diff options
author | Arend van Spriel <arend@broadcom.com> | 2014-07-12 02:49:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-07-15 16:00:10 -0400 |
commit | 1b1e4e9e3abca01b7be6400db879ca8c475a2c96 (patch) | |
tree | c34efa121a5070554c6fcb639c50c5a81907e18f /drivers/net/wireless/brcm80211 | |
parent | 5779ae6a5559252adabc5b5e807381dc7a16f1ff (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.c | 249 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 122 |
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 | ||
44 | static | 44 | static int brcmf_debugfs_chipinfo_read(struct seq_file *seq, void *data) |
45 | ssize_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", | 54 | static 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 | ||
62 | static const struct file_operations brcmf_debugfs_chipinfo_ops = { | 59 | static 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 | ||
68 | static int brcmf_debugfs_create_chipinfo(struct brcmf_pub *drvr) | 67 | static 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 | ||
101 | static | 100 | static int brcmf_debugfs_sdio_count_read(struct seq_file *seq, void *data) |
102 | ssize_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, | 137 | static 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 | ||
146 | static const struct file_operations brcmf_debugfs_sdio_counter_ops = { | 142 | static 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 | ||
152 | void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr, | 150 | void 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 | ||
162 | static | 160 | static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data) |
163 | ssize_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 | |||
221 | static 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 | ||
231 | static const struct file_operations brcmf_debugfs_fws_stats_ops = { | 226 | static 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 | ||
237 | void brcmf_debugfs_create_fws_stats(struct brcmf_pub *drvr, | 234 | void 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 |
2901 | static int brcmf_sdio_dump_console(struct brcmf_sdio *bus, | 2901 | static 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 | } | ||
2963 | done: | 2953 | done: |
2964 | vfree(conbuf); | 2954 | vfree(conbuf); |
2965 | return rv; | 2955 | return rv; |
2966 | } | 2956 | } |
2967 | 2957 | ||
2968 | static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh, | 2958 | static 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 | ||
3004 | static int brcmf_sdio_assert_info(struct brcmf_sdio *bus, | 2992 | static 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 | ||
3044 | static int brcmf_sdio_checkdied(struct brcmf_sdio *bus) | 3027 | static 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 | ||
3065 | static int brcmf_sdio_died_dump(struct brcmf_sdio *bus, char __user *data, | 3048 | static 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; | ||
3097 | done: | 3067 | done: |
3098 | return error; | 3068 | return error; |
3099 | } | 3069 | } |
3100 | 3070 | ||
3101 | static ssize_t brcmf_sdio_forensic_read(struct file *f, char __user *data, | 3071 | static 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; | 3078 | static 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 | ||
3113 | static const struct file_operations brcmf_sdio_forensic_ops = { | 3083 | static 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 | ||
3119 | static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) | 3091 | static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) |