From: Pete P. <pp...@us...> - 2001-08-22 00:33:57
|
Update of /cvsroot/linux-mips/linux/drivers/net In directory usw-pr-cvs1:/tmp/cvs-serv2570/drivers/net Modified Files: gt96100eth.c gt96100eth.h Log Message: Latest gt96100 ethernet driver. Index: gt96100eth.c =================================================================== RCS file: /cvsroot/linux-mips/linux/drivers/net/gt96100eth.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** gt96100eth.c 2001/06/22 02:29:32 1.1.1.1 --- gt96100eth.c 2001/08/22 00:33:54 1.2 *************** *** 25,28 **** --- 25,34 ---- */ + #ifndef __OPTIMIZE__ + #error You must compile this file with the correct options! + #error See the last lines of the source file. + #error You must compile this driver with "-O". + #endif + #ifndef __mips__ [...2737 lines suppressed...] ! spin_unlock_irqrestore(&gp->lock, flags); } ! static struct net_device_stats * ! gt96100_get_stats(struct net_device *dev) { ! struct gt96100_private *gp = (struct gt96100_private *)dev->priv; ! unsigned long flags; ! if (gt96100_debug > 3) ! printk("%s: gt96100_get_stats: dev=%p\n", dev->name, dev); ! if (netif_device_present(dev)) { ! spin_lock_irqsave (&gp->lock, flags); ! update_stats(gp); ! spin_unlock_irqrestore (&gp->lock, flags); ! } ! return &gp->stats; } Index: gt96100eth.h =================================================================== RCS file: /cvsroot/linux-mips/linux/drivers/net/gt96100eth.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** gt96100eth.h 2001/06/22 02:29:32 1.1.1.1 --- gt96100eth.h 2001/08/22 00:33:54 1.2 *************** *** 33,37 **** #define TX_RING_SIZE 16 #define RX_RING_SIZE 32 ! #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */ #define RX_HASH_TABLE_SIZE 16384 --- 33,37 ---- #define TX_RING_SIZE 16 #define RX_RING_SIZE 32 ! #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ #define RX_HASH_TABLE_SIZE 16384 *************** *** 40,44 **** #define NUM_INTERFACES 2 ! #define GT96100ETH_TX_TIMEOUT HZ #define GT96100_ETH0_BASE (MIPS_GT96100_BASE + GT96100_ETH_PORT_CONFIG) --- 40,44 ---- #define NUM_INTERFACES 2 ! #define GT96100ETH_TX_TIMEOUT HZ/4 #define GT96100_ETH0_BASE (MIPS_GT96100_BASE + GT96100_ETH_PORT_CONFIG) *************** *** 53,56 **** --- 53,59 ---- #endif + #define REV_GT96100 1 + #define REV_GT96100A 3 + #define GT96100ETH_READ(gp, offset) \ GT96100_READ((gp->port_offset + offset)) *************** *** 70,127 **** /* Bit definitions of the SMI Reg */ enum { ! smirDataMask = 0xffff, ! smirPhyAdMask = 0x1f << 16, ! smirPhyAdBit = 16, ! smirRegAdMask = 0x1f << 21, ! smirRegAdBit = 21, ! smirOpCode = 1 << 26, ! smirReadValid = 1 << 27, ! smirBusy = 1 << 28 }; /* Bit definitions of the Port Config Reg */ enum pcr_bits { ! pcrPM = 1, ! pcrRBM = 2, ! pcrPBF = 4, ! pcrEN = 1 << 7, ! pcrLPBKMask = 0x3 << 8, ! pcrLPBKBit = 8, ! pcrFC = 1 << 10, ! pcrHS = 1 << 12, ! pcrHM = 1 << 13, ! pcrHDM = 1 << 14, ! pcrHD = 1 << 15, ! pcrISLMask = 0x7 << 28, ! pcrISLBit = 28, ! pcrACCS = 1 << 31 }; /* Bit definitions of the Port Config Extend Reg */ enum pcxr_bits { ! pcxrIGMP = 1, ! pcxrSPAN = 2, ! pcxrPAR = 4, ! pcxrPRIOtxMask = 0x7 << 3, ! pcxrPRIOtxBit = 3, ! pcxrPRIOrxMask = 0x3 << 6, ! pcxrPRIOrxBit = 6, ! pcxrPRIOrxOverride = 1 << 8, ! pcxrDPLXen = 1 << 9, ! pcxrFCTLen = 1 << 10, ! pcxrFLP = 1 << 11, ! pcxrFCTL = 1 << 12, ! pcxrMFLMask = 0x3 << 14, ! pcxrMFLBit = 14, ! pcxrMIBclrMode = 1 << 16, ! pcxrSpeed = 1 << 18, ! pcxrSpeeden = 1 << 19, ! pcxrRMIIen = 1 << 20, ! pcxrDSCPen = 1 << 21 }; /* Bit definitions of the Port Command Reg */ enum pcmr_bits { ! pcmrFJ = 1 << 15 }; --- 73,130 ---- /* Bit definitions of the SMI Reg */ enum { ! smirDataMask = 0xffff, ! smirPhyAdMask = 0x1f<<16, ! smirPhyAdBit = 16, ! smirRegAdMask = 0x1f<<21, ! smirRegAdBit = 21, ! smirOpCode = 1<<26, ! smirReadValid = 1<<27, ! smirBusy = 1<<28 }; /* Bit definitions of the Port Config Reg */ enum pcr_bits { ! pcrPM = 1, ! pcrRBM = 2, ! pcrPBF = 4, ! pcrEN = 1<<7, ! pcrLPBKMask = 0x3<<8, ! pcrLPBKBit = 8, ! pcrFC = 1<<10, ! pcrHS = 1<<12, ! pcrHM = 1<<13, ! pcrHDM = 1<<14, ! pcrHD = 1<<15, ! pcrISLMask = 0x7<<28, ! pcrISLBit = 28, ! pcrACCS = 1<<31 }; /* Bit definitions of the Port Config Extend Reg */ enum pcxr_bits { ! pcxrIGMP = 1, ! pcxrSPAN = 2, ! pcxrPAR = 4, ! pcxrPRIOtxMask = 0x7<<3, ! pcxrPRIOtxBit = 3, ! pcxrPRIOrxMask = 0x3<<6, ! pcxrPRIOrxBit = 6, ! pcxrPRIOrxOverride = 1<<8, ! pcxrDPLXen = 1<<9, ! pcxrFCTLen = 1<<10, ! pcxrFLP = 1<<11, ! pcxrFCTL = 1<<12, ! pcxrMFLMask = 0x3<<14, ! pcxrMFLBit = 14, ! pcxrMIBclrMode = 1<<16, ! pcxrSpeed = 1<<18, ! pcxrSpeeden = 1<<19, ! pcxrRMIIen = 1<<20, ! pcxrDSCPen = 1<<21 }; /* Bit definitions of the Port Command Reg */ enum pcmr_bits { ! pcmrFJ = 1<<15 }; *************** *** 129,324 **** /* Bit definitions of the Port Status Reg */ enum psr_bits { ! psrSpeed = 1, ! psrDuplex = 2, ! psrFctl = 4, ! psrLink = 8, ! psrPause = 1 << 4, ! psrTxLow = 1 << 5, ! psrTxHigh = 1 << 6, ! psrTxInProg = 1 << 7 }; /* Bit definitions of the SDMA Config Reg */ enum sdcr_bits { ! sdcrRCMask = 0xf << 2, ! sdcrRCBit = 2, ! sdcrBLMR = 1 << 6, ! sdcrBLMT = 1 << 7, ! sdcrPOVR = 1 << 8, ! sdcrRIFB = 1 << 9, ! sdcrBSZMask = 0x3 << 12, ! sdcrBSZBit = 12 }; /* Bit definitions of the SDMA Command Reg */ enum sdcmr_bits { ! sdcmrERD = 1 << 7, ! sdcmrAR = 1 << 15, ! sdcmrSTDH = 1 << 16, ! sdcmrSTDL = 1 << 17, ! sdcmrTXDH = 1 << 23, ! sdcmrTXDL = 1 << 24, ! sdcmrAT = 1 << 31 }; /* Bit definitions of the Interrupt Cause Reg */ enum icr_bits { ! icrRxBuffer = 1, ! icrTxBufferHigh = 1 << 2, ! icrTxBufferLow = 1 << 3, ! icrTxEndHigh = 1 << 6, ! icrTxEndLow = 1 << 7, ! icrRxError = 1 << 8, ! icrTxErrorHigh = 1 << 10, ! icrTxErrorLow = 1 << 11, ! icrRxOVR = 1 << 12, ! icrTxUdr = 1 << 13, ! icrRxBufferQ0 = 1 << 16, ! icrRxBufferQ1 = 1 << 17, ! icrRxBufferQ2 = 1 << 18, ! icrRxBufferQ3 = 1 << 19, ! icrRxErrorQ0 = 1 << 20, ! icrRxErrorQ1 = 1 << 21, ! icrRxErrorQ2 = 1 << 22, ! icrRxErrorQ3 = 1 << 23, ! icrMIIPhySTC = 1 << 28, ! icrSMIdone = 1 << 29, ! icrEtherIntSum = 1 << 31 }; /* The Rx and Tx descriptor lists. */ - typedef struct { ! u32 cmdstat; ! u32 byte_cnt; ! u32 buff_ptr; ! u32 next; ! } gt96100_td_t; ! ! #define tdByteCntBit 16 typedef struct { ! u32 cmdstat; ! u32 buff_cnt_sz; ! u32 buff_ptr; ! u32 next; ! } gt96100_rd_t; ! ! #define rdBuffSzBit 16 ! #define rdByteCntMask 0xffff /* Values for the Tx command-status descriptor entry. */ enum td_cmdstat { ! txOwn = 1 << 31, ! txAutoMode = 1 << 30, ! txEI = 1 << 23, ! txGenCRC = 1 << 22, ! txPad = 1 << 18, ! txFirst = 1 << 17, ! txLast = 1 << 16, ! txErrorSummary = 1 << 15, ! txReTxCntMask = 0x0f << 10, ! txReTxCntBit = 10, ! txCollision = 1 << 9, ! txReTxLimit = 1 << 8, ! txUnderrun = 1 << 6, ! txLateCollision = 1 << 5 }; - #define TxReTxCntBit 10 /* Values for the Rx command-status descriptor entry. */ enum rd_cmdstat { ! rxOwn = 1 << 31, ! rxAutoMode = 1 << 30, ! rxEI = 1 << 23, ! rxFirst = 1 << 17, ! rxLast = 1 << 16, ! rxErrorSummary = 1 << 15, ! rxIGMP = 1 << 14, ! rxHashExpired = 1 << 13, ! rxMissedFrame = 1 << 12, ! rxFrameType = 1 << 11, ! rxShortFrame = 1 << 8, ! rxMaxFrameLen = 1 << 7, ! rxOverrun = 1 << 6, ! rxCollision = 1 << 4, ! rxCRCError = 1 }; /* Bit fields of a Hash Table Entry */ enum hash_table_entry { ! hteValid = 1, ! hteSkip = 2, ! hteRD = 4 }; // The MIB counters typedef struct { ! u32 byteReceived; ! u32 byteSent; ! u32 framesReceived; ! u32 framesSent; ! u32 totalByteReceived; ! u32 totalFramesReceived; ! u32 broadcastFramesReceived; ! u32 multicastFramesReceived; ! u32 cRCError; ! u32 oversizeFrames; ! u32 fragments; ! u32 jabber; ! u32 collision; ! u32 lateCollision; ! u32 frames64; ! u32 frames65_127; ! u32 frames128_255; ! u32 frames256_511; ! u32 frames512_1023; ! u32 frames1024_MaxSize; ! u32 macRxError; ! u32 droppedFrames; ! u32 outMulticastFrames; ! u32 outBroadcastFrames; ! u32 undersizeFrames; } mib_counters_t; struct gt96100_private { ! gt96100_rd_t *rx_ring; ! gt96100_td_t *tx_ring; ! // The Rx and Tx rings must be 16-byte aligned ! dma_addr_t rx_ring_dma; ! dma_addr_t tx_ring_dma; ! char *hash_table; ! // The Hash Table must be 8-byte aligned ! dma_addr_t hash_table_dma; ! int hash_mode; ! ! // The Rx buffers must be 8-byte aligned ! char *rx_buff[RX_RING_SIZE]; ! // Tx buffers (tx_skbuff[i]->data) with less than 8 bytes ! // of payload must be 8-byte aligned ! struct sk_buff *tx_skbuff[TX_RING_SIZE]; ! int rx_next_out; /* The next free ring entry to receive */ ! int tx_next_in; /* The next free ring entry to send */ ! int tx_next_out; /* The last ring entry the ISR processed */ ! int tx_count; /* current # of pkts waiting to be sent in Tx ring */ ! ! mib_counters_t mib; ! struct net_device_stats stats; ! ! int io_size; ! int port_num; // 0 or 1 ! u32 port_offset; ! int phy_addr; // PHY address ! u32 last_psr; // last value of the port status register ! int options; /* User-settable misc. driver options. */ ! int drv_flags; ! unsigned char phys[2]; /* MII device addresses. */ ! spinlock_t lock; /* Serialise access to device */ }; --- 132,335 ---- /* Bit definitions of the Port Status Reg */ enum psr_bits { ! psrSpeed = 1, ! psrDuplex = 2, ! psrFctl = 4, ! psrLink = 8, ! psrPause = 1<<4, ! psrTxLow = 1<<5, ! psrTxHigh = 1<<6, ! psrTxInProg = 1<<7 }; /* Bit definitions of the SDMA Config Reg */ enum sdcr_bits { ! sdcrRCMask = 0xf<<2, ! sdcrRCBit = 2, ! sdcrBLMR = 1<<6, ! sdcrBLMT = 1<<7, ! sdcrPOVR = 1<<8, ! sdcrRIFB = 1<<9, ! sdcrBSZMask = 0x3<<12, ! sdcrBSZBit = 12 }; /* Bit definitions of the SDMA Command Reg */ enum sdcmr_bits { ! sdcmrERD = 1<<7, ! sdcmrAR = 1<<15, ! sdcmrSTDH = 1<<16, ! sdcmrSTDL = 1<<17, ! sdcmrTXDH = 1<<23, ! sdcmrTXDL = 1<<24, ! sdcmrAT = 1<<31 }; /* Bit definitions of the Interrupt Cause Reg */ enum icr_bits { ! icrRxBuffer = 1, ! icrTxBufferHigh = 1<<2, ! icrTxBufferLow = 1<<3, ! icrTxEndHigh = 1<<6, ! icrTxEndLow = 1<<7, ! icrRxError = 1<<8, ! icrTxErrorHigh = 1<<10, ! icrTxErrorLow = 1<<11, ! icrRxOVR = 1<<12, ! icrTxUdr = 1<<13, ! icrRxBufferQ0 = 1<<16, ! icrRxBufferQ1 = 1<<17, ! icrRxBufferQ2 = 1<<18, ! icrRxBufferQ3 = 1<<19, ! icrRxErrorQ0 = 1<<20, ! icrRxErrorQ1 = 1<<21, ! icrRxErrorQ2 = 1<<22, ! icrRxErrorQ3 = 1<<23, ! icrMIIPhySTC = 1<<28, ! icrSMIdone = 1<<29, ! icrEtherIntSum = 1<<31 }; /* The Rx and Tx descriptor lists. */ typedef struct { ! #ifdef DESC_BE ! u16 byte_cnt; ! u16 reserved; ! #else ! u16 reserved; ! u16 byte_cnt; ! #endif ! u32 cmdstat; ! u32 next; ! u32 buff_ptr; ! } gt96100_td_t __attribute__ ((packed)); typedef struct { ! #ifdef DESC_BE ! u16 buff_sz; ! u16 byte_cnt; ! #else ! u16 byte_cnt; ! u16 buff_sz; ! #endif ! u32 cmdstat; ! u32 next; ! u32 buff_ptr; ! } gt96100_rd_t __attribute__ ((packed)); /* Values for the Tx command-status descriptor entry. */ enum td_cmdstat { ! txOwn = 1<<31, ! txAutoMode = 1<<30, ! txEI = 1<<23, ! txGenCRC = 1<<22, ! txPad = 1<<18, ! txFirst = 1<<17, ! txLast = 1<<16, ! txErrorSummary = 1<<15, ! txReTxCntMask = 0x0f<<10, ! txReTxCntBit = 10, ! txCollision = 1<<9, ! txReTxLimit = 1<<8, ! txUnderrun = 1<<6, ! txLateCollision = 1<<5 }; /* Values for the Rx command-status descriptor entry. */ enum rd_cmdstat { ! rxOwn = 1<<31, ! rxAutoMode = 1<<30, ! rxEI = 1<<23, ! rxFirst = 1<<17, ! rxLast = 1<<16, ! rxErrorSummary = 1<<15, ! rxIGMP = 1<<14, ! rxHashExpired = 1<<13, ! rxMissedFrame = 1<<12, ! rxFrameType = 1<<11, ! rxShortFrame = 1<<8, ! rxMaxFrameLen = 1<<7, ! rxOverrun = 1<<6, ! rxCollision = 1<<4, ! rxCRCError = 1 }; /* Bit fields of a Hash Table Entry */ enum hash_table_entry { ! hteValid = 1, ! hteSkip = 2, ! hteRD = 4 }; // The MIB counters typedef struct { ! u32 byteReceived; ! u32 byteSent; ! u32 framesReceived; ! u32 framesSent; ! u32 totalByteReceived; ! u32 totalFramesReceived; ! u32 broadcastFramesReceived; ! u32 multicastFramesReceived; ! u32 cRCError; ! u32 oversizeFrames; ! u32 fragments; ! u32 jabber; ! u32 collision; ! u32 lateCollision; ! u32 frames64; ! u32 frames65_127; ! u32 frames128_255; ! u32 frames256_511; ! u32 frames512_1023; ! u32 frames1024_MaxSize; ! u32 macRxError; ! u32 droppedFrames; ! u32 outMulticastFrames; ! u32 outBroadcastFrames; ! u32 undersizeFrames; } mib_counters_t; struct gt96100_private { ! gt96100_rd_t* rx_ring; ! gt96100_td_t* tx_ring; ! // The Rx and Tx rings must be 16-byte aligned ! dma_addr_t rx_ring_dma; ! dma_addr_t tx_ring_dma; ! char* hash_table; ! // The Hash Table must be 8-byte aligned ! dma_addr_t hash_table_dma; ! int hash_mode; ! ! // The Rx buffers must be 8-byte aligned ! char* rx_buff; ! dma_addr_t rx_buff_dma; ! // Tx buffers (tx_skbuff[i]->data) with less than 8 bytes ! // of payload must be 8-byte aligned ! struct sk_buff* tx_skbuff[TX_RING_SIZE]; ! int rx_next_out; /* The next free ring entry to receive */ ! int tx_next_in; /* The next free ring entry to send */ ! int tx_next_out; /* The last ring entry the ISR processed */ ! int tx_count; /* current # of pkts waiting to be sent in Tx ring */ ! int intr_work_done; /* number of Rx and Tx pkts processed in the isr */ ! int tx_full; /* Tx ring is full */ ! ! mib_counters_t mib; ! struct net_device_stats stats; ! int io_size; ! int port_num; // 0 or 1 ! int chip_rev; ! u32 port_offset; ! ! int phy_addr; // PHY address ! u32 last_psr; // last value of the port status register ! int options; /* User-settable misc. driver options. */ ! int drv_flags; ! spinlock_t lock; /* Serialise access to device */ }; |