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

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
...@@ -41,28 +41,27 @@ void brcmf_debugfs_exit(void) ...@@ -41,28 +41,27 @@ void brcmf_debugfs_exit(void)
root_folder = NULL; root_folder = NULL;
} }
static static int brcmf_debugfs_chipinfo_read(struct seq_file *seq, void *data)
ssize_t brcmf_debugfs_chipinfo_read(struct file *f, char __user *data,
size_t count, loff_t *ppos)
{ {
struct brcmf_pub *drvr = f->private_data; struct brcmf_pub *drvr = seq->private;
struct brcmf_bus *bus = drvr->bus_if; struct brcmf_bus *bus = drvr->bus_if;
char buf[40];
int res;
/* only allow read from start */ seq_printf(seq, "chip: %x(%u) rev %u\n",
if (*ppos > 0) bus->chip, bus->chip, bus->chiprev);
return 0; return 0;
}
res = scnprintf(buf, sizeof(buf), "chip: %x(%u) rev %u\n", static int brcmf_debugfs_chipinfo_open(struct inode *inode, struct file *f)
bus->chip, bus->chip, bus->chiprev); {
return simple_read_from_buffer(data, count, ppos, buf, res); return single_open(f, brcmf_debugfs_chipinfo_read, inode->i_private);
} }
static const struct file_operations brcmf_debugfs_chipinfo_ops = { static const struct file_operations brcmf_debugfs_chipinfo_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = simple_open, .open = brcmf_debugfs_chipinfo_open,
.read = brcmf_debugfs_chipinfo_read .release = single_release,
.read = seq_read,
.llseek = seq_lseek
}; };
static int brcmf_debugfs_create_chipinfo(struct brcmf_pub *drvr) static int brcmf_debugfs_create_chipinfo(struct brcmf_pub *drvr)
...@@ -98,19 +97,11 @@ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr) ...@@ -98,19 +97,11 @@ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
return drvr->dbgfs_dir; return drvr->dbgfs_dir;
} }
static static int brcmf_debugfs_sdio_count_read(struct seq_file *seq, void *data)
ssize_t brcmf_debugfs_sdio_counter_read(struct file *f, char __user *data,
size_t count, loff_t *ppos)
{ {
struct brcmf_sdio_count *sdcnt = f->private_data; struct brcmf_sdio_count *sdcnt = seq->private;
char buf[750];
int res;
/* only allow read from start */ seq_printf(seq,
if (*ppos > 0)
return 0;
res = scnprintf(buf, sizeof(buf),
"intrcount: %u\nlastintrs: %u\n" "intrcount: %u\nlastintrs: %u\n"
"pollcnt: %u\nregfails: %u\n" "pollcnt: %u\nregfails: %u\n"
"tx_sderrs: %u\nfcqueued: %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, ...@@ -140,13 +131,20 @@ ssize_t brcmf_debugfs_sdio_counter_read(struct file *f, char __user *data,
sdcnt->tx_ctlpkts, sdcnt->rx_ctlerrs, sdcnt->tx_ctlpkts, sdcnt->rx_ctlerrs,
sdcnt->rx_ctlpkts, sdcnt->rx_readahead_cnt); 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 = { static const struct file_operations brcmf_debugfs_sdio_counter_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = simple_open, .open = brcmf_debugfs_sdio_count_open,
.read = brcmf_debugfs_sdio_counter_read .release = single_release,
.read = seq_read,
.llseek = seq_lseek
}; };
void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr, void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr,
...@@ -159,19 +157,11 @@ 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); sdcnt, &brcmf_debugfs_sdio_counter_ops);
} }
static static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data)
ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data,
size_t count, loff_t *ppos)
{ {
struct brcmf_fws_stats *fwstats = f->private_data; struct brcmf_fws_stats *fwstats = seq->private;
char buf[650];
int res;
/* only allow read from start */
if (*ppos > 0)
return 0;
res = scnprintf(buf, sizeof(buf), seq_printf(seq,
"header_pulls: %u\n" "header_pulls: %u\n"
"header_only_pkt: %u\n" "header_only_pkt: %u\n"
"tlv_parse_failed: %u\n" "tlv_parse_failed: %u\n"
...@@ -225,13 +215,20 @@ ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data, ...@@ -225,13 +215,20 @@ ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data,
fwstats->requested_sent[3], fwstats->requested_sent[3],
fwstats->requested_sent[4]); 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 = { static const struct file_operations brcmf_debugfs_fws_stats_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = simple_open, .open = brcmf_debugfs_fws_stats_open,
.read = brcmf_debugfs_fws_stats_read .release = single_release,
.read = seq_read,
.llseek = seq_lseek
}; };
void brcmf_debugfs_create_fws_stats(struct brcmf_pub *drvr, void brcmf_debugfs_create_fws_stats(struct brcmf_pub *drvr,
......
...@@ -2898,16 +2898,13 @@ brcmf_sdio_bus_txctl(struct device *dev, unsigned char *msg, uint msglen) ...@@ -2898,16 +2898,13 @@ brcmf_sdio_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
} }
#ifdef DEBUG #ifdef DEBUG
static int brcmf_sdio_dump_console(struct brcmf_sdio *bus, static int brcmf_sdio_dump_console(struct seq_file *seq, struct brcmf_sdio *bus,
struct sdpcm_shared *sh, char __user *data, struct sdpcm_shared *sh)
size_t count)
{ {
u32 addr, console_ptr, console_size, console_index; u32 addr, console_ptr, console_size, console_index;
char *conbuf = NULL; char *conbuf = NULL;
__le32 sh_val; __le32 sh_val;
int rv; int rv;
loff_t pos = 0;
int nbytes = 0;
/* obtain console information from device memory */ /* obtain console information from device memory */
addr = sh->console_addr + offsetof(struct rte_console, log_le); addr = sh->console_addr + offsetof(struct rte_console, log_le);
...@@ -2945,33 +2942,24 @@ static int brcmf_sdio_dump_console(struct brcmf_sdio *bus, ...@@ -2945,33 +2942,24 @@ static int brcmf_sdio_dump_console(struct brcmf_sdio *bus,
if (rv < 0) if (rv < 0)
goto done; goto done;
rv = simple_read_from_buffer(data, count, &pos, rv = seq_write(seq, conbuf + console_index,
conbuf + console_index,
console_size - console_index); console_size - console_index);
if (rv < 0) if (rv < 0)
goto done; goto done;
nbytes = rv; if (console_index > 0)
if (console_index > 0) { rv = seq_write(seq, conbuf, console_index - 1);
pos = 0;
rv = simple_read_from_buffer(data+nbytes, count, &pos,
conbuf, console_index - 1);
if (rv < 0)
goto done;
rv += nbytes;
}
done: done:
vfree(conbuf); vfree(conbuf);
return rv; return rv;
} }
static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh, static int brcmf_sdio_trap_info(struct seq_file *seq, struct brcmf_sdio *bus,
char __user *data, size_t count) struct sdpcm_shared *sh)
{ {
int error, res; int error;
char buf[350];
struct brcmf_trap_info tr; struct brcmf_trap_info tr;
loff_t pos = 0;
if ((sh->flags & SDPCM_SHARED_TRAP) == 0) { if ((sh->flags & SDPCM_SHARED_TRAP) == 0) {
brcmf_dbg(INFO, "no trap in firmware\n"); 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, ...@@ -2983,7 +2971,7 @@ static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
if (error < 0) if (error < 0)
return error; return error;
res = scnprintf(buf, sizeof(buf), seq_printf(seq,
"dongle trap info: type 0x%x @ epc 0x%08x\n" "dongle trap info: type 0x%x @ epc 0x%08x\n"
" cpsr 0x%08x spsr 0x%08x sp 0x%08x\n" " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
" lr 0x%08x pc 0x%08x offset 0x%x\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, ...@@ -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.r4), le32_to_cpu(tr.r5),
le32_to_cpu(tr.r6), le32_to_cpu(tr.r7)); 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, static int brcmf_sdio_assert_info(struct seq_file *seq, struct brcmf_sdio *bus,
struct sdpcm_shared *sh, char __user *data, struct sdpcm_shared *sh)
size_t count)
{ {
int error = 0; int error = 0;
char buf[200];
char file[80] = "?"; char file[80] = "?";
char expr[80] = "<???>"; char expr[80] = "<???>";
int res;
loff_t pos = 0;
if ((sh->flags & SDPCM_SHARED_ASSERT_BUILT) == 0) { if ((sh->flags & SDPCM_SHARED_ASSERT_BUILT) == 0) {
brcmf_dbg(INFO, "firmware not built with -assert\n"); brcmf_dbg(INFO, "firmware not built with -assert\n");
...@@ -3035,10 +3019,9 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus, ...@@ -3035,10 +3019,9 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
} }
sdio_release_host(bus->sdiodev->func[1]); sdio_release_host(bus->sdiodev->func[1]);
res = scnprintf(buf, sizeof(buf), seq_printf(seq, "dongle assert: %s:%d: assert(%s)\n",
"dongle assert: %s:%d: assert(%s)\n",
file, sh->assert_line, expr); 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) static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
...@@ -3062,58 +3045,47 @@ static int brcmf_sdio_checkdied(struct brcmf_sdio *bus) ...@@ -3062,58 +3045,47 @@ static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
return 0; return 0;
} }
static int brcmf_sdio_died_dump(struct brcmf_sdio *bus, char __user *data, static int brcmf_sdio_died_dump(struct seq_file *seq, struct brcmf_sdio *bus)
size_t count, loff_t *ppos)
{ {
int error = 0; int error = 0;
struct sdpcm_shared sh; struct sdpcm_shared sh;
int nbytes = 0;
loff_t pos = *ppos;
if (pos != 0)
return 0;
error = brcmf_sdio_readshared(bus, &sh); error = brcmf_sdio_readshared(bus, &sh);
if (error < 0) if (error < 0)
goto done; goto done;
error = brcmf_sdio_assert_info(bus, &sh, data, count); error = brcmf_sdio_assert_info(seq, bus, &sh);
if (error < 0) if (error < 0)
goto done; 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) if (error < 0)
goto done; goto done;
nbytes += error;
error = brcmf_sdio_dump_console(bus, &sh, data+nbytes, count); error = brcmf_sdio_dump_console(seq, bus, &sh);
if (error < 0)
goto done;
nbytes += error;
error = nbytes;
*ppos += nbytes;
done: done:
return error; return error;
} }
static ssize_t brcmf_sdio_forensic_read(struct file *f, char __user *data, static int brcmf_sdio_forensic_read(struct seq_file *seq, void *data)
size_t count, loff_t *ppos)
{ {
struct brcmf_sdio *bus = f->private_data; struct brcmf_sdio *bus = seq->private;
int res;
return brcmf_sdio_died_dump(seq, bus);
}
res = brcmf_sdio_died_dump(bus, data, count, ppos); static int brcmf_sdio_forensic_open(struct inode *inode, struct file *f)
if (res > 0) {
*ppos += res; return single_open(f, brcmf_sdio_forensic_read, inode->i_private);
return (ssize_t)res;
} }
static const struct file_operations brcmf_sdio_forensic_ops = { static const struct file_operations brcmf_sdio_forensic_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = simple_open, .open = brcmf_sdio_forensic_open,
.read = brcmf_sdio_forensic_read .release = single_release,
.read = seq_read,
.llseek = seq_lseek
}; };
static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment