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

Commit 1b1e4e9e authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville
Browse files

brcmfmac: make use of seq_file API for debugfs entries



The use of seq_file simplifies the debugfs code. Simpler is
better.

Reviewed-by: default avatarHante Meuleman <meuleman@broadcom.com>
Reviewed-by: default avatarFranky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 5779ae6a
Loading
Loading
Loading
Loading
+123 −126
Original line number Diff line number Diff line
@@ -41,28 +41,27 @@ void brcmf_debugfs_exit(void)
	root_folder = NULL;
}

static
ssize_t brcmf_debugfs_chipinfo_read(struct file *f, char __user *data,
				   size_t count, loff_t *ppos)
static int brcmf_debugfs_chipinfo_read(struct seq_file *seq, void *data)
{
	struct brcmf_pub *drvr = f->private_data;
	struct brcmf_pub *drvr = seq->private;
	struct brcmf_bus *bus = drvr->bus_if;
	char buf[40];
	int res;

	/* only allow read from start */
	if (*ppos > 0)
	seq_printf(seq, "chip: %x(%u) rev %u\n",
		   bus->chip, bus->chip, bus->chiprev);
	return 0;
}

	res = scnprintf(buf, sizeof(buf), "chip: %x(%u) rev %u\n",
			bus->chip, bus->chip, bus->chiprev);
	return simple_read_from_buffer(data, count, ppos, buf, res);
static int brcmf_debugfs_chipinfo_open(struct inode *inode, struct file *f)
{
	return single_open(f, brcmf_debugfs_chipinfo_read, inode->i_private);
}

static const struct file_operations brcmf_debugfs_chipinfo_ops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read = brcmf_debugfs_chipinfo_read
	.open = brcmf_debugfs_chipinfo_open,
	.release = single_release,
	.read = seq_read,
	.llseek = seq_lseek
};

static int brcmf_debugfs_create_chipinfo(struct brcmf_pub *drvr)
@@ -98,19 +97,11 @@ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
	return drvr->dbgfs_dir;
}

static
ssize_t brcmf_debugfs_sdio_counter_read(struct file *f, char __user *data,
					size_t count, loff_t *ppos)
static int brcmf_debugfs_sdio_count_read(struct seq_file *seq, void *data)
{
	struct brcmf_sdio_count *sdcnt = f->private_data;
	char buf[750];
	int res;
	struct brcmf_sdio_count *sdcnt = seq->private;

	/* only allow read from start */
	if (*ppos > 0)
		return 0;

	res = scnprintf(buf, sizeof(buf),
	seq_printf(seq,
		   "intrcount:    %u\nlastintrs:    %u\n"
		   "pollcnt:      %u\nregfails:     %u\n"
		   "tx_sderrs:    %u\nfcqueued:     %u\n"
@@ -140,13 +131,20 @@ ssize_t brcmf_debugfs_sdio_counter_read(struct file *f, char __user *data,
		   sdcnt->tx_ctlpkts, sdcnt->rx_ctlerrs,
		   sdcnt->rx_ctlpkts, sdcnt->rx_readahead_cnt);

	return simple_read_from_buffer(data, count, ppos, buf, res);
	return 0;
}

static int brcmf_debugfs_sdio_count_open(struct inode *inode, struct file *f)
{
	return single_open(f, brcmf_debugfs_sdio_count_read, inode->i_private);
}

static const struct file_operations brcmf_debugfs_sdio_counter_ops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read = brcmf_debugfs_sdio_counter_read
	.open = brcmf_debugfs_sdio_count_open,
	.release = single_release,
	.read = seq_read,
	.llseek = seq_lseek
};

void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr,
@@ -159,19 +157,11 @@ void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr,
				    sdcnt, &brcmf_debugfs_sdio_counter_ops);
}

static
ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data,
				     size_t count, loff_t *ppos)
static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data)
{
	struct brcmf_fws_stats *fwstats = f->private_data;
	char buf[650];
	int res;

	/* only allow read from start */
	if (*ppos > 0)
		return 0;
	struct brcmf_fws_stats *fwstats = seq->private;

	res = scnprintf(buf, sizeof(buf),
	seq_printf(seq,
		   "header_pulls:      %u\n"
		   "header_only_pkt:   %u\n"
		   "tlv_parse_failed:  %u\n"
@@ -225,13 +215,20 @@ ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data,
		   fwstats->requested_sent[3],
		   fwstats->requested_sent[4]);

	return simple_read_from_buffer(data, count, ppos, buf, res);
	return 0;
}

static int brcmf_debugfs_fws_stats_open(struct inode *inode, struct file *f)
{
	return single_open(f, brcmf_debugfs_fws_stats_read, inode->i_private);
}

static const struct file_operations brcmf_debugfs_fws_stats_ops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read = brcmf_debugfs_fws_stats_read
	.open = brcmf_debugfs_fws_stats_open,
	.release = single_release,
	.read = seq_read,
	.llseek = seq_lseek
};

void brcmf_debugfs_create_fws_stats(struct brcmf_pub *drvr,
+47 −75
Original line number Diff line number Diff line
@@ -2898,16 +2898,13 @@ brcmf_sdio_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
}

#ifdef DEBUG
static int brcmf_sdio_dump_console(struct brcmf_sdio *bus,
				   struct sdpcm_shared *sh, char __user *data,
				   size_t count)
