Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7cde470 authored by Vladimir Kondratiev's avatar Vladimir Kondratiev Committed by John W. Linville
Browse files

wil6210: convert debugfs to the table mode



Define tables for similar file entries, i.e.
- table for debugfs_create_file
- table for static parameters
- table for parameters that are members of "wil" structure
- table for blobs
- table for interrupt controllers

Signed-off-by: default avatarVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 6afd6005
Loading
Loading
Loading
Loading
+180 −74
Original line number Original line Diff line number Diff line
@@ -29,6 +29,21 @@ static u32 mem_addr;
static u32 dbg_txdesc_index;
static u32 dbg_txdesc_index;
static u32 dbg_vring_index; /* 24+ for Rx, 0..23 for Tx */
static u32 dbg_vring_index; /* 24+ for Rx, 0..23 for Tx */


enum dbg_off_type {
	doff_u32 = 0,
	doff_x32 = 1,
	doff_ulong = 2,
	doff_io32 = 3,
};

/* offset to "wil" */
struct dbg_off {
	const char *name;
	umode_t mode;
	ulong off;
	enum dbg_off_type type;
};

static void wil_print_vring(struct seq_file *s, struct wil6210_priv *wil,
static void wil_print_vring(struct seq_file *s, struct wil6210_priv *wil,
			    const char *name, struct vring *vring,
			    const char *name, struct vring *vring,
			    char _s, char _h)
			    char _s, char _h)
@@ -244,9 +259,9 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_iomem_x32, wil_debugfs_iomem_x32_get,
static struct dentry *wil_debugfs_create_iomem_x32(const char *name,
static struct dentry *wil_debugfs_create_iomem_x32(const char *name,
						   umode_t mode,
						   umode_t mode,
						   struct dentry *parent,
						   struct dentry *parent,
						   void __iomem *value)
						   void *value)
{
{
	return debugfs_create_file(name, mode, parent, (void * __force)value,
	return debugfs_create_file(name, mode, parent, value,
				   &fops_iomem_x32);
				   &fops_iomem_x32);
}
}


@@ -270,6 +285,59 @@ static struct dentry *wil_debugfs_create_ulong(const char *name, umode_t mode,
	return debugfs_create_file(name, mode, parent, value, &wil_fops_ulong);
	return debugfs_create_file(name, mode, parent, value, &wil_fops_ulong);
}
}


/**
 * wil6210_debugfs_init_offset - create set of debugfs files
 * @wil - driver's context, used for printing
 * @dbg - directory on the debugfs, where files will be created
 * @base - base address used in address calculation
 * @tbl - table with file descriptions. Should be terminated with empty element.
 *
 * Creates files accordingly to the @tbl.
 */
static void wil6210_debugfs_init_offset(struct wil6210_priv *wil,
					struct dentry *dbg, void *base,
					const struct dbg_off * const tbl)
{
	int i;

	for (i = 0; tbl[i].name; i++) {
		struct dentry *f = NULL;

		switch (tbl[i].type) {
		case doff_u32:
			f = debugfs_create_u32(tbl[i].name, tbl[i].mode, dbg,
					       base + tbl[i].off);
			break;
		case doff_x32:
			f = debugfs_create_x32(tbl[i].name, tbl[i].mode, dbg,
					       base + tbl[i].off);
			break;
		case doff_ulong:
			f = wil_debugfs_create_ulong(tbl[i].name, tbl[i].mode,
						     dbg, base + tbl[i].off);
			break;
		case doff_io32:
			f = wil_debugfs_create_iomem_x32(tbl[i].name,
							 tbl[i].mode, dbg,
							 base + tbl[i].off);
			break;
		}
		if (IS_ERR_OR_NULL(f))
			wil_err(wil, "Create file \"%s\": err %ld\n",
				tbl[i].name, PTR_ERR(f));
	}
}

static const struct dbg_off isr_off[] = {
	{"ICC", S_IRUGO | S_IWUSR, offsetof(struct RGF_ICR, ICC), doff_io32},
	{"ICR", S_IRUGO | S_IWUSR, offsetof(struct RGF_ICR, ICR), doff_io32},
	{"ICM", S_IRUGO | S_IWUSR, offsetof(struct RGF_ICR, ICM), doff_io32},
	{"ICS",		  S_IWUSR, offsetof(struct RGF_ICR, ICS), doff_io32},
	{"IMV", S_IRUGO | S_IWUSR, offsetof(struct RGF_ICR, IMV), doff_io32},
	{"IMS",		  S_IWUSR, offsetof(struct RGF_ICR, IMS), doff_io32},
	{"IMC",		  S_IWUSR, offsetof(struct RGF_ICR, IMC), doff_io32},
	{},
};
static int wil6210_debugfs_create_ISR(struct wil6210_priv *wil,
static int wil6210_debugfs_create_ISR(struct wil6210_priv *wil,
				      const char *name,
				      const char *name,
				      struct dentry *parent, u32 off)
				      struct dentry *parent, u32 off)
@@ -279,24 +347,19 @@ static int wil6210_debugfs_create_ISR(struct wil6210_priv *wil,
	if (IS_ERR_OR_NULL(d))
	if (IS_ERR_OR_NULL(d))
		return -ENODEV;
		return -ENODEV;


	wil_debugfs_create_iomem_x32("ICC", S_IRUGO | S_IWUSR, d,
	wil6210_debugfs_init_offset(wil, d, (void * __force)wil->csr + off,
				     wil->csr + off);
				    isr_off);
	wil_debugfs_create_iomem_x32("ICR", S_IRUGO | S_IWUSR, d,
				     wil->csr + off + 4);
	wil_debugfs_create_iomem_x32("ICM", S_IRUGO | S_IWUSR, d,
				     wil->csr + off + 8);
	wil_debugfs_create_iomem_x32("ICS", S_IWUSR, d,
				     wil->csr + off + 12);
	wil_debugfs_create_iomem_x32("IMV", S_IRUGO | S_IWUSR, d,
				     wil->csr + off + 16);
	wil_debugfs_create_iomem_x32("IMS", S_IWUSR, d,
				     wil->csr + off + 20);
	wil_debugfs_create_iomem_x32("IMC", S_IWUSR, d,
				     wil->csr + off + 24);


	return 0;
	return 0;
}
}


static const struct dbg_off pseudo_isr_off[] = {
	{"CAUSE",   S_IRUGO, HOSTADDR(RGF_DMA_PSEUDO_CAUSE), doff_io32},
	{"MASK_SW", S_IRUGO, HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_SW), doff_io32},
	{"MASK_FW", S_IRUGO, HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_FW), doff_io32},
	{},
};

static int wil6210_debugfs_create_pseudo_ISR(struct wil6210_priv *wil,
static int wil6210_debugfs_create_pseudo_ISR(struct wil6210_priv *wil,
					     struct dentry *parent)
					     struct dentry *parent)
{
{
@@ -305,16 +368,19 @@ static int wil6210_debugfs_create_pseudo_ISR(struct wil6210_priv *wil,
	if (IS_ERR_OR_NULL(d))
	if (IS_ERR_OR_NULL(d))
		return -ENODEV;
		return -ENODEV;


	wil_debugfs_create_iomem_x32("CAUSE", S_IRUGO, d, wil->csr +
	wil6210_debugfs_init_offset(wil, d, (void * __force)wil->csr,
				     HOSTADDR(RGF_DMA_PSEUDO_CAUSE));
				    pseudo_isr_off);
	wil_debugfs_create_iomem_x32("MASK_SW", S_IRUGO, d, wil->csr +
				     HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_SW));
	wil_debugfs_create_iomem_x32("MASK_FW", S_IRUGO, d, wil->csr +
				     HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_FW));


	return 0;
	return 0;
}
}


static const struct dbg_off itr_cnt_off[] = {
	{"TRSH", S_IRUGO | S_IWUSR, HOSTADDR(RGF_DMA_ITR_CNT_TRSH), doff_io32},
	{"DATA", S_IRUGO | S_IWUSR, HOSTADDR(RGF_DMA_ITR_CNT_DATA), doff_io32},
	{"CTL",  S_IRUGO | S_IWUSR, HOSTADDR(RGF_DMA_ITR_CNT_CRL), doff_io32},
	{},
};

static int wil6210_debugfs_create_ITR_CNT(struct wil6210_priv *wil,
static int wil6210_debugfs_create_ITR_CNT(struct wil6210_priv *wil,
					  struct dentry *parent)
					  struct dentry *parent)
{
{
@@ -323,12 +389,8 @@ static int wil6210_debugfs_create_ITR_CNT(struct wil6210_priv *wil,
	if (IS_ERR_OR_NULL(d))
	if (IS_ERR_OR_NULL(d))
		return -ENODEV;
		return -ENODEV;


	wil_debugfs_create_iomem_x32("TRSH", S_IRUGO | S_IWUSR, d, wil->csr +
	wil6210_debugfs_init_offset(wil, d, (void * __force)wil->csr,
				     HOSTADDR(RGF_DMA_ITR_CNT_TRSH));
				    itr_cnt_off);
	wil_debugfs_create_iomem_x32("DATA", S_IRUGO | S_IWUSR, d, wil->csr +
				     HOSTADDR(RGF_DMA_ITR_CNT_DATA));
	wil_debugfs_create_iomem_x32("CTL", S_IRUGO | S_IWUSR, d, wil->csr +
				     HOSTADDR(RGF_DMA_ITR_CNT_CRL));


	return 0;
	return 0;
}
}
@@ -985,6 +1047,87 @@ static void wil6210_debugfs_init_blobs(struct wil6210_priv *wil,
	}
	}
}
}


