drivers/net/can/c_can/c_can.h

Source file repositories/reference/linux-study-clean/drivers/net/can/c_can/c_can.h

File Facts

System
Linux kernel
Corpus path
drivers/net/can/c_can/c_can.h
Extension
.h
Size
6968 bytes
Lines
257
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 raminit_bits {
	u8 start;
	u8 done;
};

struct c_can_driver_data {
	enum c_can_dev_id id;
	unsigned int msg_obj_num;

	/* RAMINIT register description. Optional. */
	const struct raminit_bits *raminit_bits; /* Array of START/DONE bit positions */
	u8 raminit_num;		/* Number of CAN instances on the SoC */
	bool raminit_pulse;	/* If set, sets and clears START bit (pulse) */
};

/* Out of band RAMINIT register access via syscon regmap */
struct c_can_raminit {
	struct regmap *syscon;	/* for raminit ctrl. reg. access */
	unsigned int reg;	/* register index within syscon */
	struct raminit_bits bits;
	bool needs_pulse;
};

/* c_can tx ring structure */
struct c_can_tx_ring {
	unsigned int head;
	unsigned int tail;
	unsigned int obj_num;
};

/* c_can private data structure */
struct c_can_priv {
	struct can_priv can;	/* must be the first member */
	struct napi_struct napi;
	struct net_device *dev;
	struct device *device;
	unsigned int msg_obj_num;
	unsigned int msg_obj_rx_num;
	unsigned int msg_obj_tx_num;
	unsigned int msg_obj_rx_first;
	unsigned int msg_obj_rx_last;
	unsigned int msg_obj_tx_first;
	unsigned int msg_obj_tx_last;
	u32 msg_obj_rx_mask;
	atomic_t sie_pending;
	unsigned long tx_dir;
	int last_status;
	struct c_can_tx_ring tx;
	u16 (*read_reg)(const struct c_can_priv *priv, enum reg index);
	void (*write_reg)(const struct c_can_priv *priv, enum reg index, u16 val);
	u32 (*read_reg32)(const struct c_can_priv *priv, enum reg index);
	void (*write_reg32)(const struct c_can_priv *priv, enum reg index, u32 val);
	void __iomem *base;
	const u16 *regs;
	enum c_can_dev_id type;
	struct c_can_raminit raminit_sys;	/* RAMINIT via syscon regmap */
	void (*raminit)(const struct c_can_priv *priv, bool enable);
	u32 comm_rcv_high;
};

struct net_device *alloc_c_can_dev(int msg_obj_num);
void free_c_can_dev(struct net_device *dev);
int register_c_can_dev(struct net_device *dev);
void unregister_c_can_dev(struct net_device *dev);

#ifdef CONFIG_PM
int c_can_power_up(struct net_device *dev);
int c_can_power_down(struct net_device *dev);
#endif

extern const struct ethtool_ops c_can_ethtool_ops;

static inline u8 c_can_get_tx_head(const struct c_can_tx_ring *ring)
{
	return ring->head & (ring->obj_num - 1);
}

static inline u8 c_can_get_tx_tail(const struct c_can_tx_ring *ring)
{
	return ring->tail & (ring->obj_num - 1);
}

static inline u8 c_can_get_tx_free(const struct c_can_priv *priv,
				   const struct c_can_tx_ring *ring)
{
	u8 head = c_can_get_tx_head(ring);
	u8 tail = c_can_get_tx_tail(ring);

	if (priv->type == BOSCH_D_CAN)
		return ring->obj_num - (ring->head - ring->tail);

Annotation

Implementation Notes