📄 rrunner.h
字号:
#ifndef _RRUNNER_H_#define _RRUNNER_H_#include<linux/config.h>#if ((BITS_PER_LONG != 32) && (BITS_PER_LONG != 64))#error "BITS_PER_LONG not defined or not valid"#endifstruct rr_regs { u32 pad0[16]; u32 HostCtrl; u32 LocalCtrl; u32 Pc; u32 BrkPt;/* Timer increments every 0.97 micro-seconds (unsigned int) */ u32 Timer_Hi; u32 Timer; u32 TimerRef; u32 PciState; u32 Event; u32 MbEvent; u32 WinBase; u32 WinData; u32 RX_state; u32 TX_state; u32 Overhead; u32 ExtIo; u32 DmaWriteHostHi; u32 DmaWriteHostLo; u32 pad1[2]; u32 DmaReadHostHi; u32 DmaReadHostLo; u32 pad2; u32 DmaReadLen; u32 DmaWriteState; u32 DmaWriteLcl; u32 DmaWriteIPchecksum; u32 DmaWriteLen; u32 DmaReadState; u32 DmaReadLcl; u32 DmaReadIPchecksum; u32 pad3; u32 RxBase; u32 RxPrd; u32 RxCon; u32 pad4; u32 TxBase; u32 TxPrd; u32 TxCon; u32 pad5; u32 RxIndPro; u32 RxIndCon; u32 RxIndRef; u32 pad6; u32 TxIndPro; u32 TxIndCon; u32 TxIndRef; u32 pad7[17]; u32 DrCmndPro; u32 DrCmndCon; u32 DrCmndRef; u32 pad8; u32 DwCmndPro; u32 DwCmndCon; u32 DwCmndRef; u32 AssistState; u32 DrDataPro; u32 DrDataCon; u32 DrDataRef; u32 pad9; u32 DwDataPro; u32 DwDataCon; u32 DwDataRef; u32 pad10[33]; u32 EvtCon; u32 pad11[5]; u32 TxPi; u32 IpRxPi; u32 pad11a[8]; u32 CmdRing[16];/* The ULA is in two registers the high order two bytes of the first * word contain the RunCode features. * ula0 res res byte0 byte1 * ula1 byte2 byte3 byte4 byte5 */ u32 Ula0; u32 Ula1; u32 RxRingHi; u32 RxRingLo; u32 InfoPtrHi; u32 InfoPtrLo; u32 Mode; u32 ConRetry; u32 ConRetryTmr; u32 ConTmout; u32 CtatTmr; u32 MaxRxRng; u32 IntrTmr; u32 TxDataMvTimeout; u32 RxDataMvTimeout; u32 EvtPrd; u32 TraceIdx; u32 Fail1; u32 Fail2; u32 DrvPrm; u32 FilterLA; u32 FwRev; u32 FwRes1; u32 FwRes2; u32 FwRes3; u32 WriteDmaThresh; u32 ReadDmaThresh; u32 pad12[325]; u32 Window[512];};/* * Host control register bits. */ #define RR_INT 0x01#define RR_CLEAR_INT 0x02#define NO_SWAP 0x04000004#define NO_SWAP1 0x00000004#define PCI_RESET_NIC 0x08#define HALT_NIC 0x10#define SSTEP_NIC 0x20#define MEM_READ_MULTI 0x40#define NIC_HALTED 0x100#define HALT_INST 0x200#define PARITY_ERR 0x400#define INVALID_INST_B 0x800#define RR_REV_2 0x20000000#define RR_REV_MASK 0xf0000000/* * Local control register bits. */#define INTA_STATE 0x01#define CLEAR_INTA 0x02#define FAST_EEPROM_ACCESS 0x08#define ENABLE_EXTRA_SRAM 0x100#define ENABLE_EXTRA_DESC 0x200#define ENABLE_PARITY 0x400#define FORCE_DMA_PARITY_ERROR 0x800#define ENABLE_EEPROM_WRITE 0x1000#define ENABLE_DATA_CACHE 0x2000#define SRAM_LO_PARITY_ERR 0x4000#define SRAM_HI_PARITY_ERR 0x8000/* * PCI state bits. */#define FORCE_PCI_RESET 0x01#define PROVIDE_LENGTH 0x02#define MASK_DMA_READ_MAX 0x1C#define RBURST_DISABLE 0x00#define RBURST_4 0x04#define RBURST_16 0x08#define RBURST_32 0x0C#define RBURST_64 0x10#define RBURST_128 0x14#define RBURST_256 0x18#define RBURST_1024 0x1C#define MASK_DMA_WRITE_MAX 0xE0#define WBURST_DISABLE 0x00#define WBURST_4 0x20#define WBURST_16 0x40#define WBURST_32 0x60#define WBURST_64 0x80#define WBURST_128 0xa0#define WBURST_256 0xc0#define WBURST_1024 0xe0#define MASK_MIN_DMA 0xFF00#define FIFO_RETRY_ENABLE 0x10000/* * Event register */#define DMA_WRITE_DONE 0x10000#define DMA_READ_DONE 0x20000#define DMA_WRITE_ERR 0x40000#define DMA_READ_ERR 0x80000/* * Receive state * * RoadRunner HIPPI Receive State Register controls and monitors the * HIPPI receive interface in the NIC. Look at err bits when a HIPPI * receive Error Event occurs. */#define ENABLE_NEW_CON 0x01#define RESET_RECV 0x02#define RECV_ALL 0x00#define RECV_1K 0x20#define RECV_2K 0x40#define RECV_4K 0x60#define RECV_8K 0x80#define RECV_16K 0xa0#define RECV_32K 0xc0#define RECV_64K 0xe0/* * Transmit status. */#define ENA_XMIT 0x01#define PERM_CON 0x02/* * DMA write state */#define RESET_DMA 0x01#define NO_SWAP_DMA 0x02#define DMA_ACTIVE 0x04#define THRESH_MASK 0x1F#define DMA_ERROR_MASK 0xff000000/* * Gooddies stored in the ULA registers. */#define TRACE_ON_WHAT_BIT 0x00020000 /* Traces on */#define ONEM_BUF_WHAT_BIT 0x00040000 /* 1Meg vs 256K */#define CHAR_API_WHAT_BIT 0x00080000 /* Char API vs network only */#define MS_DOS_WHAT_BIT 0x00100000 /* MS_DOS */#define CMD_EVT_WHAT_BIT 0x00200000 /* Command event */#define LONG_TX_WHAT_BIT 0x00400000#define LONG_RX_WHAT_BIT 0x00800000#define WHAT_BIT_MASK 0xFFFD0000 /* Feature bit mask *//* * Mode status */#define EVENT_OVFL 0x80000000#define FATAL_ERR 0x40000000#define LOOP_BACK 0x01#define MODE_PH 0x02#define MODE_FP 0x00#define PTR64BIT 0x04#define PTR32BIT 0x00#define PTR_WD_SWAP 0x08#define PTR_WD_NOSWAP 0x00#define POST_WARN_EVENT 0x10#define ERR_TERM 0x20#define DIRECT_CONN 0x40#define NO_NIC_WATCHDOG 0x80#define SWAP_DATA 0x100#define SWAP_CONTROL 0x200#define NIC_HALT_ON_ERR 0x400#define NIC_NO_RESTART 0x800#define HALF_DUP_TX 0x1000#define HALF_DUP_RX 0x2000/* * Error codes *//* Host Error Codes - values of fail1 */#define ERR_UNKNOWN_MBOX 0x1001#define ERR_UNKNOWN_CMD 0x1002#define ERR_MAX_RING 0x1003#define ERR_RING_CLOSED 0x1004#define ERR_RING_OPEN 0x1005/* Firmware internal errors */#define ERR_EVENT_RING_FULL 0x01#define ERR_DW_PEND_CMND_FULL 0x02#define ERR_DR_PEND_CMND_FULL 0x03#define ERR_DW_PEND_DATA_FULL 0x04#define ERR_DR_PEND_DATA_FULL 0x05#define ERR_ILLEGAL_JUMP 0x06#define ERR_UNIMPLEMENTED 0x07#define ERR_TX_INFO_FULL 0x08#define ERR_RX_INFO_FULL 0x09#define ERR_ILLEGAL_MODE 0x0A#define ERR_MAIN_TIMEOUT 0x0B#define ERR_EVENT_BITS 0x0C#define ERR_UNPEND_FULL 0x0D#define ERR_TIMER_QUEUE_FULL 0x0E#define ERR_TIMER_QUEUE_EMPTY 0x0F#define ERR_TIMER_NO_FREE 0x10#define ERR_INTR_START 0x11#define ERR_BAD_STARTUP 0x12#define ERR_NO_PKT_END 0x13#define ERR_HALTED_ON_ERR 0x14/* Hardware NIC Errors */#define ERR_WRITE_DMA 0x0101#define ERR_READ_DMA 0x0102#define ERR_EXT_SERIAL 0x0103#define ERR_TX_INT_PARITY 0x0104/* * Event definitions */#define EVT_RING_ENTRIES 64#define EVT_RING_SIZE (EVT_RING_ENTRIES * sizeof(struct event))struct event {#ifdef __LITTLE_ENDIAN u16 index; u8 ring; u8 code;#else u8 code; u8 ring; u16 index;#endif u32 timestamp;};/* * General Events */#define E_NIC_UP 0x01#define E_WATCHDOG 0x02#define E_STAT_UPD 0x04#define E_INVAL_CMD 0x05#define E_SET_CMD_CONS 0x06#define E_LINK_ON 0x07#define E_LINK_OFF 0x08#define E_INTERN_ERR 0x09#define E_HOST_ERR 0x0A#define E_STATS_UPDATE 0x0B#define E_REJECTING 0x0C/* * Send Events */#define E_CON_REJ 0x13#define E_CON_TMOUT 0x14#define E_CON_NC_TMOUT 0x15 /* I , Connection No Campon Timeout */#define E_DISC_ERR 0x16#define E_INT_PRTY 0x17#define E_TX_IDLE 0x18#define E_TX_LINK_DROP 0x19#define E_TX_INV_RNG 0x1A#define E_TX_INV_BUF 0x1B#define E_TX_INV_DSC 0x1C/* * Destination Events *//* * General Receive events */#define E_VAL_RNG 0x20#define E_RX_RNG_ENER 0x21#define E_INV_RNG 0x22#define E_RX_RNG_SPC 0x23#define E_RX_RNG_OUT 0x24#define E_PKT_DISCARD 0x25#define E_INFO_EVT 0x27/* * Data corrupted events */#define E_RX_PAR_ERR 0x2B#define E_RX_LLRC_ERR 0x2C#define E_IP_CKSM_ERR 0x2D#define E_DTA_CKSM_ERR 0x2E#define E_SHT_BST 0x2F/* * Data lost events */#define E_LST_LNK_ERR 0x30#define E_FLG_SYN_ERR 0x31#define E_FRM_ERR 0x32#define E_RX_IDLE 0x33#define E_PKT_LN_ERR 0x34#define E_STATE_ERR 0x35#define E_UNEXP_DATA 0x3C/* * Fatal events */#define E_RX_INV_BUF 0x36#define E_RX_INV_DSC 0x37#define E_RNG_BLK 0x38/* * Warning events */#define E_RX_TO 0x39#define E_BFR_SPC 0x3A#define E_INV_ULP 0x3B#define E_NOT_IMPLEMENTED 0x40/* * Commands */#define CMD_RING_ENTRIES 16struct cmd {#ifdef __LITTLE_ENDIAN u16 index; u8 ring; u8 code;#else u8 code; u8 ring; u16 index;#endif};#define C_START_FW 0x01#define C_UPD_STAT 0x02#define C_WATCHDOG 0x05#define C_DEL_RNG 0x09#define C_NEW_RNG 0x0A#define C_CONN 0x0D/* * Mode bits */#define INTERRUPT 0x02#define TX_IP_CKSUM 0x04#define PACKET_END 0x08#define PACKET_START 0x10#define SAME_IFIELD 0x80/* * TX ring */#ifdef CONFIG_ROADRUNNER_LARGE_RINGS#define TX_RING_ENTRIES 32#else#define TX_RING_ENTRIES 16#endif#define TX_RING_SIZE (TX_RING_ENTRIES * sizeof(struct tx_desc))struct tx_desc{#if (BITS_PER_LONG == 64) u64 addr;#else u32 zero; u32 addr;#endif u32 res;#ifdef __LITTLE_ENDIAN u16 size; u8 pad; u8 mode;#else u8 mode; u8 pad; u16 size;#endif};#ifdef CONFIG_ROADRUNNER_LARGE_RINGS#define RX_RING_ENTRIES 32#else#define RX_RING_ENTRIES 16#endif#define RX_RING_SIZE (RX_RING_ENTRIES * sizeof(struct rx_desc))struct rx_desc{#if (BITS_PER_LONG == 64) u64 addr;#else u32 zero; u32 addr;#endif u32 res;#ifdef __LITTLE_ENDIAN u16 size; u8 pad; u8 mode;#else u8 mode; u8 pad; u16 size;#endif};/* * ioctl's */#define SIOCRRPFW SIOCDEVPRIVATE /* put firmware */#define SIOCRRGFW SIOCDEVPRIVATE+1 /* get firmware */#define SIOCRRID SIOCDEVPRIVATE+2 /* identify */struct seg_hdr { u32 seg_start; u32 seg_len; u32 seg_eestart;};#define EEPROM_BASE 0x80000000#define EEPROM_WORDS 8192#define EEPROM_BYTES (EEPROM_WORDS * sizeof(u32))struct eeprom_boot { u32 key1; u32 key2; u32 sram_size; struct seg_hdr loader; u32 init_chksum; u32 reserved1;};struct eeprom_manf { u32 HeaderFmt; u32 Firmware; u32 BoardRevision; u32 RoadrunnerRev; char OpticsPart[8]; u32 OpticsRev; u32 pad1; char SramPart[8]; u32 SramRev; u32 pad2; char EepromPart[8]; u32 EepromRev; u32 EepromSize; char PalPart[8]; u32 PalRev; u32 pad3; char PalCodeFile[12]; u32 PalCodeRev; char BoardULA[8]; char SerialNo[8]; char MfgDate[8]; char MfgTime[8]; char ModifyDate[8]; u32 ModCount; u32 pad4[13];};struct eeprom_phase_info { char phase1File[12]; u32 phase1Rev; char phase1Date[8]; char phase2File[12]; u32 phase2Rev; char phase2Date[8]; u32 reserved7[4];};struct eeprom_rncd_info { u32 FwStart; u32 FwRev; char FwDate[8]; u32 AddrRunCodeSegs; u32 FileNames; char File[13][8];};/* Phase 1 region (starts are word offset 0x80) */struct phase1_hdr{ u32 jump; u32 noop; struct seg_hdr phase2Seg;};struct eeprom { struct eeprom_boot boot; u32 pad1[8]; struct eeprom_manf manf; struct eeprom_phase_info phase_info; struct eeprom_rncd_info rncd_info; u32 pad2[15]; u32 hdr_checksum; struct phase1_hdr phase1;};struct rr_stats { u32 NicTimeStamp; u32 RngCreated; u32 RngDeleted; u32 IntrGen; u32 NEvtOvfl; u32 InvCmd; u32 DmaReadErrs; u32 DmaWriteErrs; u32 StatUpdtT; u32 StatUpdtC; u32 WatchDog; u32 Trace; /* Serial HIPPI */ u32 LnkRdyEst; u32 GLinkErr; u32 AltFlgErr; u32 OvhdBit8Sync; u32 RmtSerPrtyErr; u32 RmtParPrtyErr; u32 RmtLoopBk; u32 pad1; /* HIPPI tx */ u32 ConEst; u32 ConRejS; u32 ConRetry; u32 ConTmOut; u32 SndConDiscon; u32 SndParErr; u32 PktSnt; u32 pad2[2]; u32 ShFBstSnt; u64 BytSent; u32 TxTimeout; u32 pad3[3]; /* HIPPI rx */ u32 ConAcc; u32 ConRejdiPrty; u32 ConRejd64b; u32 ConRejdBuf; u32 RxConDiscon; u32 RxConNoData; u32 PktRx; u32 pad4[2]; u32 ShFBstRx; u64 BytRx; u32 RxParErr; u32 RxLLRCerr; u32 RxBstSZerr; u32 RxStateErr; u32 RxRdyErr; u32 RxInvULP; u32 RxSpcBuf; u32 RxSpcDesc; u32 RxRngSpc; u32 RxRngFull; u32 RxPktLenErr; u32 RxCksmErr; u32 RxPktDrp; u32 RngLowSpc; u32 RngDataClose; u32 RxTimeout; u32 RxIdle;};/* * This struct is shared with the NIC firmware. */struct ring_ctrl {#if (BITS_PER_LONG == 64) u64 rngptr;#else u32 zero; u32 rngptr;#endif#ifdef __LITTLE_ENDIAN u16 entries; u8 pad; u8 entry_size; u16 pi; u16 mode;#else u8 entry_size; u8 pad; u16 entries; u16 mode; u16 pi;#endif};struct rr_info { union { struct rr_stats stats; u32 stati[128]; } s; struct ring_ctrl evt_ctrl; struct ring_ctrl cmd_ctrl; struct ring_ctrl tx_ctrl; u8 pad[464]; u8 trace[3072];};/* * The linux structure for the RoadRunner. * * RX/TX descriptors are put first to make sure they are properly * aligned and do not cross cache-line boundaries. */struct rr_private{ struct rx_desc rx_ring[RX_RING_ENTRIES]; struct tx_desc tx_ring[TX_RING_ENTRIES]; struct event evt_ring[EVT_RING_ENTRIES]; struct sk_buff *tx_skbuff[TX_RING_ENTRIES]; struct sk_buff *rx_skbuff[RX_RING_ENTRIES]; struct rr_regs *regs; /* Register base */ struct ring_ctrl *rx_ctrl; /* Receive ring control */ struct rr_info *info; /* Shared info page */ spinlock_t lock; struct timer_list timer; u32 cur_rx, cur_cmd, cur_evt; u32 dirty_rx, dirty_tx; u32 tx_full; short fw_running; u8 pci_bus; /* PCI bus number */ u8 pci_dev_fun; /* PCI device numbers */ char name[24]; /* The assigned name */ struct net_device_stats stats;};/* * Prototypes */static int rr_init(struct device *dev);static int rr_init1(struct device *dev);static void rr_interrupt(int irq, void *dev_id, struct pt_regs *regs);static int rr_open(struct device *dev);static int rr_start_xmit(struct sk_buff *skb, struct device *dev);static int rr_close(struct device *dev);static struct net_device_stats *rr_get_stats(struct device *dev);static int rr_ioctl(struct device *dev, struct ifreq *rq, int cmd);#endif /* _RRUNNER_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -