Rev 425 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 425 | Rev 431 | ||
---|---|---|---|
1 | $Revision: 425 $ |
1 | $Revision: 431 $ |
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
3 | ;; ;; |
3 | ;; ;; |
- | 4 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
|
- | 5 | ;; Distributed under terms of the GNU General Public License ;; |
|
- | 6 | ;; ;; |
|
4 | ;; RTL8029.INC ;; |
7 | ;; RTL8029.INC ;; |
5 | ;; ;; |
8 | ;; ;; |
6 | ;; Ethernet driver for Menuet OS ;; |
9 | ;; Ethernet driver for Menuet OS ;; |
7 | ;; ;; |
10 | ;; ;; |
8 | ;; Version 0.2 31 July 2002 ;; |
11 | ;; Version 0.2 31 July 2002 ;; |
9 | ;; ;; |
12 | ;; ;; |
10 | ;; This driver is based on the ns8390 driver from ;; |
13 | ;; This driver is based on the ns8390 driver from ;; |
11 | ;; the etherboot 5.0.6 project. The copyright statement is ;; |
14 | ;; the etherboot 5.0.6 project. The copyright statement is ;; |
12 | ;; ;; |
15 | ;; ;; |
13 | ;; GNU GENERAL PUBLIC LICENSE ;; |
16 | ;; GNU GENERAL PUBLIC LICENSE ;; |
14 | ;; Version 2, June 1991 ;; |
17 | ;; Version 2, June 1991 ;; |
15 | ;; ;; |
18 | ;; ;; |
16 | ;; remaining parts Copyright 2002 Mike Hibbett, ;; |
19 | ;; remaining parts Copyright 2002 Mike Hibbett, ;; |
17 | ;; mikeh@oceanfree.net ;; |
20 | ;; mikeh@oceanfree.net ;; |
18 | ;; ;; |
21 | ;; ;; |
19 | ;; See file COPYING for details ;; |
22 | ;; See file COPYING for details ;; |
20 | ;; ;; |
23 | ;; ;; |
21 | ;; While this implementation handles only PCI bus RTL8029 ;; |
24 | ;; While this implementation handles only PCI bus RTL8029 ;; |
22 | ;; hardware, it can be easily adapted to other NE2000 clone ;; |
25 | ;; hardware, it can be easily adapted to other NE2000 clone ;; |
23 | ;; products. I just dont have any to try! ;; |
26 | ;; products. I just dont have any to try! ;; |
24 | ;; ;; |
27 | ;; ;; |
25 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
28 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
26 | 29 | ||
27 | 30 | ||
28 | 31 | ||
29 | ;******************************************************************** |
32 | ;******************************************************************** |
30 | ; Interface |
33 | ; Interface |
31 | ; rtl8029_reset |
34 | ; rtl8029_reset |
32 | ; rtl8029_probe |
35 | ; rtl8029_probe |
33 | ; rtl8029_poll |
36 | ; rtl8029_poll |
34 | ; rtl8029_transmit |
37 | ; rtl8029_transmit |
35 | ; |
38 | ; |
36 | ;******************************************************************** |
39 | ;******************************************************************** |
37 | 40 | ||
38 | 41 | ||
39 | 42 | ||
40 | 43 | ||
41 | ;************************************************************************** |
44 | ;************************************************************************** |
42 | ; 8390 Register Definitions |
45 | ; 8390 Register Definitions |
43 | ;************************************************************************** |
46 | ;************************************************************************** |
44 | D8390_P0_COMMAND equ 0x00 |
47 | D8390_P0_COMMAND equ 0x00 |
45 | D8390_P0_PSTART equ 0x01 |
48 | D8390_P0_PSTART equ 0x01 |
46 | D8390_P0_PSTOP equ 0x02 |
49 | D8390_P0_PSTOP equ 0x02 |
47 | D8390_P0_BOUND equ 0x03 |
50 | D8390_P0_BOUND equ 0x03 |
48 | D8390_P0_TSR equ 0x04 |
51 | D8390_P0_TSR equ 0x04 |
49 | D8390_P0_TPSR equ 0x04 |
52 | D8390_P0_TPSR equ 0x04 |
50 | D8390_P0_TBCR0 equ 0x05 |
53 | D8390_P0_TBCR0 equ 0x05 |
51 | D8390_P0_TBCR1 equ 0x06 |
54 | D8390_P0_TBCR1 equ 0x06 |
52 | D8390_P0_ISR equ 0x07 |
55 | D8390_P0_ISR equ 0x07 |
53 | D8390_P0_RSAR0 equ 0x08 |
56 | D8390_P0_RSAR0 equ 0x08 |
54 | D8390_P0_RSAR1 equ 0x09 |
57 | D8390_P0_RSAR1 equ 0x09 |
55 | D8390_P0_RBCR0 equ 0x0A |
58 | D8390_P0_RBCR0 equ 0x0A |
56 | D8390_P0_RBCR1 equ 0x0B |
59 | D8390_P0_RBCR1 equ 0x0B |
57 | D8390_P0_RSR equ 0x0C |
60 | D8390_P0_RSR equ 0x0C |
58 | D8390_P0_RCR equ 0x0C |
61 | D8390_P0_RCR equ 0x0C |
59 | D8390_P0_TCR equ 0x0D |
62 | D8390_P0_TCR equ 0x0D |
60 | D8390_P0_DCR equ 0x0E |
63 | D8390_P0_DCR equ 0x0E |
61 | D8390_P0_IMR equ 0x0F |
64 | D8390_P0_IMR equ 0x0F |
62 | D8390_P1_COMMAND equ 0x00 |
65 | D8390_P1_COMMAND equ 0x00 |
63 | D8390_P1_PAR0 equ 0x01 |
66 | D8390_P1_PAR0 equ 0x01 |
64 | D8390_P1_PAR1 equ 0x02 |
67 | D8390_P1_PAR1 equ 0x02 |
65 | D8390_P1_PAR2 equ 0x03 |
68 | D8390_P1_PAR2 equ 0x03 |
66 | D8390_P1_PAR3 equ 0x04 |
69 | D8390_P1_PAR3 equ 0x04 |
67 | D8390_P1_PAR4 equ 0x05 |
70 | D8390_P1_PAR4 equ 0x05 |
68 | D8390_P1_PAR5 equ 0x06 |
71 | D8390_P1_PAR5 equ 0x06 |
69 | D8390_P1_CURR equ 0x07 |
72 | D8390_P1_CURR equ 0x07 |
70 | D8390_P1_MAR0 equ 0x08 |
73 | D8390_P1_MAR0 equ 0x08 |
71 | 74 | ||
72 | D8390_COMMAND_PS0 equ 0x0 ; Page 0 select |
75 | D8390_COMMAND_PS0 equ 0x0 ; Page 0 select |
73 | D8390_COMMAND_PS1 equ 0x40 ; Page 1 select |
76 | D8390_COMMAND_PS1 equ 0x40 ; Page 1 select |
74 | D8390_COMMAND_PS2 equ 0x80 ; Page 2 select |
77 | D8390_COMMAND_PS2 equ 0x80 ; Page 2 select |
75 | D8390_COMMAND_RD2 equ 0x20 ; Remote DMA control |
78 | D8390_COMMAND_RD2 equ 0x20 ; Remote DMA control |
76 | D8390_COMMAND_RD1 equ 0x10 |
79 | D8390_COMMAND_RD1 equ 0x10 |
77 | D8390_COMMAND_RD0 equ 0x08 |
80 | D8390_COMMAND_RD0 equ 0x08 |
78 | D8390_COMMAND_TXP equ 0x04 ; transmit packet |
81 | D8390_COMMAND_TXP equ 0x04 ; transmit packet |
79 | D8390_COMMAND_STA equ 0x02 ; start |
82 | D8390_COMMAND_STA equ 0x02 ; start |
80 | D8390_COMMAND_STP equ 0x01 ; stop |
83 | D8390_COMMAND_STP equ 0x01 ; stop |
81 | 84 | ||
82 | D8390_COMMAND_RD2_STA equ 0x22 |
85 | D8390_COMMAND_RD2_STA equ 0x22 |
83 | D8390_COMMAND_RD2_STP equ 0x21 |
86 | D8390_COMMAND_RD2_STP equ 0x21 |
84 | D8390_COMMAND_RD1_STA equ 0x12 |
87 | D8390_COMMAND_RD1_STA equ 0x12 |
85 | D8390_COMMAND_RD0_STA equ 0x0A |
88 | D8390_COMMAND_RD0_STA equ 0x0A |
86 | D8390_COMMAND_PS0_RD2_STP equ 0x21 |
89 | D8390_COMMAND_PS0_RD2_STP equ 0x21 |
87 | D8390_COMMAND_PS1_RD2_STP equ 0x61 |
90 | D8390_COMMAND_PS1_RD2_STP equ 0x61 |
88 | D8390_COMMAND_PS0_RD2_STA equ 0x22 |
91 | D8390_COMMAND_PS0_RD2_STA equ 0x22 |
89 | D8390_COMMAND_PS0_TXP_RD2_STA equ 0x26 |
92 | D8390_COMMAND_PS0_TXP_RD2_STA equ 0x26 |
90 | 93 | ||
91 | D8390_RCR_MON equ 0x20 ; monitor mode |
94 | D8390_RCR_MON equ 0x20 ; monitor mode |
92 | 95 | ||
93 | D8390_DCR_FT1 equ 0x40 |
96 | D8390_DCR_FT1 equ 0x40 |
94 | D8390_DCR_LS equ 0x08 ; Loopback select |
97 | D8390_DCR_LS equ 0x08 ; Loopback select |
95 | D8390_DCR_WTS equ 0x01 ; Word transfer select |
98 | D8390_DCR_WTS equ 0x01 ; Word transfer select |
96 | 99 | ||
97 | D8390_DCR_FT1_LS equ 0x48 |
100 | D8390_DCR_FT1_LS equ 0x48 |
98 | D8390_DCR_WTS_FT1_LS equ 0x49 |
101 | D8390_DCR_WTS_FT1_LS equ 0x49 |
99 | 102 | ||
100 | D8390_ISR_PRX equ 0x01 ; successful recv |
103 | D8390_ISR_PRX equ 0x01 ; successful recv |
101 | D8390_ISR_PTX equ 0x02 ; successful xmit |
104 | D8390_ISR_PTX equ 0x02 ; successful xmit |
102 | D8390_ISR_RXE equ 0x04 ; receive error |
105 | D8390_ISR_RXE equ 0x04 ; receive error |
103 | D8390_ISR_TXE equ 0x08 ; transmit error |
106 | D8390_ISR_TXE equ 0x08 ; transmit error |
104 | D8390_ISR_OVW equ 0x10 ; Overflow |
107 | D8390_ISR_OVW equ 0x10 ; Overflow |
105 | D8390_ISR_CNT equ 0x20 ; Counter overflow |
108 | D8390_ISR_CNT equ 0x20 ; Counter overflow |
106 | D8390_ISR_RDC equ 0x40 ; Remote DMA complete |
109 | D8390_ISR_RDC equ 0x40 ; Remote DMA complete |
107 | D8390_ISR_RST equ 0x80 ; reset |
110 | D8390_ISR_RST equ 0x80 ; reset |
108 | 111 | ||
109 | D8390_RSTAT_PRX equ 0x01 ; successful recv |
112 | D8390_RSTAT_PRX equ 0x01 ; successful recv |
110 | D8390_RSTAT_CRC equ 0x02 ; CRC error |
113 | D8390_RSTAT_CRC equ 0x02 ; CRC error |
111 | D8390_RSTAT_FAE equ 0x04 ; Frame alignment error |
114 | D8390_RSTAT_FAE equ 0x04 ; Frame alignment error |
112 | D8390_RSTAT_OVER equ 0x08 ; FIFO overrun |
115 | D8390_RSTAT_OVER equ 0x08 ; FIFO overrun |
113 | 116 | ||
114 | D8390_TXBUF_SIZE equ 6 |
117 | D8390_TXBUF_SIZE equ 6 |
115 | D8390_RXBUF_END equ 32 |
118 | D8390_RXBUF_END equ 32 |
116 | D8390_PAGE_SIZE equ 256 |
119 | D8390_PAGE_SIZE equ 256 |
117 | 120 | ||
118 | ETH_ALEN equ 6 |
121 | ETH_ALEN equ 6 |
119 | ETH_HLEN equ 14 |
122 | ETH_HLEN equ 14 |
120 | ETH_ZLEN equ 60 |
123 | ETH_ZLEN equ 60 |
121 | ETH_FRAME_LEN equ 1514 |
124 | ETH_FRAME_LEN equ 1514 |
122 | 125 | ||
123 | FLAG_PIO equ 0x01 |
126 | FLAG_PIO equ 0x01 |
124 | FLAG_16BIT equ 0x02 |
127 | FLAG_16BIT equ 0x02 |
125 | ASIC_PIO equ 0 |
128 | ASIC_PIO equ 0 |
126 | 129 | ||
127 | VENDOR_NONE equ 0 |
130 | VENDOR_NONE equ 0 |
128 | VENDOR_WD equ 1 |
131 | VENDOR_WD equ 1 |
129 | VENDOR_NOVELL equ 2 |
132 | VENDOR_NOVELL equ 2 |
130 | VENDOR_3COM equ 3 |
133 | VENDOR_3COM equ 3 |
131 | 134 | ||
132 | NE_ASIC_OFFSET equ 0x10 |
135 | NE_ASIC_OFFSET equ 0x10 |
133 | NE_RESET equ 0x0F ; Used to reset card |
136 | NE_RESET equ 0x0F ; Used to reset card |
134 | NE_DATA equ 0x00 ; Used to read/write NIC mem |
137 | NE_DATA equ 0x00 ; Used to read/write NIC mem |
135 | 138 | ||
136 | MEM_8192 equ 32 |
139 | MEM_8192 equ 32 |
137 | MEM_16384 equ 64 |
140 | MEM_16384 equ 64 |
138 | MEM_32768 equ 128 |
141 | MEM_32768 equ 128 |
139 | 142 | ||
140 | ISA_MAX_ADDR equ 0x400 |
143 | ISA_MAX_ADDR equ 0x400 |
141 | 144 | ||
142 | uglobal |
145 | uglobal |
143 | eth_flags: db 0 |
146 | eth_flags: db 0 |
144 | eth_vendor: db 0 |
147 | eth_vendor: db 0 |
145 | eth_nic_base: dw 0 |
148 | eth_nic_base: dw 0 |
146 | eth_asic_base: dw 0 |
149 | eth_asic_base: dw 0 |
147 | eth_memsize: db 0 |
150 | eth_memsize: db 0 |
148 | eth_rx_start: db 0 |
151 | eth_rx_start: db 0 |
149 | eth_tx_start: db 0 |
152 | eth_tx_start: db 0 |
150 | eth_bmem: dd 0 |
153 | eth_bmem: dd 0 |
151 | eth_rmem: dd 0 |
154 | eth_rmem: dd 0 |
152 | romdata: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
155 | romdata: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
153 | endg |
156 | endg |
154 | 157 | ||
155 | iglobal |
158 | iglobal |
156 | test_data: db 'NE*000 memory',0 |
159 | test_data: db 'NE*000 memory',0 |
157 | test_buffer: db ' ',0 |
160 | test_buffer: db ' ',0 |
158 | endg |
161 | endg |
159 | 162 | ||
160 | uglobal |
163 | uglobal |
161 | eth_type: dw 0 |
164 | eth_type: dw 0 |
162 | pkthdr: db 0,0,0,0 ; status, next, (short) len |
165 | pkthdr: db 0,0,0,0 ; status, next, (short) len |
163 | pktoff: dw 0 |
166 | pktoff: dw 0 |
164 | eth_rx_data_ptr: dd 0 |
167 | eth_rx_data_ptr: dd 0 |
165 | eth_tmp_len: dw 0 |
168 | eth_tmp_len: dw 0 |
166 | endg |
169 | endg |
167 | 170 | ||
168 | 171 | ||
169 | 172 | ||
170 | ;*************************************************************************** |
173 | ;*************************************************************************** |
171 | ; Function |
174 | ; Function |
172 | ; eth_pio_read |
175 | ; eth_pio_read |
173 | ; |
176 | ; |
174 | ; Description |
177 | ; Description |
175 | ; Read a frame from the ethernet card via Programmed I/O |
178 | ; Read a frame from the ethernet card via Programmed I/O |
176 | ; src in ebx |
179 | ; src in ebx |
177 | ; cnt in ecx |
180 | ; cnt in ecx |
178 | ; dst in edi |
181 | ; dst in edi |
179 | ;*************************************************************************** |
182 | ;*************************************************************************** |
180 | eth_pio_read: |
183 | eth_pio_read: |
181 | mov al, [eth_flags] |
184 | mov al, [eth_flags] |
182 | and al, FLAG_16BIT |
185 | and al, FLAG_16BIT |
183 | cmp al, 0 |
186 | cmp al, 0 |
184 | je epr_001 |
187 | je epr_001 |
185 | 188 | ||
186 | inc ecx |
189 | inc ecx |
187 | and ecx, 0xFFFFFFFE |
190 | and ecx, 0xFFFFFFFE |
188 | 191 | ||
189 | epr_001: |
192 | epr_001: |
190 | mov al, D8390_COMMAND_RD2_STA |
193 | mov al, D8390_COMMAND_RD2_STA |
191 | mov dx, [eth_nic_base] |
194 | mov dx, [eth_nic_base] |
192 | add dx, D8390_P0_COMMAND |
195 | add dx, D8390_P0_COMMAND |
193 | out dx, al |
196 | out dx, al |
194 | 197 | ||
195 | mov al, cl |
198 | mov al, cl |
196 | mov dx, [eth_nic_base] |
199 | mov dx, [eth_nic_base] |
197 | add dx, D8390_P0_RBCR0 |
200 | add dx, D8390_P0_RBCR0 |
198 | out dx, al |
201 | out dx, al |
199 | 202 | ||
200 | mov al, ch |
203 | mov al, ch |
201 | mov dx, [eth_nic_base] |
204 | mov dx, [eth_nic_base] |
202 | add dx, D8390_P0_RBCR1 |
205 | add dx, D8390_P0_RBCR1 |
203 | out dx, al |
206 | out dx, al |
204 | 207 | ||
205 | mov al, bl |
208 | mov al, bl |
206 | mov dx, [eth_nic_base] |
209 | mov dx, [eth_nic_base] |
207 | add dx, D8390_P0_RSAR0 |
210 | add dx, D8390_P0_RSAR0 |
208 | out dx, al |
211 | out dx, al |
209 | 212 | ||
210 | mov al, bh |
213 | mov al, bh |
211 | mov dx, [eth_nic_base] |
214 | mov dx, [eth_nic_base] |
212 | add dx, D8390_P0_RSAR1 |
215 | add dx, D8390_P0_RSAR1 |
213 | out dx, al |
216 | out dx, al |
214 | 217 | ||
215 | mov al, D8390_COMMAND_RD0_STA |
218 | mov al, D8390_COMMAND_RD0_STA |
216 | mov dx, [eth_nic_base] |
219 | mov dx, [eth_nic_base] |
217 | add dx, D8390_P0_COMMAND |
220 | add dx, D8390_P0_COMMAND |
218 | out dx, al |
221 | out dx, al |
219 | 222 | ||
220 | mov dx, [eth_asic_base] |
223 | mov dx, [eth_asic_base] |
221 | add dx, ASIC_PIO |
224 | add dx, ASIC_PIO |
222 | 225 | ||
223 | mov al, [eth_flags] |
226 | mov al, [eth_flags] |
224 | and al, FLAG_16BIT |
227 | and al, FLAG_16BIT |
225 | cmp al, 0 |
228 | cmp al, 0 |
226 | je epr_003 |
229 | je epr_003 |
227 | 230 | ||
228 | shr ecx, 1 |
231 | shr ecx, 1 |
229 | 232 | ||
230 | epr_002: |
233 | epr_002: |
231 | ; 2 bytes at a time |
234 | ; 2 bytes at a time |
232 | in ax, dx |
235 | in ax, dx |
233 | mov [edi], ax |
236 | mov [edi], ax |
234 | add edi, 2 |
237 | add edi, 2 |
235 | loop epr_002 |
238 | loop epr_002 |
236 | ret |
239 | ret |
237 | 240 | ||
238 | epr_003: |
241 | epr_003: |
239 | ; 1 byte at a time |
242 | ; 1 byte at a time |
240 | in al, dx |
243 | in al, dx |
241 | mov [edi], al |
244 | mov [edi], al |
242 | inc edi |
245 | inc edi |
243 | loop epr_003 |
246 | loop epr_003 |
244 | ret |
247 | ret |
245 | 248 | ||
246 | 249 | ||
247 | 250 | ||
248 | 251 | ||
249 | ;*************************************************************************** |
252 | ;*************************************************************************** |
250 | ; Function |
253 | ; Function |
251 | ; eth_pio_write |
254 | ; eth_pio_write |
252 | ; |
255 | ; |
253 | ; Description |
256 | ; Description |
254 | ; writes a frame to the ethernet card via Programmed I/O |
257 | ; writes a frame to the ethernet card via Programmed I/O |
255 | ; dst in ebx |
258 | ; dst in ebx |
256 | ; cnt in ecx |
259 | ; cnt in ecx |
257 | ; src in esi |
260 | ; src in esi |
258 | ;*************************************************************************** |
261 | ;*************************************************************************** |
259 | eth_pio_write: |
262 | eth_pio_write: |
260 | mov al, [eth_flags] |
263 | mov al, [eth_flags] |
261 | and al, FLAG_16BIT |
264 | and al, FLAG_16BIT |
262 | cmp al, 0 |
265 | cmp al, 0 |
263 | je epw_001 |
266 | je epw_001 |
264 | 267 | ||
265 | inc ecx |
268 | inc ecx |
266 | and ecx, 0xFFFFFFFE |
269 | and ecx, 0xFFFFFFFE |
267 | 270 | ||
268 | epw_001: |
271 | epw_001: |
269 | mov al, D8390_COMMAND_RD2_STA |
272 | mov al, D8390_COMMAND_RD2_STA |
270 | mov dx, [eth_nic_base] |
273 | mov dx, [eth_nic_base] |
271 | add dx, D8390_P0_COMMAND |
274 | add dx, D8390_P0_COMMAND |
272 | out dx, al |
275 | out dx, al |
273 | 276 | ||
274 | mov al, D8390_ISR_RDC |
277 | mov al, D8390_ISR_RDC |
275 | mov dx, [eth_nic_base] |
278 | mov dx, [eth_nic_base] |
276 | add dx, D8390_P0_ISR |
279 | add dx, D8390_P0_ISR |
277 | out dx, al |
280 | out dx, al |
278 | 281 | ||
279 | 282 | ||
280 | mov al, cl |
283 | mov al, cl |
281 | mov dx, [eth_nic_base] |
284 | mov dx, [eth_nic_base] |
282 | add dx, D8390_P0_RBCR0 |
285 | add dx, D8390_P0_RBCR0 |
283 | out dx, al |
286 | out dx, al |
284 | 287 | ||
285 | mov al, ch |
288 | mov al, ch |
286 | mov dx, [eth_nic_base] |
289 | mov dx, [eth_nic_base] |
287 | add dx, D8390_P0_RBCR1 |
290 | add dx, D8390_P0_RBCR1 |
288 | out dx, al |
291 | out dx, al |
289 | 292 | ||
290 | mov al, bl |
293 | mov al, bl |
291 | mov dx, [eth_nic_base] |
294 | mov dx, [eth_nic_base] |
292 | add dx, D8390_P0_RSAR0 |
295 | add dx, D8390_P0_RSAR0 |
293 | out dx, al |
296 | out dx, al |
294 | 297 | ||
295 | mov al, bh |
298 | mov al, bh |
296 | mov dx, [eth_nic_base] |
299 | mov dx, [eth_nic_base] |
297 | add dx, D8390_P0_RSAR1 |
300 | add dx, D8390_P0_RSAR1 |
298 | out dx, al |
301 | out dx, al |
299 | 302 | ||
300 | mov al, D8390_COMMAND_RD1_STA |
303 | mov al, D8390_COMMAND_RD1_STA |
301 | mov dx, [eth_nic_base] |
304 | mov dx, [eth_nic_base] |
302 | add dx, D8390_P0_COMMAND |
305 | add dx, D8390_P0_COMMAND |
303 | out dx, al |
306 | out dx, al |
304 | 307 | ||
305 | mov dx, [eth_asic_base] |
308 | mov dx, [eth_asic_base] |
306 | add dx, ASIC_PIO |
309 | add dx, ASIC_PIO |
307 | 310 | ||
308 | mov al, [eth_flags] |
311 | mov al, [eth_flags] |
309 | and al, FLAG_16BIT |
312 | and al, FLAG_16BIT |
310 | cmp al, 0 |
313 | cmp al, 0 |
311 | je epw_003 |
314 | je epw_003 |
312 | 315 | ||
313 | shr ecx, 1 |
316 | shr ecx, 1 |
314 | 317 | ||
315 | epw_002: |
318 | epw_002: |
316 | ; 2 bytes at a time |
319 | ; 2 bytes at a time |
317 | mov ax, [esi] |
320 | mov ax, [esi] |
318 | add esi, 2 |
321 | add esi, 2 |
319 | out dx, ax |
322 | out dx, ax |
320 | 323 | ||
321 | loop epw_002 |
324 | loop epw_002 |
322 | jmp epw_004 |
325 | jmp epw_004 |
323 | 326 | ||
324 | epw_003: |
327 | epw_003: |
325 | ; 1 byte at a time |
328 | ; 1 byte at a time |
326 | mov al, [esi] |
329 | mov al, [esi] |
327 | inc esi |
330 | inc esi |
328 | out dx, al |
331 | out dx, al |
329 | loop epw_003 |
332 | loop epw_003 |
330 | 333 | ||
331 | epw_004: |
334 | epw_004: |
332 | mov dx, [eth_nic_base] |
335 | mov dx, [eth_nic_base] |
333 | add dx, D8390_P0_ISR |
336 | add dx, D8390_P0_ISR |
334 | 337 | ||
335 | epw_005: |
338 | epw_005: |
336 | in al, dx |
339 | in al, dx |
337 | and al, D8390_ISR_RDC |
340 | and al, D8390_ISR_RDC |
338 | cmp al, D8390_ISR_RDC |
341 | cmp al, D8390_ISR_RDC |
339 | jne epw_005 |
342 | jne epw_005 |
340 | 343 | ||
341 | ret |
344 | ret |
342 | 345 | ||
343 | 346 | ||
344 | 347 | ||
345 | ;*************************************************************************** |
348 | ;*************************************************************************** |
346 | ; Function |
349 | ; Function |
347 | ; rtl8029_reset |
350 | ; rtl8029_reset |
348 | ; Description |
351 | ; Description |
349 | ; Place the chip (ie, the ethernet card) into a virgin state |
352 | ; Place the chip (ie, the ethernet card) into a virgin state |
350 | ; No inputs |
353 | ; No inputs |
351 | ; All registers destroyed |
354 | ; All registers destroyed |
352 | ; |
355 | ; |
353 | ;*************************************************************************** |
356 | ;*************************************************************************** |
354 | rtl8029_reset: |
357 | rtl8029_reset: |
355 | mov bx, [eth_nic_base] |
358 | mov bx, [eth_nic_base] |
356 | 359 | ||
357 | mov dx, bx |
360 | mov dx, bx |
358 | add dx, D8390_P0_COMMAND |
361 | add dx, D8390_P0_COMMAND |
359 | mov al, D8390_COMMAND_PS0_RD2_STP |
362 | mov al, D8390_COMMAND_PS0_RD2_STP |
360 | out dx, al |
363 | out dx, al |
361 | 364 | ||
362 | mov dx, bx |
365 | mov dx, bx |
363 | add dx, D8390_P0_DCR |
366 | add dx, D8390_P0_DCR |
364 | mov al, [eth_flags] |
367 | mov al, [eth_flags] |
365 | and al, FLAG_16BIT |
368 | and al, FLAG_16BIT |
366 | cmp al, FLAG_16BIT |
369 | cmp al, FLAG_16BIT |
367 | jne nsr_001 |
370 | jne nsr_001 |
368 | 371 | ||
369 | mov al, 0x49 |
372 | mov al, 0x49 |
370 | jmp nsr_002 |
373 | jmp nsr_002 |
371 | 374 | ||
372 | nsr_001: |
375 | nsr_001: |
373 | mov al, 0x48 |
376 | mov al, 0x48 |
374 | 377 | ||
375 | nsr_002: |
378 | nsr_002: |
376 | out dx, al |
379 | out dx, al |
377 | 380 | ||
378 | xor al, al |
381 | xor al, al |
379 | 382 | ||
380 | mov dx, bx |
383 | mov dx, bx |
381 | add dx, D8390_P0_RBCR0 |
384 | add dx, D8390_P0_RBCR0 |
382 | out dx, al |
385 | out dx, al |
383 | 386 | ||
384 | mov dx, bx |
387 | mov dx, bx |
385 | add dx, D8390_P0_RBCR1 |
388 | add dx, D8390_P0_RBCR1 |
386 | out dx, al |
389 | out dx, al |
387 | 390 | ||
388 | mov dx, bx |
391 | mov dx, bx |
389 | add dx, D8390_P0_RCR |
392 | add dx, D8390_P0_RCR |
390 | mov al, 0x20 |
393 | mov al, 0x20 |
391 | out dx, al |
394 | out dx, al |
392 | 395 | ||
393 | mov dx, bx |
396 | mov dx, bx |
394 | add dx, D8390_P0_TCR |
397 | add dx, D8390_P0_TCR |
395 | mov al, 2 |
398 | mov al, 2 |
396 | out dx, al |
399 | out dx, al |
397 | 400 | ||
398 | mov dx, bx |
401 | mov dx, bx |
399 | add dx, D8390_P0_TPSR |
402 | add dx, D8390_P0_TPSR |
400 | mov al, [eth_tx_start] |
403 | mov al, [eth_tx_start] |
401 | out dx, al |
404 | out dx, al |
402 | 405 | ||
403 | mov dx, bx |
406 | mov dx, bx |
404 | add dx, D8390_P0_PSTART |
407 | add dx, D8390_P0_PSTART |
405 | mov al, [eth_rx_start] |
408 | mov al, [eth_rx_start] |
406 | out dx, al |
409 | out dx, al |
407 | 410 | ||
408 | mov dx, bx |
411 | mov dx, bx |
409 | add dx, D8390_P0_PSTOP |
412 | add dx, D8390_P0_PSTOP |
410 | mov al, [eth_memsize] |
413 | mov al, [eth_memsize] |
411 | out dx, al |
414 | out dx, al |
412 | 415 | ||
413 | mov dx, bx |
416 | mov dx, bx |
414 | add dx, D8390_P0_BOUND |
417 | add dx, D8390_P0_BOUND |
415 | mov al, [eth_memsize] |
418 | mov al, [eth_memsize] |
416 | dec al |
419 | dec al |
417 | out dx, al |
420 | out dx, al |
418 | 421 | ||
419 | mov dx, bx |
422 | mov dx, bx |
420 | add dx, D8390_P0_ISR |
423 | add dx, D8390_P0_ISR |
421 | mov al, 0xff |
424 | mov al, 0xff |
422 | out dx, al |
425 | out dx, al |
423 | 426 | ||
424 | mov dx, bx |
427 | mov dx, bx |
425 | add dx, D8390_P0_IMR |
428 | add dx, D8390_P0_IMR |
426 | xor al, al |
429 | xor al, al |
427 | out dx, al |
430 | out dx, al |
428 | 431 | ||
429 | mov dx, bx |
432 | mov dx, bx |
430 | add dx, D8390_P0_COMMAND |
433 | add dx, D8390_P0_COMMAND |
431 | mov al, D8390_COMMAND_PS1_RD2_STP |
434 | mov al, D8390_COMMAND_PS1_RD2_STP |
432 | out dx, al |
435 | out dx, al |
433 | 436 | ||
434 | mov dx, bx |
437 | mov dx, bx |
435 | add dx, D8390_P1_PAR0 |
438 | add dx, D8390_P1_PAR0 |
436 | mov esi, node_addr |
439 | mov esi, node_addr |
437 | mov ecx, ETH_ALEN |
440 | mov ecx, ETH_ALEN |
438 | 441 | ||
439 | nsr_003: |
442 | nsr_003: |
440 | mov al, [esi] |
443 | mov al, [esi] |
441 | out dx, al |
444 | out dx, al |
442 | 445 | ||
443 | inc esi |
446 | inc esi |
444 | inc dx |
447 | inc dx |
445 | loop nsr_003 |
448 | loop nsr_003 |
446 | 449 | ||
447 | mov dx, bx |
450 | mov dx, bx |
448 | add dx, D8390_P1_MAR0 |
451 | add dx, D8390_P1_MAR0 |
449 | mov ecx, ETH_ALEN |
452 | mov ecx, ETH_ALEN |
450 | 453 | ||
451 | mov al, 0xff |
454 | mov al, 0xff |
452 | 455 | ||
453 | nsr_004: |
456 | nsr_004: |
454 | out dx, al |
457 | out dx, al |
455 | inc dx |
458 | inc dx |
456 | loop nsr_004 |
459 | loop nsr_004 |
457 | 460 | ||
458 | mov dx, bx |
461 | mov dx, bx |
459 | add dx, D8390_P1_CURR |
462 | add dx, D8390_P1_CURR |
460 | mov al, [eth_rx_start] |
463 | mov al, [eth_rx_start] |
461 | out dx, al |
464 | out dx, al |
462 | 465 | ||
463 | mov dx, bx |
466 | mov dx, bx |
464 | add dx, D8390_P0_COMMAND |
467 | add dx, D8390_P0_COMMAND |
465 | mov al, D8390_COMMAND_PS0_RD2_STA |
468 | mov al, D8390_COMMAND_PS0_RD2_STA |
466 | out dx, al |
469 | out dx, al |
467 | 470 | ||
468 | mov dx, bx |
471 | mov dx, bx |
469 | add dx, D8390_P0_ISR |
472 | add dx, D8390_P0_ISR |
470 | mov al, 0xff |
473 | mov al, 0xff |
471 | out dx, al |
474 | out dx, al |
472 | 475 | ||
473 | mov dx, bx |
476 | mov dx, bx |
474 | add dx, D8390_P0_TCR |
477 | add dx, D8390_P0_TCR |
475 | mov al, 0 |
478 | mov al, 0 |
476 | out dx, al |
479 | out dx, al |
477 | 480 | ||
478 | mov dx, bx |
481 | mov dx, bx |
479 | add dx, D8390_P0_RCR |
482 | add dx, D8390_P0_RCR |
480 | mov al, 4 |
483 | mov al, 4 |
481 | out dx, al |
484 | out dx, al |
482 | 485 | ||
483 | ret |
486 | ret |
484 | 487 | ||
485 | 488 | ||
486 | 489 | ||
487 | ;*************************************************************************** |
490 | ;*************************************************************************** |
488 | ; Function |
491 | ; Function |
489 | ; rtl8029_probe |
492 | ; rtl8029_probe |
490 | ; Description |
493 | ; Description |
491 | ; Searches for an ethernet card, enables it and clears the rx buffer |
494 | ; Searches for an ethernet card, enables it and clears the rx buffer |
492 | ; If a card was found, it enables the ethernet -> TCPIP link |
495 | ; If a card was found, it enables the ethernet -> TCPIP link |
493 | ; |
496 | ; |
494 | ;*************************************************************************** |
497 | ;*************************************************************************** |
495 | rtl8029_probe: |
498 | rtl8029_probe: |
496 | mov eax, [io_addr] |
499 | mov eax, [io_addr] |
497 | mov [eth_nic_base], ax ; The IO address space is 16 bit only |
500 | mov [eth_nic_base], ax ; The IO address space is 16 bit only |
498 | 501 | ||
499 | mov al, VENDOR_NONE |
502 | mov al, VENDOR_NONE |
500 | mov [eth_vendor], al |
503 | mov [eth_vendor], al |
501 | 504 | ||
502 | mov al, [eth_vendor] |
505 | mov al, [eth_vendor] |
503 | cmp al, VENDOR_NONE |
506 | cmp al, VENDOR_NONE |
504 | 507 | ||
505 | jne ep_check_have_vendor |
508 | jne ep_check_have_vendor |
506 | xor eax, eax |
509 | xor eax, eax |
507 | mov [eth_bmem], eax |
510 | mov [eth_bmem], eax |
508 | 511 | ||
509 | mov al, FLAG_PIO |
512 | mov al, FLAG_PIO |
510 | mov [eth_flags], al |
513 | mov [eth_flags], al |
511 | 514 | ||
512 | mov ax, [eth_nic_base] |
515 | mov ax, [eth_nic_base] |
513 | add ax, NE_ASIC_OFFSET |
516 | add ax, NE_ASIC_OFFSET |
514 | mov [eth_asic_base], ax |
517 | mov [eth_asic_base], ax |
515 | 518 | ||
516 | mov al, MEM_16384 |
519 | mov al, MEM_16384 |
517 | mov [eth_memsize], al |
520 | mov [eth_memsize], al |
518 | 521 | ||
519 | mov al, 32 |
522 | mov al, 32 |
520 | mov [eth_tx_start], al |
523 | mov [eth_tx_start], al |
521 | 524 | ||
522 | add al, D8390_TXBUF_SIZE |
525 | add al, D8390_TXBUF_SIZE |
523 | mov [eth_rx_start], al |
526 | mov [eth_rx_start], al |
524 | 527 | ||
525 | mov dx, [eth_asic_base] |
528 | mov dx, [eth_asic_base] |
526 | add dx, NE_RESET |
529 | add dx, NE_RESET |
527 | 530 | ||
528 | in al, dx |
531 | in al, dx |
529 | out dx, al |
532 | out dx, al |
530 | 533 | ||
531 | in al, 0x84 |
534 | in al, 0x84 |
532 | 535 | ||
533 | mov bx, [eth_nic_base] |
536 | mov bx, [eth_nic_base] |
534 | 537 | ||
535 | mov dx, bx |
538 | mov dx, bx |
536 | add dx, D8390_P0_COMMAND |
539 | add dx, D8390_P0_COMMAND |
537 | mov al, D8390_COMMAND_RD2_STP |
540 | mov al, D8390_COMMAND_RD2_STP |
538 | out dx, al |
541 | out dx, al |
539 | 542 | ||
540 | mov dx, bx |
543 | mov dx, bx |
541 | add dx, D8390_P0_RCR |
544 | add dx, D8390_P0_RCR |
542 | mov al, D8390_RCR_MON |
545 | mov al, D8390_RCR_MON |
543 | out dx, al |
546 | out dx, al |
544 | 547 | ||
545 | mov dx, bx |
548 | mov dx, bx |
546 | add dx, D8390_P0_DCR |
549 | add dx, D8390_P0_DCR |
547 | mov al, D8390_DCR_FT1_LS |
550 | mov al, D8390_DCR_FT1_LS |
548 | out dx, al |
551 | out dx, al |
549 | 552 | ||
550 | mov dx, bx |
553 | mov dx, bx |
551 | add dx, D8390_P0_PSTART |
554 | add dx, D8390_P0_PSTART |
552 | mov al, MEM_8192 |
555 | mov al, MEM_8192 |
553 | out dx, al |
556 | out dx, al |
554 | 557 | ||
555 | mov dx, bx |
558 | mov dx, bx |
556 | add dx, D8390_P0_PSTOP |
559 | add dx, D8390_P0_PSTOP |
557 | mov al, MEM_16384 |
560 | mov al, MEM_16384 |
558 | out dx, al |
561 | out dx, al |
559 | 562 | ||
560 | mov esi, test_data |
563 | mov esi, test_data |
561 | mov ebx, 8192 |
564 | mov ebx, 8192 |
562 | mov ecx, 14 |
565 | mov ecx, 14 |
563 | call eth_pio_write |
566 | call eth_pio_write |
564 | 567 | ||
565 | mov ebx, 8192 |
568 | mov ebx, 8192 |
566 | mov ecx, 14 |
569 | mov ecx, 14 |
567 | mov edi, test_buffer |
570 | mov edi, test_buffer |
568 | call eth_pio_read |
571 | call eth_pio_read |
569 | 572 | ||
570 | mov esi, test_buffer |
573 | mov esi, test_buffer |
571 | mov edi, test_data |
574 | mov edi, test_data |
572 | mov ecx, 13 |
575 | mov ecx, 13 |
573 | cld |
576 | cld |
574 | rep cmpsb |
577 | rep cmpsb |
575 | 578 | ||
576 | je ep_set_vendor |
579 | je ep_set_vendor |
577 | 580 | ||
578 | mov al, [eth_flags] |
581 | mov al, [eth_flags] |
579 | or al, FLAG_16BIT |
582 | or al, FLAG_16BIT |
580 | mov [eth_flags], al |
583 | mov [eth_flags], al |
581 | 584 | ||
582 | mov al, MEM_32768 |
585 | mov al, MEM_32768 |
583 | mov [eth_memsize], al |
586 | mov [eth_memsize], al |
584 | 587 | ||
585 | mov al, 64 |
588 | mov al, 64 |
586 | mov [eth_tx_start], al |
589 | mov [eth_tx_start], al |
587 | 590 | ||
588 | add al, D8390_TXBUF_SIZE |
591 | add al, D8390_TXBUF_SIZE |
589 | mov [eth_rx_start], al |
592 | mov [eth_rx_start], al |
590 | 593 | ||
591 | mov bx, [eth_nic_base] |
594 | mov bx, [eth_nic_base] |
592 | 595 | ||
593 | mov dx, bx |
596 | mov dx, bx |
594 | add dx, D8390_P0_DCR |
597 | add dx, D8390_P0_DCR |
595 | mov al, D8390_DCR_WTS_FT1_LS |
598 | mov al, D8390_DCR_WTS_FT1_LS |
596 | out dx, al |
599 | out dx, al |
597 | 600 | ||
598 | mov dx, bx |
601 | mov dx, bx |
599 | add dx, D8390_P0_PSTART |
602 | add dx, D8390_P0_PSTART |
600 | mov al, MEM_16384 |
603 | mov al, MEM_16384 |
601 | out dx, al |
604 | out dx, al |
602 | 605 | ||
603 | mov dx, bx |
606 | mov dx, bx |
604 | add dx, D8390_P0_PSTOP |
607 | add dx, D8390_P0_PSTOP |
605 | mov al, MEM_32768 |
608 | mov al, MEM_32768 |
606 | out dx, al |
609 | out dx, al |
607 | 610 | ||
608 | mov esi, test_data |
611 | mov esi, test_data |
609 | mov ebx, 16384 |
612 | mov ebx, 16384 |
610 | mov ecx, 14 |
613 | mov ecx, 14 |
611 | call eth_pio_write |
614 | call eth_pio_write |
612 | 615 | ||
613 | mov ebx, 16384 |
616 | mov ebx, 16384 |
614 | mov ecx, 14 |
617 | mov ecx, 14 |
615 | mov edi, test_buffer |
618 | mov edi, test_buffer |
616 | call eth_pio_read |
619 | call eth_pio_read |
617 | 620 | ||
618 | mov esi, test_buffer |
621 | mov esi, test_buffer |
619 | mov edi, test_data |
622 | mov edi, test_data |
620 | mov ecx, 13 |
623 | mov ecx, 13 |
621 | cld |
624 | cld |
622 | rep cmpsb |
625 | rep cmpsb |
623 | 626 | ||
624 | ep_set_vendor: |
627 | ep_set_vendor: |
625 | ; this bit is odd - probably left over from my hacking |
628 | ; this bit is odd - probably left over from my hacking |
626 | mov ax, [eth_nic_base] |
629 | mov ax, [eth_nic_base] |
627 | cmp ax, 0 |
630 | cmp ax, 0 |
628 | je rtl8029_exit |
631 | je rtl8029_exit |
629 | cmp ax, ISA_MAX_ADDR |
632 | cmp ax, ISA_MAX_ADDR |
630 | jbe ep_001 |
633 | jbe ep_001 |
631 | mov al, [eth_flags] |
634 | mov al, [eth_flags] |
632 | or al, FLAG_16BIT |
635 | or al, FLAG_16BIT |
633 | mov [eth_flags], al |
636 | mov [eth_flags], al |
634 | 637 | ||
635 | ep_001: |
638 | ep_001: |
636 | mov al, VENDOR_NOVELL |
639 | mov al, VENDOR_NOVELL |
637 | mov [eth_vendor], al |
640 | mov [eth_vendor], al |
638 | 641 | ||
639 | mov ebx, 0 |
642 | mov ebx, 0 |
640 | mov ecx, 16 |
643 | mov ecx, 16 |
641 | mov edi, romdata |
644 | mov edi, romdata |
642 | call eth_pio_read |
645 | call eth_pio_read |
643 | 646 | ||
644 | 647 | ||
645 | mov ecx, ETH_ALEN |
648 | mov ecx, ETH_ALEN |
646 | mov esi, romdata |
649 | mov esi, romdata |
647 | mov edi, node_addr |
650 | mov edi, node_addr |
648 | 651 | ||
649 | mov bl, [eth_flags] |
652 | mov bl, [eth_flags] |
650 | and bl, FLAG_16BIT |
653 | and bl, FLAG_16BIT |
651 | 654 | ||
652 | ep_002: |
655 | ep_002: |
653 | mov al, [esi] |
656 | mov al, [esi] |
654 | mov [edi], al |
657 | mov [edi], al |
655 | 658 | ||
656 | inc edi |
659 | inc edi |
657 | inc esi |
660 | inc esi |
658 | cmp bl, FLAG_16BIT |
661 | cmp bl, FLAG_16BIT |
659 | jne ep_003 |
662 | jne ep_003 |
660 | 663 | ||
661 | inc esi |
664 | inc esi |
662 | 665 | ||
663 | ep_003: |
666 | ep_003: |
664 | loop ep_002 |
667 | loop ep_002 |
665 | 668 | ||
666 | ep_check_have_vendor: |
669 | ep_check_have_vendor: |
667 | mov al, [eth_vendor] |
670 | mov al, [eth_vendor] |
668 | cmp al, VENDOR_NONE |
671 | cmp al, VENDOR_NONE |
669 | je rtl8029_exit |
672 | je rtl8029_exit |
670 | 673 | ||
671 | cmp al, VENDOR_3COM |
674 | cmp al, VENDOR_3COM |
672 | je ep_reset_card |
675 | je ep_reset_card |
673 | 676 | ||
674 | mov eax, [eth_bmem] |
677 | mov eax, [eth_bmem] |
675 | mov [eth_rmem], eax |
678 | mov [eth_rmem], eax |
676 | 679 | ||
677 | ep_reset_card: |
680 | ep_reset_card: |
678 | ; Reset the card |
681 | ; Reset the card |
679 | call rtl8029_reset |
682 | call rtl8029_reset |
680 | 683 | ||
681 | ; Indicate that we have successfully reset the card |
684 | ; Indicate that we have successfully reset the card |
682 | mov eax, [pci_data] |
685 | mov eax, [pci_data] |
683 | mov [eth_status], eax |
686 | mov [eth_status], eax |
684 | 687 | ||
685 | rtl8029_exit: |
688 | rtl8029_exit: |
686 | ret |
689 | ret |
687 | 690 | ||
688 | 691 | ||
689 | 692 | ||
690 | ;*************************************************************************** |
693 | ;*************************************************************************** |
691 | ; Function |
694 | ; Function |
692 | ; rtl8029_poll |
695 | ; rtl8029_poll |
693 | ; |
696 | ; |
694 | ; Description |
697 | ; Description |
695 | ; Polls the ethernet card for a received packet |
698 | ; Polls the ethernet card for a received packet |
696 | ; Received data, if any, ends up in Ether_buffer |
699 | ; Received data, if any, ends up in Ether_buffer |
697 | ; |
700 | ; |
698 | ;*************************************************************************** |
701 | ;*************************************************************************** |
699 | rtl8029_poll: |
702 | rtl8029_poll: |
700 | mov eax, Ether_buffer |
703 | mov eax, Ether_buffer |
701 | mov [eth_rx_data_ptr], eax |
704 | mov [eth_rx_data_ptr], eax |
702 | 705 | ||
703 | mov bx, [eth_nic_base] |
706 | mov bx, [eth_nic_base] |
704 | 707 | ||
705 | mov dx, bx |
708 | mov dx, bx |
706 | add dx, D8390_P0_RSR |
709 | add dx, D8390_P0_RSR |
707 | in al, dx |
710 | in al, dx |
708 | 711 | ||
709 | and al, D8390_RSTAT_PRX |
712 | and al, D8390_RSTAT_PRX |
710 | cmp al, D8390_RSTAT_PRX |
713 | cmp al, D8390_RSTAT_PRX |
711 | jne nsp_exit |
714 | jne nsp_exit |
712 | 715 | ||
713 | mov dx, bx |
716 | mov dx, bx |
714 | add dx, D8390_P0_BOUND |
717 | add dx, D8390_P0_BOUND |
715 | in al, dx |
718 | in al, dx |
716 | inc al |
719 | inc al |
717 | 720 | ||
718 | cmp al, [eth_memsize] |
721 | cmp al, [eth_memsize] |
719 | jb nsp_001 |
722 | jb nsp_001 |
720 | 723 | ||
721 | mov al, [eth_rx_start] |
724 | mov al, [eth_rx_start] |
722 | 725 | ||
723 | nsp_001: |
726 | nsp_001: |
724 | mov ch, al |
727 | mov ch, al |
725 | 728 | ||
726 | mov dx, bx |
729 | mov dx, bx |
727 | add dx, D8390_P0_COMMAND |
730 | add dx, D8390_P0_COMMAND |
728 | mov al, D8390_COMMAND_PS1 |
731 | mov al, D8390_COMMAND_PS1 |
729 | out dx, al |
732 | out dx, al |
730 | 733 | ||
731 | mov dx, bx |
734 | mov dx, bx |
732 | add dx, D8390_P1_CURR |
735 | add dx, D8390_P1_CURR |
733 | in al, dx ; get current page |
736 | in al, dx ; get current page |
734 | mov cl, al |
737 | mov cl, al |
735 | 738 | ||
736 | mov dx, bx |
739 | mov dx, bx |
737 | add dx, D8390_P0_COMMAND |
740 | add dx, D8390_P0_COMMAND |
738 | mov al, D8390_COMMAND_PS0 |
741 | mov al, D8390_COMMAND_PS0 |
739 | out dx, al |
742 | out dx, al |
740 | 743 | ||
741 | cmp cl, [eth_memsize] |
744 | cmp cl, [eth_memsize] |
742 | jb nsp_002 |
745 | jb nsp_002 |
743 | 746 | ||
744 | mov cl, [eth_rx_start] |
747 | mov cl, [eth_rx_start] |
745 | 748 | ||
746 | nsp_002: |
749 | nsp_002: |
747 | cmp cl, ch |
750 | cmp cl, ch |
748 | je nsp_exit |
751 | je nsp_exit |
749 | 752 | ||
750 | xor ax, ax |
753 | xor ax, ax |
751 | mov ah, ch |
754 | mov ah, ch |
752 | 755 | ||
753 | mov [pktoff], ax |
756 | mov [pktoff], ax |
754 | 757 | ||
755 | mov al, [eth_flags] |
758 | mov al, [eth_flags] |
756 | and al, FLAG_PIO |
759 | and al, FLAG_PIO |
757 | cmp al, FLAG_PIO |
760 | cmp al, FLAG_PIO |
758 | jne nsp_003 |
761 | jne nsp_003 |
759 | 762 | ||
760 | movzx ebx, word [pktoff] |
763 | movzx ebx, word [pktoff] |
761 | mov edi, pkthdr |
764 | mov edi, pkthdr |
762 | mov ecx, 4 |
765 | mov ecx, 4 |
763 | call eth_pio_read |
766 | call eth_pio_read |
764 | jmp nsp_004 |
767 | jmp nsp_004 |
765 | 768 | ||
766 | nsp_003: |
769 | nsp_003: |
767 | mov edi, [eth_rmem] |
770 | mov edi, [eth_rmem] |
768 | movzx eax, word [pktoff] |
771 | movzx eax, word [pktoff] |
769 | add edi, eax |
772 | add edi, eax |
770 | mov eax, [edi] |
773 | mov eax, [edi] |
771 | mov [pkthdr], eax |
774 | mov [pkthdr], eax |
772 | 775 | ||
773 | nsp_004: |
776 | nsp_004: |
774 | mov ax, [pktoff] |
777 | mov ax, [pktoff] |
775 | add ax, 4 |
778 | add ax, 4 |
776 | mov [pktoff], ax |
779 | mov [pktoff], ax |
777 | 780 | ||
778 | mov ax, [pkthdr + 2] |
781 | mov ax, [pkthdr + 2] |
779 | sub ax, 4 |
782 | sub ax, 4 |
780 | 783 | ||
781 | mov [eth_tmp_len], ax |
784 | mov [eth_tmp_len], ax |
782 | 785 | ||
783 | cmp ax, ETH_ZLEN |
786 | cmp ax, ETH_ZLEN |
784 | jb nsp_exit |
787 | jb nsp_exit |
785 | 788 | ||
786 | cmp ax, ETH_FRAME_LEN |
789 | cmp ax, ETH_FRAME_LEN |
787 | ja nsp_exit |
790 | ja nsp_exit |
788 | 791 | ||
789 | mov al, [pkthdr] |
792 | mov al, [pkthdr] |
790 | and al, D8390_RSTAT_PRX |
793 | and al, D8390_RSTAT_PRX |
791 | cmp al, D8390_RSTAT_PRX |
794 | cmp al, D8390_RSTAT_PRX |
792 | jne nsp_exit |
795 | jne nsp_exit |
793 | 796 | ||
794 | ; Right, we can now get the data |
797 | ; Right, we can now get the data |
795 | 798 | ||
796 | mov ax, [eth_tmp_len] |
799 | mov ax, [eth_tmp_len] |
797 | mov [eth_rx_data_len], ax |
800 | mov [eth_rx_data_len], ax |
798 | 801 | ||
799 | xor ebx, ebx |
802 | xor ebx, ebx |
800 | mov bh, [eth_memsize] |
803 | mov bh, [eth_memsize] |
801 | sub bx, [pktoff] |
804 | sub bx, [pktoff] |
802 | 805 | ||
803 | cmp [eth_tmp_len], bx |
806 | cmp [eth_tmp_len], bx |
804 | jbe nsp_005 |
807 | jbe nsp_005 |
805 | 808 | ||
806 | mov al, [eth_flags] |
809 | mov al, [eth_flags] |
807 | and al, FLAG_PIO |
810 | and al, FLAG_PIO |
808 | cmp al, FLAG_PIO |
811 | cmp al, FLAG_PIO |
809 | jne nsp_006 |
812 | jne nsp_006 |
810 | 813 | ||
811 | push ebx |
814 | push ebx |
812 | mov ecx, ebx |
815 | mov ecx, ebx |
813 | xor ebx, ebx |
816 | xor ebx, ebx |
814 | mov bx, [pktoff] |
817 | mov bx, [pktoff] |
815 | mov edi, [eth_rx_data_ptr] |
818 | mov edi, [eth_rx_data_ptr] |
816 | call eth_pio_read |
819 | call eth_pio_read |
817 | pop ebx |
820 | pop ebx |
818 | jmp nsp_007 |
821 | jmp nsp_007 |
819 | 822 | ||
820 | nsp_006: |
823 | nsp_006: |
821 | ; Not implemented, as we are using PIO mode on this card |
824 | ; Not implemented, as we are using PIO mode on this card |
822 | 825 | ||
823 | nsp_007: |
826 | nsp_007: |
824 | xor ax, ax |
827 | xor ax, ax |
825 | mov ah, [eth_rx_start] |
828 | mov ah, [eth_rx_start] |
826 | mov [pktoff], ax |
829 | mov [pktoff], ax |
827 | 830 | ||
828 | mov eax, [eth_rx_data_ptr] |
831 | mov eax, [eth_rx_data_ptr] |
829 | add eax, ebx |
832 | add eax, ebx |
830 | mov [eth_rx_data_ptr], eax |
833 | mov [eth_rx_data_ptr], eax |
831 | 834 | ||
832 | mov ax, [eth_tmp_len] |
835 | mov ax, [eth_tmp_len] |
833 | sub ax, bx |
836 | sub ax, bx |
834 | mov [eth_tmp_len], ax |
837 | mov [eth_tmp_len], ax |
835 | 838 | ||
836 | nsp_005: |
839 | nsp_005: |
837 | mov al, [eth_flags] |
840 | mov al, [eth_flags] |
838 | and al, FLAG_PIO |
841 | and al, FLAG_PIO |
839 | cmp al, FLAG_PIO |
842 | cmp al, FLAG_PIO |
840 | jne nsp_008 |
843 | jne nsp_008 |
841 | 844 | ||
842 | xor ebx, ebx |
845 | xor ebx, ebx |
843 | mov bx, [pktoff] |
846 | mov bx, [pktoff] |
844 | xor ecx, ecx |
847 | xor ecx, ecx |
845 | mov cx, [eth_tmp_len] |
848 | mov cx, [eth_tmp_len] |
846 | mov edi, [eth_rx_data_ptr] |
849 | mov edi, [eth_rx_data_ptr] |
847 | call eth_pio_read |
850 | call eth_pio_read |
848 | jmp nsp_009 |
851 | jmp nsp_009 |
849 | 852 | ||
850 | nsp_008: |
853 | nsp_008: |
851 | ; Not implemented, as we are using PIO mode on this card |
854 | ; Not implemented, as we are using PIO mode on this card |
852 | 855 | ||
853 | nsp_009: |
856 | nsp_009: |
854 | mov al, [pkthdr+1] |
857 | mov al, [pkthdr+1] |
855 | cmp al, [eth_rx_start] |
858 | cmp al, [eth_rx_start] |
856 | jne nsp_010 |
859 | jne nsp_010 |
857 | 860 | ||
858 | mov al, [eth_memsize] |
861 | mov al, [eth_memsize] |
859 | 862 | ||
860 | nsp_010: |
863 | nsp_010: |
861 | mov dx, [eth_nic_base] |
864 | mov dx, [eth_nic_base] |
862 | add dx, D8390_P0_BOUND |
865 | add dx, D8390_P0_BOUND |
863 | dec al |
866 | dec al |
864 | out dx, al |
867 | out dx, al |
865 | 868 | ||
866 | nsp_exit: |
869 | nsp_exit: |
867 | ret |
870 | ret |
868 | 871 | ||
869 | 872 | ||
870 | 873 | ||
871 | ;*************************************************************************** |
874 | ;*************************************************************************** |
872 | ; Function |
875 | ; Function |
873 | ; rtl8029_transmit |
876 | ; rtl8029_transmit |
874 | ; |
877 | ; |
875 | ; Description |
878 | ; Description |
876 | ; Transmits a packet of data via the ethernet card |
879 | ; Transmits a packet of data via the ethernet card |
877 | ; Pointer to 48 bit destination address in edi |
880 | ; Pointer to 48 bit destination address in edi |
878 | ; Type of packet in bx |
881 | ; Type of packet in bx |
879 | ; size of packet in ecx |
882 | ; size of packet in ecx |
880 | ; pointer to packet data in esi |
883 | ; pointer to packet data in esi |
881 | ; |
884 | ; |
882 | ;*************************************************************************** |
885 | ;*************************************************************************** |
883 | rtl8029_transmit: |
886 | rtl8029_transmit: |
884 | mov [eth_type], bx |
887 | mov [eth_type], bx |
885 | 888 | ||
886 | pusha |
889 | pusha |
887 | 890 | ||
888 | mov esi, edi |
891 | mov esi, edi |
889 | xor bx, bx |
892 | xor bx, bx |
890 | mov bh, [eth_tx_start] |
893 | mov bh, [eth_tx_start] |
891 | mov ecx, ETH_ALEN |
894 | mov ecx, ETH_ALEN |
892 | call eth_pio_write |
895 | call eth_pio_write |
893 | 896 | ||
894 | mov esi, node_addr |
897 | mov esi, node_addr |
895 | xor bx, bx |
898 | xor bx, bx |
896 | mov bh, [eth_tx_start] |
899 | mov bh, [eth_tx_start] |
897 | add bx, ETH_ALEN |
900 | add bx, ETH_ALEN |
898 | mov ecx, ETH_ALEN |
901 | mov ecx, ETH_ALEN |
899 | call eth_pio_write |
902 | call eth_pio_write |
900 | 903 | ||
901 | mov esi, eth_type |
904 | mov esi, eth_type |
902 | xor bx, bx |
905 | xor bx, bx |
903 | mov bh, [eth_tx_start] |
906 | mov bh, [eth_tx_start] |
904 | add bx, ETH_ALEN |
907 | add bx, ETH_ALEN |
905 | add bx, ETH_ALEN |
908 | add bx, ETH_ALEN |
906 | mov ecx, 2 |
909 | mov ecx, 2 |
907 | call eth_pio_write |
910 | call eth_pio_write |
908 | 911 | ||
909 | popa |
912 | popa |
910 | 913 | ||
911 | xor bx, bx |
914 | xor bx, bx |
912 | mov bh, [eth_tx_start] |
915 | mov bh, [eth_tx_start] |
913 | add bx, ETH_HLEN |
916 | add bx, ETH_HLEN |
914 | push ecx |
917 | push ecx |
915 | call eth_pio_write |
918 | call eth_pio_write |
916 | pop ecx |
919 | pop ecx |
917 | 920 | ||
918 | add ecx, ETH_HLEN |
921 | add ecx, ETH_HLEN |
919 | cmp ecx, ETH_ZLEN |
922 | cmp ecx, ETH_ZLEN |
920 | jae nst_001 |
923 | jae nst_001 |
921 | 924 | ||
922 | mov ecx, ETH_ZLEN |
925 | mov ecx, ETH_ZLEN |
923 | 926 | ||
924 | nst_001: |
927 | nst_001: |
925 | push ecx |
928 | push ecx |
926 | 929 | ||
927 | mov bx, [eth_nic_base] |
930 | mov bx, [eth_nic_base] |
928 | 931 | ||
929 | mov dx, bx |
932 | mov dx, bx |
930 | add dx, D8390_P0_COMMAND |
933 | add dx, D8390_P0_COMMAND |
931 | mov al, D8390_COMMAND_PS0_RD2_STA |
934 | mov al, D8390_COMMAND_PS0_RD2_STA |
932 | out dx, al |
935 | out dx, al |
933 | 936 | ||
934 | mov dx, bx |
937 | mov dx, bx |
935 | add dx, D8390_P0_TPSR |
938 | add dx, D8390_P0_TPSR |
936 | mov al, [eth_tx_start] |
939 | mov al, [eth_tx_start] |
937 | out dx, al |
940 | out dx, al |
938 | 941 | ||
939 | pop ecx |
942 | pop ecx |
940 | 943 | ||
941 | mov dx, bx |
944 | mov dx, bx |
942 | add dx, D8390_P0_TBCR0 |
945 | add dx, D8390_P0_TBCR0 |
943 | mov al, cl |
946 | mov al, cl |
944 | out dx, al |
947 | out dx, al |
945 | 948 | ||
946 | mov dx, bx |
949 | mov dx, bx |
947 | add dx, D8390_P0_TBCR1 |
950 | add dx, D8390_P0_TBCR1 |
948 | mov al, ch |
951 | mov al, ch |
949 | out dx, al |
952 | out dx, al |
950 | 953 | ||
951 | mov dx, bx |
954 | mov dx, bx |
952 | add dx, D8390_P0_COMMAND |
955 | add dx, D8390_P0_COMMAND |
953 | mov al, D8390_COMMAND_PS0_TXP_RD2_STA |
956 | mov al, D8390_COMMAND_PS0_TXP_RD2_STA |
954 | out dx, al |
957 | out dx, al |
955 | 958 | ||
956 | ret |
959 | ret |