Subversion Repositories Kolibri OS

Rev

Rev 425 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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