Subversion Repositories Kolibri OS

Rev

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