Rev 739 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 739 | Rev 866 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;; ETHERNET.INC ;; |
6 | ;; ETHERNET.INC ;; |
7 | ;; ;; |
7 | ;; ;; |
8 | ;; Ethernet network layer for Menuet OS ;; |
8 | ;; Ethernet network layer for Menuet OS ;; |
9 | ;; ;; |
9 | ;; ;; |
10 | ;; Version 0.4 22 September 2003 ;; |
10 | ;; Version 0.4 22 September 2003 ;; |
11 | ;; ;; |
11 | ;; ;; |
12 | ;; This file contains the following: ;; |
12 | ;; This file contains the following: ;; |
13 | ;; PCI bus scanning for valid devices ;; |
13 | ;; PCI bus scanning for valid devices ;; |
14 | ;; Table of supported ethernet drivers ;; |
14 | ;; Table of supported ethernet drivers ;; |
15 | ;; Code to identify and activate a supported driver ;; |
15 | ;; Code to identify and activate a supported driver ;; |
16 | ;; ARP handler ;; |
16 | ;; ARP handler ;; |
17 | ;; Driver interface to the IP layer ;; |
17 | ;; Driver interface to the IP layer ;; |
18 | ;; Gateway support ;; |
18 | ;; Gateway support ;; |
19 | ;; ;; |
19 | ;; ;; |
20 | ;; Individual driver files are included here ;; |
20 | ;; Individual driver files are included here ;; |
21 | ;; ;; |
21 | ;; ;; |
22 | ;; The PCI bus scanning code was ported from the etherboot ;; |
22 | ;; The PCI bus scanning code was ported from the etherboot ;; |
23 | ;; 5.0.6 project. The copyright statement for that code is ;; |
23 | ;; 5.0.6 project. The copyright statement for that code is ;; |
24 | ;; ;; |
24 | ;; ;; |
25 | ;; GNU GENERAL PUBLIC LICENSE ;; |
25 | ;; GNU GENERAL PUBLIC LICENSE ;; |
26 | ;; Version 2, June 1991 ;; |
26 | ;; Version 2, June 1991 ;; |
27 | ;; ;; |
27 | ;; ;; |
28 | ;; remaining parts Copyright 2002 Mike Hibbett ;; |
28 | ;; remaining parts Copyright 2002 Mike Hibbett ;; |
29 | ;; mikeh@oceanfree.net ;; |
29 | ;; mikeh@oceanfree.net ;; |
30 | ;; ;; |
30 | ;; ;; |
31 | ;; See file COPYING for details ;; |
31 | ;; See file COPYING for details ;; |
32 | ;; ;; |
32 | ;; ;; |
33 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
33 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
34 | 34 | ||
35 | $Revision: 739 $ |
35 | $Revision: 866 $ |
36 | 36 | ||
37 | 37 | ||
38 | ;******************************************************************** |
38 | ;******************************************************************** |
39 | ; Interface |
39 | ; Interface |
40 | ; ethernet_driver called by stack_handler in stack.inc |
40 | ; ethernet_driver called by stack_handler in stack.inc |
41 | ; eth_probe called by app_stack_handler in stack.inc |
41 | ; eth_probe called by app_stack_handler in stack.inc |
42 | ; |
42 | ; |
43 | ;******************************************************************** |
43 | ;******************************************************************** |
44 | 44 | ||
45 | ETHER_IP equ 0x0008 ; Reversed from 0800 for intel |
45 | ETHER_IP equ 0x0008 ; Reversed from 0800 for intel |
46 | ETHER_ARP equ 0x0608 ; Reversed from 0806 for intel |
46 | ETHER_ARP equ 0x0608 ; Reversed from 0806 for intel |
47 | ETHER_RARP equ 0x3580 |
47 | ETHER_RARP equ 0x3580 |
48 | 48 | ||
49 | struc ETH_FRAME |
49 | struc ETH_FRAME |
50 | { .DstMAC dp ? ;destination MAC-address [6 bytes] |
50 | { .DstMAC dp ? ;destination MAC-address [6 bytes] |
51 | .SrcMAC dp ? ;source MAC-address [6 bytes] |
51 | .SrcMAC dp ? ;source MAC-address [6 bytes] |
52 | .Type dw ? ;type of the upper-layer protocol [2 bytes] |
52 | .Type dw ? ;type of the upper-layer protocol [2 bytes] |
53 | .Data db ? ;data [46-1500 bytes] |
53 | .Data db ? ;data [46-1500 bytes] |
54 | } |
54 | } |
55 | 55 | ||
56 | virtual at Ether_buffer |
56 | virtual at Ether_buffer |
57 | ETH_FRAME ETH_FRAME |
57 | ETH_FRAME ETH_FRAME |
58 | end virtual |
58 | end virtual |
59 | 59 | ||
60 | 60 | ||
61 | ; Some useful information on data structures |
61 | ; Some useful information on data structures |
62 | 62 | ||
63 | ; Ethernet Packet - ARP Request example |
63 | ; Ethernet Packet - ARP Request example |
64 | ; |
64 | ; |
65 | ; 0 1 2 3 |
65 | ; 0 1 2 3 |
66 | ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
66 | ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
67 | ; |
67 | ; |
68 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
68 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
69 | ; | Dest H/W Address | |
69 | ; | Dest H/W Address | |
70 | ; | ( 14 byte header ) | |
70 | ; | ( 14 byte header ) | |
71 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
71 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
72 | ; | | Source H/W Address | |
72 | ; | | Source H/W Address | |
73 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
73 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
74 | ; | | |
74 | ; | | |
75 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
75 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
76 | ; | Protocol - ARP 08 06 | |
76 | ; | Protocol - ARP 08 06 | |
77 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
77 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
78 | 78 | ||
79 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
79 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
80 | ; | H/W Type 00 01 | Protocol Type 08 00 | |
80 | ; | H/W Type 00 01 | Protocol Type 08 00 | |
81 | ; | ( ARP Request packet ) | |
81 | ; | ( ARP Request packet ) | |
82 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
82 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
83 | ; | HLen 0x06 | PLen 0x04 | OpCode 00 01 | |
83 | ; | HLen 0x06 | PLen 0x04 | OpCode 00 01 | |
84 | ; | ( 0001 for request, 0002 for reply ) | |
84 | ; | ( 0001 for request, 0002 for reply ) | |
85 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
85 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
86 | ; | Source Hardware Address ( MAC Address ) | |
86 | ; | Source Hardware Address ( MAC Address ) | |
87 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
87 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
88 | ; | | Source IP Address | |
88 | ; | | Source IP Address | |
89 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
89 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
90 | ; | | Destination Hardware Address | |
90 | ; | | Destination Hardware Address | |
91 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
91 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
92 | ; | | |
92 | ; | | |
93 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
93 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
94 | ; | Destination IP Address | |
94 | ; | Destination IP Address | |
95 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
95 | ; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
96 | 96 | ||
97 | ; Include individual drivers source files at this point. |
97 | ; Include individual drivers source files at this point. |
98 | ; If you create a new driver, include it below. |
98 | ; If you create a new driver, include it below. |
99 | 99 | ||
100 | include "drivers/rtl8029.inc" |
100 | include "drivers/rtl8029.inc" |
101 | include "drivers/i8255x.inc" |
101 | include "drivers/i8255x.inc" |
102 | include "drivers/rtl8139.inc" |
102 | include "drivers/rtl8139.inc" |
103 | include "drivers/3c59x.inc" |
103 | include "drivers/3c59x.inc" |
104 | include "drivers/sis900.inc" |
104 | include "drivers/sis900.inc" |
105 | include "drivers/pcnet32.inc" |
105 | include "drivers/pcnet32.inc" |
106 | include "drivers/rtl8169.inc" |
106 | include "drivers/rtl8169.inc" |
- | 107 | include "drivers/forcedeth.inc" |
|
107 | 108 | ||
108 | ; PCICards |
109 | ; PCICards |
109 | ; ======== |
110 | ; ======== |
110 | ; PCI vendor and hardware types for hardware supported by the above drivers |
111 | ; PCI vendor and hardware types for hardware supported by the above drivers |
111 | ; If you add a driver, ensure you update this datastructure, otherwise the |
112 | ; If you add a driver, ensure you update this datastructure, otherwise the |
112 | ; card will not be probed. |
113 | ; card will not be probed. |
113 | ; Each driver is defined by 4 double words. These are |
114 | ; Each driver is defined by 4 double words. These are |
114 | ; PCIVendorDevice probeFunction ResetFunction PollFunction transmitFunction |
115 | ; PCIVendorDevice probeFunction ResetFunction PollFunction transmitFunction |
115 | ; The last entry must be kept at all zeros, to indicate the end of the list |
116 | ; The last entry must be kept at all zeros, to indicate the end of the list |
116 | ; As a PCI driver may support more than one hardware implementation, there may |
117 | ; As a PCI driver may support more than one hardware implementation, there may |
117 | ; be several lines which refer to the same functions. |
118 | ; be several lines which refer to the same functions. |
118 | ; The first driver found on the PCI bus will be the one used. |
119 | ; The first driver found on the PCI bus will be the one used. |
119 | 120 | ||
120 | PCICARDS_ENTRY_SIZE equ 24 ; Size of each PCICARDS entry |
121 | PCICARDS_ENTRY_SIZE equ 24 ; Size of each PCICARDS entry |
121 | 122 | ||
122 | iglobal |
123 | iglobal |
123 | PCICards: |
124 | PCICards: |
124 | dd 0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
125 | dd 0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
125 | dd 0x10298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
126 | dd 0x10298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
126 | dd 0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
127 | dd 0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
127 | dd 0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
128 | dd 0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
128 | dd 0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
129 | dd 0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
129 | 130 | ||
130 | dd 0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
131 | dd 0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
131 | 132 | ||
132 | dd 0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable ; tested by hidnplayr: works ok |
133 | dd 0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable ; tested by hidnplayr: works ok |
133 | dd 0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
134 | dd 0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
134 | dd 0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable ; tested by hidnplayr: works ok |
135 | dd 0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable ; tested by hidnplayr: works ok |
135 | dd 0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
136 | dd 0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
136 | dd 0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
137 | dd 0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
137 | dd 0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
138 | dd 0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
138 | dd 0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
139 | dd 0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
139 | dd 0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
140 | dd 0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
140 | dd 0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
141 | dd 0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
141 | dd 0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
142 | dd 0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
142 | dd 0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
143 | dd 0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
143 | dd 0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
144 | dd 0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
144 | dd 0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
145 | dd 0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
145 | dd 0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
146 | dd 0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
146 | dd 0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
147 | dd 0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
147 | dd 0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
148 | dd 0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
148 | dd 0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
149 | dd 0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
149 | dd 0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
150 | dd 0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
150 | dd 0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
151 | dd 0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
151 | 152 | ||
152 | dd 0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
153 | dd 0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
153 | dd 0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
154 | dd 0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
154 | dd 0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
155 | dd 0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
155 | dd 0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
156 | dd 0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
156 | 157 | ||
157 | dd 0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
158 | dd 0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
158 | dd 0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
159 | dd 0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
159 | dd 0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
160 | dd 0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
160 | dd 0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
161 | dd 0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
161 | dd 0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
162 | dd 0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
162 | dd 0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
163 | dd 0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
163 | dd 0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
164 | dd 0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
164 | dd 0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
165 | dd 0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
165 | dd 0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
166 | dd 0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
166 | dd 0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
167 | dd 0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
167 | dd 0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
168 | dd 0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
168 | dd 0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
169 | dd 0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
169 | dd 0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
170 | dd 0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
170 | dd 0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
171 | dd 0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
171 | dd 0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
172 | dd 0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
172 | dd 0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
173 | dd 0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
173 | dd 0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
174 | dd 0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
174 | dd 0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
175 | dd 0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
175 | dd 0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
176 | dd 0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
176 | dd 0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
177 | dd 0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
177 | dd 0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
178 | dd 0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
178 | dd 0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
179 | dd 0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
179 | dd 0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
180 | dd 0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
180 | dd 0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
181 | dd 0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
181 | dd 0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
182 | dd 0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
182 | dd 0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
183 | dd 0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
183 | dd 0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
184 | dd 0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
184 | dd 0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
185 | dd 0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
185 | dd 0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
186 | dd 0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
186 | dd 0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
187 | dd 0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
187 | dd 0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
188 | dd 0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
188 | dd 0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
189 | dd 0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
189 | 190 | ||
190 | dd 0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
191 | dd 0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
191 | 192 | ||
192 | dd 0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
193 | dd 0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
193 | dd 0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
194 | dd 0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
194 | dd 0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
195 | dd 0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
195 | 196 | ||
196 | ;dd 0x08031516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
197 | ;dd 0x08031516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
197 | 198 | ||
198 | ; following cards are untested |
199 | ; following cards are untested |
199 | dd 0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
200 | dd 0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
200 | ;dd 0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
201 | ;dd 0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
201 | ;dd 0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
202 | ;dd 0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
- | 203 | ||
- | 204 | dd 0x006610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, 0 ; nVidia Corporation nForce2 Ethernet Controller |
|
202 | 205 | ||
203 | rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove |
206 | rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove |
204 | endg |
207 | endg |
205 | 208 | ||
206 | uglobal |
209 | uglobal |
207 | ;Net-stack's interface's settings |
210 | ;Net-stack's interface's settings |
208 | node_addr: db 0,0,0,0,0,0 |
211 | node_addr: db 0,0,0,0,0,0 |
209 | gateway_ip: dd 0 |
212 | gateway_ip: dd 0 |
210 | dns_ip: dd 0 |
213 | dns_ip: dd 0 |
211 | 214 | ||
212 | eth_rx_data_len: dw 0 |
215 | eth_rx_data_len: dw 0 |
213 | eth_status: dd 0 |
216 | eth_status: dd 0 |
214 | io_addr: dd 0 |
217 | io_addr: dd 0 |
215 | hdrtype: db 0 |
218 | hdrtype: db 0 |
216 | vendor_device: dd 0 |
219 | vendor_device: dd 0 |
217 | pci_data: dd 0 |
220 | pci_data: dd 0 |
218 | pci_dev: dd 0 |
221 | pci_dev: dd 0 |
219 | pci_bus: dd 0 |
222 | pci_bus: dd 0 |
220 | 223 | ||
221 | ; These will hold pointers to the selected driver functions |
224 | ; These will hold pointers to the selected driver functions |
222 | drvr_probe: dd 0 |
225 | drvr_probe: dd 0 |
223 | drvr_reset: dd 0 |
226 | drvr_reset: dd 0 |
224 | drvr_poll: dd 0 |
227 | drvr_poll: dd 0 |
225 | drvr_transmit: dd 0 |
228 | drvr_transmit: dd 0 |
226 | drvr_cable: dd 0 |
229 | drvr_cable: dd 0 |
227 | 230 | ||
228 | endg |
231 | endg |
229 | 232 | ||
230 | iglobal |
233 | iglobal |
231 | broadcast_add: db 0xff,0xff,0xff,0xff,0xff,0xff |
234 | broadcast_add: db 0xff,0xff,0xff,0xff,0xff,0xff |
232 | subnet_mask: dd 0x00ffffff ; 255.255.255.0 |
235 | subnet_mask: dd 0x00ffffff ; 255.255.255.0 |
233 | endg |
236 | endg |
234 | 237 | ||
235 | include "arp.inc" ;arp-protocol functions |
238 | include "arp.inc" ;arp-protocol functions |
236 | include "pci.inc" ;PCI bus access functions |
239 | include "pci.inc" ;PCI bus access functions |
237 | 240 | ||
238 | 241 | ||
239 | ;*************************************************************************** |
242 | ;*************************************************************************** |
240 | ; Function |
243 | ; Function |
241 | ; eth_tx |
244 | ; eth_tx |
242 | ; |
245 | ; |
243 | ; Description |
246 | ; Description |
244 | ; Looks at the NET1OUT_QUEUE for data to send. |
247 | ; Looks at the NET1OUT_QUEUE for data to send. |
245 | ; Stores that destination IP in a location used by the tx routine |
248 | ; Stores that destination IP in a location used by the tx routine |
246 | ; Looks up the MAC address in the ARP table; stores that where |
249 | ; Looks up the MAC address in the ARP table; stores that where |
247 | ; the tx routine can get it |
250 | ; the tx routine can get it |
248 | ; Get the length of the data. Store that where the tx routine wants it |
251 | ; Get the length of the data. Store that where the tx routine wants it |
249 | ; Call tx |
252 | ; Call tx |
250 | ; Places buffer on empty queue when the tx routine finished |
253 | ; Places buffer on empty queue when the tx routine finished |
251 | ; |
254 | ; |
252 | ;*************************************************************************** |
255 | ;*************************************************************************** |
253 | proc eth_tx stdcall uses ebx esi edi |
256 | proc eth_tx stdcall uses ebx esi edi |
254 | local MACAddress dp ? ;allocate 6 bytes in the stack |
257 | local MACAddress dp ? ;allocate 6 bytes in the stack |
255 | 258 | ||
256 | ; Look for a buffer to tx |
259 | ; Look for a buffer to tx |
257 | mov eax, NET1OUT_QUEUE |
260 | mov eax, NET1OUT_QUEUE |
258 | call dequeue |
261 | call dequeue |
259 | cmp ax, NO_BUFFER |
262 | cmp ax, NO_BUFFER |
260 | je .exit ; Exit if no buffer available |
263 | je .exit ; Exit if no buffer available |
261 | 264 | ||
262 | push eax ;save buffer number |
265 | push eax ;save buffer number |
263 | 266 | ||
264 | ; convert buffer pointer eax to the absolute address |
267 | ; convert buffer pointer eax to the absolute address |
265 | imul eax, IPBUFFSIZE |
268 | imul eax, IPBUFFSIZE |
266 | add eax, IPbuffs |
269 | add eax, IPbuffs |
267 | 270 | ||
268 | ; Extract the destination IP |
271 | ; Extract the destination IP |
269 | ; find the destination IP in the ARP table, get MAC |
272 | ; find the destination IP in the ARP table, get MAC |
270 | ; store this MAC in 'MACAddress' |
273 | ; store this MAC in 'MACAddress' |
271 | mov ebx, eax ; Save buffer address |
274 | mov ebx, eax ; Save buffer address |
272 | mov edx, [ebx + 16] ; get destination address |
275 | mov edx, [ebx + 16] ; get destination address |
273 | 276 | ||
274 | ; If the destination address is 255.255.255.255, |
277 | ; If the destination address is 255.255.255.255, |
275 | ; set the MACAddress to all ones ( broadcast ) |
278 | ; set the MACAddress to all ones ( broadcast ) |
276 | cld |
279 | cld |
277 | mov esi, broadcast_add |
280 | mov esi, broadcast_add |
278 | lea edi, [MACAddress] |
281 | lea edi, [MACAddress] |
279 | movsd |
282 | movsd |
280 | movsw |
283 | movsw |
281 | cmp edx, 0xffffffff |
284 | cmp edx, 0xffffffff |
282 | je .send ; If it is broadcast, just send |
285 | je .send ; If it is broadcast, just send |
283 | 286 | ||
284 | lea eax, [MACAddress] ;cause this is local variable |
287 | lea eax, [MACAddress] ;cause this is local variable |
285 | stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax ;opcode,IP,MAC_ptr - Get the MAC address. |
288 | stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax ;opcode,IP,MAC_ptr - Get the MAC address. |
286 | 289 | ||
287 | cmp eax, ARP_VALID_MAPPING |
290 | cmp eax, ARP_VALID_MAPPING |
288 | je .send |
291 | je .send |
289 | 292 | ||
290 | ; No valid entry. Has the request been sent, but timed out? |
293 | ; No valid entry. Has the request been sent, but timed out? |
291 | cmp eax, ARP_RESPONSE_TIMEOUT |
294 | cmp eax, ARP_RESPONSE_TIMEOUT |
292 | je .freebuf |
295 | je .freebuf |
293 | 296 | ||
294 | .wait_response: ;we wait arp-response |
297 | .wait_response: ;we wait arp-response |
295 | ; Re-queue the packet, and exit |
298 | ; Re-queue the packet, and exit |
296 | pop ebx |
299 | pop ebx |
297 | mov eax, NET1OUT_QUEUE |
300 | mov eax, NET1OUT_QUEUE |
298 | call queue ; Get the buffer back |
301 | call queue ; Get the buffer back |
299 | jmp .exit |
302 | jmp .exit |
300 | 303 | ||
301 | .send: ;if ARP_VALID_MAPPING then send the packet |
304 | .send: ;if ARP_VALID_MAPPING then send the packet |
302 | lea edi, [MACAddress] ; Pointer to 48 bit destination address |
305 | lea edi, [MACAddress] ; Pointer to 48 bit destination address |
303 | movzx ecx, word[ebx+2] ; Size of IP packet to send |
306 | movzx ecx, word[ebx+2] ; Size of IP packet to send |
304 | xchg ch, cl ; because mirror byte-order |
307 | xchg ch, cl ; because mirror byte-order |
305 | mov esi, ebx ; Pointer to packet data |
308 | mov esi, ebx ; Pointer to packet data |
306 | mov bx, ETHER_IP ; Type of packet |
309 | mov bx, ETHER_IP ; Type of packet |
307 | push ebp |
310 | push ebp |
308 | call dword [drvr_transmit] ; Call the drivers transmit function |
311 | call dword [drvr_transmit] ; Call the drivers transmit function |
309 | pop ebp |
312 | pop ebp |
310 | 313 | ||
311 | ; OK, we have sent a packet, so increment the count |
314 | ; OK, we have sent a packet, so increment the count |
312 | inc dword [ip_tx_count] |
315 | inc dword [ip_tx_count] |
313 | 316 | ||
314 | ; And finally, return the buffer to the free queue |
317 | ; And finally, return the buffer to the free queue |
315 | .freebuf: |
318 | .freebuf: |
316 | pop eax |
319 | pop eax |
317 | call freeBuff |
320 | call freeBuff |
318 | 321 | ||
319 | .exit: |
322 | .exit: |
320 | ret |
323 | ret |
321 | endp |
324 | endp |
322 | 325 | ||
323 | ;*************************************************************************** |
326 | ;*************************************************************************** |
324 | ; Function |
327 | ; Function |
325 | ; ether_IP_handler |
328 | ; ether_IP_handler |
326 | ; |
329 | ; |
327 | ; Description |
330 | ; Description |
328 | ; Called when an IP ethernet packet is received on the ethernet |
331 | ; Called when an IP ethernet packet is received on the ethernet |
329 | ; Header + Data is in Ether_buffer[] |
332 | ; Header + Data is in Ether_buffer[] |
330 | ; We just need to get a buffer from the 'free' queue, and |
333 | ; We just need to get a buffer from the 'free' queue, and |
331 | ; store the packet in it, then insert the packet number into the |
334 | ; store the packet in it, then insert the packet number into the |
332 | ; IPRX queue. |
335 | ; IPRX queue. |
333 | ; If no queue entry is available, the packet is silently discarded |
336 | ; If no queue entry is available, the packet is silently discarded |
334 | ; All registers may be destroyed |
337 | ; All registers may be destroyed |
335 | ; |
338 | ; |
336 | ;*************************************************************************** |
339 | ;*************************************************************************** |
337 | ether_IP_handler: |
340 | ether_IP_handler: |
338 | mov eax, EMPTY_QUEUE |
341 | mov eax, EMPTY_QUEUE |
339 | call dequeue |
342 | call dequeue |
340 | cmp ax, NO_BUFFER |
343 | cmp ax, NO_BUFFER |
341 | je eiph00x |
344 | je eiph00x |
342 | 345 | ||
343 | ; convert buffer pointer eax to the absolute address |
346 | ; convert buffer pointer eax to the absolute address |
344 | push eax |
347 | push eax |
345 | mov ecx, IPBUFFSIZE |
348 | mov ecx, IPBUFFSIZE |
346 | mul ecx |
349 | mul ecx |
347 | add eax, IPbuffs |
350 | add eax, IPbuffs |
348 | 351 | ||
349 | mov edi, eax |
352 | mov edi, eax |
350 | 353 | ||
351 | ; get a pointer to the start of the DATA |
354 | ; get a pointer to the start of the DATA |
352 | mov esi, ETH_FRAME.Data |
355 | mov esi, ETH_FRAME.Data |
353 | 356 | ||
354 | ; Now store it all away |
357 | ; Now store it all away |
355 | mov ecx, IPBUFFSIZE / 4 ; Copy all of the available |
358 | mov ecx, IPBUFFSIZE / 4 ; Copy all of the available |
356 | ; data across - worse case |
359 | ; data across - worse case |
357 | cld |
360 | cld |
358 | rep movsd |
361 | rep movsd |
359 | 362 | ||
360 | ; And finally, place the buffer in the IPRX queue |
363 | ; And finally, place the buffer in the IPRX queue |
361 | pop ebx |
364 | pop ebx |
362 | mov eax, IPIN_QUEUE |
365 | mov eax, IPIN_QUEUE |
363 | call queue |
366 | call queue |
364 | 367 | ||
365 | eiph00x: |
368 | eiph00x: |
366 | ret |
369 | ret |
367 | 370 | ||
368 | ;*************************************************************************** |
371 | ;*************************************************************************** |
369 | ; Function |
372 | ; Function |
370 | ; eth_probe |
373 | ; eth_probe |
371 | ; Description |
374 | ; Description |
372 | ; Searches for an ethernet card. If found, the card is enabled and |
375 | ; Searches for an ethernet card. If found, the card is enabled and |
373 | ; the ethernet -> IP link established |
376 | ; the ethernet -> IP link established |
374 | ; |
377 | ; |
375 | ; This function scans the PCI bus looking for a supported device. |
378 | ; This function scans the PCI bus looking for a supported device. |
376 | ; ISA bus is currently not supported. |
379 | ; ISA bus is currently not supported. |
377 | ; |
380 | ; |
378 | ; eax is 0 if no hardware found |
381 | ; eax is 0 if no hardware found |
379 | ;*************************************************************************** |
382 | ;*************************************************************************** |
380 | eth_probe: |
383 | eth_probe: |
381 | ; Find a card on the PCI bus, and get it's address |
384 | ; Find a card on the PCI bus, and get it's address |
382 | call scan_bus ; Find the ethernet cards PIC address |
385 | call scan_bus ; Find the ethernet cards PIC address |
383 | xor eax, eax |
386 | xor eax, eax |
384 | cmp [io_addr], eax |
387 | cmp [io_addr], eax |
385 | je ep_00x ; Return 0 in eax if no cards found |
388 | je ep_00x ; Return 0 in eax if no cards found |
386 | 389 | ||
387 | call dword [drvr_probe] ; Call the drivers probe function |
390 | call dword [drvr_probe] ; Call the drivers probe function |
388 | 391 | ||
389 | mov eax, [io_addr] ; return a non zero value |
392 | mov eax, [io_addr] ; return a non zero value |
390 | 393 | ||
391 | ep_00x: |
394 | ep_00x: |
392 | ret |
395 | ret |
393 | 396 | ||
394 | ;*************************************************************************** |
397 | ;*************************************************************************** |
395 | ; Function |
398 | ; Function |
396 | ; ethernet_driver |
399 | ; ethernet_driver |
397 | ; |
400 | ; |
398 | ; Description |
401 | ; Description |
399 | ; The ethernet RX and TX handler |
402 | ; The ethernet RX and TX handler |
400 | ; This is a kernel function, called by stack_handler |
403 | ; This is a kernel function, called by stack_handler |
401 | ; |
404 | ; |
402 | ;*************************************************************************** |
405 | ;*************************************************************************** |
403 | ethernet_driver: |
406 | ethernet_driver: |
404 | ; Do nothing if the driver is inactive |
407 | ; Do nothing if the driver is inactive |
405 | cmp [ethernet_active], byte 0 |
408 | cmp [ethernet_active], byte 0 |
406 | je eth_exit |
409 | je eth_exit |
407 | 410 | ||
408 | call eth_rx |
411 | call eth_rx |
409 | call eth_tx |
412 | call eth_tx |
410 | 413 | ||
411 | eth_exit: |
414 | eth_exit: |
412 | ret |
415 | ret |
413 | 416 | ||
414 | ;*************************************************************************** |
417 | ;*************************************************************************** |
415 | ; Function |
418 | ; Function |
416 | ; eth_rx |
419 | ; eth_rx |
417 | ; |
420 | ; |
418 | ; Description |
421 | ; Description |
419 | ; Polls the ethernet card for received data. Extracts if present |
422 | ; Polls the ethernet card for received data. Extracts if present |
420 | ; Depending on the Protocol within the packet: |
423 | ; Depending on the Protocol within the packet: |
421 | ; ARP : Pass to ARP_handler. This may result in an ARP reply |
424 | ; ARP : Pass to ARP_handler. This may result in an ARP reply |
422 | ; being tx'ed |
425 | ; being tx'ed |
423 | ; IP : Store in an IP buffer |
426 | ; IP : Store in an IP buffer |
424 | ; |
427 | ; |
425 | ;*************************************************************************** |
428 | ;*************************************************************************** |
426 | eth_rx: |
429 | eth_rx: |
427 | xor ax, ax |
430 | xor ax, ax |
428 | mov [eth_rx_data_len], ax |
431 | mov [eth_rx_data_len], ax |
429 | call dword [drvr_poll] ; Call the drivers poll function |
432 | call dword [drvr_poll] ; Call the drivers poll function |
430 | 433 | ||
431 | mov ax, [eth_rx_data_len] |
434 | mov ax, [eth_rx_data_len] |
432 | cmp ax, 0 |
435 | cmp ax, 0 |
433 | je .exit |
436 | je .exit |
434 | 437 | ||
435 | 438 | ||
436 | ; Check the protocol. Call appropriate handler |
439 | ; Check the protocol. Call appropriate handler |
437 | 440 | ||
438 | mov ax, [ETH_FRAME.Type] ; The address of the protocol word |
441 | mov ax, [ETH_FRAME.Type] ; The address of the protocol word |
439 | 442 | ||
440 | cmp ax, ETHER_IP |
443 | cmp ax, ETHER_IP |
441 | je .is_ip ; It's IP |
444 | je .is_ip ; It's IP |
442 | 445 | ||
443 | cmp ax, ETHER_ARP |
446 | cmp ax, ETHER_ARP |
444 | je .is_arp ; It is ARP |
447 | je .is_arp ; It is ARP |
445 | 448 | ||
446 | jmp .exit ; If not IP or ARP, ignore |
449 | jmp .exit ; If not IP or ARP, ignore |
447 | 450 | ||
448 | .is_ip: |
451 | .is_ip: |
449 | DEBUGF 1,"K : eth_rx - IP packet\n" |
452 | DEBUGF 1,"K : eth_rx - IP packet\n" |
450 | inc dword [ip_rx_count] |
453 | inc dword [ip_rx_count] |
451 | call ether_IP_handler |
454 | call ether_IP_handler |
452 | jmp .exit |
455 | jmp .exit |
453 | 456 | ||
454 | .is_arp: |
457 | .is_arp: |
455 | DEBUGF 1,"K : eth_rx - ARP packet\n" |
458 | DEBUGF 1,"K : eth_rx - ARP packet\n" |
456 | ; At this point, the packet is still in the Ether_buffer |
459 | ; At this point, the packet is still in the Ether_buffer |
457 | call arp_handler |
460 | call arp_handler |
458 | 461 | ||
459 | .exit: |
462 | .exit: |
460 | ret |
463 | ret |