📄 sunbmac.h
字号:
#define BIGMAC_RXCFG_ME 0x00000200 /* Receive packets addressed to me */#define BIGMAC_RXCFG_PGRP 0x00000400 /* Enable promisc group mode */#define BIGMAC_RXCFG_HENABLE 0x00000800 /* Enable the hash filter */#define BIGMAC_RXCFG_AENABLE 0x00001000 /* Enable the address filter *//* The BigMAC PHY transceiver. Not nearly as sophisticated as the happy meal * one. But it does have the "bit banger", oh baby. */struct bmac_tcvr { unsigned int tcvr_pal; unsigned int mgmt_pal;};/* Frame commands. */#define FRAME_WRITE 0x50020000#define FRAME_READ 0x60020000/* Tranceiver registers. */#define TCVR_PAL_SERIAL 0x00000001 /* Enable serial mode */#define TCVR_PAL_EXTLBACK 0x00000002 /* Enable external loopback */#define TCVR_PAL_MSENSE 0x00000004 /* Media sense */#define TCVR_PAL_LTENABLE 0x00000008 /* Link test enable */#define TCVR_PAL_LTSTATUS 0x00000010 /* Link test status (P1 only) *//* Management PAL. */#define MGMT_PAL_DCLOCK 0x00000001 /* Data clock */#define MGMT_PAL_OENAB 0x00000002 /* Output enabler */#define MGMT_PAL_MDIO 0x00000004 /* MDIO Data/attached */#define MGMT_PAL_TIMEO 0x00000008 /* Transmit enable timeout error */#define MGMT_PAL_EXT_MDIO MGMT_PAL_MDIO#define MGMT_PAL_INT_MDIO MGMT_PAL_TIMEO/* Here are some PHY addresses. */#define BIGMAC_PHY_EXTERNAL 0 /* External transceiver */#define BIGMAC_PHY_INTERNAL 1 /* Internal transceiver *//* PHY registers */#define BIGMAC_BMCR 0x00 /* Basic mode control register */#define BIGMAC_BMSR 0x01 /* Basic mode status register *//* BMCR bits */#define BMCR_ISOLATE 0x0400 /* Disconnect DP83840 from MII */#define BMCR_PDOWN 0x0800 /* Powerdown the DP83840 */#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */#define BMCR_SPEED100 0x2000 /* Select 100Mbps */#define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */#define BMCR_RESET 0x8000 /* Reset the DP83840 *//* BMSR bits */#define BMSR_ERCAP 0x0001 /* Ext-reg capability */#define BMSR_JCD 0x0002 /* Jabber detected */#define BMSR_LSTATUS 0x0004 /* Link status *//* Ring descriptors and such, same as Quad Ethernet. */struct be_rxd { unsigned int rx_flags; unsigned int rx_addr;};#define RXD_OWN 0x80000000 /* Ownership. */#define RXD_UPDATE 0x10000000 /* Being Updated? */#define RXD_LENGTH 0x000007ff /* Packet Length. */struct be_txd { unsigned int tx_flags; unsigned int tx_addr;};#define TXD_OWN 0x80000000 /* Ownership. */#define TXD_SOP 0x40000000 /* Start Of Packet */#define TXD_EOP 0x20000000 /* End Of Packet */#define TXD_UPDATE 0x10000000 /* Being Updated? */#define TXD_LENGTH 0x000007ff /* Packet Length. */#define TX_RING_MAXSIZE 256#define RX_RING_MAXSIZE 256#define TX_RING_SIZE 256#define RX_RING_SIZE 256#define NEXT_RX(num) (((num) + 1) & (RX_RING_SIZE - 1))#define NEXT_TX(num) (((num) + 1) & (TX_RING_SIZE - 1))#define PREV_RX(num) (((num) - 1) & (RX_RING_SIZE - 1))#define PREV_TX(num) (((num) - 1) & (TX_RING_SIZE - 1))#define TX_BUFFS_AVAIL(bp) \ (((bp)->tx_old <= (bp)->tx_new) ? \ (bp)->tx_old + (TX_RING_SIZE - 1) - (bp)->tx_new : \ (bp)->tx_old - (bp)->tx_new - 1)#define SUN4C_TX_BUFFS_AVAIL(bp) \ (((bp)->tx_old <= (bp)->tx_new) ? \ (bp)->tx_old + (SUN4C_TX_RING_SIZE - 1) - (bp)->tx_new : \ (bp)->tx_old - (bp)->tx_new - (TX_RING_SIZE - SUN4C_TX_RING_SIZE))#define RX_COPY_THRESHOLD 128#define RX_BUF_ALLOC_SIZE (ETH_FRAME_LEN + (64 * 3))struct bmac_init_block { struct be_rxd be_rxd[RX_RING_MAXSIZE]; struct be_txd be_txd[TX_RING_MAXSIZE];};#define bib_offset(mem, elem) \((__u32)((unsigned long)(&(((struct bmac_init_block *)0)->mem[elem]))))#define SUN4C_PKT_BUF_SZ 1546#define SUN4C_RX_BUFF_SIZE SUN4C_PKT_BUF_SZ#define SUN4C_TX_BUFF_SIZE SUN4C_PKT_BUF_SZ#define SUN4C_RX_RING_SIZE 16#define SUN4C_TX_RING_SIZE 16struct bigmac_buffers { char tx_buf[SUN4C_TX_RING_SIZE][SUN4C_TX_BUFF_SIZE]; char pad[2]; /* Align rx_buf for copy_and_sum(). */ char rx_buf[SUN4C_RX_RING_SIZE][SUN4C_RX_BUFF_SIZE];};#define bbuf_offset(mem, elem) \((__u32)((unsigned long)(&(((struct bigmac_buffers *)0)->mem[elem][0]))))/* Now software state stuff. */enum bigmac_transceiver { external = 0, internal = 1, none = 2,};/* Timer state engine. */enum bigmac_timer_state { ltrywait = 1, /* Forcing try of all modes, from fastest to slowest. */ asleep = 2, /* Timer inactive. */};struct bigmac { struct qe_globreg *gregs; /* QEC Global Registers */ struct qe_creg *creg; /* QEC BigMAC Channel Registers */ struct BIG_MAC_regs *bregs; /* BigMAC Registers */ struct bmac_tcvr *tregs; /* BigMAC Transceiver */ struct bmac_init_block *bmac_block; /* RX and TX descriptors */ __u32 bblock_dvma; /* RX and TX descriptors */ struct sk_buff *rx_skbs[RX_RING_SIZE]; struct sk_buff *tx_skbs[TX_RING_SIZE]; int rx_new, tx_new, rx_old, tx_old; struct bigmac_buffers *sun4c_buffers; __u32 s4c_buf_dvma; int board_rev; /* BigMAC board revision. */ enum bigmac_transceiver tcvr_type; unsigned int bigmac_bursts; unsigned int paddr; unsigned short sw_bmsr; /* SW copy of PHY BMSR */ unsigned short sw_bmcr; /* SW copy of PHY BMCR */ struct timer_list bigmac_timer; enum bigmac_timer_state timer_state; unsigned int timer_ticks; struct enet_statistics enet_stats; struct linux_sbus_device *qec_sbus_dev; struct linux_sbus_device *bigmac_sbus_dev; struct device *dev; struct bigmac *next_module;};/* We use this to acquire receive skb's that we can DMA directly into. */#define ALIGNED_RX_SKB_ADDR(addr) \ ((((unsigned long)(addr) + (64 - 1)) & ~(64 - 1)) - (unsigned long)(addr))static inline struct sk_buff *big_mac_alloc_skb(unsigned int length, int gfp_flags){ struct sk_buff *skb; skb = alloc_skb(length + 64, gfp_flags); if(skb) { int offset = ALIGNED_RX_SKB_ADDR(skb->data); if(offset) skb_reserve(skb, offset); } return skb;}#endif /* !(_SUNBMAC_H) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -