drivers/net/ethernet/natsemi/sonic.h

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/natsemi/sonic.h

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/natsemi/sonic.h
Extension
.h
Size
14514 bytes
Lines
474
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct sonic_local {
	/* Bus size.  0 == 16 bits, 1 == 32 bits. */
	int dma_bitmode;
	/* Register offset within the longword (independent of endianness,
	   and varies from one type of Macintosh SONIC to another
	   (Aarrgh)) */
	int reg_offset;
	void *descriptors;
	/* Crud.  These areas have to be within the same 64K.  Therefore
       we allocate a desriptors page, and point these to places within it. */
	void *cda;  /* CAM descriptor area */
	void *tda;  /* Transmit descriptor area */
	void *rra;  /* Receive resource area */
	void *rda;  /* Receive descriptor area */
	struct sk_buff* volatile rx_skb[SONIC_NUM_RRS];	/* packets to be received */
	struct sk_buff* volatile tx_skb[SONIC_NUM_TDS];	/* packets to be transmitted */
	unsigned int tx_len[SONIC_NUM_TDS]; /* lengths of tx DMA mappings */
	/* Logical DMA addresses on MIPS, bus addresses on m68k
	 * (so "laddr" is a bit misleading) */
	dma_addr_t descriptors_laddr;
	u32 cda_laddr;              /* logical DMA address of CDA */
	u32 tda_laddr;              /* logical DMA address of TDA */
	u32 rra_laddr;              /* logical DMA address of RRA */
	u32 rda_laddr;              /* logical DMA address of RDA */
	dma_addr_t rx_laddr[SONIC_NUM_RRS]; /* logical DMA addresses of rx skbuffs */
	dma_addr_t tx_laddr[SONIC_NUM_TDS]; /* logical DMA addresses of tx skbuffs */
	unsigned int cur_rx;
	unsigned int cur_tx;           /* first unacked transmit packet */
	unsigned int eol_rx;
	unsigned int eol_tx;           /* last unacked transmit packet */
	int msg_enable;
	struct device *device;         /* generic device */
	struct net_device_stats stats;
	spinlock_t lock;
};

#define TX_TIMEOUT (3 * HZ)

/* Index to functions, as function prototypes. */

static int sonic_open(struct net_device *dev);
static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev);
static irqreturn_t sonic_interrupt(int irq, void *dev_id);
static void sonic_rx(struct net_device *dev);
static int sonic_close(struct net_device *dev);
static struct net_device_stats *sonic_get_stats(struct net_device *dev);
static void sonic_multicast_list(struct net_device *dev);
static int sonic_init(struct net_device *dev, bool may_sleep);
static void sonic_tx_timeout(struct net_device *dev, unsigned int txqueue);
static void sonic_msg_init(struct net_device *dev);
static int sonic_alloc_descriptors(struct net_device *dev);

/* Internal inlines for reading/writing DMA buffers.  Note that bus
   size and endianness matter here, whereas they don't for registers,
   as far as we can tell. */
/* OpenBSD calls this "SWO".  I'd like to think that sonic_buf_put()
   is a much better name. */
static inline void sonic_buf_put(u16 *base, int bitmode,
				 int offset, __u16 val)
{
	if (bitmode)
#ifdef __BIG_ENDIAN
		__raw_writew(val, base + (offset * 2) + 1);
#else
		__raw_writew(val, base + (offset * 2) + 0);
#endif
	else
		__raw_writew(val, base + (offset * 1) + 0);
}

static inline __u16 sonic_buf_get(u16 *base, int bitmode,
				  int offset)
{
	if (bitmode)
#ifdef __BIG_ENDIAN
		return __raw_readw(base + (offset * 2) + 1);
#else
		return __raw_readw(base + (offset * 2) + 0);
#endif
	else
		return __raw_readw(base + (offset * 1) + 0);
}

/* Inlines that you should actually use for reading/writing DMA buffers */
static inline void sonic_cda_put(struct net_device* dev, int entry,
				 int offset, __u16 val)
{
	struct sonic_local *lp = netdev_priv(dev);
	sonic_buf_put(lp->cda, lp->dma_bitmode,
		      (entry * SIZEOF_SONIC_CD) + offset, val);

Annotation

Implementation Notes