aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2014-07-12 02:49:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-07-15 16:00:10 -0400
commit1b1e4e9e3abca01b7be6400db879ca8c475a2c96 (patch)
treec34efa121a5070554c6fcb639c50c5a81907e18f /drivers/net/wireless/brcm80211
parent5779ae6a5559252adabc5b5e807381dc7a16f1ff (diff)
brcmfmac: make use of seq_file API for debugfs entries
The use of seq_file simplifies the debugfs code. Simpler is better. Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c249
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c122
2 files changed, 170 insertions, 201 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
index 03fe8aca4d32..e1ac932a3154 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
@@ -41,28 +41,27 @@ void brcmf_debugfs_exit(void)
41 root_folder = NULL; 41 root_folder = NULL;
42} 42}
43 43
44static 44static int brcmf_debugfs_chipinfo_read(struct seq_file *seq, void *data)
45ssize_t brcmf_debugfs_chipinfo_read(struct file *f, char __user *data,
46 size_t count, loff_t *ppos)
47{ 45{
48 struct brcmf_pub *drvr = f->private_data; 46 struct brcmf_pub *drvr = seq->private;
49 struct brcmf_bus *bus = drvr->bus_if; 47 struct brcmf_bus *bus = drvr->bus_if;
50 char buf[40];
51 int res;
52 48
53 /* only allow read from start */ 49 seq_printf(seq, "chip: %x(%u) rev %u\n",
54 if (*ppos > 0) 50 bus->chip, bus->chip, bus->chiprev);
55 return 0; 51 return 0;
52}
56 53
57 res = scnprintf(buf, sizeof(buf), "chip: %x(%u) rev %u\n", 54static int brcmf_debugfs_chipinfo_open(struct inode *inode, struct file *f)
58 bus->chip, bus->chip, bus->chiprev); 55{
59 return simple_read_from_buffer(data, count, ppos, buf, res); 56 return single_open(f, brcmf_debugfs_chipinfo_read, inode->i_private);
60} 57}
61 58
62static const struct file_operations brcmf_debugfs_chipinfo_ops = { 59static const struct file_operations brcmf_debugfs_chipinfo_ops = {
63 .owner = THIS_MODULE, 60 .owner = THIS_MODULE,
64 .open = simple_open, 61 .open = brcmf_debugfs_chipinfo_open,
65 .read = brcmf_debugfs_chipinfo_read 62 .release = single_release,
63 .read = seq_read,
64 .llseek = seq_lseek
66}; 65};
67 66
68static int brcmf_debugfs_create_chipinfo(struct brcmf_pub *drvr) 67static int brcmf_debugfs_create_chipinfo(struct brcmf_pub *drvr)
@@ -98,55 +97,54 @@ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
98 return drvr->dbgfs_dir; 97 return drvr->dbgfs_dir;
99} 98}
100 99
101static 100static int brcmf_debugfs_sdio_count_read(struct seq_file *seq, void *data)
102ssize_t brcmf_debugfs_sdio_counter_read(struct file *f, char __user *data,
103 size_t count, loff_t *ppos)
104{ 101{
105 struct brcmf_sdio_count *sdcnt = f->private_data; 102 struct brcmf_sdio_count *sdcnt = seq->private;
106 char buf[750]; 103
107 int res; 104 seq_printf(seq,
108 105 "intrcount: %u\nlastintrs: %u\n"
109 /* only allow read from start */ 106 "pollcnt: %u\nregfails: %u\n"
110 if (*ppos > 0) 107 "tx_sderrs: %u\nfcqueued: %u\n"
111 return 0; 108 "rxrtx: %u\nrx_toolong: %u\n"
112 109 "rxc_errors: %u\nrx_hdrfail: %u\n"
113 res = scnprintf(buf, sizeof(buf), 110 "rx_badhdr: %u\nrx_badseq: %u\n"
114 "intrcount: %u\nlastintrs: %u\n" 111 "fc_rcvd: %u\nfc_xoff: %u\n"
115 "pollcnt: %u\nregfails: %u\n" 112 "fc_xon: %u\nrxglomfail: %u\n"
116 "tx_sderrs: %u\nfcqueued: %u\n" 113 "rxglomframes: %u\nrxglompkts: %u\n"
117 "rxrtx: %u\nrx_toolong: %u\n" 114 "f2rxhdrs: %u\nf2rxdata: %u\n"
118 "rxc_errors: %u\nrx_hdrfail: %u\n" 115 "f2txdata: %u\nf1regdata: %u\n"
119 "rx_badhdr: %u\nrx_badseq: %u\n" 116 "tickcnt: %u\ntx_ctlerrs: %lu\n"
120 "fc_rcvd: %u\nfc_xoff: %u\n" 117 "tx_ctlpkts: %lu\nrx_ctlerrs: %lu\n"
121 "fc_xon: %u\nrxglomfail: %u\n" 118 "rx_ctlpkts: %lu\nrx_readahead: %lu\n",
122 "rxglomframes: %u\nrxglompkts: %u\n" 119 sdcnt->intrcount, sdcnt->lastintrs,
123 "f2rxhdrs: %u\nf2rxdata: %u\n" 120 sdcnt->pollcnt, sdcnt->regfails,
124 "f2txdata: %u\nf1regdata: %u\n" 121 sdcnt->tx_sderrs, sdcnt->fcqueued,
125 "tickcnt: %u\ntx_ctlerrs: %lu\n" 122 sdcnt->rxrtx, sdcnt->rx_toolong,
126 "tx_ctlpkts: %lu\nrx_ctlerrs: %lu\n" 123 sdcnt->rxc_errors, sdcnt->rx_hdrfail,
127 "rx_ctlpkts: %lu\nrx_readahead: %lu\n", 124 sdcnt->rx_badhdr, sdcnt->rx_badseq,
128 sdcnt->intrcount, sdcnt->lastintrs, 125 sdcnt->fc_rcvd, sdcnt->fc_xoff,
129 sdcnt->pollcnt, sdcnt->regfails, 126 sdcnt->fc_xon, sdcnt->rxglomfail,
130 sdcnt->tx_sderrs, sdcnt->fcqueued, 127 sdcnt->rxglomframes, sdcnt->rxglompkts,
131 sdcnt->rxrtx, sdcnt->rx_toolong, 128 sdcnt->f2rxhdrs, sdcnt->f2rxdata,
132 sdcnt->rxc_errors, sdcnt->rx_hdrfail, 129 sdcnt->f2txdata, sdcnt->f1regdata,
133 sdcnt->rx_badhdr, sdcnt->rx_badseq, 130 sdcnt->tickcnt, sdcnt->tx_ctlerrs,
134 sdcnt->fc_rcvd, sdcnt->fc_xoff, 131 sdcnt->tx_ctlpkts, sdcnt->rx_ctlerrs,
135 sdcnt->fc_xon, sdcnt->rxglomfail, 132 sdcnt->rx_ctlpkts, sdcnt->rx_readahead_cnt);
136 sdcnt->rxglomframes, sdcnt->rxglompkts, 133
137 sdcnt->f2rxhdrs, sdcnt->f2rxdata, 134 return 0;
138 sdcnt->f2txdata, sdcnt->f1regdata, 135}
139 sdcnt->tickcnt, sdcnt->tx_ctlerrs, 136
140 sdcnt->tx_ctlpkts, sdcnt->rx_ctlerrs, 137static int brcmf_debugfs_sdio_count_open(struct inode *inode, struct file *f)
141 sdcnt->rx_ctlpkts, sdcnt->rx_readahead_cnt); 138{
142 139 return single_open(f, brcmf_debugfs_sdio_count_read, inode->i_private);
143 return simple_read_from_buffer(data, count, ppos, buf, res);
144} 140}
145 141
146static const struct file_operations brcmf_debugfs_sdio_counter_ops = { 142static const struct file_operations brcmf_debugfs_sdio_counter_ops = {
147 .owner = THIS_MODULE, 143 .owner = THIS_MODULE,
148 .open = simple_open, 144 .open = brcmf_debugfs_sdio_count_open,
149 .read = brcmf_debugfs_sdio_counter_read 145 .release = single_release,
146 .read = seq_read,
147 .llseek = seq_lseek
150}; 148};
151 149
152void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr, 150void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr,
@@ -159,79 +157,78 @@ void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr,
159 sdcnt, &brcmf_debugfs_sdio_counter_ops); 157 sdcnt, &brcmf_debugfs_sdio_counter_ops);
160} 158}
161 159
162static 160static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data)
163ssize_t brcmf_debugfs_fws_stats_read(struct file *f, char __user *data, 161{
164 size_t count, loff_t *ppos) 162 struct brcmf_fws_stats *fwstats = seq->private;
163
164 seq_printf(seq,
165 "header_pulls: %u\n"
166 "header_only_pkt: %u\n"
167 "tlv_parse_failed: %u\n"
168 "tlv_invalid_type: %u\n"
169 "mac_update_fails: %u\n"
170 "ps_update_fails: %u\n"
171 "if_update_fails: %u\n"
172 "pkt2bus: %u\n"
173 "generic_error: %u\n"
174 "rollback_success: %u\n"
175 "rollback_failed: %u\n"
176 "delayq_full: %u\n"
177 "supprq_full: %u\n"
178 "txs_indicate: %u\n"
179 "txs_discard: %u\n"
180 "txs_suppr_core: %u\n"
181 "txs_suppr_ps: %u\n"
182 "txs_tossed: %u\n"
183 "txs_host_tossed: %u\n"
184 "bus_flow_block: %u\n"
185 "fws_flow_block: %u\n"
186 "send_pkts: BK:%u BE:%u VO:%u VI:%u BCMC:%u\n"
187 "requested_sent: BK:%u BE:%u VO:%u VI:%u BCMC:%u\n",
188 fwstats->header_pulls,
189 fwstats->header_only_pkt,
190 fwstats->tlv_parse_failed,
191 fwstats->tlv_invalid_type,
192 fwstats->mac_update_failed,
193 fwstats->mac_ps_update_failed,
194 fwstats->if_update_failed,
195 fwstats->pkt2bus,
196 fwstats->generic_error,
197 fwstats->rollback_success,
198 fwstats->rollback_failed,
199 fwstats->delayq_full_error,
200 fwstats->supprq_full_error,
201 fwstats->txs_indicate,
202 fwstats->txs_discard,
203 fwstats->txs_supp_core,
204 fwstats->txs_supp_ps,
205 fwstats->txs_tossed,
206 fwstats->txs_host_tossed,
207 fwstats->bus_flow_block,
208 fwstats->fws_flow_block,
209 fwstats->send_pkts[0], fwstats->send_pkts[1],
210 fwstats->send_pkts[2], fwstats->send_pkts[3],
211 fwstats->send_pkts[4],
212 fwstats->requested_sent[0],
213 fwstats->requested_sent[1],
214 fwstats->requested_sent[2],
215 fwstats->requested_sent[3],
216 fwstats->requested_sent[4]);
217
218 return 0;
219}
220
221static int brcmf_debugfs_fws_stats_open(struct inode *inode, struct file *f)
165{ 222{
166 struct brcmf_fws_stats *fwstats = f->private_data; 223 return single_open(f, brcmf_debugfs_fws_stats_read, inode->i_private);
167 char buf[650];
168 int res;
169
170 /* only allow read from start */
171 if (*ppos > 0)
172 return 0;
173
174 res = scnprintf(buf, sizeof(buf),
175 "header_pulls: %u\n"
176 "header_only_pkt: %u\n"
177 "tlv_parse_failed: %u\n"
178 "tlv_invalid_type: %u\n"
179 "mac_update_fails: %u\n"
180 "ps_update_fails: %u\n"
181 "if_update_fails: %u\n"
182 "pkt2bus: %u\n"
183 "generic_error: %u\n"
184 "rollback_success: %u\n"
185 "rollback_failed: %u\n"
186 "delayq_full: %u\n"
187 "supprq_full: %u\n"
188 "txs_indicate: %u\n"
189 "txs_discard: %u\n"
190 "txs_suppr_core: %u\n"
191 "txs_suppr_ps: %u\n"
192 "txs_tossed: %u\n"
193 "txs_host_tossed: %u\n"
194 "bus_flow_block: %u\n"
195 "fws_flow_block: %u\n"
196 "send_pkts: BK:%u BE:%u VO:%u VI:%u BCMC:%u\n"
197 "requested_sent: BK:%u BE:%u VO:%u VI:%u BCMC:%u\n",
198 fwstats->header_pulls,
199 fwstats->header_only_pkt,
200 fwstats->tlv_parse_failed,
201 fwstats->tlv_invalid_type,
202 fwstats->mac_update_failed,
203 fwstats->mac_ps_update_failed,
204 fwstats->if_update_failed,
205 fwstats->pkt2bus,
206 fwstats->generic_error,
207 fwstats->rollback_success,
208 fwstats->rollback_failed,
209 fwstats->delayq_full_error,
210 fwstats->supprq_full_error,
211 fwstats->txs_indicate,
212 fwstats->txs_discard,
213 fwstats->txs_supp_core,
214 fwstats->txs_supp_ps,
215 fwstats->txs_tossed,
216 fwstats->txs_host_tossed,
217 fwstats->bus_flow_block,
218 fwstats->fws_flow_block,
219 fwstats->send_pkts[0], fwstats->send_pkts[1],
220 fwstats->send_pkts[2], fwstats->send_pkts[3],
221 fwstats->send_pkts[4],
222 fwstats->requested_sent[0],
223 fwstats->requested_sent[1],
224 fwstats->requested_sent[2],
225 fwstats->requested_sent[3],
226 fwstats->requested_sent[4]);
227
228 return simple_read_from_buffer(data, count, ppos, buf, res);
229} 224}
230 225
231static const struct file_operations brcmf_debugfs_fws_stats_ops = { 226static const struct file_operations brcmf_debugfs_fws_stats_ops = {
232 .owner = THIS_MODULE, 227 .owner = THIS_MODULE,
233 .open = simple_open, 228 .open = brcmf_debugfs_fws_stats_open,
234 .read = brcmf_debugfs_fws_stats_read 229 .release = single_release,
230 .read = seq_read,
231 .llseek = seq_lseek
235}; 232};
236 233
237void brcmf_debugfs_create_fws_stats(struct brcmf_pub *drvr, 234void brcmf_debugfs_create_fws_stats(struct brcmf_pub *drvr,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index bf9bc2d89230..0c98a7942a0f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -2898,16 +2898,13 @@ brcmf_sdio_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2898} 2898}
2899 2899
2900#ifdef DEBUG 2900#ifdef DEBUG
2901static int brcmf_sdio_dump_console(struct brcmf_sdio *bus, 2901static int brcmf_sdio_dump_console(struct seq_file *seq, struct brcmf_sdio *bus,
2902 struct sdpcm_shared *sh, char __user *data, 2902 struct sdpcm_shared *sh)
2903 size_t count)
2904{ 2903{
2905 u32 addr, console_ptr, console_size, console_index; 2904 u32 addr, console_ptr, console_size, console_index;
2906 char *conbuf = NULL; 2905 char *conbuf = NULL;
2907 __le32 sh_val; 2906 __le32 sh_val;
2908 int rv; 2907 int rv;
2909 loff_t pos = 0;
2910 int nbytes = 0;
2911 2908
2912 /* obtain console information from device memory */ 2909 /* obtain console information from device memory */
2913 addr = sh->console_addr + offsetof(struct rte_console, log_le); 2910 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 if (rv < 0) 2942 if (rv < 0)
2946 goto done; 2943 goto done;
2947 2944
2948 rv = simple_read_from_buffer(data, count, &pos, 2945 rv = seq_write(seq, conbuf + console_index,
2949 conbuf + console_index, 2946 console_size - console_index);
2950 console_size - console_index);
2951 if (rv < 0) 2947 if (rv < 0)
2952 goto done; 2948 goto done;
2953 2949
2954 nbytes = rv; 2950 if (console_index > 0)
2955 if (console_index > 0) { 2951 rv = seq_write(seq, conbuf, console_index - 1);
2956 pos = 0; 2952
2957 rv = simple_read_from_buffer(data+nbytes, count, &pos,
2958 conbuf, console_index - 1);
2959 if (rv < 0)
2960 goto done;
2961 rv += nbytes;
2962 }
2963done: 2953done:
2964 vfree(conbuf); 2954 vfree(conbuf);
2965 return rv; 2955 return rv;
2966} 2956}
2967 2957
2968static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh, 2958static int brcmf_sdio_trap_info(struct seq_file *seq, struct brcmf_sdio *bus,
2969 char __user *data, size_t count) 2959 struct sdpcm_shared *sh)
2970{ 2960{
2971 int error, res; 2961 int error;
2972 char buf[350];
2973 struct brcmf_trap_info tr; 2962 struct brcmf_trap_info tr;
2974 loff_t pos = 0;
2975 2963
2976 if ((sh->flags & SDPCM_SHARED_TRAP) == 0) { 2964 if ((sh->flags & SDPCM_SHARED_TRAP) == 0) {
2977 brcmf_dbg(INFO, "no trap in firmware\n"); 2965 brcmf_dbg(INFO, "no trap in firmware\n");
@@ -2983,34 +2971,30 @@ static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
2983 if (error < 0) 2971 if (error < 0)
2984 return error; 2972 return error;
2985 2973
2986 res = scnprintf(buf, sizeof(buf), 2974 seq_printf(seq,
2987 "dongle trap info: type 0x%x @ epc 0x%08x\n" 2975 "dongle trap info: type 0x%x @ epc 0x%08x\n"
2988 " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n" 2976 " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
2989 " lr 0x%08x pc 0x%08x offset 0x%x\n" 2977 " lr 0x%08x pc 0x%08x offset 0x%x\n"
2990 " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n" 2978 " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n"
2991 " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n", 2979 " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n",
2992 le32_to_cpu(tr.type), le32_to_cpu(tr.epc), 2980 le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
2993 le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr), 2981 le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
2994 le32_to_cpu(tr.r13), le32_to_cpu(tr.r14), 2982 le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
2995 le32_to_cpu(tr.pc), sh->trap_addr, 2983 le32_to_cpu(tr.pc), sh->trap_addr,
2996 le32_to_cpu(tr.r0), le32_to_cpu(tr.r1), 2984 le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
2997 le32_to_cpu(tr.r2), le32_to_cpu(tr.r3), 2985 le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
2998 le32_to_cpu(tr.r4), le32_to_cpu(tr.r5), 2986 le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
2999 le32_to_cpu(tr.r6), le32_to_cpu(tr.r7)); 2987 le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
3000 2988
3001 return simple_read_from_buffer(data, count, &pos, buf, res); 2989 return 0;
3002} 2990}
3003 2991
3004static int brcmf_sdio_assert_info(struct brcmf_sdio *bus, 2992static int brcmf_sdio_assert_info(struct seq_file *seq, struct brcmf_sdio *bus,
3005 struct sdpcm_shared *sh, char __user *data, 2993 struct sdpcm_shared *sh)
3006 size_t count)
3007{ 2994{
3008 int error = 0; 2995 int error = 0;
3009 char buf[200];
3010 char file[80] = "?"; 2996 char file[80] = "?";
3011 char expr[80] = "<???>"; 2997 char expr[80] = "<???>";
3012 int res;
3013 loff_t pos = 0;
3014 2998
3015 if ((sh->flags & SDPCM_SHARED_ASSERT_BUILT) == 0) { 2999 if ((sh->flags & SDPCM_SHARED_ASSERT_BUILT) == 0) {
3016 brcmf_dbg(INFO, "firmware not built with -assert\n"); 3000 brcmf_dbg(INFO, "firmware not built with -assert\n");
@@ -3035,10 +3019,9 @@ static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
3035 } 3019 }
3036 sdio_release_host(bus->sdiodev->func[1]); 3020 sdio_release_host(bus->sdiodev->func[1]);
3037 3021
3038 res = scnprintf(buf, sizeof(buf), 3022 seq_printf(seq, "dongle assert: %s:%d: assert(%s)\n",
3039 "dongle assert: %s:%d: assert(%s)\n", 3023 file, sh->assert_line, expr);
3040 file, sh->assert_line, expr); 3024 return 0;
3041 return simple_read_from_buffer(data, count, &pos, buf, res);
3042} 3025}
3043 3026
3044static int brcmf_sdio_checkdied(struct brcmf_sdio *bus) 3027static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
@@ -3062,58 +3045,47 @@ static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
3062 return 0; 3045 return 0;
3063} 3046}
3064 3047
3065static int brcmf_sdio_died_dump(struct brcmf_sdio *bus, char __user *data, 3048static int brcmf_sdio_died_dump(struct seq_file *seq, struct brcmf_sdio *bus)
3066 size_t count, loff_t *ppos)
3067{ 3049{
3068 int error = 0; 3050 int error = 0;
3069 struct sdpcm_shared sh; 3051 struct sdpcm_shared sh;
3070 int nbytes = 0;
3071 loff_t pos = *ppos;
3072
3073 if (pos != 0)
3074 return 0;
3075 3052
3076 error = brcmf_sdio_readshared(bus, &sh); 3053 error = brcmf_sdio_readshared(bus, &sh);
3077 if (error < 0) 3054 if (error < 0)
3078 goto done; 3055 goto done;
3079 3056
3080 error = brcmf_sdio_assert_info(bus, &sh, data, count); 3057 error = brcmf_sdio_assert_info(seq, bus, &sh);
3081 if (error < 0) 3058 if (error < 0)
3082 goto done; 3059 goto done;
3083 nbytes = error;
3084 3060
3085 error = brcmf_sdio_trap_info(bus, &sh, data+nbytes, count); 3061 error = brcmf_sdio_trap_info(seq, bus, &sh);
3086 if (error < 0) 3062 if (error < 0)
3087 goto done; 3063 goto done;
3088 nbytes += error;
3089 3064
3090 error = brcmf_sdio_dump_console(bus, &sh, data+nbytes, count); 3065 error = brcmf_sdio_dump_console(seq, bus, &sh);
3091 if (error < 0)
3092 goto done;
3093 nbytes += error;
3094 3066
3095 error = nbytes;
3096 *ppos += nbytes;
3097done: 3067done:
3098 return error; 3068 return error;
3099} 3069}
3100 3070
3101static ssize_t brcmf_sdio_forensic_read(struct file *f, char __user *data, 3071static int brcmf_sdio_forensic_read(struct seq_file *seq, void *data)
3102 size_t count, loff_t *ppos)
3103{ 3072{
3104 struct brcmf_sdio *bus = f->private_data; 3073 struct brcmf_sdio *bus = seq->private;
3105 int res;
3106 3074
3107 res = brcmf_sdio_died_dump(bus, data, count, ppos); 3075 return brcmf_sdio_died_dump(seq, bus);
3108 if (res > 0) 3076}
3109 *ppos += res; 3077
3110 return (ssize_t)res; 3078static int brcmf_sdio_forensic_open(struct inode *inode, struct file *f)
3079{
3080 return single_open(f, brcmf_sdio_forensic_read, inode->i_private);
3111} 3081}
3112 3082
3113static const struct file_operations brcmf_sdio_forensic_ops = { 3083static const struct file_operations brcmf_sdio_forensic_ops = {
3114 .owner = THIS_MODULE, 3084 .owner = THIS_MODULE,
3115 .open = simple_open, 3085 .open = brcmf_sdio_forensic_open,
3116 .read = brcmf_sdio_forensic_read 3086 .release = single_release,
3087 .read = seq_read,
3088 .llseek = seq_lseek
3117}; 3089};
3118 3090
3119static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) 3091static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)