⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3c59x.inc

📁 MenuetOS是一个用汇编开发的32/64位PC操作系统
💻 INC
📖 第 1 页 / 共 5 页
字号:
;; Copyright (c) 2004, Endre Kozma <endre.kozma@axelero.hu>;; All rights reserved.;;;; Redistribution  and  use  in  source  and  binary  forms, with or without;; modification, are permitted provided  that  the following  conditions are;; met:;;;; 1. Redistributions of source code must retain the above  copyright notice,;;    this list of conditions and the following disclaimer.;;;; 2. Redistributions  in  binary form  must  reproduce  the above copyright;;    notice, this  list of conditions  and the  following disclaimer in the;;    documentation and/or other  materials  provided with  the distribution.;;;; 3. The name of the author may not be used to  endorse or promote products;;    derived from this software without  specific prior  written permission.;;;; THIS SOFTWARE IS  PROVIDED  BY  THE  AUTHOR  ``AS IS'' AND ANY EXPRESS OR;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES;; OF  MERCHANTABILITY AND FITNESS  FOR A PARTICULAR  PURPOSE ARE DISCLAIMED.;; IN  NO  EVENT  SHALL  THE  AUTHOR  BE  LIABLE  FOR  ANY  DIRECT, INDIRECT,;; INCIDENTAL, SPECIAL, EXEMPLARY, OR  CONSEQUENTIAL DAMAGES (INCLUDING, BUT;; NOT LIMITED TO, PROCUREMENT OF  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,;; DATA, OR  PROFITS; OR  BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON ANY;; THEORY OF  LIABILITY, WHETHER IN  CONTRACT,  STRICT  LIABILITY,  OR  TORT;; (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT OF THE USE OF;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                                                                         ;;;;  3C59X.INC                                                              ;;;;                                                                         ;;;;  Ethernet driver for Menuet OS                                          ;;;;                                                                         ;;;;  Driver for 3Com fast etherlink 3c59x and                               ;;;;         etherlink XL 3c900 and 3c905 cards                              ;;;;  References:                                                            ;;;;    www.3Com.com - data sheets                                           ;;;;    DP83840A.pdf - ethernet physical layer                               ;;;;    3c59x.c - linux driver                                               ;;;;    ethernet driver template by Mike Hibbett                             ;;;;                                                                         ;;;;  Credits                                                                ;;;;   Mike Hibbett,                                                         ;;;;         who kindly supplied me with a 3Com905C-TX-M card                ;;;;                                                                         ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  History;;  =======;;  $Log: 3C59X.INC,v $;;  Revision 1.3  2004/07/11 12:21:12  kozma;;  Support of vortex chips (3c59x) added.;;  Support of 3c920 and 3c982 added.;;  Corrections.;;;;  Revision 1.2  2004/06/12 19:40:20  kozma;;  Function e3c59x_set_available_media added in order to set;;  the default media in case auto detection finds no valid link.;;  Incorrect mii check removed (3c900 Cyclone works now).;;  Cleanups.;;;;  Revision 1.1  2004/06/12 18:27:15  kozma;;  Initial revision;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; comment the next line out if you don't want debug info printed; on the debug board. This option adds a lot of bytes to the driver; so it's worth to comment it out.;        E3C59X_DEBUG    equ 1; forcing full duplex mode makes sense at some cards and link types        E3C59X_FORCE_FD equ 1macro virt_to_dma reg{if defined E3C59X_LINUX        sub     reg, [virt_addr]        add     reg, [dma_addr]end if}macro dma_to_virt reg{if defined E3C59X_LINUX        sub     reg, [dma_addr]        add     reg, [virt_addr]end if}macro zero_to_virt reg{if defined E3C59X_LINUX        add     reg, [virt_addr]end if}macro virt_to_zero reg{if defined E3C59X_LINUX        sub     reg, [virt_addr]end if}macro zero_to_dma reg{if defined E3C59X_LINUX        add     reg, [dma_addr]end if}macro dma_to_zero reg{if defined E3C59X_LINUX        sub     reg, [dma_addr]end if}macro strtbl name, [string]{common        label name dwordforward        local label        dd labelforward        label db string, 0}; Ethernet frame symbols        ETH_ALEN                       equ 6        ETH_HLEN                       equ (2*ETH_ALEN+2)        ETH_ZLEN                       equ 60 ; 60 + 4bytes auto payload for                                              ; mininmum 64bytes frame length; PCI programming        PCI_REG_COMMAND                equ 0x4 ; command register        PCI_REG_STATUS                 equ 0x6 ; status register        PCI_REG_LATENCY                equ 0xd ; latency timer register        PCI_REG_CAP_PTR                equ 0x34 ; capabilities pointer        PCI_REG_CAPABILITY_ID          equ 0x0 ; capapility ID in pm register block        PCI_REG_PM_STATUS              equ 0x4 ; power management status register        PCI_REG_PM_CTRL                equ 0x4 ; power management control register        PCI_BIT_PIO                    equ 0 ; bit0: io space control        PCI_BIT_MMIO                   equ 1 ; bit1: memory space control        PCI_BIT_MASTER                 equ 2 ; bit2: device acts as a PCI master; Registers        E3C59X_REG_POWER_MGMT_CTRL     equ 0x7c        E3C59X_REG_UP_LIST_PTR         equ 0x38        E3C59X_REG_UP_PKT_STATUS       equ 0x30        E3C59X_REG_TX_FREE_THRESH      equ 0x2f        E3C59X_REG_DN_LIST_PTR         equ 0x24        E3C59X_REG_DMA_CTRL            equ 0x20        E3C59X_REG_TX_STATUS           equ 0x1b        E3C59X_REG_RX_STATUS           equ 0x18        E3C59X_REG_TX_DATA             equ 0x10; Common window registers        E3C59X_REG_INT_STATUS          equ 0xe        E3C59X_REG_COMMAND             equ 0xe; Register window 7        E3C59X_REG_MASTER_STATUS       equ 0xc        E3C59X_REG_POWER_MGMT_EVENT    equ 0xc        E3C59X_REG_MASTER_LEN          equ 0x6        E3C59X_REG_VLAN_ETHER_TYPE     equ 0x4        E3C59X_REG_VLAN_MASK           equ 0x0        E3C59X_REG_MASTER_ADDRESS      equ 0x0; Register window 6        E3C59X_REG_BYTES_XMITTED_OK    equ 0xc        E3C59X_REG_BYTES_RCVD_OK       equ 0xa        E3C59X_REG_UPPER_FRAMES_OK     equ 0x9        E3C59X_REG_FRAMES_DEFERRED     equ 0x8        E3C59X_REG_FRAMES_RCVD_OK      equ 0x7        E3C59X_REG_FRAMES_XMITTED_OK   equ 0x6        E3C59X_REG_RX_OVERRUNS         equ 0x5        E3C59X_REG_LATE_COLLISIONS     equ 0x4        E3C59X_REG_SINGLE_COLLISIONS   equ 0x3        E3C59X_REG_MULTIPLE_COLLISIONS equ 0x2        E3C59X_REG_SQE_ERRORS          equ 0x1        E3C59X_REG_CARRIER_LOST        equ 0x0; Register window 5        E3C59X_REG_INDICATION_ENABLE   equ 0xc        E3C59X_REG_INTERRUPT_ENABLE    equ 0xa        E3C59X_REG_TX_RECLAIM_THRESH   equ 0x9        E3C59X_REG_RX_FILTER           equ 0x8        E3C59X_REG_RX_EARLY_THRESH     equ 0x6        E3C59X_REG_TX_START_THRESH     equ 0x0; Register window 4        E3C59X_REG_UPPER_BYTES_OK      equ 0xe        E3C59X_REG_BAD_SSD             equ 0xc        E3C59X_REG_MEDIA_STATUS        equ 0xa        E3C59X_REG_PHYSICAL_MGMT       equ 0x8        E3C59X_REG_NETWORK_DIAGNOSTIC  equ 0x6        E3C59X_REG_FIFO_DIAGNOSTIC     equ 0x4        E3C59X_REG_VCO_DIAGNOSTIC      equ 0x2 ; may not supported; Bits in register window 4        E3C59X_BIT_AUTOSELECT          equ 24; Register window 3        E3C59X_REG_TX_FREE             equ 0xc        E3C59X_REG_RX_FREE             equ 0xa        E3C59X_REG_MEDIA_OPTIONS       equ 0x8        E3C59X_REG_MAC_CONTROL         equ 0x6        E3C59X_REG_MAX_PKT_SIZE        equ 0x4        E3C59X_REG_INTERNAL_CONFIG     equ 0x0; Register window 2        E3C59X_REG_RESET_OPTIONS       equ 0xc        E3C59X_REG_STATION_MASK_HI     equ 0xa        E3C59X_REG_STATION_MASK_MID    equ 0x8        E3C59X_REG_STATION_MASK_LO     equ 0x6        E3C59X_REG_STATION_ADDRESS_HI  equ 0x4        E3C59X_REG_STATION_ADDRESS_MID equ 0x2        E3C59X_REG_STATION_ADDRESS_LO  equ 0x0; Register window 1        E3C59X_REG_TRIGGER_BITS        equ 0xc        E3C59X_REG_SOS_BITS            equ 0xa        E3C59X_REG_WAKE_ON_TIMER       equ 0x8        E3C59X_REG_SMB_RXBYTES         equ 0x7        E3C59X_REG_SMB_DIAG            equ 0x5        E3C59X_REG_SMB_ARB             equ 0x4        E3C59X_REG_SMB_STATUS          equ 0x2        E3C59X_REG_SMB_ADDRESS         equ 0x1        E3C59X_REG_SMB_FIFO_DATA       equ 0x0; Register window 0        E3C59X_REG_EEPROM_DATA         equ 0xc        E3C59X_REG_EEPROM_COMMAND      equ 0xa        E3C59X_REG_BIOS_ROM_DATA       equ 0x8        E3C59X_REG_BIOS_ROM_ADDR       equ 0x4; Physical management bits        E3C59X_BIT_MGMT_DIR            equ 2 ; drive with the data written in mgmtData        E3C59X_BIT_MGMT_DATA           equ 1 ; MII management data bit        E3C59X_BIT_MGMT_CLK            equ 0 ; MII management clock; MII commands        E3C59X_MII_CMD_MASK            equ (1111b shl 10)        E3C59X_MII_CMD_READ            equ (0110b shl 10)        E3C59X_MII_CMD_WRITE           equ (0101b shl 10); MII registers        E3C59X_REG_MII_BMCR            equ 0 ; basic mode control register        E3C59X_REG_MII_BMSR            equ 1 ; basic mode status register        E3C59X_REG_MII_ANAR            equ 4 ; auto negotiation advertisement register        E3C59X_REG_MII_ANLPAR          equ 5 ; auto negotiation link partner ability register        E3C59X_REG_MII_ANER            equ 6 ; auto negotiation expansion register; MII bits        E3C59X_BIT_MII_AUTONEG_COMPLETE     equ 5 ; auto-negotiation complete        E3C59X_BIT_MII_PREAMBLE_SUPPRESSION equ 6; eeprom bits and commands        E3C59X_EEPROM_CMD_READ         equ 0x80        E3C59X_EEPROM_BIT_BUSY         equ 15; eeprom registers        E3C59X_EEPROM_REG_OEM_NODE_ADDR equ 0xa        E3C59X_EEPROM_REG_CAPABILITIES  equ 0x10; Commands for command register        E3C59X_SELECT_REGISTER_WINDOW  equ (1 shl 11)        IS_VORTEX                      equ 0x1        IS_BOOMERANG                   equ 0x2        IS_CYCLONE                     equ 0x4        IS_TORNADO                     equ 0x8        EEPROM_8BIT                    equ 0x10        HAS_PWR_CTRL                   equ 0x20        HAS_MII                        equ 0x40        HAS_NWAY                       equ 0x80        HAS_CB_FNS                     equ 0x100        INVERT_MII_PWR                 equ 0x200        INVERT_LED_PWR                 equ 0x400        MAX_COLLISION_RESET            equ 0x800        EEPROM_OFFSET                  equ 0x1000        HAS_HWCKSM                     equ 0x2000        EXTRA_PREAMBLE                 equ 0x4000        align 4e3c59x_hw_versions:        dw 0x5900, IS_VORTEX ; 3c590 Vortex 10Mbps        dw 0x5920, IS_VORTEX ; 3c592 EISA 10Mbps Demon/Vortex        dw 0x5970, IS_VORTEX ; 3c597 EISA Fast Demon/Vortex        dw 0x5950, IS_VORTEX ; 3c595 Vortex 100baseTx        dw 0x5951, IS_VORTEX ; 3c595 Vortex 100baseT4        dw 0x5952, IS_VORTEX ; 3c595 Vortex 100base-MII        dw 0x9000, IS_BOOMERANG ; 3c900 Boomerang 10baseT        dw 0x9001, IS_BOOMERANG ; 3c900 Boomerang 10Mbps Combo        dw 0x9004, IS_CYCLONE or HAS_NWAY or HAS_HWCKSM ; 3c900 Cyclone 10Mbps TPO        dw 0x9005, IS_CYCLONE or HAS_HWCKSM ; 3c900 Cyclone 10Mbps Combo        dw 0x9006, IS_CYCLONE or HAS_HWCKSM ; 3c900 Cyclone 10Mbps TPC        dw 0x900A, IS_CYCLONE or HAS_HWCKSM ; 3c900B-FL Cyclone 10base-FL        dw 0x9050, IS_BOOMERANG or HAS_MII ; 3c905 Boomerang 100baseTx        dw 0x9051, IS_BOOMERANG or HAS_MII ; 3c905 Boomerang 100baseT4        dw 0x9055, IS_CYCLONE or HAS_NWAY or HAS_HWCKSM or EXTRA_PREAMBLE ; 3c905B Cyclone 100baseTx        dw 0x9058, IS_CYCLONE or HAS_NWAY or HAS_HWCKSM ; 3c905B Cyclone 10/100/BNC        dw 0x905A, IS_CYCLONE or HAS_HWCKSM ; 3c905B-FX Cyclone 100baseFx        dw 0x9200, IS_TORNADO or HAS_NWAY or HAS_HWCKSM ; 3c905C Tornado        dw 0x9800, IS_CYCLONE or HAS_NWAY or HAS_HWCKSM ; 3c980 Cyclone        dw 0x9805, IS_TORNADO or HAS_NWAY or HAS_HWCKSM ; 3c982 Dual Port Server Cyclone        dw 0x7646, IS_CYCLONE or HAS_NWAY or HAS_HWCKSM ; 3cSOHO100-TX Hurricane        dw 0x5055, IS_CYCLONE or EEPROM_8BIT or HAS_HWCKSM ; 3c555 Laptop Hurricane        dw 0x6055, IS_TORNADO or HAS_NWAY or EEPROM_8BIT or HAS_CB_FNS \                              or INVERT_MII_PWR or HAS_HWCKSM ; 3c556 Laptop Tornado        dw 0x6056, IS_TORNADO or HAS_NWAY or EEPROM_OFFSET or HAS_CB_FNS \                              or INVERT_MII_PWR or HAS_HWCKSM ; 3c556B Laptop Hurricane        dw 0x5b57, IS_BOOMERANG or HAS_MII or EEPROM_8BIT ; 3c575 [Megahertz] 10/100 LAN CardBus        dw 0x5057, IS_BOOMERANG or HAS_MII or EEPROM_8BIT ; 3c575 Boomerang CardBus        dw 0x5157, IS_CYCLONE or HAS_NWAY or HAS_CB_FNS or EEPROM_8BIT \                              or INVERT_LED_PWR or HAS_HWCKSM ; 3CCFE575BT Cyclone CardBus        dw 0x5257, IS_TORNADO or HAS_NWAY or HAS_CB_FNS or EEPROM_8BIT or INVERT_MII_PWR \                              or MAX_COLLISION_RESET or HAS_HWCKSM ; 3CCFE575CT Tornado CardBus        dw 0x6560, IS_CYCLONE or HAS_NWAY or HAS_CB_FNS or EEPROM_8BIT or INVERT_MII_PWR \                              or INVERT_LED_PWR or HAS_HWCKSM ; 3CCFE656 Cyclone CardBus        dw 0x6562, IS_CYCLONE or HAS_NWAY or HAS_CB_FNS or EEPROM_8BIT or INVERT_MII_PWR \                              or INVERT_LED_PWR or HAS_HWCKSM ; 3CCFEM656B Cyclone+Winmodem CardBus        dw 0x6564, IS_TORNADO or HAS_NWAY or HAS_CB_FNS or EEPROM_8BIT or INVERT_MII_PWR \                              or MAX_COLLISION_RESET or HAS_HWCKSM ; 3CXFEM656C Tornado+Winmodem CardBus        dw 0x4500, IS_TORNADO or HAS_NWAY or HAS_HWCKSM ; 3c450 HomePNA Tornado        dw 0x9201, IS_TORNADO or HAS_NWAY or HAS_HWCKSM ; 3c920 Tornado        dw 0x1201, IS_TORNADO or HAS_HWCKSM or HAS_NWAY ; 3c982 Hydra Dual Port A        dw 0x1202, IS_TORNADO or HAS_HWCKSM or HAS_NWAY ; 3c982 Hydra Dual Port B        dw 0x9056, IS_CYCLONE or HAS_NWAY or HAS_HWCKSM or EXTRA_PREAMBLE ; 3c905B-T4        dw 0x9210, IS_TORNADO or HAS_NWAY or HAS_HWCKSM ; 3c920B-EMB-WNM TornadoE3C59X_HW_VERSIONS_SIZE= $-e3c59x_hw_versions; RX/TX buffers sizes        E3C59X_MAX_ETH_PKT_SIZE      equ 1536 ; max packet size        E3C59X_NUM_RX_DESC           equ 4 ; a power of 2 number        E3C59X_NUM_TX_DESC           equ 4 ; a power of 2 number        E3C59X_RX_BUFFER_SIZE        equ (E3C59X_MAX_ETH_FRAME_SIZE*E3C59X_NUM_RX_DESC)        E3C59X_TX_BUFFER_SIZE        equ (E3C59X_MAX_ETH_FRAME_SIZE*E3C59X_NUM_TX_DESC); Download Packet Descriptor        E3C59X_DPD_DN_NEXT_PTR       equ 0        E3C59X_DPD_FRAME_START_HDR   equ 4        E3C59X_DPD_DN_FRAG_ADDR      equ 8 ; for packet data        E3C59X_DPD_DN_FRAG_LEN       equ 12 ; for packet data        E3C59X_DPD_SIZE              equ 16 ; a power of 2 number; Upload Packet Descriptor        E3C59X_UPD_UP_NEXT_PTR       equ 0        E3C59X_UPD_PKT_STATUS        equ 4        E3C59X_UPD_UP_FRAG_ADDR      equ 8 ; for packet data        E3C59X_UPD_UP_FRAG_LEN       equ 12 ; for packet data        E3C59X_UPD_SIZE              equ 16; RX/TX buffersif defined E3C59X_LINUX        E3C59X_MAX_ETH_FRAME_SIZE = 160 ; size of ethernet frame + bytes alignment        e3c59x_rx_buff = 0else        E3C59X_MAX_ETH_FRAME_SIZE = 1520 ; size of ethernet frame + bytes alignment        e3c59x_rx_buff = eth_data_startend if        e3c59x_tx_buff = e3c59x_rx_buff+E3C59X_RX_BUFFER_SIZE        e3c59x_dpd_buff = e3c59x_tx_buff+E3C59X_TX_BUFFER_SIZE        e3c59x_upd_buff = e3c59x_dpd_buff+(E3C59X_DPD_SIZE*E3C59X_NUM_TX_DESC)e3c59x_curr_upd: dd 0e3c59x_prev_dpd: dd 0e3c59x_prev_tx_frame: dd 0e3c59x_transmit_function: dd 0e3c59x_receive_function: dd 0e3c59x_ver_id: db 17e3c59x_full_bus_master: db 0e3c59x_has_hwcksm:  db 0e3c59x_preamble: db 0e3c59x_dn_list_ptr_cleared: db 0e3c59x_self_directed_packet: rb 6if defined E3C59X_DEBUGe3c59x_hw_type_str: db "Detected hardware type  : ", 0e3c59x_device_str: db  "Device ID               : 0x"e3c59x_device_id_str: db "ffff", 13, 10, 0e3c59x_vendor_str: db  "Vendor ID               : 0x"e3c59x_vendor_id_str: db "ffff", 13, 10, 0e3c59x_io_info_str: db "IO address              : 0x"e3c59x_io_addr_str: db "ffff", 13, 10, 0e3c59x_mac_info_str: db "MAC address             : "e3c59x_mac_addr_str: db "ff:ff:ff:ff:ff:ff", 13, 10, 0e3c59x_boomerang_str: db " (boomerang)", 13, 10, 0e3c59x_vortex_str: db " (vortex)", 13, 10, 0e3c59x_link_type_str: db "Established link type   : ", 0e3c59x_new_line_str: db 13, 10, 0e3c59x_link_type: dd 0e3c59x_charset: db '0123456789abcdef'strtbl e3c59x_link_str, \        "No valid link type detected", \        "10BASE-T half duplex", \        "10BASE-T full-duplex", \        "100BASE-TX half duplex", \        "100BASE-TX full duplex", \        "100BASE-T4", \        "100BASE-FX", \        "10Mbps AUI", \        "10Mbps COAX (BNC)", \        "miiDevice - not supported"strtbl e3c59x_hw_str, \        "3c590 Vortex 10Mbps", \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -