aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c179
1 files changed, 27 insertions, 152 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
index e1ac932a3154..be9f4f829192 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
@@ -43,37 +43,13 @@ void brcmf_debugfs_exit(void)
43 43
44static int brcmf_debugfs_chipinfo_read(struct seq_file *seq, void *data) 44static int brcmf_debugfs_chipinfo_read(struct seq_file *seq, void *data)
45{ 45{
46 struct brcmf_pub *drvr = seq->private; 46 struct brcmf_bus *bus = dev_get_drvdata(seq->private);
47 struct brcmf_bus *bus = drvr->bus_if;
48 47
49 seq_printf(seq, "chip: %x(%u) rev %u\n", 48 seq_printf(seq, "chip: %x(%u) rev %u\n",
50 bus->chip, bus->chip, bus->chiprev); 49 bus->chip, bus->chip, bus->chiprev);
51 return 0; 50 return 0;
52} 51}
53 52
54static int brcmf_debugfs_chipinfo_open(struct inode *inode, struct file *f)
55{
56 return single_open(f, brcmf_debugfs_chipinfo_read, inode->i_private);
57}
58
59static const struct file_operations brcmf_debugfs_chipinfo_ops = {
60 .owner = THIS_MODULE,
61 .open = brcmf_debugfs_chipinfo_open,
62 .release = single_release,
63 .read = seq_read,
64 .llseek = seq_lseek
65};
66
67static int brcmf_debugfs_create_chipinfo(struct brcmf_pub *drvr)
68{
69 struct dentry *dentry = drvr->dbgfs_dir;
70
71 if (!IS_ERR_OR_NULL(dentry))
72 debugfs_create_file("chipinfo", S_IRUGO, dentry, drvr,
73 &brcmf_debugfs_chipinfo_ops);
74 return 0;
75}
76
77int brcmf_debugfs_attach(struct brcmf_pub *drvr) 53int brcmf_debugfs_attach(struct brcmf_pub *drvr)
78{ 54{
79 struct device *dev = drvr->bus_if->dev; 55 struct device *dev = drvr->bus_if->dev;
@@ -82,7 +58,8 @@ int brcmf_debugfs_attach(struct brcmf_pub *drvr)
82 return -ENODEV; 58 return -ENODEV;
83 59
84 drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder); 60 drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
85 brcmf_debugfs_create_chipinfo(drvr); 61 brcmf_debugfs_add_entry(drvr, "chipinfo", brcmf_debugfs_chipinfo_read);
62
86 return PTR_ERR_OR_ZERO(drvr->dbgfs_dir); 63 return PTR_ERR_OR_ZERO(drvr->dbgfs_dir);
87} 64}
88 65
@@ -97,146 +74,44 @@ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
97 return drvr->dbgfs_dir; 74 return drvr->dbgfs_dir;
98} 75}
99 76
100static int brcmf_debugfs_sdio_count_read(struct seq_file *seq, void *data) 77struct brcmf_debugfs_entry {
101{ 78 int (*read)(struct seq_file *seq, void *data);
102 struct brcmf_sdio_count *sdcnt = seq->private; 79 struct brcmf_pub *drvr;
103 80};
104 seq_printf(seq,
105 "intrcount: %u\nlastintrs: %u\n"
106 "pollcnt: %u\nregfails: %u\n"
107 "tx_sderrs: %u\nfcqueued: %u\n"
108 "rxrtx: %u\nrx_toolong: %u\n"
109 "rxc_errors: %u\nrx_hdrfail: %u\n"
110 "rx_badhdr: %u\nrx_badseq: %u\n"
111 "fc_rcvd: %u\nfc_xoff: %u\n"
112 "fc_xon: %u\nrxglomfail: %u\n"
113 "rxglomframes: %u\nrxglompkts: %u\n"
114 "f2rxhdrs: %u\nf2rxdata: %u\n"
115 "f2txdata: %u\nf1regdata: %u\n"
116 "tickcnt: %u\ntx_ctlerrs: %lu\n"
117 "tx_ctlpkts: %lu\nrx_ctlerrs: %lu\n"
118 "rx_ctlpkts: %lu\nrx_readahead: %lu\n",
119 sdcnt->intrcount, sdcnt->lastintrs,
120 sdcnt->pollcnt, sdcnt->regfails,
121 sdcnt->tx_sderrs, sdcnt->fcqueued,
122 sdcnt->rxrtx, sdcnt->rx_toolong,
123 sdcnt->rxc_errors, sdcnt->rx_hdrfail,
124 sdcnt->rx_badhdr, sdcnt->rx_badseq,
125 sdcnt->fc_rcvd, sdcnt->fc_xoff,
126 sdcnt->fc_xon, sdcnt->rxglomfail,
127 sdcnt->rxglomframes, sdcnt->rxglompkts,
128 sdcnt->f2rxhdrs, sdcnt->f2rxdata,
129 sdcnt->f2txdata, sdcnt->f1regdata,
130 sdcnt->tickcnt, sdcnt->tx_ctlerrs,
131 sdcnt->tx_ctlpkts, sdcnt->rx_ctlerrs,
132 sdcnt->rx_ctlpkts, sdcnt->rx_readahead_cnt);
133
134 return 0;
135}
136 81
137static int brcmf_debugfs_sdio_count_open(struct inode *inode, struct file *f) 82static int brcmf_debugfs_entry_open(struct inode *inode, struct file *f)
138{ 83{
139 return single_open(f, brcmf_debugfs_sdio_count_read, inode->i_private); 84 struct brcmf_debugfs_entry *entry = inode->i_private;
85
86 return single_open(f, entry->read, entry->drvr->bus_if->dev);
140} 87}
141 88
142static const struct file_operations brcmf_debugfs_sdio_counter_ops = { 89static const struct file_operations brcmf_debugfs_def_ops = {
143 .owner = THIS_MODULE, 90 .owner = THIS_MODULE,
144 .open = brcmf_debugfs_sdio_count_open, 91 .open = brcmf_debugfs_entry_open,
145 .release = single_release, 92 .release = single_release,
146 .read = seq_read, 93 .read = seq_read,
147 .llseek = seq_lseek 94 .llseek = seq_lseek
148}; 95};
149 96
150void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr, 97int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
151 struct brcmf_sdio_count *sdcnt) 98 int (*read_fn)(struct seq_file *seq, void *data))
152{ 99{
153 struct dentry *dentry = drvr->dbgfs_dir; 100 struct dentry *dentry = drvr->dbgfs_dir;
101 struct brcmf_debugfs_entry *entry;
154 102
155 if (!IS_ERR_OR_NULL(dentry)) 103 if (IS_ERR_OR_NULL(dentry))
156 debugfs_create_file("counters", S_IRUGO, dentry, 104 return -ENOENT;
157 sdcnt, &brcmf_debugfs_sdio_counter_ops);
158}
159 105
160static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data) 106 entry = devm_kzalloc(drvr->bus_if->dev, sizeof(*entry), GFP_KERNEL);
161{ 107 if (!entry)
162 struct brcmf_fws_stats *fwstats = seq->private; 108 return -ENOMEM;
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 109
218 return 0; 110 entry->read = read_fn;
219} 111 entry->drvr = drvr;
220 112
221static int brcmf_debugfs_fws_stats_open(struct inode *inode, struct file *f) 113 dentry = debugfs_create_file(fn, S_IRUGO, dentry, entry,
222{ 114 &brcmf_debugfs_def_ops);
223 return single_open(f, brcmf_debugfs_fws_stats_read, inode->i_private);
224}
225
226static const struct file_operations brcmf_debugfs_fws_stats_ops = {
227 .owner = THIS_MODULE,
228 .open = brcmf_debugfs_fws_stats_open,
229 .release = single_release,
230 .read = seq_read,
231 .llseek = seq_lseek
232};
233
234void brcmf_debugfs_create_fws_stats(struct brcmf_pub *drvr,
235 struct brcmf_fws_stats *stats)
236{
237 struct dentry *dentry = drvr->dbgfs_dir;
238 115
239 if (!IS_ERR_OR_NULL(dentry)) 116 return PTR_ERR_OR_ZERO(dentry);
240 debugfs_create_file("fws_stats", S_IRUGO, dentry,
241 stats, &brcmf_debugfs_fws_stats_ops);
242} 117}