static int brcmf_sdio_dump_console(struct seq_file *seq, struct brcmf_sdio *bus,
				   struct sdpcm_shared *sh)
{
	u32 addr, console_ptr, console_size, console_index;
	char *conbuf = NULL;
	__le32 sh_val;
	int rv;
	loff_t pos = 0;
	int nbytes = 0;

	/* obtain console information from device memory */
	addr = sh->console_addr + offsetof(struct rte_console, log_le);
@@ -2945,33 +2942,24 @@ static int brcmf_sdio_dump_console(struct brcmf_sdio *bus,
	if (rv < 0)
		goto done;

	rv = simple_read_from_buffer(data, count, &pos,
				     conbuf + console_index,
	rv = seq_write(seq, conbuf + console_index,
		       console_size - console_index);
	if (rv < 0)
		goto done;

	nbytes = rv;
	if (console_index > 0) {
		pos = 0;
		rv = simple_read_from_buffer(data+nbytes, count, &pos,
					     conbuf, console_index - 1);
		if (rv < 0)
			goto done;
		rv += nbytes;
	}
	if (console_index > 0)
		rv = seq_write(seq, conbuf, console_index - 1);

done:
	vfree(conbuf);
	return rv;
}

static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
				char __user *data, size_t count)
static int brcmf_sdio_trap_info(struct seq_file *seq, struct brcmf_sdio *bus,
				struct sdpcm_shared *sh)
{
	int error, res;
	char buf[350];
	int error;
	struct brcmf_trap_info tr;
	loff_t pos = 0;

	if ((sh->flags & SDPCM_SHARED_TRAP) == 0) {
		brcmf_dbg(INFO, "no trap in firmware\n");
@@ -2983,7 +2971,7 @@ static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
	if (error < 0)
		return error;

	res = scnprintf(buf, sizeof(buf),
	seq_printf(seq,
		   "dongle trap info: type 0x%x @ epc 0x%08x\n"
		   "  cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
		   "  lr   0x%08x pc   0x%08x offset 0x%x\n"
@@ -2998,19 +2986,15 @@ static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
		   le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
		   le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));

	return simple_read_from_buffer(data, count, &pos, buf, res);
	return 0;
}

static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
				  struct sdpcm_shared *sh, char __user *data,
				  size_t count)
static int brcmf_sdio_assert_info(struct seq_file *seq, struct brcmf_sdio *bus,
				  struct sdpcm_shared *sh)
{
	int error = 0;
	char buf[200];
	char file[80] = "?";
	char expr[80] = "<???>";
	int res;
	loff_t pos = 0;

	if ((sh->flags & SDPCM_SHARED_ASSERT_BUILT) == 0) {
		brcmf_dbg(INFO, "firmware not built with -assert\n");
@@ -3035,10 +3019,9 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
	}
	sdio_release_host(bus->sdiodev->func[1]);

	res = scnprintf(buf, sizeof(buf),
			"dongle assert: %s:%d: assert(%s)\n",
	seq_printf(seq, "dongle assert: %s:%d: assert(%s)\n",
		   file, sh->assert_line, expr);
	return simple_read_from_buffer(data, count, &pos, buf, res);
	return 0;
}

static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
@@ -3062,58 +3045,47 @@ static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
	return 0;
}

static int brcmf_sdio_died_dump(struct brcmf_sdio *bus, char __user *data,
				size_t count, loff_t *ppos)
static int brcmf_sdio_died_dump(struct seq_file *seq, struct brcmf_sdio *bus)
{
	int error = 0;
	struct sdpcm_shared sh;
	int nbytes = 0;
	loff_t pos = *ppos;

	if (pos != 0)
		return 0;

	error = brcmf_sdio_readshared(bus, &sh);
	if (error < 0)
		goto done;

	error = brcmf_sdio_assert_info(bus, &sh, data, count);
	error = brcmf_sdio_assert_info(seq, bus, &sh);
	if (error < 0)
		goto done;
	nbytes = error;

	error = brcmf_sdio_trap_info(bus, &sh, data+nbytes, count);
	error = brcmf_sdio_trap_info(seq, bus, &sh);
	if (error < 0)
		goto done;
	nbytes += error;

	error = brcmf_sdio_dump_console(bus, &sh, data+nbytes, count);
	if (error < 0)
		goto done;
	nbytes += error;
	error = brcmf_sdio_dump_console(seq, bus, &sh);

	error = nbytes;
	*ppos += nbytes;
done:
	return error;
}

static ssize_t brcmf_sdio_forensic_read(struct file *f, char __user *data,
					size_t count, loff_t *ppos)
static int brcmf_sdio_forensic_read(struct seq_file *seq, void *data)
{
	struct brcmf_sdio *bus = f->private_data;
	int res;
	struct brcmf_sdio *bus = seq->private;

	return brcmf_sdio_died_dump(seq, bus);
}

	res = brcmf_sdio_died_dump(bus, data, count, ppos);
	if (res > 0)
		*ppos += res;
	return (ssize_t)res;
static int brcmf_sdio_forensic_open(struct inode *inode, struct file *f)
{
	return single_open(f, brcmf_sdio_forensic_read, inode->i_private);
}

static const struct file_operations brcmf_sdio_forensic_ops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read = brcmf_sdio_forensic_read
	.open = brcmf_sdio_forensic_open,
	.release = single_release,
	.read = seq_read,
	.llseek = seq_lseek
};

static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)