/* misc files */
static const struct {
	const char *name;
	umode_t mode;
	const struct file_operations *fops;
} dbg_files[] = {
	{"mbox",	S_IRUGO,		&fops_mbox},
	{"vrings",	S_IRUGO,		&fops_vring},
	{"stations",	S_IRUGO,		&fops_sta},
	{"desc",	S_IRUGO,		&fops_txdesc},
	{"bf",		S_IRUGO,		&fops_bf},
	{"ssid",	S_IRUGO | S_IWUSR,	&fops_ssid},
	{"mem_val",	S_IRUGO,		&fops_memread},
	{"reset",		  S_IWUSR,	&fops_reset},
	{"rxon",		  S_IWUSR,	&fops_rxon},
	{"tx_mgmt",		  S_IWUSR,	&fops_txmgmt},
	{"wmi_send",		  S_IWUSR,	&fops_wmi},
	{"temp",	S_IRUGO,		&fops_temp},
	{"freq",	S_IRUGO,		&fops_freq},
	{"link",	S_IRUGO,		&fops_link},
	{"info",	S_IRUGO,		&fops_info},
};

static void wil6210_debugfs_init_files(struct wil6210_priv *wil,
				       struct dentry *dbg)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(dbg_files); i++)
		debugfs_create_file(dbg_files[i].name, dbg_files[i].mode, dbg,
				    wil, dbg_files[i].fops);
}

/* interrupt control blocks */
static const struct {
	const char *name;
	u32 icr_off;
} dbg_icr[] = {
	{"USER_ICR",		HOSTADDR(RGF_USER_USER_ICR)},
	{"DMA_EP_TX_ICR",	HOSTADDR(RGF_DMA_EP_TX_ICR)},
	{"DMA_EP_RX_ICR",	HOSTADDR(RGF_DMA_EP_RX_ICR)},
	{"DMA_EP_MISC_ICR",	HOSTADDR(RGF_DMA_EP_MISC_ICR)},
};

static void wil6210_debugfs_init_isr(struct wil6210_priv *wil,
				     struct dentry *dbg)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(dbg_icr); i++)
		wil6210_debugfs_create_ISR(wil, dbg_icr[i].name, dbg,
					   dbg_icr[i].icr_off);
}

#define WIL_FIELD(name, mode, type) { __stringify(name), mode, \
	offsetof(struct wil6210_priv, name), type}

/* fields in struct wil6210_priv */
static const struct dbg_off dbg_wil_off[] = {
	WIL_FIELD(secure_pcp,	S_IRUGO | S_IWUSR,	doff_u32),
	WIL_FIELD(status,	S_IRUGO | S_IWUSR,	doff_ulong),
	WIL_FIELD(fw_version,	S_IRUGO,		doff_u32),
	WIL_FIELD(hw_version,	S_IRUGO,		doff_x32),
	{},
};

static const struct dbg_off dbg_wil_regs[] = {
	{"RGF_MAC_MTRL_COUNTER_0", S_IRUGO, HOSTADDR(RGF_MAC_MTRL_COUNTER_0),
		doff_io32},
	{"RGF_USER_USAGE_1", S_IRUGO, HOSTADDR(RGF_USER_USAGE_1), doff_io32},
	{},
};

/* static parameters */
static const struct dbg_off dbg_statics[] = {
	{"desc_index",	S_IRUGO | S_IWUSR, (ulong)&dbg_txdesc_index, doff_u32},
	{"vring_index",	S_IRUGO | S_IWUSR, (ulong)&dbg_vring_index, doff_u32},
	{"mem_addr",	S_IRUGO | S_IWUSR, (ulong)&mem_addr, doff_u32},
	{},
};

