📄 elnk.c
字号:
#define XL_W0_MFG_ID 0x00/* * Window 1 */#define XL_W1_TX_FIFO 0x10#define XL_W1_FREE_TX 0x0C#define XL_W1_TX_STATUS 0x0B#define XL_W1_TX_TIMER 0x0A#define XL_W1_RX_STATUS 0x08#define XL_W1_RX_FIFO 0x00/* * RX status codes */#define XL_RXSTATUS_OVERRUN 0x01#define XL_RXSTATUS_RUNT 0x02#define XL_RXSTATUS_ALIGN 0x04#define XL_RXSTATUS_CRC 0x08#define XL_RXSTATUS_OVERSIZE 0x10#define XL_RXSTATUS_DRIBBLE 0x20/* * TX status codes */#define XL_TXSTATUS_RECLAIM 0x02 /* 3c905B only */#define XL_TXSTATUS_OVERFLOW 0x04#define XL_TXSTATUS_MAXCOLS 0x08#define XL_TXSTATUS_UNDERRUN 0x10#define XL_TXSTATUS_JABBER 0x20#define XL_TXSTATUS_INTREQ 0x40#define XL_TXSTATUS_COMPLETE 0x80/* * Window 2 */#define XL_W2_RESET_OPTIONS 0x0C /* 3c905B only */#define XL_W2_STATION_MASK_HI 0x0A#define XL_W2_STATION_MASK_MID 0x08#define XL_W2_STATION_MASK_LO 0x06#define XL_W2_STATION_ADDR_HI 0x04#define XL_W2_STATION_ADDR_MID 0x02#define XL_W2_STATION_ADDR_LO 0x00#define XL_RESETOPT_FEATUREMASK 0x0001|0x0002|0x004#define XL_RESETOPT_D3RESETDIS 0x0008#define XL_RESETOPT_DISADVFD 0x0010#define XL_RESETOPT_DISADV100 0x0020#define XL_RESETOPT_DISAUTONEG 0x0040#define XL_RESETOPT_DEBUGMODE 0x0080#define XL_RESETOPT_FASTAUTO 0x0100#define XL_RESETOPT_FASTEE 0x0200#define XL_RESETOPT_FORCEDCONF 0x0400#define XL_RESETOPT_TESTPDTPDR 0x0800#define XL_RESETOPT_TEST100TX 0x1000#define XL_RESETOPT_TEST100RX 0x2000#define XL_RESETOPT_INVERT_LED 0x0010#define XL_RESETOPT_INVERT_MII 0x4000/* * Window 3 (fifo management) */#define XL_W3_INTERNAL_CFG 0x00#define XL_W3_MAXPKTSIZE 0x04 /* 3c905B only */#define XL_W3_RESET_OPT 0x08#define XL_W3_FREE_TX 0x0C#define XL_W3_FREE_RX 0x0A#define XL_W3_MAC_CTRL 0x06#define XL_ICFG_CONNECTOR_MASK 0x00F00000#define XL_ICFG_CONNECTOR_BITS 20#define XL_ICFG_RAMSIZE_MASK 0x00000007#define XL_ICFG_RAMWIDTH 0x00000008#define XL_ICFG_ROMSIZE_MASK (0x00000040|0x00000080)#define XL_ICFG_DISABLE_BASSD 0x00000100#define XL_ICFG_RAMLOC 0x00000200#define XL_ICFG_RAMPART (0x00010000|0x00020000)#define XL_ICFG_XCVRSEL (0x00100000|0x00200000|0x00400000)#define XL_ICFG_AUTOSEL 0x01000000#define XL_XCVR_10BT 0x00#define XL_XCVR_AUI 0x01#define XL_XCVR_RSVD_0 0x02#define XL_XCVR_COAX 0x03#define XL_XCVR_100BTX 0x04#define XL_XCVR_100BFX 0x05#define XL_XCVR_MII 0x06#define XL_XCVR_RSVD_1 0x07#define XL_XCVR_AUTO 0x08 /* 3c905B only */#define XL_MACCTRL_DEFER_EXT_END 0x0001#define XL_MACCTRL_DEFER_0 0x0002#define XL_MACCTRL_DEFER_1 0x0004#define XL_MACCTRL_DEFER_2 0x0008#define XL_MACCTRL_DEFER_3 0x0010#define XL_MACCTRL_DUPLEX 0x0020#define XL_MACCTRL_ALLOW_LARGE_PACK 0x0040#define XL_MACCTRL_EXTEND_AFTER_COL 0x0080 (3c905B only)#define XL_MACCTRL_FLOW_CONTROL_ENB 0x0100 (3c905B only)#define XL_MACCTRL_VLT_END 0x0200 (3c905B only)/* * The 'reset options' register contains power-on reset values * loaded from the EEPROM. This includes the supported media * types on the card. It is also known as the media options register. */#define XL_W3_MEDIA_OPT 0x08#define XL_MEDIAOPT_BT4 0x0001 /* MII */#define XL_MEDIAOPT_BTX 0x0002 /* on-chip */#define XL_MEDIAOPT_BFX 0x0004 /* on-chip */#define XL_MEDIAOPT_BT 0x0008 /* on-chip */#define XL_MEDIAOPT_BNC 0x0010 /* on-chip */#define XL_MEDIAOPT_AUI 0x0020 /* on-chip */#define XL_MEDIAOPT_MII 0x0040 /* MII */#define XL_MEDIAOPT_VCO 0x0100 /* 1st gen chip only */#define XL_MEDIAOPT_10FL 0x0100 /* 3x905B only, on-chip */#define XL_MEDIAOPT_MASK 0x01FF/* * Window 4 (diagnostics) */#define XL_W4_UPPERBYTESOK 0x0D#define XL_W4_BADSSD 0x0C#define XL_W4_MEDIA_STATUS 0x0A#define XL_W4_PHY_MGMT 0x08#define XL_W4_NET_DIAG 0x06#define XL_W4_FIFO_DIAG 0x04#define XL_W4_VCO_DIAG 0x02#define XL_W4_CTRLR_STAT 0x08#define XL_W4_TX_DIAG 0x00#define XL_MII_CLK 0x01#define XL_MII_DATA 0x02#define XL_MII_DIR 0x04#define XL_MEDIA_SQE 0x0008#define XL_MEDIA_10TP 0x00C0#define XL_MEDIA_LNK 0x0080#define XL_MEDIA_LNKBEAT 0x0800#define XL_MEDIASTAT_CRCSTRIP 0x0004#define XL_MEDIASTAT_SQEENB 0x0008#define XL_MEDIASTAT_COLDET 0x0010#define XL_MEDIASTAT_CARRIER 0x0020#define XL_MEDIASTAT_JABGUARD 0x0040#define XL_MEDIASTAT_LINKBEAT 0x0080#define XL_MEDIASTAT_JABDETECT 0x0200#define XL_MEDIASTAT_POLREVERS 0x0400#define XL_MEDIASTAT_LINKDETECT 0x0800#define XL_MEDIASTAT_TXINPROG 0x1000#define XL_MEDIASTAT_DCENB 0x4000#define XL_MEDIASTAT_AUIDIS 0x8000#define XL_NETDIAG_TEST_LOWVOLT 0x0001#define XL_NETDIAG_ASIC_REVMASK (0x0002|0x0004|0x0008|0x0010|0x0020)#define XL_NETDIAG_UPPER_BYTES_ENABLE 0x0040#define XL_NETDIAG_STATS_ENABLED 0x0080#define XL_NETDIAG_TX_FATALERR 0x0100#define XL_NETDIAG_TRANSMITTING 0x0200#define XL_NETDIAG_RX_ENABLED 0x0400#define XL_NETDIAG_TX_ENABLED 0x0800#define XL_NETDIAG_FIFO_LOOPBACK 0x1000#define XL_NETDIAG_MAC_LOOPBACK 0x2000#define XL_NETDIAG_ENDEC_LOOPBACK 0x4000#define XL_NETDIAG_EXTERNAL_LOOP 0x8000/* * Window 5 */#define XL_W5_STAT_ENB 0x0C#define XL_W5_INTR_ENB 0x0A#define XL_W5_RECLAIM_THRESH 0x09 /* 3c905B only */#define XL_W5_RX_FILTER 0x08#define XL_W5_RX_EARLYTHRESH 0x06#define XL_W5_TX_AVAILTHRESH 0x02#define XL_W5_TX_STARTTHRESH 0x00/* * RX filter bits */#define XL_RXFILTER_INDIVIDUAL 0x01#define XL_RXFILTER_ALLMULTI 0x02#define XL_RXFILTER_BROADCAST 0x04#define XL_RXFILTER_ALLFRAMES 0x08#define XL_RXFILTER_MULTIHASH 0x10 /* 3c905B only *//* * Window 6 (stats) */#define XL_W6_TX_BYTES_OK 0x0C#define XL_W6_RX_BYTES_OK 0x0A#define XL_W6_UPPER_FRAMES_OK 0x09#define XL_W6_DEFERRED 0x08#define XL_W6_RX_OK 0x07#define XL_W6_TX_OK 0x06#define XL_W6_RX_OVERRUN 0x05#define XL_W6_COL_LATE 0x04#define XL_W6_COL_SINGLE 0x03#define XL_W6_COL_MULTIPLE 0x02#define XL_W6_SQE_ERRORS 0x01#define XL_W6_CARRIER_LOST 0x00/* * Window 7 (bus master control) */#define XL_W7_BM_ADDR 0x00#define XL_W7_BM_LEN 0x06#define XL_W7_BM_STATUS 0x0B#define XL_W7_BM_TIMEr 0x0A/* * bus master control registers */#define XL_BM_PKTSTAT 0x20#define XL_BM_DOWNLISTPTR 0x24#define XL_BM_FRAGADDR 0x28#define XL_BM_FRAGLEN 0x2C#define XL_BM_TXFREETHRESH 0x2F#define XL_BM_UPPKTSTAT 0x30#define XL_BM_UPLISTPTR 0x38struct xl_mii_frame { u_int8_t mii_stdelim; u_int8_t mii_opcode; u_int8_t mii_phyaddr; u_int8_t mii_regaddr; u_int8_t mii_turnaround; u_int16_t mii_data;};/* * MII constants */#define XL_MII_STARTDELIM 0x01#define XL_MII_READOP 0x02#define XL_MII_WRITEOP 0x01#define XL_MII_TURNAROUND 0x02/* * The 3C905B adapters implement a few features that we want to * take advantage of, namely the multicast hash filter. With older * chips, you only have the option of turning on reception of all * multicast frames, which is kind of lame. * * We also use this to decide on a transmit strategy. For the 3c90xB * cards, we can use polled descriptor mode, which reduces CPU overhead. */#define XL_TYPE_905B 1#define XL_TYPE_90X 2#define XL_FLAG_FUNCREG 0x0001#define XL_FLAG_PHYOK 0x0002#define XL_FLAG_EEPROM_OFFSET_30 0x0004#define XL_FLAG_WEIRDRESET 0x0008#define XL_FLAG_8BITROM 0x0010#define XL_FLAG_INVERT_LED_PWR 0x0020#define XL_FLAG_INVERT_MII_PWR 0x0040#define XL_FLAG_NO_XCVR_PWR 0x0080#define XL_FLAG_USE_MMIO 0x0100#define XL_NO_XCVR_PWR_MAGICBITS 0x0900#define XL_MIN_FRAMELEN 60#define XL_LAST_FRAG 0x80000000struct xl_stats { /* accumulated stats */ u_int16_t xl_carrier_lost; u_int16_t xl_sqe_errs; u_int16_t xl_tx_multi_collision; u_int16_t xl_tx_single_collision; u_int16_t xl_tx_late_collision; u_int16_t xl_rx_overrun; u_int16_t xl_tx_deferred; u_int32_t xl_rx_bytes_ok; u_int32_t xl_tx_bytes_ok; u_int32_t xl_tx_frames_ok; u_int32_t xl_rx_frames_ok; u_int16_t xl_badssd; /* non-accumulated stats */ u_int16_t intstatus; u_int16_t rxstatus; u_int8_t txstatus; u_int16_t mediastatus; u_int32_t txcomplete_ints; u_int16_t miianr, miipar, miistatus, miicmd; u_int32_t device_interrupts; u_int32_t internalconfig; u_int16_t mac_control; u_int16_t smbstatus; u_int32_t dmactl; u_int16_t txfree;};struct xl_type { u_int16_t xl_vid; u_int16_t xl_did; char *xl_name;};/* * Various supported device vendors/types and their names. */static struct xl_type xl_devs[] = { { TC_VENDORID, TC_DEVICEID_BOOMERANG_10BT, "3Com 3c900-TPO Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_BOOMERANG_10BT_COMBO, "3Com 3c900-COMBO Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_BOOMERANG_10_100BT, "3Com 3c905-TX Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_BOOMERANG_100BT4, "3Com 3c905-T4 Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_KRAKATOA_10BT, "3Com 3c900B-TPO Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_KRAKATOA_10BT_COMBO, "3Com 3c900B-COMBO Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_KRAKATOA_10BT_TPC, "3Com 3c900B-TPC Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_CYCLONE_10FL, "3Com 3c900B-FL Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_10_100BT, "3Com 3c905B-TX Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_CYCLONE_10_100BT4, "3Com 3c905B-T4 Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_CYCLONE_10_100FX, "3Com 3c905B-FX/SC Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_CYCLONE_10_100_COMBO, "3Com 3c905B-COMBO Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_TORNADO_10_100BT, "3Com 3c905C-TX Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_TORNADO_10_100BT_920B, "3Com 3c920B-EMB Integrated Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_10_100BT_SERV, "3Com 3c980 Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_TORNADO_10_100BT_SERV, "3Com 3c980C Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_SOHO100TX, "3Com 3cSOHO100-TX OfficeConnect" }, { TC_VENDORID, TC_DEVICEID_TORNADO_HOMECONNECT, "3Com 3c450-TX HomeConnect" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_555, "3Com 3c555 Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_556, "3Com 3c556 Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_556B, "3Com 3c556B Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_575A, "3Com 3c575TX Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_575B, "3Com 3c575B Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_575C, "3Com 3c575C Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_656, "3Com 3c656 Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_HURRICANE_656B, "3Com 3c656B Fast Etherlink XL" }, { TC_VENDORID, TC_DEVICEID_TORNADO_656C, "3Com 3c656C Fast Etherlink XL" }, { 0, 0, NULL }};#define XL_TIMEOUT 1000/* rx message descriptor entry, ensure the struct is aligned to 8 bytes */struct RXMD { /* used by hardware */ volatile unsigned32 next; volatile unsigned32 status; volatile unsigned32 addr; volatile unsigned32 length; /* used by software */ struct mbuf *mbuf; /* scratch variable used in the tx ring */ struct RXMD *next_md;} __attribute__ ((aligned (8), packed));#define NUM_FRAGS 6/* * tx message descriptor entry, ensure the struct is aligned to 8 bytes */struct tfrag{ volatile unsigned32 addr; volatile unsigned32 length;} __attribute__ ((packed));struct TXMD { /* used by hardware */ volatile unsigned32 next; volatile unsigned32 status; struct tfrag txfrags[NUM_FRAGS]; /* used by software */ struct mbuf *mbuf; /* scratch variable used in the tx ring */ struct TXMD *next_md, *chainptr;} __attribute__ ((aligned (8), packed));#define NUM_CHAIN_LENGTHS 50/* * Per-device data */struct elnk_softc { struct arpcom arpcom; rtems_irq_connect_data irqInfo; rtems_event_set ioevent; unsigned int ioaddr; unsigned char *bufferBase, *ringBase; struct RXMD *rx_ring, *curr_rx_md; struct TXMD *tx_ring, *last_tx_md, *last_txchain_head;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -