175e18fe4SDavid van Moolenbroek /* 3Com 3C90xB/C EtherLink driver, by D.C. van Moolenbroek */ 275e18fe4SDavid van Moolenbroek #ifndef _DRIVERS_NET_3C90X_H 375e18fe4SDavid van Moolenbroek #define _DRIVERS_NET_3C90X_H 475e18fe4SDavid van Moolenbroek 575e18fe4SDavid van Moolenbroek /* The following time values are in microseconds (us). */ 675e18fe4SDavid van Moolenbroek #define XLBC_CMD_TIMEOUT 1000 /* command timeout */ 775e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_TIMEOUT 500 /* EEPROM read timeout */ 875e18fe4SDavid van Moolenbroek #define XLBC_AUTONEG_TIMEOUT 2000000 /* auto-negotiation timeout */ 975e18fe4SDavid van Moolenbroek #define XLBC_RESET_DELAY 1000 /* wait time for reset */ 1075e18fe4SDavid van Moolenbroek #define XLBC_MII_DELAY 1 /* MII cycle response time */ 1175e18fe4SDavid van Moolenbroek 1275e18fe4SDavid van Moolenbroek /* 1375e18fe4SDavid van Moolenbroek * Transmission and receipt memory parameters. The current values allow for 1475e18fe4SDavid van Moolenbroek * buffering of about 32 full-size packets, requiring 48KB of memory for each 1575e18fe4SDavid van Moolenbroek * direction (and thus 96KB in total). For transmission, it is possible to 1675e18fe4SDavid van Moolenbroek * queue many more small packets using the same memory area. For receipt, it 1775e18fe4SDavid van Moolenbroek * is not, since each incoming packet may be of full size. This explains the 1875e18fe4SDavid van Moolenbroek * seemingly huge difference in descriptor counts. 1975e18fe4SDavid van Moolenbroek */ 2075e18fe4SDavid van Moolenbroek #define XLBC_DPD_COUNT 256 /* TX descriptor count */ 2175e18fe4SDavid van Moolenbroek #define XLBC_TXB_SIZE 48128 /* TX buffer size in bytes */ 2275e18fe4SDavid van Moolenbroek #define XLBC_UPD_COUNT 32 /* RX descriptor count */ 2375e18fe4SDavid van Moolenbroek 24*f7df02e7SDavid van Moolenbroek #define XLBC_MIN_PKT_LEN NDEV_ETH_PACKET_MIN 25*f7df02e7SDavid van Moolenbroek #define XLBC_MAX_PKT_LEN NDEV_ETH_PACKET_MAX_TAGGED 2675e18fe4SDavid van Moolenbroek 2775e18fe4SDavid van Moolenbroek #define XLBC_MIN_REG_SIZE 128 /* min. register memory size */ 2875e18fe4SDavid van Moolenbroek 2975e18fe4SDavid van Moolenbroek #define XLBC_CMD_REG 0x0e /* command register */ 3075e18fe4SDavid van Moolenbroek # define XLBC_CMD_GLOBAL_RESET 0x0000 /* perform overall NIC reset */ 3175e18fe4SDavid van Moolenbroek # define XLBC_CMD_RX_RESET 0x2800 /* perform receiver reset */ 3275e18fe4SDavid van Moolenbroek # define XLBC_CMD_TX_RESET 0x5800 /* perform transmitter reset */ 3375e18fe4SDavid van Moolenbroek # define XLBC_CMD_DN_STALL 0x3002 /* stall download */ 3475e18fe4SDavid van Moolenbroek # define XLBC_CMD_DN_UNSTALL 0x3003 /* unstall download */ 3575e18fe4SDavid van Moolenbroek # define XLBC_CMD_TX_ENABLE 0x4800 /* enable transmission */ 3675e18fe4SDavid van Moolenbroek # define XLBC_CMD_RX_ENABLE 0x2000 /* enable receipt */ 3775e18fe4SDavid van Moolenbroek # define XLBC_CMD_SET_FILTER 0x8000 /* set receipt filter */ 3875e18fe4SDavid van Moolenbroek # define XLBC_CMD_UP_UNSTALL 0x3001 /* unstall upload */ 3975e18fe4SDavid van Moolenbroek # define XLBC_CMD_IND_ENABLE 0x7800 /* enable indications */ 4075e18fe4SDavid van Moolenbroek # define XLBC_CMD_INT_ENABLE 0x7000 /* enable interrupts */ 4175e18fe4SDavid van Moolenbroek # define XLBC_CMD_SELECT_WINDOW 0x0800 /* select register window */ 4275e18fe4SDavid van Moolenbroek # define XLBC_CMD_STATS_ENABLE 0xa800 /* enable statistics */ 4375e18fe4SDavid van Moolenbroek 4475e18fe4SDavid van Moolenbroek #define XLBC_FILTER_STATION 0x01 /* packets addressed to NIC */ 4575e18fe4SDavid van Moolenbroek #define XLBC_FILTER_MULTI 0x02 /* multicast packets */ 4675e18fe4SDavid van Moolenbroek #define XLBC_FILTER_BROAD 0x04 /* broadcast packets */ 4775e18fe4SDavid van Moolenbroek #define XLBC_FILTER_PROMISC 0x08 /* all packets (promiscuous) */ 4875e18fe4SDavid van Moolenbroek 4975e18fe4SDavid van Moolenbroek #define XLBC_STATUS_REG 0x0e /* interupt status register */ 5075e18fe4SDavid van Moolenbroek # define XLBC_STATUS_HOST_ERROR 0x0002 /* catastrophic host error */ 5175e18fe4SDavid van Moolenbroek # define XLBC_STATUS_TX_COMPLETE 0x0004 /* packet transmission done */ 5275e18fe4SDavid van Moolenbroek # define XLBC_STATUS_UPDATE_STATS 0x0080 /* statistics need retrieval */ 5375e18fe4SDavid van Moolenbroek # define XLBC_STATUS_LINK_EVENT 0x0100 /* link status change event */ 5475e18fe4SDavid van Moolenbroek # define XLBC_STATUS_DN_COMPLETE 0x0200 /* packet download completed */ 5575e18fe4SDavid van Moolenbroek # define XLBC_STATUS_UP_COMPLETE 0x0400 /* packet upload completed */ 5675e18fe4SDavid van Moolenbroek # define XLBC_STATUS_IN_PROGRESS 0x1000 /* command still in progress */ 5775e18fe4SDavid van Moolenbroek 5875e18fe4SDavid van Moolenbroek /* The mask of interrupts in which we are interested. */ 5975e18fe4SDavid van Moolenbroek #define XLBC_STATUS_MASK \ 6075e18fe4SDavid van Moolenbroek (XLBC_STATUS_HOST_ERROR | \ 6175e18fe4SDavid van Moolenbroek XLBC_STATUS_TX_COMPLETE | \ 6275e18fe4SDavid van Moolenbroek XLBC_STATUS_UPDATE_STATS | \ 6375e18fe4SDavid van Moolenbroek XLBC_STATUS_LINK_EVENT | \ 6475e18fe4SDavid van Moolenbroek XLBC_STATUS_DN_COMPLETE | \ 6575e18fe4SDavid van Moolenbroek XLBC_STATUS_UP_COMPLETE) 6675e18fe4SDavid van Moolenbroek 6775e18fe4SDavid van Moolenbroek #define XLBC_TX_STATUS_REG 0x1b /* TX status register */ 6875e18fe4SDavid van Moolenbroek # define XLBC_TX_STATUS_OVERFLOW 0x04 /* TX status stack full */ 6975e18fe4SDavid van Moolenbroek # define XLBC_TX_STATUS_MAX_COLL 0x08 /* max collisions reached */ 7075e18fe4SDavid van Moolenbroek # define XLBC_TX_STATUS_UNDERRUN 0x10 /* packet transfer underrun */ 7175e18fe4SDavid van Moolenbroek # define XLBC_TX_STATUS_JABBER 0x20 /* transmitting for too long */ 7275e18fe4SDavid van Moolenbroek # define XLBC_TX_STATUS_COMPLETE 0x80 /* register contents valid */ 7375e18fe4SDavid van Moolenbroek 7475e18fe4SDavid van Moolenbroek #define XLBC_STATUS_AUTO_REG 0x1e /* auto interrupt status reg */ 7575e18fe4SDavid van Moolenbroek 7675e18fe4SDavid van Moolenbroek #define XLBC_DMA_CTRL_REG 0x20 /* DMA control register */ 7775e18fe4SDavid van Moolenbroek # define XLBC_DMA_CTRL_DN_INPROG 0x00000080 /* dn in progress */ 7875e18fe4SDavid van Moolenbroek # define XLBC_DMA_CTRL_UP_NOALT 0x00010000 /* disable up altseq */ 7975e18fe4SDavid van Moolenbroek # define XLBC_DMA_CTRL_DN_NOALT 0x00020000 /* disable dn altseq */ 8075e18fe4SDavid van Moolenbroek 8175e18fe4SDavid van Moolenbroek #define XLBC_DN_LIST_PTR_REG 0x24 /* download pointer register */ 8275e18fe4SDavid van Moolenbroek 8375e18fe4SDavid van Moolenbroek #define XLBC_UP_LIST_PTR_REG 0x38 /* uplist pointer register */ 8475e18fe4SDavid van Moolenbroek 8575e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WINDOW 0 /* EEPROM register window */ 8675e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_CMD_REG 0x0a /* EEPROM command register */ 8775e18fe4SDavid van Moolenbroek # define XLBC_EEPROM_CMD_ADDR 0x003f /* address mask */ 8875e18fe4SDavid van Moolenbroek # define XLBC_EEPROM_CMD_READ 0x0080 /* read register opcode */ 8975e18fe4SDavid van Moolenbroek # define XLBC_EEPROM_CMD_BUSY 0x8000 /* command in progress */ 9075e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_DATA_REG 0x0c /* EEPROM data register */ 9175e18fe4SDavid van Moolenbroek 9275e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WORD_OEM_ADDR0 0x0a /* OEM node address, word 0 */ 9375e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WORD_OEM_ADDR1 0x0b /* OEM node address, word 1 */ 9475e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WORD_OEM_ADDR2 0x0c /* OEM node address, word 2 */ 9575e18fe4SDavid van Moolenbroek 9675e18fe4SDavid van Moolenbroek #define XLBC_STATION_WINDOW 2 /* station register window */ 9775e18fe4SDavid van Moolenbroek #define XLBC_STATION_ADDR0_REG 0x00 /* station address, word 0 */ 9875e18fe4SDavid van Moolenbroek #define XLBC_STATION_ADDR1_REG 0x02 /* station address, word 1 */ 9975e18fe4SDavid van Moolenbroek #define XLBC_STATION_ADDR2_REG 0x04 /* station address, word 2 */ 10075e18fe4SDavid van Moolenbroek #define XLBC_STATION_MASK0_REG 0x06 /* station mask, word 0 */ 10175e18fe4SDavid van Moolenbroek #define XLBC_STATION_MASK1_REG 0x08 /* station mask, word 1 */ 10275e18fe4SDavid van Moolenbroek #define XLBC_STATION_MASK2_REG 0x0a /* station mask, word 2 */ 10375e18fe4SDavid van Moolenbroek 10475e18fe4SDavid van Moolenbroek #define XLBC_CONFIG_WINDOW 3 /* configuration window */ 10575e18fe4SDavid van Moolenbroek #define XLBC_CONFIG_WORD1_REG 0x02 /* high-order 16 config bits */ 10675e18fe4SDavid van Moolenbroek # define XLBC_CONFIG_XCVR_MASK 0x00f0 /* transceiver selection */ 10775e18fe4SDavid van Moolenbroek # define XLBC_CONFIG_XCVR_AUTO 0x0080 /* auto-negotiation */ 10875e18fe4SDavid van Moolenbroek 10975e18fe4SDavid van Moolenbroek #define XLBC_MAC_CTRL_WINDOW 3 /* MAC control window */ 11075e18fe4SDavid van Moolenbroek #define XLBC_MAC_CTRL_REG 0x06 /* MAC control register */ 11175e18fe4SDavid van Moolenbroek # define XLBC_MAC_CTRL_ENA_FD 0x0020 /* enable full duplex */ 11275e18fe4SDavid van Moolenbroek 11375e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_OPT_WINDOW 3 /* media options window */ 11475e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_OPT_REG 0x08 /* media options register */ 11575e18fe4SDavid van Moolenbroek # define XLBC_MEDIA_OPT_BASE_TX 0x0002 /* 100BASE-TX available */ 11675e18fe4SDavid van Moolenbroek # define XLBC_MEDIA_OPT_10_BT 0x0008 /* 10BASE-T available */ 11775e18fe4SDavid van Moolenbroek 11875e18fe4SDavid van Moolenbroek #define XLBC_NET_DIAG_WINDOW 4 /* net diagnostics window */ 11975e18fe4SDavid van Moolenbroek #define XLBC_NET_DIAG_REG 0x06 /* net diagnostics register */ 12075e18fe4SDavid van Moolenbroek # define XLBC_NET_DIAG_UPPER 0x0040 /* enable upper stats bytes */ 12175e18fe4SDavid van Moolenbroek 12275e18fe4SDavid van Moolenbroek #define XLBC_PHYS_MGMT_WINDOW 4 /* physical mgmt window */ 12375e18fe4SDavid van Moolenbroek #define XLBC_PHYS_MGMT_REG 0x08 /* physical mgmt register */ 12475e18fe4SDavid van Moolenbroek # define XLBC_PHYS_MGMT_CLK 0x0001 /* MII management clock */ 12575e18fe4SDavid van Moolenbroek # define XLBC_PHYS_MGMT_DATA 0x0002 /* MII management data bit */ 12675e18fe4SDavid van Moolenbroek # define XLBC_PHYS_MGMT_DIR 0x0004 /* MII data direction bit */ 12775e18fe4SDavid van Moolenbroek 12875e18fe4SDavid van Moolenbroek #define XLBC_PHY_ADDR 0x18 /* internal PHY address */ 12975e18fe4SDavid van Moolenbroek 13075e18fe4SDavid van Moolenbroek #define XLBC_MII_CONTROL 0x00 /* MII control register */ 13175e18fe4SDavid van Moolenbroek # define XLBC_MII_CONTROL_AUTONEG 0x0200 /* restart auto-negotiation */ 13275e18fe4SDavid van Moolenbroek # define XLBC_MII_CONTROL_RESET 0x8000 /* reset the PHY */ 13375e18fe4SDavid van Moolenbroek #define XLBC_MII_STATUS 0x01 /* MII status register */ 13475e18fe4SDavid van Moolenbroek # define XLBC_MII_STATUS_EXTCAP 0x0001 /* extended capability */ 13575e18fe4SDavid van Moolenbroek # define XLBC_MII_STATUS_AUTONEG 0x0008 /* auto-neg capability */ 13675e18fe4SDavid van Moolenbroek # define XLBC_MII_STATUS_COMPLETE 0x0020 /* auto-neg complete */ 13775e18fe4SDavid van Moolenbroek #define XLBC_MII_AUTONEG_ADV 0x04 /* MII auto-neg advertise */ 13875e18fe4SDavid van Moolenbroek # define XLBC_MII_LINK_T_HD 0x0020 /* 10BASE-T half-duplex */ 13975e18fe4SDavid van Moolenbroek # define XLBC_MII_LINK_T_FD 0x0040 /* 10BASE-T full-duplex */ 14075e18fe4SDavid van Moolenbroek # define XLBC_MII_LINK_TX_HD 0x0080 /* 100BASE-TX half-duplex */ 14175e18fe4SDavid van Moolenbroek # define XLBC_MII_LINK_TX_FD 0x0100 /* 100BASE-TX full-duplex */ 14275e18fe4SDavid van Moolenbroek #define XLBC_MII_LP_ABILITY 0x05 /* MII link partner ability */ 14375e18fe4SDavid van Moolenbroek #define XLBC_MII_AUTONEG_EXP 0x06 /* MII auto-neg expansion */ 14475e18fe4SDavid van Moolenbroek 14575e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_STS_WINDOW 4 /* media status window */ 14675e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_STS_REG 0x0a /* media status register */ 14775e18fe4SDavid van Moolenbroek # define XLBC_MEDIA_STS_LINK_DET 0x0800 /* link detected */ 14875e18fe4SDavid van Moolenbroek # define XLBC_MEDIA_STS_TX_INPROG 0x1000 /* TX in progress */ 14975e18fe4SDavid van Moolenbroek 15075e18fe4SDavid van Moolenbroek #define XLBC_SSD_STATS_WINDOW 4 /* SSD statistics window */ 15175e18fe4SDavid van Moolenbroek #define XLBC_BAD_SSD_REG 0x0c /* bad start-of-stream delim */ 15275e18fe4SDavid van Moolenbroek 15375e18fe4SDavid van Moolenbroek #define XLBC_STATS_WINDOW 6 /* statistics window */ 15475e18fe4SDavid van Moolenbroek #define XLBC_CARRIER_LOST_REG 0x00 /* # packets w/ carrier lost */ 15575e18fe4SDavid van Moolenbroek #define XLBC_SQE_ERR_REG 0x01 /* # SQE pulse errors */ 15675e18fe4SDavid van Moolenbroek #define XLBC_MULTI_COLL_REG 0x02 /* # multiple collisions */ 15775e18fe4SDavid van Moolenbroek #define XLBC_SINGLE_COLL_REG 0x03 /* # single collisions */ 15875e18fe4SDavid van Moolenbroek #define XLBC_LATE_COLL_REG 0x04 /* # late collisions */ 15975e18fe4SDavid van Moolenbroek #define XLBC_RX_OVERRUNS_REG 0x05 /* # receiver overruns */ 16075e18fe4SDavid van Moolenbroek #define XLBC_FRAMES_XMIT_OK_REG 0x06 /* # frames transmitted */ 16175e18fe4SDavid van Moolenbroek #define XLBC_FRAMES_RCVD_OK_REG 0x07 /* # frames received */ 16275e18fe4SDavid van Moolenbroek #define XLBC_FRAMES_DEFERRED_REG 0x08 /* # frames deferred */ 16375e18fe4SDavid van Moolenbroek #define XLBC_UPPER_FRAMES_REG 0x09 /* upper bits of frame stats */ 16475e18fe4SDavid van Moolenbroek # define XLBC_UPPER_RX_MASK 0x03 /* mask for frames received */ 16575e18fe4SDavid van Moolenbroek # define XLBC_UPPER_RX_SHIFT 0 /* shift for frames received */ 16675e18fe4SDavid van Moolenbroek # define XLBC_UPPER_TX_MASK 0x30 /* mask for frames sent */ 16775e18fe4SDavid van Moolenbroek # define XLBC_UPPER_TX_SHIFT 4 /* shift for frames sent */ 16875e18fe4SDavid van Moolenbroek #define XLBC_BYTES_RCVD_OK_REG 0x0a /* # bytes received */ 16975e18fe4SDavid van Moolenbroek #define XLBC_BYTES_XMIT_OK_REG 0x0c /* # bytes transmitted */ 17075e18fe4SDavid van Moolenbroek 17175e18fe4SDavid van Moolenbroek typedef struct { 17275e18fe4SDavid van Moolenbroek uint32_t next; /* physical address of next descriptor */ 17375e18fe4SDavid van Moolenbroek uint32_t flags; /* frame start header or packet status */ 17475e18fe4SDavid van Moolenbroek uint32_t addr; /* address of first (and only) fragment */ 17575e18fe4SDavid van Moolenbroek uint32_t len; /* length of first (and only) fragment */ 17675e18fe4SDavid van Moolenbroek } xlbc_pd_t; 17775e18fe4SDavid van Moolenbroek 17875e18fe4SDavid van Moolenbroek /* Bits for the 'flags' field of download descriptors. */ 17975e18fe4SDavid van Moolenbroek #define XLBC_DN_RNDUP_WORD 0x00000002 /* round up to word */ 18075e18fe4SDavid van Moolenbroek #define XLBC_DN_DN_COMPLETE 0x00010000 /* download complete */ 18175e18fe4SDavid van Moolenbroek #define XLBC_DN_DN_INDICATE 0x80000000 /* fire DN_COMPLETE */ 18275e18fe4SDavid van Moolenbroek 18375e18fe4SDavid van Moolenbroek /* Bits for the 'flags' field of upload descriptors. */ 18475e18fe4SDavid van Moolenbroek #define XLBC_UP_LEN 0x00001fff /* packet length */ 18575e18fe4SDavid van Moolenbroek #define XLBC_UP_ERROR 0x00004000 /* receive error */ 18675e18fe4SDavid van Moolenbroek #define XLBC_UP_COMPLETE 0x00008000 /* packet complete */ 18775e18fe4SDavid van Moolenbroek #define XLBC_UP_OVERRUN 0x00010000 /* FIFO overrun */ 18875e18fe4SDavid van Moolenbroek #define XLBC_UP_ALIGN_ERR 0x00040000 /* alignment error */ 18975e18fe4SDavid van Moolenbroek #define XLBC_UP_CRC_ERR 0x00080000 /* CRC error */ 19075e18fe4SDavid van Moolenbroek #define XLBC_UP_OVERFLOW 0x01000000 /* buffer too small */ 19175e18fe4SDavid van Moolenbroek 19275e18fe4SDavid van Moolenbroek /* Bits for the 'len' field of upload and download descriptors. */ 19375e18fe4SDavid van Moolenbroek #define XLBC_LEN_LAST 0x80000000 /* last fragment */ 19475e18fe4SDavid van Moolenbroek 19575e18fe4SDavid van Moolenbroek #endif /* !_DRIVERS_NET_3C90X_H */ 196