Subversion Repositories Kolibri OS

Rev

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

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