diff options
Diffstat (limited to 'sys/dev/pci/if_sereg.h')
-rw-r--r-- | sys/dev/pci/if_sereg.h | 442 |
1 files changed, 212 insertions, 230 deletions
diff --git a/sys/dev/pci/if_sereg.h b/sys/dev/pci/if_sereg.h index 009741716f9..cc619ec6198 100644 --- a/sys/dev/pci/if_sereg.h +++ b/sys/dev/pci/if_sereg.h @@ -1,7 +1,7 @@ -/* $OpenBSD: if_sereg.h,v 1.2 2010/04/02 22:42:55 jsg Exp $ */ +/* $OpenBSD: if_sereg.h,v 1.3 2010/09/04 12:47:00 miod Exp $ */ /*- - * Copyright (c) 2009, 2010 Christopher Zimmermann <madroach@zakweb.de> + * Copyright (c) 2008, 2009, 2010 Nikolay Denev <ndenev@gmail.com> * Copyright (c) 2007, 2008 Alexander Pohoyda <alexander.pohoyda@gmx.net> * Copyright (c) 1997, 1998, 1999 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. @@ -34,256 +34,238 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD$ + * $FreeBSD: src/sys/dev/sge/if_sgereg.h,v 1.7 2010/07/08 18:22:49 yongari Exp $ */ -struct se_desc { - volatile u_int32_t se_sts_size; - volatile u_int32_t se_cmdsts; - volatile u_int32_t se_ptr; - volatile u_int32_t se_flags; -}; - -#define SE_RX_RING_CNT 1000 /* [8, 1024] */ -#define SE_TX_RING_CNT 1000 /* [8, 8192] */ - -#define SE_RX_RING_SZ (SE_RX_RING_CNT * sizeof(struct se_desc)) -#define SE_TX_RING_SZ (SE_TX_RING_CNT * sizeof(struct se_desc)) - -struct se_list_data { - struct se_desc *se_rx_ring; - struct se_desc *se_tx_ring; - bus_dmamap_t se_rx_dmamap; - bus_dmamap_t se_tx_dmamap; -}; - -struct se_chain_data { - struct mbuf *se_rx_mbuf[SE_RX_RING_CNT]; - struct mbuf *se_tx_mbuf[SE_TX_RING_CNT]; - bus_dmamap_t se_rx_map[SE_RX_RING_CNT]; - bus_dmamap_t se_tx_map[SE_TX_RING_CNT]; - int se_rx_prod; - int se_tx_prod; - int se_tx_cons; - int se_tx_cnt; -}; - -struct se_softc { - struct device sc_dev; - void *sc_ih; - struct ifnet *se_ifp; /* interface info */ - struct resource *se_res[2]; - void *se_intrhand; - mii_data_t sc_mii; - struct arpcom arpcom; - - u_int8_t se_link; - - bus_space_handle_t se_bhandle; - bus_space_tag_t se_btag; - bus_dma_tag_t se_tag; - - struct se_list_data se_ldata; - struct se_chain_data se_cdata; - - struct timeout se_timeout; - int in_tick; - int se_watchdog_timer; - int se_stopped; -}; - - -#define SE_PCI_LOMEM 0x10 - -enum sis19x_registers { - TxControl = 0x00, - TxDescStartAddr = 0x04, - Reserved0 = 0x08, // unused - TxNextDescAddr = 0x0c, // unused - - RxControl = 0x10, - RxDescStartAddr = 0x14, - Reserved1 = 0x18, // unused - RxNextDescAddr = 0x1c, // unused - - IntrStatus = 0x20, - IntrMask = 0x24, - IntrControl = 0x28, - IntrTimer = 0x2c, // unused - - PMControl = 0x30, // unused - Reserved2 = 0x34, // unused - ROMControl = 0x38, - ROMInterface = 0x3c, - StationControl = 0x40, - GMIIControl = 0x44, - GMacIOCR = 0x48, - GMacIOCTL = 0x4c, - TxMacControl = 0x50, - TxMacTimeLimit = 0x54, - RGMIIDelay = 0x58, - Reserved3 = 0x5c, - RxMacControl = 0x60, // 1 WORD - RxMacAddr = 0x62, // 6x BYTE - RxHashTable = 0x68, // 1 LONG - RxHashTable2 = 0x6c, // 1 LONG - RxWakeOnLan = 0x70, - RxWakeOnLanData = 0x74, - RxMPSControl = 0x78, - Reserved4 = 0x7c, -}; - -enum sis19x_register_content { - /* IntrStatus */ - SoftInt = 0x40000000, // unused - Timeup = 0x20000000, // unused - PauseFrame = 0x00080000, // unused - MagicPacket = 0x00040000, // unused - WakeupFrame = 0x00020000, // unused - LinkChange = 0x00010000, - RxQEmpty = 0x00000080, //! RXIDLE - RxQInt = 0x00000040, //! RXDONE - TxQ1Empty = 0x00000020, // unused - TxQ1Int = 0x00000010, // unused - TxQEmpty = 0x00000008, //! TXIDLE - TxQInt = 0x00000004, //! TXDONE - RxHalt = 0x00000002, //! RXHALT - TxHalt = 0x00000001, //! TXHALT - - /* RxStatusDesc */ - RxRES = 0x00200000, // unused - RxCRC = 0x00080000, - RxRUNT = 0x00100000, // unused - RxRWT = 0x00400000, // unused - - /* {Rx/Tx}CmdBits */ - CmdReset = 0x10, - CmdRxEnb = 0x01, /* Linux does not use it, but 0x8 */ - CmdTxEnb = 0x01, - - /* RxMacControl */ - AcceptBroadcast = 0x0800, - AcceptMulticast = 0x0400, - AcceptMyPhys = 0x0200, - AcceptAllPhys = 0x0100, - AcceptErr = 0x0020, // unused - AcceptRunt = 0x0010, // unused -}; +#define TX_CTL 0x00 +#define TX_DESC 0x04 +#define Reserved0 0x08 +#define TX_NEXT 0x0c + +#define RX_CTL 0x10 +#define RX_DESC 0x14 +#define Reserved1 0x18 +#define RX_NEXT 0x1c + +#define IntrStatus 0x20 +#define IntrMask 0x24 +#define IntrControl 0x28 +#define IntrTimer 0x2c + +#define PMControl 0x30 +#define Reserved2 0x34 +#define ROMControl 0x38 +#define ROMInterface 0x3c +#define StationControl 0x40 +#define GMIIControl 0x44 +#define GMacIOCR 0x48 +#define GMacIOCTL 0x4c +#define TxMacControl 0x50 +#define TxMacTimeLimit 0x54 +#define RGMIIDelay 0x58 +#define Reserved3 0x5c +#define RxMacControl 0x60 /* 1 WORD */ +#define RxMacAddr 0x62 /* 6x BYTE */ +#define RxHashTable 0x68 /* 1 LONG */ +#define RxHashTable2 0x6c /* 1 LONG */ +#define RxWakeOnLan 0x70 +#define RxWakeOnLanData 0x74 +#define RxMPSControl 0x78 +#define Reserved4 0x7c /* - * register space access macros + * IntrStatus Register Content */ -#define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->se_btag, sc->se_bhandle, reg, val) -#define CSR_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->se_btag, sc->se_bhandle, reg, val) - -#define CSR_READ_4(sc, reg) \ - bus_space_read_4(sc->se_btag, sc->se_bhandle, reg) -#define CSR_READ_2(sc, reg) \ - bus_space_read_2(sc->se_btag, sc->se_bhandle, reg) +#define INTR_SOFT 0x40000000 +#define INTR_TIMER 0x20000000 +#define INTR_PAUSE_FRAME 0x00080000 +#define INTR_MAGIC_FRAME 0x00040000 +#define INTR_WAKE_FRAME 0x00020000 +#define INTR_LINK 0x00010000 +#define INTR_RX_IDLE 0x00000080 +#define INTR_RX_DONE 0x00000040 +#define INTR_TXQ1_IDLE 0x00000020 +#define INTR_TXQ1_DONE 0x00000010 +#define INTR_TX_IDLE 0x00000008 +#define INTR_TX_DONE 0x00000004 +#define INTR_RX_HALT 0x00000002 +#define INTR_TX_HALT 0x00000001 + +#define SE_INTRS \ + (INTR_RX_IDLE | INTR_RX_DONE | INTR_TXQ1_IDLE | \ + INTR_TXQ1_DONE |INTR_TX_IDLE | INTR_TX_DONE | \ + INTR_TX_HALT | INTR_RX_HALT) -#define SE_PCI_COMMIT() CSR_READ_4(sc, IntrControl) - -#define SE_SETBIT(_sc, _reg, x) \ - CSR_WRITE_4(_sc, _reg, CSR_READ_4(_sc, _reg) | (x)) +/* + * RxStatusDesc Register Content + */ +#define RxRES 0x00200000 +#define RxCRC 0x00080000 +#define RxRUNT 0x00100000 +#define RxRWT 0x00400000 -#define SE_CLRBIT(_sc, _reg, x) \ - CSR_WRITE_4(_sc, _reg, CSR_READ_4(_sc, _reg) & ~(x)) +/* + * RX_CTL Register Content + */ +#define RX_CTL_POLL 0x00000010 +#define RX_CTL_ENB 0x00000001 -#define DISABLE_INTERRUPTS(sc) CSR_WRITE_4(sc, IntrMask, 0x0) -#define ENABLE_INTERRUPTS(sc) CSR_WRITE_4(sc, IntrMask, RxQEmpty | RxQInt | \ - TxQInt | RxHalt | TxHalt) +/* + * TX_CTL Register Content + */ +#define TX_CTL_POLL 0x00000010 +#define TX_CTL_ENB 0x00000001 +/* + * RxMacControl Register Content + */ +#define AcceptBroadcast 0x0800 +#define AcceptMulticast 0x0400 +#define AcceptMyPhys 0x0200 +#define AcceptAllPhys 0x0100 +#define AcceptErr 0x0020 +#define AcceptRunt 0x0010 +#define RXMAC_STRIP_VLAN 0x0020 +#define RXMAC_STRIP_FCS 0x0010 +#define RXMAC_PAD_ENB 0x0004 +#define RXMAC_CSUM_ENB 0x0002 + +#define SE_RX_PAD_BYTES 10 + +/* Station control register. */ +#define SC_LOOPBACK 0x80000000 +#define SC_RGMII 0x00008000 +#define SC_FDX 0x00001000 +#define SC_SPEED_MASK 0x00000c00 +#define SC_SPEED_10 0x00000400 +#define SC_SPEED_100 0x00000800 +#define SC_SPEED_1000 0x00000c00 /* * Gigabit Media Independent Interface CTL register */ -#define GMI_DATA 0xffff0000 -#define GMI_DATA_SHIFT 16 -#define GMI_REG 0x0000f800 -#define GMI_REG_SHIFT 11 -#define GMI_PHY 0x000007c0 -#define GMI_PHY_SHIFT 6 -#define GMI_OP 0x00000020 -#define GMI_OP_SHIFT 5 -#define GMI_OP_WR (1 << GMI_OP_SHIFT) -#define GMI_OP_RD (0 << GMI_OP_SHIFT) -#define GMI_REQ 0x00000010 -#define GMI_MDIO 0x00000008 /* not used */ -#define GMI_MDDIR 0x00000004 /* not used */ -#define GMI_MDC 0x00000002 /* not used */ -#define GMI_MDEN 0x00000001 /* not used */ - -enum CommandStatus { - OWNbit = 0x80000000, - INTbit = 0x40000000, - IPbit = 0x20000000, - TCPbit = 0x10000000, - UDPbit = 0x08000000, - DEFbit = 0x00200000, - CRCbit = 0x00020000, - PADbit = 0x00010000, -}; - +#define GMI_DATA 0xffff0000 +#define GMI_DATA_SHIFT 16 +#define GMI_REG 0x0000f800 +#define GMI_REG_SHIFT 11 +#define GMI_PHY 0x000007c0 +#define GMI_PHY_SHIFT 6 +#define GMI_OP_WR 0x00000020 +#define GMI_OP_RD 0x00000000 +#define GMI_REQ 0x00000010 +#define GMI_MDIO 0x00000008 +#define GMI_MDDIR 0x00000004 +#define GMI_MDC 0x00000002 +#define GMI_MDEN 0x00000001 + +/* Tx descriptor command bits. */ +#define TDC_OWN 0x80000000 +#define TDC_INTR 0x40000000 +#define TDC_THOL3 0x30000000 +#define TDC_THOL2 0x20000000 +#define TDC_THOL1 0x10000000 +#define TDC_THOL0 0x00000000 +#define TDC_LS 0x08000000 +#define TDC_IP_CSUM 0x04000000 +#define TDC_TCP_CSUM 0x02000000 +#define TDC_UDP_CSUM 0x01000000 +#define TDC_BST 0x00800000 +#define TDC_EXT 0x00400000 +#define TDC_DEF 0x00200000 +#define TDC_BKF 0x00100000 +#define TDC_CRS 0x00080000 +#define TDC_COL 0x00040000 +#define TDC_CRC 0x00020000 +#define TDC_PAD 0x00010000 +#define TDC_VLAN_MASK 0x0000FFFF + +#define SE_TX_INTR_FRAMES 32 /* - * RX descriptor status bits + * TX descriptor status bits. */ -#define RDS_TAGON 0x80000000 -#define RDS_DESCS 0x3f000000 -#define RDS_ABORT 0x00800000 -#define RDS_SHORT 0x00400000 -#define RDS_LIMIT 0x00200000 -#define RDS_MIIER 0x00100000 -#define RDS_OVRUN 0x00080000 -#define RDS_NIBON 0x00040000 -#define RDS_COLON 0x00020000 -#define RDS_CRCOK 0x00010000 -#define RX_ERR_BITS \ - (RDS_COLON | RDS_NIBON | RDS_OVRUN | RDS_MIIER | \ - RDS_LIMIT | RDS_SHORT | RDS_ABORT) - -#define RING_END 0x80000000 - -#define SE_RXSIZE(x) letoh32((x)->se_sts_size & 0x0000ffff) -#define SE_RXSTATUS(x) letoh32((x)->se_sts_size & 0xffff0000) - -#undef SE_OWNDESC -#define SE_OWNDESC(x) ((x)->se_cmdsts & OWNbit) - -#define SE_INC(x, y) (x) = (((x) == ((y)-1)) ? 0 : (x)+1) - +#define TDS_OWC 0x00080000 +#define TDS_ABT 0x00040000 +#define TDS_FIFO 0x00020000 +#define TDS_CRS 0x00010000 +#define TDS_COLLS 0x0000ffff +#define SE_TX_ERROR(x) ((x) & (TDS_OWC | TDS_ABT | TDS_FIFO | TDS_CRS)) +#define TX_ERR_BITS "\20" \ + "\21CRS\22FIFO\23ABT\24OWC" + +/* Rx descriptor command bits. */ +#define RDC_OWN 0x80000000 +#define RDC_INTR 0x40000000 +#define RDC_IP_CSUM 0x20000000 +#define RDC_TCP_CSUM 0x10000000 +#define RDC_UDP_CSUM 0x08000000 +#define RDC_IP_CSUM_OK 0x04000000 +#define RDC_TCP_CSUM_OK 0x02000000 +#define RDC_UDP_CSUM_OK 0x01000000 +#define RDC_WAKEUP 0x00400000 +#define RDC_MAGIC 0x00200000 +#define RDC_PAUSE 0x00100000 +#define RDC_BCAST 0x000c0000 +#define RDC_MCAST 0x00080000 +#define RDC_UCAST 0x00040000 +#define RDC_CRCOFF 0x00020000 +#define RDC_PREADD 0x00010000 +#define RDC_VLAN_MASK 0x0000FFFF /* - * TX descriptor status bits + * RX descriptor status bits */ -#define TDS_OWC 0x00080000 -#define TDS_ABT 0x00040000 -#define TDS_FIFO 0x00020000 -#define TDS_CRS 0x00010000 -#define TDS_COLLS 0x0000ffff -#define TX_ERR_BITS (TDS_OWC | TDS_ABT | TDS_FIFO | TDS_CRS) +#define RDS_VLAN 0x80000000 +#define RDS_DESCS 0x3f000000 +#define RDS_ABORT 0x00800000 +#define RDS_SHORT 0x00400000 +#define RDS_LIMIT 0x00200000 +#define RDS_MIIER 0x00100000 +#define RDS_OVRUN 0x00080000 +#define RDS_NIBON 0x00040000 +#define RDS_COLON 0x00020000 +#define RDS_CRCOK 0x00010000 +#define SE_RX_ERROR(x) \ + ((x) & (RDS_COLON | RDS_NIBON | RDS_OVRUN | RDS_MIIER | \ + RDS_LIMIT | RDS_SHORT | RDS_ABORT)) +#define SE_RX_NSEGS(x) (((x) & RDS_DESCS) >> 24) +#define RX_ERR_BITS "\20" \ + "\21CRCOK\22COLON\23NIBON\24OVRUN" \ + "\25MIIER\26LIMIT\27SHORT\30ABORT" \ + "\40VLAN" + +#define RING_END 0x80000000 +#define SE_RX_BYTES(x) ((x) & 0xFFFF) +#define SE_INC(x, y) (x) = (((x) + 1) % y) /* Taken from Solaris driver */ -#define EI_DATA 0xffff0000 -#define EI_DATA_SHIFT 16 -#define EI_OFFSET 0x0000fc00 -#define EI_OFFSET_SHIFT 10 -#define EI_OP 0x00000300 -#define EI_OP_SHIFT 8 -#define EI_OP_RD (2 << EI_OP_SHIFT) -#define EI_OP_WR (1 << EI_OP_SHIFT) -#define EI_REQ 0x00000080 -#define EI_DO 0x00000008 /* not used */ -#define EI_DI 0x00000004 /* not used */ -#define EI_CLK 0x00000002 /* not used */ -#define EI_CS 0x00000001 +#define EI_DATA 0xffff0000 +#define EI_DATA_SHIFT 16 +#define EI_OFFSET 0x0000fc00 +#define EI_OFFSET_SHIFT 10 +#define EI_OP 0x00000300 +#define EI_OP_SHIFT 8 +#define EI_OP_RD (2 << EI_OP_SHIFT) +#define EI_OP_WR (1 << EI_OP_SHIFT) +#define EI_REQ 0x00000080 +#define EI_DO 0x00000008 +#define EI_DI 0x00000004 +#define EI_CLK 0x00000002 +#define EI_CS 0x00000001 /* * EEPROM Addresses */ -#define EEPROMSignature 0x00 -#define EEPROMCLK 0x01 -#define EEPROMInfo 0x02 -#define EEPROMMACAddr 0x03 +#define EEPROMSignature 0x00 +#define EEPROMCLK 0x01 +#define EEPROMInfo 0x02 +#define EEPROMMACAddr 0x03 + +#define SE_TIMEOUT 1000 + +struct se_desc { + volatile u_int32_t se_sts_size; + volatile u_int32_t se_cmdsts; + volatile u_int32_t se_ptr; + volatile u_int32_t se_flags; +}; |