aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c63
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h36
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c169
3 files changed, 175 insertions, 93 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
index 0a7a3d50df6e..7f89540b56da 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
@@ -17,12 +17,14 @@
17#include <linux/if_ether.h> 17#include <linux/if_ether.h>
18#include <linux/if.h> 18#include <linux/if.h>
19#include <linux/ieee80211.h> 19#include <linux/ieee80211.h>
20#include <linux/module.h>
20 21
21#include <defs.h> 22#include <defs.h>
22#include <brcmu_wifi.h> 23#include <brcmu_wifi.h>
23#include <brcmu_utils.h> 24#include <brcmu_utils.h>
24#include "dhd.h" 25#include "dhd.h"
25#include "dhd_bus.h" 26#include "dhd_bus.h"
27#include "dhd_dbg.h"
26 28
27static struct dentry *root_folder; 29static struct dentry *root_folder;
28 30
@@ -61,3 +63,64 @@ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
61{ 63{
62 return drvr->dbgfs_dir; 64 return drvr->dbgfs_dir;
63} 65}
66
67static
68ssize_t brcmf_debugfs_sdio_counter_read(struct file *f, char __user *data,
69 size_t count, loff_t *ppos)
70{
71 struct brcmf_sdio_count *sdcnt = f->private_data;
72 char buf[750];
73 int res;
74
75 /* only allow read from start */
76 if (*ppos > 0)
77 return 0;
78
79 res = scnprintf(buf, sizeof(buf),
80 "intrcount: %u\nlastintrs: %u\n"
81 "pollcnt: %u\nregfails: %u\n"
82 "tx_sderrs: %u\nfcqueued: %u\n"
83 "rxrtx: %u\nrx_toolong: %u\n"
84 "rxc_errors: %u\nrx_hdrfail: %u\n"
85 "rx_badhdr: %u\nrx_badseq: %u\n"
86 "fc_rcvd: %u\nfc_xoff: %u\n"
87 "fc_xon: %u\nrxglomfail: %u\n"
88 "rxglomframes: %u\nrxglompkts: %u\n"
89 "f2rxhdrs: %u\nf2rxdata: %u\n"
90 "f2txdata: %u\nf1regdata: %u\n"
91 "tickcnt: %u\ntx_ctlerrs: %lu\n"
92 "tx_ctlpkts: %lu\nrx_ctlerrs: %lu\n"
93 "rx_ctlpkts: %lu\nrx_readahead: %lu\n",
94 sdcnt->intrcount, sdcnt->lastintrs,
95 sdcnt->pollcnt, sdcnt->regfails,
96 sdcnt->tx_sderrs, sdcnt->fcqueued,
97 sdcnt->rxrtx, sdcnt->rx_toolong,
98 sdcnt->rxc_errors, sdcnt->rx_hdrfail,
99 sdcnt->rx_badhdr, sdcnt->rx_badseq,
100 sdcnt->fc_rcvd, sdcnt->fc_xoff,
101 sdcnt->fc_xon, sdcnt->rxglomfail,
102 sdcnt->rxglomframes, sdcnt->rxglompkts,
103 sdcnt->f2rxhdrs, sdcnt->f2rxdata,
104 sdcnt->f2txdata, sdcnt->f1regdata,
105 sdcnt->tickcnt, sdcnt->tx_ctlerrs,
106 sdcnt->tx_ctlpkts, sdcnt->rx_ctlerrs,
107 sdcnt->rx_ctlpkts, sdcnt->rx_readahead_cnt);
108
109 return simple_read_from_buffer(data, count, ppos, buf, res);
110}
111
112static const struct file_operations brcmf_debugfs_sdio_counter_ops = {
113 .owner = THIS_MODULE,
114 .open = simple_open,
115 .read = brcmf_debugfs_sdio_counter_read
116};
117
118void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr,
119 struct brcmf_sdio_count *sdcnt)
120{
121 struct dentry *dentry = drvr->dbgfs_dir;
122
123 if (!IS_ERR_OR_NULL(dentry))
124 debugfs_create_file("counters", S_IRUGO, dentry,
125 sdcnt, &brcmf_debugfs_sdio_counter_ops);
126}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
index 0efb226030a4..b784920532d3 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
@@ -76,6 +76,40 @@ do { \
76 76
77extern int brcmf_msg_level; 77extern int brcmf_msg_level;
78 78
79/*
80 * hold counter variables used in brcmfmac sdio driver.
81 */
82struct brcmf_sdio_count {
83 uint intrcount; /* Count of device interrupt callbacks */
84 uint lastintrs; /* Count as of last watchdog timer */
85 uint pollcnt; /* Count of active polls */
86 uint regfails; /* Count of R_REG failures */
87 uint tx_sderrs; /* Count of tx attempts with sd errors */
88 uint fcqueued; /* Tx packets that got queued */
89 uint rxrtx; /* Count of rtx requests (NAK to dongle) */
90 uint rx_toolong; /* Receive frames too long to receive */
91 uint rxc_errors; /* SDIO errors when reading control frames */
92 uint rx_hdrfail; /* SDIO errors on header reads */
93 uint rx_badhdr; /* Bad received headers (roosync?) */
94 uint rx_badseq; /* Mismatched rx sequence number */
95 uint fc_rcvd; /* Number of flow-control events received */
96 uint fc_xoff; /* Number which turned on flow-control */
97 uint fc_xon; /* Number which turned off flow-control */
98 uint rxglomfail; /* Failed deglom attempts */
99 uint rxglomframes; /* Number of glom frames (superframes) */
100 uint rxglompkts; /* Number of packets from glom frames */
101 uint f2rxhdrs; /* Number of header reads */
102 uint f2rxdata; /* Number of frame data reads */
103 uint f2txdata; /* Number of f2 frame writes */
104 uint f1regdata; /* Number of f1 register accesses */
105 uint tickcnt; /* Number of watchdog been schedule */
106 ulong tx_ctlerrs; /* Err of sending ctrl frames */
107 ulong tx_ctlpkts; /* Ctrl frames sent to dongle */
108 ulong rx_ctlerrs; /* Err of processing rx ctrl frames */
109 ulong rx_ctlpkts; /* Ctrl frames processed from dongle */
110 ulong rx_readahead_cnt; /* packets where header read-ahead was used */
111};
112
79struct brcmf_pub; 113struct brcmf_pub;
80#ifdef DEBUG 114#ifdef DEBUG
81void brcmf_debugfs_init(void); 115void brcmf_debugfs_init(void);
@@ -83,6 +117,8 @@ void brcmf_debugfs_exit(void);
83int brcmf_debugfs_attach(struct brcmf_pub *drvr); 117int brcmf_debugfs_attach(struct brcmf_pub *drvr);
84void brcmf_debugfs_detach(struct brcmf_pub *drvr); 118void brcmf_debugfs_detach(struct brcmf_pub *drvr);
85struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr); 119struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
120void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr,
121 struct brcmf_sdio_count *sdcnt);
86#else 122#else
87static inline void brcmf_debugfs_init(void) 123static inline void brcmf_debugfs_init(void)
88{ 124{
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 1dbf2be478c8..a07fb01bc36b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -502,12 +502,9 @@ struct brcmf_sdio {
502 bool intr; /* Use interrupts */ 502 bool intr; /* Use interrupts */
503 bool poll; /* Use polling */ 503 bool poll; /* Use polling */
504 bool ipend; /* Device interrupt is pending */ 504 bool ipend; /* Device interrupt is pending */
505 uint intrcount; /* Count of device interrupt callbacks */
506 uint lastintrs; /* Count as of last watchdog timer */
507 uint spurious; /* Count of spurious interrupts */ 505 uint spurious; /* Count of spurious interrupts */
508 uint pollrate; /* Ticks between device polls */ 506 uint pollrate; /* Ticks between device polls */
509 uint polltick; /* Tick counter */ 507 uint polltick; /* Tick counter */
510 uint pollcnt; /* Count of active polls */
511 508
512#ifdef DEBUG 509#ifdef DEBUG
513 uint console_interval; 510 uint console_interval;
@@ -515,8 +512,6 @@ struct brcmf_sdio {
515 uint console_addr; /* Console address from shared struct */ 512 uint console_addr; /* Console address from shared struct */
516#endif /* DEBUG */ 513#endif /* DEBUG */
517 514
518 uint regfails; /* Count of R_REG failures */
519
520 uint clkstate; /* State of sd and backplane clock(s) */ 515 uint clkstate; /* State of sd and backplane clock(s) */
521 bool activity; /* Activity flag for clock down */ 516 bool activity; /* Activity flag for clock down */
522 s32 idletime; /* Control for activity timeout */ 517 s32 idletime; /* Control for activity timeout */
@@ -531,33 +526,6 @@ struct brcmf_sdio {
531/* Field to decide if rx of control frames happen in rxbuf or lb-pool */ 526/* Field to decide if rx of control frames happen in rxbuf or lb-pool */
532 bool usebufpool; 527 bool usebufpool;
533 528
534 /* Some additional counters */
535 uint tx_sderrs; /* Count of tx attempts with sd errors */
536 uint fcqueued; /* Tx packets that got queued */
537 uint rxrtx; /* Count of rtx requests (NAK to dongle) */
538 uint rx_toolong; /* Receive frames too long to receive */
539 uint rxc_errors; /* SDIO errors when reading control frames */
540 uint rx_hdrfail; /* SDIO errors on header reads */
541 uint rx_badhdr; /* Bad received headers (roosync?) */
542 uint rx_badseq; /* Mismatched rx sequence number */
543 uint fc_rcvd; /* Number of flow-control events received */
544 uint fc_xoff; /* Number which turned on flow-control */
545 uint fc_xon; /* Number which turned off flow-control */
546 uint rxglomfail; /* Failed deglom attempts */
547 uint rxglomframes; /* Number of glom frames (superframes) */
548 uint rxglompkts; /* Number of packets from glom frames */
549 uint f2rxhdrs; /* Number of header reads */
550 uint f2rxdata; /* Number of frame data reads */
551 uint f2txdata; /* Number of f2 frame writes */
552 uint f1regdata; /* Number of f1 register accesses */
553 uint tickcnt; /* Number of watchdog been schedule */
554 unsigned long tx_ctlerrs; /* Err of sending ctrl frames */
555 unsigned long tx_ctlpkts; /* Ctrl frames sent to dongle */
556 unsigned long rx_ctlerrs; /* Err of processing rx ctrl frames */
557 unsigned long rx_ctlpkts; /* Ctrl frames processed from dongle */
558 unsigned long rx_readahead_cnt; /* Number of packets where header
559 * read-ahead was used. */
560
561 u8 *ctrl_frame_buf; 529 u8 *ctrl_frame_buf;
562 u32 ctrl_frame_len; 530 u32 ctrl_frame_len;
563 bool ctrl_frame_stat; 531 bool ctrl_frame_stat;
@@ -583,6 +551,7 @@ struct brcmf_sdio {
583 u32 fw_ptr; 551 u32 fw_ptr;
584 552
585 bool txoff; /* Transmit flow-controlled */ 553 bool txoff; /* Transmit flow-controlled */
554 struct brcmf_sdio_count sdcnt;
586}; 555};
587 556
588/* clkstate */ 557/* clkstate */
@@ -945,7 +914,7 @@ static u32 brcmf_sdbrcm_hostmail(struct brcmf_sdio *bus)
945 if (ret == 0) 914 if (ret == 0)
946 w_sdreg32(bus, SMB_INT_ACK, 915 w_sdreg32(bus, SMB_INT_ACK,
947 offsetof(struct sdpcmd_regs, tosbmailbox)); 916 offsetof(struct sdpcmd_regs, tosbmailbox));
948 bus->f1regdata += 2; 917 bus->sdcnt.f1regdata += 2;
949 918
950 /* Dongle recomposed rx frames, accept them again */ 919 /* Dongle recomposed rx frames, accept them again */
951 if (hmb_data & HMB_DATA_NAKHANDLED) { 920 if (hmb_data & HMB_DATA_NAKHANDLED) {
@@ -984,12 +953,12 @@ static u32 brcmf_sdbrcm_hostmail(struct brcmf_sdio *bus)
984 HMB_DATA_FCDATA_SHIFT; 953 HMB_DATA_FCDATA_SHIFT;
985 954
986 if (fcbits & ~bus->flowcontrol) 955 if (fcbits & ~bus->flowcontrol)
987 bus->fc_xoff++; 956 bus->sdcnt.fc_xoff++;
988 957
989 if (bus->flowcontrol & ~fcbits) 958 if (bus->flowcontrol & ~fcbits)
990 bus->fc_xon++; 959 bus->sdcnt.fc_xon++;
991 960
992 bus->fc_rcvd++; 961 bus->sdcnt.fc_rcvd++;
993 bus->flowcontrol = fcbits; 962 bus->flowcontrol = fcbits;
994 } 963 }
995 964
@@ -1021,7 +990,7 @@ static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx)
1021 990
1022 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, 991 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
1023 SFC_RF_TERM, &err); 992 SFC_RF_TERM, &err);
1024 bus->f1regdata++; 993 bus->sdcnt.f1regdata++;
1025 994
1026 /* Wait until the packet has been flushed (device/FIFO stable) */ 995 /* Wait until the packet has been flushed (device/FIFO stable) */
1027 for (lastrbc = retries = 0xffff; retries > 0; retries--) { 996 for (lastrbc = retries = 0xffff; retries > 0; retries--) {
@@ -1029,7 +998,7 @@ static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx)
1029 SBSDIO_FUNC1_RFRAMEBCHI, &err); 998 SBSDIO_FUNC1_RFRAMEBCHI, &err);
1030 lo = brcmf_sdio_regrb(bus->sdiodev, 999 lo = brcmf_sdio_regrb(bus->sdiodev,
1031 SBSDIO_FUNC1_RFRAMEBCLO, &err); 1000 SBSDIO_FUNC1_RFRAMEBCLO, &err);
1032 bus->f1regdata += 2; 1001 bus->sdcnt.f1regdata += 2;
1033 1002
1034 if ((hi == 0) && (lo == 0)) 1003 if ((hi == 0) && (lo == 0))
1035 break; 1004 break;
@@ -1047,11 +1016,11 @@ static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx)
1047 brcmf_dbg(INFO, "flush took %d iterations\n", 0xffff - retries); 1016 brcmf_dbg(INFO, "flush took %d iterations\n", 0xffff - retries);
1048 1017
1049 if (rtx) { 1018 if (rtx) {
1050 bus->rxrtx++; 1019 bus->sdcnt.rxrtx++;
1051 err = w_sdreg32(bus, SMB_NAK, 1020 err = w_sdreg32(bus, SMB_NAK,
1052 offsetof(struct sdpcmd_regs, tosbmailbox)); 1021 offsetof(struct sdpcmd_regs, tosbmailbox));
1053 1022
1054 bus->f1regdata++; 1023 bus->sdcnt.f1regdata++;
1055 if (err == 0) 1024 if (err == 0)
1056 bus->rxskip = true; 1025 bus->rxskip = true;
1057 } 1026 }
@@ -1243,7 +1212,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1243 dlen); 1212 dlen);
1244 errcode = -1; 1213 errcode = -1;
1245 } 1214 }
1246 bus->f2rxdata++; 1215 bus->sdcnt.f2rxdata++;
1247 1216
1248 /* On failure, kill the superframe, allow a couple retries */ 1217 /* On failure, kill the superframe, allow a couple retries */
1249 if (errcode < 0) { 1218 if (errcode < 0) {
@@ -1256,7 +1225,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1256 } else { 1225 } else {
1257 bus->glomerr = 0; 1226 bus->glomerr = 0;
1258 brcmf_sdbrcm_rxfail(bus, true, false); 1227 brcmf_sdbrcm_rxfail(bus, true, false);
1259 bus->rxglomfail++; 1228 bus->sdcnt.rxglomfail++;
1260 brcmf_sdbrcm_free_glom(bus); 1229 brcmf_sdbrcm_free_glom(bus);
1261 } 1230 }
1262 return 0; 1231 return 0;
@@ -1312,7 +1281,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1312 if (rxseq != seq) { 1281 if (rxseq != seq) {
1313 brcmf_dbg(INFO, "(superframe) rx_seq %d, expected %d\n", 1282 brcmf_dbg(INFO, "(superframe) rx_seq %d, expected %d\n",
1314 seq, rxseq); 1283 seq, rxseq);
1315 bus->rx_badseq++; 1284 bus->sdcnt.rx_badseq++;
1316 rxseq = seq; 1285 rxseq = seq;
1317 } 1286 }
1318 1287
@@ -1376,7 +1345,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1376 } else { 1345 } else {
1377 bus->glomerr = 0; 1346 bus->glomerr = 0;
1378 brcmf_sdbrcm_rxfail(bus, true, false); 1347 brcmf_sdbrcm_rxfail(bus, true, false);
1379 bus->rxglomfail++; 1348 bus->sdcnt.rxglomfail++;
1380 brcmf_sdbrcm_free_glom(bus); 1349 brcmf_sdbrcm_free_glom(bus);
1381 } 1350 }
1382 bus->nextlen = 0; 1351 bus->nextlen = 0;
@@ -1402,7 +1371,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1402 if (rxseq != seq) { 1371 if (rxseq != seq) {
1403 brcmf_dbg(GLOM, "rx_seq %d, expected %d\n", 1372 brcmf_dbg(GLOM, "rx_seq %d, expected %d\n",
1404 seq, rxseq); 1373 seq, rxseq);
1405 bus->rx_badseq++; 1374 bus->sdcnt.rx_badseq++;
1406 rxseq = seq; 1375 rxseq = seq;
1407 } 1376 }
1408 rxseq++; 1377 rxseq++;
@@ -1441,8 +1410,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1441 down(&bus->sdsem); 1410 down(&bus->sdsem);
1442 } 1411 }
1443 1412
1444 bus->rxglomframes++; 1413 bus->sdcnt.rxglomframes++;
1445 bus->rxglompkts += bus->glom.qlen; 1414 bus->sdcnt.rxglompkts += bus->glom.qlen;
1446 } 1415 }
1447 return num; 1416 return num;
1448} 1417}
@@ -1526,7 +1495,7 @@ brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff)
1526 brcmf_dbg(ERROR, "%d-byte ctl frame (%d-byte ctl data) exceeds %d-byte limit\n", 1495 brcmf_dbg(ERROR, "%d-byte ctl frame (%d-byte ctl data) exceeds %d-byte limit\n",
1527 len, len - doff, bus->sdiodev->bus_if->maxctl); 1496 len, len - doff, bus->sdiodev->bus_if->maxctl);
1528 bus->sdiodev->bus_if->dstats.rx_errors++; 1497 bus->sdiodev->bus_if->dstats.rx_errors++;
1529 bus->rx_toolong++; 1498 bus->sdcnt.rx_toolong++;
1530 brcmf_sdbrcm_rxfail(bus, false, false); 1499 brcmf_sdbrcm_rxfail(bus, false, false);
1531 goto done; 1500 goto done;
1532 } 1501 }
@@ -1536,13 +1505,13 @@ brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff)
1536 bus->sdiodev->sbwad, 1505 bus->sdiodev->sbwad,
1537 SDIO_FUNC_2, 1506 SDIO_FUNC_2,
1538 F2SYNC, (bus->rxctl + BRCMF_FIRSTREAD), rdlen); 1507 F2SYNC, (bus->rxctl + BRCMF_FIRSTREAD), rdlen);
1539 bus->f2rxdata++; 1508 bus->sdcnt.f2rxdata++;
1540 1509
1541 /* Control frame failures need retransmission */ 1510 /* Control frame failures need retransmission */
1542 if (sdret < 0) { 1511 if (sdret < 0) {
1543 brcmf_dbg(ERROR, "read %d control bytes failed: %d\n", 1512 brcmf_dbg(ERROR, "read %d control bytes failed: %d\n",
1544 rdlen, sdret); 1513 rdlen, sdret);
1545 bus->rxc_errors++; 1514 bus->sdcnt.rxc_errors++;
1546 brcmf_sdbrcm_rxfail(bus, true, true); 1515 brcmf_sdbrcm_rxfail(bus, true, true);
1547 goto done; 1516 goto done;
1548 } 1517 }
@@ -1589,7 +1558,7 @@ brcmf_alloc_pkt_and_read(struct brcmf_sdio *bus, u16 rdlen,
1589 /* Read the entire frame */ 1558 /* Read the entire frame */
1590 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, 1559 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad,
1591 SDIO_FUNC_2, F2SYNC, *pkt); 1560 SDIO_FUNC_2, F2SYNC, *pkt);
1592 bus->f2rxdata++; 1561 bus->sdcnt.f2rxdata++;
1593 1562
1594 if (sdret < 0) { 1563 if (sdret < 0) {
1595 brcmf_dbg(ERROR, "(nextlen): read %d bytes failed: %d\n", 1564 brcmf_dbg(ERROR, "(nextlen): read %d bytes failed: %d\n",
@@ -1630,7 +1599,7 @@ brcmf_check_rxbuf(struct brcmf_sdio *bus, struct sk_buff *pkt, u8 *rxbuf,
1630 if ((u16)~(*len ^ check)) { 1599 if ((u16)~(*len ^ check)) {
1631 brcmf_dbg(ERROR, "(nextlen): HW hdr error: nextlen/len/check 0x%04x/0x%04x/0x%04x\n", 1600 brcmf_dbg(ERROR, "(nextlen): HW hdr error: nextlen/len/check 0x%04x/0x%04x/0x%04x\n",
1632 nextlen, *len, check); 1601 nextlen, *len, check);
1633 bus->rx_badhdr++; 1602 bus->sdcnt.rx_badhdr++;
1634 brcmf_sdbrcm_rxfail(bus, false, false); 1603 brcmf_sdbrcm_rxfail(bus, false, false);
1635 goto fail; 1604 goto fail;
1636 } 1605 }
@@ -1746,7 +1715,7 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1746 bus->nextlen = 0; 1715 bus->nextlen = 0;
1747 } 1716 }
1748 1717
1749 bus->rx_readahead_cnt++; 1718 bus->sdcnt.rx_readahead_cnt++;
1750 1719
1751 /* Handle Flow Control */ 1720 /* Handle Flow Control */
1752 fcbits = SDPCM_FCMASK_VALUE( 1721 fcbits = SDPCM_FCMASK_VALUE(
@@ -1754,12 +1723,12 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1754 1723
1755 if (bus->flowcontrol != fcbits) { 1724 if (bus->flowcontrol != fcbits) {
1756 if (~bus->flowcontrol & fcbits) 1725 if (~bus->flowcontrol & fcbits)
1757 bus->fc_xoff++; 1726 bus->sdcnt.fc_xoff++;
1758 1727
1759 if (bus->flowcontrol & ~fcbits) 1728 if (bus->flowcontrol & ~fcbits)
1760 bus->fc_xon++; 1729 bus->sdcnt.fc_xon++;
1761 1730
1762 bus->fc_rcvd++; 1731 bus->sdcnt.fc_rcvd++;
1763 bus->flowcontrol = fcbits; 1732 bus->flowcontrol = fcbits;
1764 } 1733 }
1765 1734
@@ -1767,7 +1736,7 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1767 if (rxseq != seq) { 1736 if (rxseq != seq) {
1768 brcmf_dbg(INFO, "(nextlen): rx_seq %d, expected %d\n", 1737 brcmf_dbg(INFO, "(nextlen): rx_seq %d, expected %d\n",
1769 seq, rxseq); 1738 seq, rxseq);
1770 bus->rx_badseq++; 1739 bus->sdcnt.rx_badseq++;
1771 rxseq = seq; 1740 rxseq = seq;
1772 } 1741 }
1773 1742
@@ -1814,11 +1783,11 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1814 sdret = brcmf_sdcard_recv_buf(bus->sdiodev, bus->sdiodev->sbwad, 1783 sdret = brcmf_sdcard_recv_buf(bus->sdiodev, bus->sdiodev->sbwad,
1815 SDIO_FUNC_2, F2SYNC, bus->rxhdr, 1784 SDIO_FUNC_2, F2SYNC, bus->rxhdr,
1816 BRCMF_FIRSTREAD); 1785 BRCMF_FIRSTREAD);
1817 bus->f2rxhdrs++; 1786 bus->sdcnt.f2rxhdrs++;
1818 1787
1819 if (sdret < 0) { 1788 if (sdret < 0) {
1820 brcmf_dbg(ERROR, "RXHEADER FAILED: %d\n", sdret); 1789 brcmf_dbg(ERROR, "RXHEADER FAILED: %d\n", sdret);
1821 bus->rx_hdrfail++; 1790 bus->sdcnt.rx_hdrfail++;
1822 brcmf_sdbrcm_rxfail(bus, true, true); 1791 brcmf_sdbrcm_rxfail(bus, true, true);
1823 continue; 1792 continue;
1824 } 1793 }
@@ -1840,7 +1809,7 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1840 if ((u16) ~(len ^ check)) { 1809 if ((u16) ~(len ^ check)) {
1841 brcmf_dbg(ERROR, "HW hdr err: len/check 0x%04x/0x%04x\n", 1810 brcmf_dbg(ERROR, "HW hdr err: len/check 0x%04x/0x%04x\n",
1842 len, check); 1811 len, check);
1843 bus->rx_badhdr++; 1812 bus->sdcnt.rx_badhdr++;
1844 brcmf_sdbrcm_rxfail(bus, false, false); 1813 brcmf_sdbrcm_rxfail(bus, false, false);
1845 continue; 1814 continue;
1846 } 1815 }
@@ -1861,7 +1830,7 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1861 if ((doff < SDPCM_HDRLEN) || (doff > len)) { 1830 if ((doff < SDPCM_HDRLEN) || (doff > len)) {
1862 brcmf_dbg(ERROR, "Bad data offset %d: HW len %d, min %d seq %d\n", 1831 brcmf_dbg(ERROR, "Bad data offset %d: HW len %d, min %d seq %d\n",
1863 doff, len, SDPCM_HDRLEN, seq); 1832 doff, len, SDPCM_HDRLEN, seq);
1864 bus->rx_badhdr++; 1833 bus->sdcnt.rx_badhdr++;
1865 brcmf_sdbrcm_rxfail(bus, false, false); 1834 brcmf_sdbrcm_rxfail(bus, false, false);
1866 continue; 1835 continue;
1867 } 1836 }
@@ -1880,19 +1849,19 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1880 1849
1881 if (bus->flowcontrol != fcbits) { 1850 if (bus->flowcontrol != fcbits) {
1882 if (~bus->flowcontrol & fcbits) 1851 if (~bus->flowcontrol & fcbits)
1883 bus->fc_xoff++; 1852 bus->sdcnt.fc_xoff++;
1884 1853
1885 if (bus->flowcontrol & ~fcbits) 1854 if (bus->flowcontrol & ~fcbits)
1886 bus->fc_xon++; 1855 bus->sdcnt.fc_xon++;
1887 1856
1888 bus->fc_rcvd++; 1857 bus->sdcnt.fc_rcvd++;
1889 bus->flowcontrol = fcbits; 1858 bus->flowcontrol = fcbits;
1890 } 1859 }
1891 1860
1892 /* Check and update sequence number */ 1861 /* Check and update sequence number */
1893 if (rxseq != seq) { 1862 if (rxseq != seq) {
1894 brcmf_dbg(INFO, "rx_seq %d, expected %d\n", seq, rxseq); 1863 brcmf_dbg(INFO, "rx_seq %d, expected %d\n", seq, rxseq);
1895 bus->rx_badseq++; 1864 bus->sdcnt.rx_badseq++;
1896 rxseq = seq; 1865 rxseq = seq;
1897 } 1866 }
1898 1867
@@ -1937,7 +1906,7 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1937 brcmf_dbg(ERROR, "too long: len %d rdlen %d\n", 1906 brcmf_dbg(ERROR, "too long: len %d rdlen %d\n",
1938 len, rdlen); 1907 len, rdlen);
1939 bus->sdiodev->bus_if->dstats.rx_errors++; 1908 bus->sdiodev->bus_if->dstats.rx_errors++;
1940 bus->rx_toolong++; 1909 bus->sdcnt.rx_toolong++;
1941 brcmf_sdbrcm_rxfail(bus, false, false); 1910 brcmf_sdbrcm_rxfail(bus, false, false);
1942 continue; 1911 continue;
1943 } 1912 }
@@ -1960,7 +1929,7 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
1960 /* Read the remaining frame data */ 1929 /* Read the remaining frame data */
1961 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad, 1930 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad,
1962 SDIO_FUNC_2, F2SYNC, pkt); 1931 SDIO_FUNC_2, F2SYNC, pkt);
1963 bus->f2rxdata++; 1932 bus->sdcnt.f2rxdata++;
1964 1933
1965 if (sdret < 0) { 1934 if (sdret < 0) {
1966 brcmf_dbg(ERROR, "read %d %s bytes failed: %d\n", rdlen, 1935 brcmf_dbg(ERROR, "read %d %s bytes failed: %d\n", rdlen,
@@ -2147,18 +2116,18 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt,
2147 2116
2148 ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad, 2117 ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad,
2149 SDIO_FUNC_2, F2SYNC, pkt); 2118 SDIO_FUNC_2, F2SYNC, pkt);
2150 bus->f2txdata++; 2119 bus->sdcnt.f2txdata++;
2151 2120
2152 if (ret < 0) { 2121 if (ret < 0) {
2153 /* On failure, abort the command and terminate the frame */ 2122 /* On failure, abort the command and terminate the frame */
2154 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n", 2123 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
2155 ret); 2124 ret);
2156 bus->tx_sderrs++; 2125 bus->sdcnt.tx_sderrs++;
2157 2126
2158 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); 2127 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
2159 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, 2128 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
2160 SFC_WF_TERM, NULL); 2129 SFC_WF_TERM, NULL);
2161 bus->f1regdata++; 2130 bus->sdcnt.f1regdata++;
2162 2131
2163 for (i = 0; i < 3; i++) { 2132 for (i = 0; i < 3; i++) {
2164 u8 hi, lo; 2133 u8 hi, lo;
@@ -2166,7 +2135,7 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt,
2166 SBSDIO_FUNC1_WFRAMEBCHI, NULL); 2135 SBSDIO_FUNC1_WFRAMEBCHI, NULL);
2167 lo = brcmf_sdio_regrb(bus->sdiodev, 2136 lo = brcmf_sdio_regrb(bus->sdiodev,
2168 SBSDIO_FUNC1_WFRAMEBCLO, NULL); 2137 SBSDIO_FUNC1_WFRAMEBCLO, NULL);
2169 bus->f1regdata += 2; 2138 bus->sdcnt.f1regdata += 2;
2170 if ((hi == 0) && (lo == 0)) 2139 if ((hi == 0) && (lo == 0))
2171 break; 2140 break;
2172 } 2141 }
@@ -2224,7 +2193,7 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes)
2224 ret = r_sdreg32(bus, &intstatus, 2193 ret = r_sdreg32(bus, &intstatus,
2225 offsetof(struct sdpcmd_regs, 2194 offsetof(struct sdpcmd_regs,
2226 intstatus)); 2195 intstatus));
2227 bus->f2txdata++; 2196 bus->sdcnt.f2txdata++;
2228 if (ret != 0) 2197 if (ret != 0)
2229 break; 2198 break;
2230 if (intstatus & bus->hostintmask) 2199 if (intstatus & bus->hostintmask)
@@ -2417,7 +2386,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2417 bus->ipend = false; 2386 bus->ipend = false;
2418 err = r_sdreg32(bus, &newstatus, 2387 err = r_sdreg32(bus, &newstatus,
2419 offsetof(struct sdpcmd_regs, intstatus)); 2388 offsetof(struct sdpcmd_regs, intstatus));
2420 bus->f1regdata++; 2389 bus->sdcnt.f1regdata++;
2421 if (err != 0) 2390 if (err != 0)
2422 newstatus = 0; 2391 newstatus = 0;
2423 newstatus &= bus->hostintmask; 2392 newstatus &= bus->hostintmask;
@@ -2426,7 +2395,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2426 err = w_sdreg32(bus, newstatus, 2395 err = w_sdreg32(bus, newstatus,
2427 offsetof(struct sdpcmd_regs, 2396 offsetof(struct sdpcmd_regs,
2428 intstatus)); 2397 intstatus));
2429 bus->f1regdata++; 2398 bus->sdcnt.f1regdata++;
2430 } 2399 }
2431 } 2400 }
2432 2401
@@ -2445,7 +2414,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2445 2414
2446 err = r_sdreg32(bus, &newstatus, 2415 err = r_sdreg32(bus, &newstatus,
2447 offsetof(struct sdpcmd_regs, intstatus)); 2416 offsetof(struct sdpcmd_regs, intstatus));
2448 bus->f1regdata += 2; 2417 bus->sdcnt.f1regdata += 2;
2449 bus->fcstate = 2418 bus->fcstate =
2450 !!(newstatus & (I_HMB_FC_STATE | I_HMB_FC_CHANGE)); 2419 !!(newstatus & (I_HMB_FC_STATE | I_HMB_FC_CHANGE));
2451 intstatus |= (newstatus & bus->hostintmask); 2420 intstatus |= (newstatus & bus->hostintmask);
@@ -2510,13 +2479,13 @@ clkwait:
2510 terminate the frame */ 2479 terminate the frame */
2511 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n", 2480 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
2512 ret); 2481 ret);
2513 bus->tx_sderrs++; 2482 bus->sdcnt.tx_sderrs++;
2514 2483
2515 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); 2484 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
2516 2485
2517 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, 2486 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
2518 SFC_WF_TERM, &err); 2487 SFC_WF_TERM, &err);
2519 bus->f1regdata++; 2488 bus->sdcnt.f1regdata++;
2520 2489
2521 for (i = 0; i < 3; i++) { 2490 for (i = 0; i < 3; i++) {
2522 u8 hi, lo; 2491 u8 hi, lo;
@@ -2526,7 +2495,7 @@ clkwait:
2526 lo = brcmf_sdio_regrb(bus->sdiodev, 2495 lo = brcmf_sdio_regrb(bus->sdiodev,
2527 SBSDIO_FUNC1_WFRAMEBCLO, 2496 SBSDIO_FUNC1_WFRAMEBCLO,
2528 &err); 2497 &err);
2529 bus->f1regdata += 2; 2498 bus->sdcnt.f1regdata += 2;
2530 if ((hi == 0) && (lo == 0)) 2499 if ((hi == 0) && (lo == 0))
2531 break; 2500 break;
2532 } 2501 }
@@ -2657,7 +2626,7 @@ static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
2657 /* Check for existing queue, current flow-control, 2626 /* Check for existing queue, current flow-control,
2658 pending event, or pending clock */ 2627 pending event, or pending clock */
2659 brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq)); 2628 brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq));
2660 bus->fcqueued++; 2629 bus->sdcnt.fcqueued++;
2661 2630
2662 /* Priority based enq */ 2631 /* Priority based enq */
2663 spin_lock_bh(&bus->txqlock); 2632 spin_lock_bh(&bus->txqlock);
@@ -2845,13 +2814,13 @@ static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len)
2845 /* On failure, abort the command and terminate the frame */ 2814 /* On failure, abort the command and terminate the frame */
2846 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n", 2815 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
2847 ret); 2816 ret);
2848 bus->tx_sderrs++; 2817 bus->sdcnt.tx_sderrs++;
2849 2818
2850 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2); 2819 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
2851 2820
2852 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, 2821 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
2853 SFC_WF_TERM, NULL); 2822 SFC_WF_TERM, NULL);
2854 bus->f1regdata++; 2823 bus->sdcnt.f1regdata++;
2855 2824
2856 for (i = 0; i < 3; i++) { 2825 for (i = 0; i < 3; i++) {
2857 u8 hi, lo; 2826 u8 hi, lo;
@@ -2859,7 +2828,7 @@ static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len)
2859 SBSDIO_FUNC1_WFRAMEBCHI, NULL); 2828 SBSDIO_FUNC1_WFRAMEBCHI, NULL);
2860 lo = brcmf_sdio_regrb(bus->sdiodev, 2829 lo = brcmf_sdio_regrb(bus->sdiodev,
2861 SBSDIO_FUNC1_WFRAMEBCLO, NULL); 2830 SBSDIO_FUNC1_WFRAMEBCLO, NULL);
2862 bus->f1regdata += 2; 2831 bus->sdcnt.f1regdata += 2;
2863 if (hi == 0 && lo == 0) 2832 if (hi == 0 && lo == 0)
2864 break; 2833 break;
2865 } 2834 }
@@ -2976,13 +2945,26 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2976 up(&bus->sdsem); 2945 up(&bus->sdsem);
2977 2946
2978 if (ret) 2947 if (ret)
2979 bus->tx_ctlerrs++; 2948 bus->sdcnt.tx_ctlerrs++;
2980 else 2949 else
2981 bus->tx_ctlpkts++; 2950 bus->sdcnt.tx_ctlpkts++;
2982 2951
2983 return ret ? -EIO : 0; 2952 return ret ? -EIO : 0;
2984} 2953}
2985 2954
2955#ifdef DEBUG
2956static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
2957{
2958 struct brcmf_pub *drvr = bus->sdiodev->bus_if->drvr;
2959
2960 brcmf_debugfs_create_sdio_count(drvr, &bus->sdcnt);
2961}
2962#else
2963static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
2964{
2965}
2966#endif /* DEBUG */
2967
2986static int 2968static int
2987brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) 2969brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen)
2988{ 2970{
@@ -3017,9 +2999,9 @@ brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen)
3017 } 2999 }
3018 3000
3019 if (rxlen) 3001 if (rxlen)
3020 bus->rx_ctlpkts++; 3002 bus->sdcnt.rx_ctlpkts++;
3021 else 3003 else
3022 bus->rx_ctlerrs++; 3004 bus->sdcnt.rx_ctlerrs++;
3023 3005
3024 return rxlen ? (int)rxlen : -ETIMEDOUT; 3006 return rxlen ? (int)rxlen : -ETIMEDOUT;
3025} 3007}
@@ -3419,7 +3401,7 @@ static int brcmf_sdbrcm_bus_init(struct device *dev)
3419 return 0; 3401 return 0;
3420 3402
3421 /* Start the watchdog timer */ 3403 /* Start the watchdog timer */
3422 bus->tickcnt = 0; 3404 bus->sdcnt.tickcnt = 0;
3423 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS); 3405 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS);
3424 3406
3425 down(&bus->sdsem); 3407 down(&bus->sdsem);
@@ -3512,7 +3494,7 @@ void brcmf_sdbrcm_isr(void *arg)
3512 return; 3494 return;
3513 } 3495 }
3514 /* Count the interrupt call */ 3496 /* Count the interrupt call */
3515 bus->intrcount++; 3497 bus->sdcnt.intrcount++;
3516 bus->ipend = true; 3498 bus->ipend = true;
3517 3499
3518 /* Shouldn't get this interrupt if we're sleeping? */ 3500 /* Shouldn't get this interrupt if we're sleeping? */
@@ -3554,7 +3536,8 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
3554 bus->polltick = 0; 3536 bus->polltick = 0;
3555 3537
3556 /* Check device if no interrupts */ 3538 /* Check device if no interrupts */
3557 if (!bus->intr || (bus->intrcount == bus->lastintrs)) { 3539 if (!bus->intr ||
3540 (bus->sdcnt.intrcount == bus->sdcnt.lastintrs)) {
3558 3541
3559 if (!bus->dpc_sched) { 3542 if (!bus->dpc_sched) {
3560 u8 devpend; 3543 u8 devpend;
@@ -3569,7 +3552,7 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
3569 /* If there is something, make like the ISR and 3552 /* If there is something, make like the ISR and
3570 schedule the DPC */ 3553 schedule the DPC */
3571 if (intstatus) { 3554 if (intstatus) {
3572 bus->pollcnt++; 3555 bus->sdcnt.pollcnt++;
3573 bus->ipend = true; 3556 bus->ipend = true;
3574 3557
3575 bus->dpc_sched = true; 3558 bus->dpc_sched = true;
@@ -3581,7 +3564,7 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
3581 } 3564 }
3582 3565
3583 /* Update interrupt tracking */ 3566 /* Update interrupt tracking */
3584 bus->lastintrs = bus->intrcount; 3567 bus->sdcnt.lastintrs = bus->sdcnt.intrcount;
3585 } 3568 }
3586#ifdef DEBUG 3569#ifdef DEBUG
3587 /* Poll for console output periodically */ 3570 /* Poll for console output periodically */
@@ -3793,7 +3776,7 @@ brcmf_sdbrcm_watchdog_thread(void *data)
3793 if (!wait_for_completion_interruptible(&bus->watchdog_wait)) { 3776 if (!wait_for_completion_interruptible(&bus->watchdog_wait)) {
3794 brcmf_sdbrcm_bus_watchdog(bus); 3777 brcmf_sdbrcm_bus_watchdog(bus);
3795 /* Count the tick for reference */ 3778 /* Count the tick for reference */
3796 bus->tickcnt++; 3779 bus->sdcnt.tickcnt++;
3797 } else 3780 } else
3798 break; 3781 break;
3799 } 3782 }
@@ -3834,7 +3817,6 @@ static void brcmf_sdbrcm_release_dongle(struct brcmf_sdio *bus)
3834static void brcmf_sdbrcm_release(struct brcmf_sdio *bus) 3817static void brcmf_sdbrcm_release(struct brcmf_sdio *bus)
3835{ 3818{
3836 brcmf_dbg(TRACE, "Enter\n"); 3819 brcmf_dbg(TRACE, "Enter\n");
3837
3838 if (bus) { 3820 if (bus) {
3839 /* De-register interrupt handler */ 3821 /* De-register interrupt handler */
3840 brcmf_sdio_intr_unregister(bus->sdiodev); 3822 brcmf_sdio_intr_unregister(bus->sdiodev);
@@ -3938,6 +3920,7 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
3938 goto fail; 3920 goto fail;
3939 } 3921 }
3940 3922
3923 brcmf_sdio_debugfs_create(bus);
3941 brcmf_dbg(INFO, "completed!!\n"); 3924 brcmf_dbg(INFO, "completed!!\n");
3942 3925
3943 /* if firmware path present try to download and bring up bus */ 3926 /* if firmware path present try to download and bring up bus */