Subversion Repositories Kolibri OS

Rev

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

  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
  956.