Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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