Subversion Repositories Kolibri OS

Rev

Rev 431 | Blame | Last modification | View Log | Download | RSS feed

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