Subversion Repositories Kolibri OS

Rev

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

  1. $Revision: 425 $
  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
  957.