drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c
Extension
.c
Size
126740 bytes
Lines
4061
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern 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

static const struct file_operations rvu_dbg_##name##_fops = { \
	.owner		= THIS_MODULE, \
	.open		= rvu_dbg_open_##name, \
	.read		= seq_read, \
	.write		= rvu_dbg_##write_op, \
	.llseek		= seq_lseek, \
	.release	= single_release, \
}

#define RVU_DEBUG_FOPS(name, read_op, write_op) \
static const struct file_operations rvu_dbg_##name##_fops = { \
	.owner = THIS_MODULE, \
	.open = simple_open, \
	.read = rvu_dbg_##read_op, \
	.write = rvu_dbg_##write_op \
}

static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf);

static int rvu_dbg_mcs_port_stats_display(struct seq_file *filp, void *unused, int dir)
{
	struct mcs *mcs = filp->private;
	struct mcs_port_stats stats;
	int lmac;

	seq_puts(filp, "\n port stats\n");
	mutex_lock(&mcs->stats_lock);
	for_each_set_bit(lmac, &mcs->hw->lmac_bmap, mcs->hw->lmac_cnt) {
		mcs_get_port_stats(mcs, &stats, lmac, dir);
		seq_printf(filp, "port%d: Tcam Miss: %lld\n", lmac, stats.tcam_miss_cnt);
		seq_printf(filp, "port%d: Parser errors: %lld\n", lmac, stats.parser_err_cnt);

		if (dir == MCS_RX && mcs->hw->mcs_blks > 1)
			seq_printf(filp, "port%d: Preempt error: %lld\n", lmac,
				   stats.preempt_err_cnt);
		if (dir == MCS_TX)
			seq_printf(filp, "port%d: Sectag insert error: %lld\n", lmac,
				   stats.sectag_insert_err_cnt);
	}
	mutex_unlock(&mcs->stats_lock);
	return 0;
}

static int rvu_dbg_mcs_rx_port_stats_display(struct seq_file *filp, void *unused)
{
	return rvu_dbg_mcs_port_stats_display(filp, unused, MCS_RX);
}

RVU_DEBUG_SEQ_FOPS(mcs_rx_port_stats, mcs_rx_port_stats_display, NULL);

static int rvu_dbg_mcs_tx_port_stats_display(struct seq_file *filp, void *unused)
{
	return rvu_dbg_mcs_port_stats_display(filp, unused, MCS_TX);
}

RVU_DEBUG_SEQ_FOPS(mcs_tx_port_stats, mcs_tx_port_stats_display, NULL);

static int rvu_dbg_mcs_sa_stats_display(struct seq_file *filp, void *unused, int dir)
{
	struct mcs *mcs = filp->private;
	struct mcs_sa_stats stats;
	struct rsrc_bmap *map;
	int sa_id;

	if (dir == MCS_TX) {
		map = &mcs->tx.sa;
		mutex_lock(&mcs->stats_lock);
		for_each_set_bit(sa_id, map->bmap, mcs->hw->sa_entries) {
			seq_puts(filp, "\n TX SA stats\n");
			mcs_get_sa_stats(mcs, &stats, sa_id, MCS_TX);
			seq_printf(filp, "sa%d: Pkts encrypted: %lld\n", sa_id,
				   stats.pkt_encrypt_cnt);

			seq_printf(filp, "sa%d: Pkts protected: %lld\n", sa_id,
				   stats.pkt_protected_cnt);
		}
		mutex_unlock(&mcs->stats_lock);
		return 0;
	}

	/* RX stats */
	map = &mcs->rx.sa;
	mutex_lock(&mcs->stats_lock);
	for_each_set_bit(sa_id, map->bmap, mcs->hw->sa_entries) {
		seq_puts(filp, "\n RX SA stats\n");
		mcs_get_sa_stats(mcs, &stats, sa_id, MCS_RX);
		seq_printf(filp, "sa%d: Invalid pkts: %lld\n", sa_id, stats.pkt_invalid_cnt);
		seq_printf(filp, "sa%d: Pkts no sa error: %lld\n", sa_id, stats.pkt_nosaerror_cnt);
		seq_printf(filp, "sa%d: Pkts not valid: %lld\n", sa_id, stats.pkt_notvalid_cnt);
		seq_printf(filp, "sa%d: Pkts ok: %lld\n", sa_id, stats.pkt_ok_cnt);

Annotation

Implementation Notes