Subversion Repositories Kolibri OS

Rev

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

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