int wil6210_debugfs_init(struct wil6210_priv *wil)
int wil6210_debugfs_init(struct wil6210_priv *wil)
{
{
	struct dentry *dbg = wil->debug = debugfs_create_dir(WIL_NAME,
	struct dentry *dbg = wil->debug = debugfs_create_dir(WIL_NAME,
@@ -993,54 +1136,17 @@ int wil6210_debugfs_init(struct wil6210_priv *wil)
	if (IS_ERR_OR_NULL(dbg))
	if (IS_ERR_OR_NULL(dbg))
		return -ENODEV;
		return -ENODEV;


	debugfs_create_file("mbox", S_IRUGO, dbg, wil, &fops_mbox);
	wil6210_debugfs_init_files(wil, dbg);
	debugfs_create_file("vrings", S_IRUGO, dbg, wil, &fops_vring);
	wil6210_debugfs_init_isr(wil, dbg);
	debugfs_create_file("stations", S_IRUGO, dbg, wil, &fops_sta);
	wil6210_debugfs_init_blobs(wil, dbg);
	debugfs_create_file("desc", S_IRUGO, dbg, wil, &fops_txdesc);
	wil6210_debugfs_init_offset(wil, dbg, wil, dbg_wil_off);
	debugfs_create_u32("desc_index", S_IRUGO | S_IWUSR, dbg,
	wil6210_debugfs_init_offset(wil, dbg, (void * __force)wil->csr,
			   &dbg_txdesc_index);
				    dbg_wil_regs);
	debugfs_create_u32("vring_index", S_IRUGO | S_IWUSR, dbg,
	wil6210_debugfs_init_offset(wil, dbg, NULL, dbg_statics);
			   &dbg_vring_index);


	debugfs_create_file("bf", S_IRUGO, dbg, wil, &fops_bf);
	debugfs_create_file("ssid", S_IRUGO | S_IWUSR, dbg, wil, &fops_ssid);
	debugfs_create_u32("secure_pcp", S_IRUGO | S_IWUSR, dbg,
			   &wil->secure_pcp);
	wil_debugfs_create_ulong("status", S_IRUGO | S_IWUSR, dbg,
				 &wil->status);
	debugfs_create_u32("fw_version", S_IRUGO, dbg, &wil->fw_version);
	debugfs_create_x32("hw_version", S_IRUGO, dbg, &wil->hw_version);

	wil6210_debugfs_create_ISR(wil, "USER_ICR", dbg,
				   HOSTADDR(RGF_USER_USER_ICR));
	wil6210_debugfs_create_ISR(wil, "DMA_EP_TX_ICR", dbg,
				   HOSTADDR(RGF_DMA_EP_TX_ICR));
	wil6210_debugfs_create_ISR(wil, "DMA_EP_RX_ICR", dbg,
				   HOSTADDR(RGF_DMA_EP_RX_ICR));
	wil6210_debugfs_create_ISR(wil, "DMA_EP_MISC_ICR", dbg,
				   HOSTADDR(RGF_DMA_EP_MISC_ICR));
	wil6210_debugfs_create_pseudo_ISR(wil, dbg);
	wil6210_debugfs_create_pseudo_ISR(wil, dbg);
	wil6210_debugfs_create_ITR_CNT(wil, dbg);
	wil_debugfs_create_iomem_x32("MAC_MTRL_COUNTER_0", S_IRUGO, dbg,
				     wil->csr +
				     HOSTADDR(RGF_MAC_MTRL_COUNTER_0));

	wil_debugfs_create_iomem_x32("RGF_USER_USAGE_1", S_IRUGO, dbg,
				     wil->csr +
				     HOSTADDR(RGF_USER_USAGE_1));
	debugfs_create_u32("mem_addr", S_IRUGO | S_IWUSR, dbg, &mem_addr);
	debugfs_create_file("mem_val", S_IRUGO, dbg, wil, &fops_memread);

	debugfs_create_file("reset", S_IWUSR, dbg, wil, &fops_reset);
	debugfs_create_file("rxon", S_IWUSR, dbg, wil, &fops_rxon);
	debugfs_create_file("tx_mgmt", S_IWUSR, dbg, wil, &fops_txmgmt);
	debugfs_create_file("wmi_send", S_IWUSR, dbg, wil, &fops_wmi);
	debugfs_create_file("temp", S_IRUGO, dbg, wil, &fops_temp);
	debugfs_create_file("freq", S_IRUGO, dbg, wil, &fops_freq);
	debugfs_create_file("link", S_IRUGO, dbg, wil, &fops_link);
	debugfs_create_file("info", S_IRUGO, dbg, wil, &fops_info);


	wil6210_debugfs_init_blobs(wil, dbg);
	wil6210_debugfs_create_ITR_CNT(wil, dbg);


	return 0;
	return 0;
}
}