diff options
author | Arend van Spriel <arend@broadcom.com> | 2012-06-09 16:51:44 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-06-13 14:35:50 -0400 |
commit | 80969836a7ddde326d3f289d234e9e2d9ed27272 (patch) | |
tree | 223a0f8dc1372972aa3c750fb4bc061cd968dbdc /drivers/net | |
parent | d319a7cfd9d80a2e2359e978ba88991531312ee6 (diff) |
brcmfmac: expose sdio internal counters in debugfs
The structure brcmf_sdio contains a number of counters that are useful
for debugging. These were not available in user-space. This patch
exposes them in debugfs under the filename 'counters'.
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@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')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c | 63 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h | 36 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 169 |
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 0a7a3d50df6..7f89540b56d 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 | ||
27 | static struct dentry *root_folder; | 29 | static 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 | |||
67 | static | ||
68 | ssize_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 | |||
112 | static 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 | |||
118 | void 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 0efb226030a..b784920532d 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 | ||
77 | extern int brcmf_msg_level; | 77 | extern int brcmf_msg_level; |
78 | 78 | ||
79 | /* | ||
80 | * hold counter variables used in brcmfmac sdio driver. | ||
81 | */ | ||
82 | struct 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 | |||
79 | struct brcmf_pub; | 113 | struct brcmf_pub; |
80 | #ifdef DEBUG | 114 | #ifdef DEBUG |
81 | void brcmf_debugfs_init(void); | 115 | void brcmf_debugfs_init(void); |
@@ -83,6 +117,8 @@ void brcmf_debugfs_exit(void); | |||
83 | int brcmf_debugfs_attach(struct brcmf_pub *drvr); | 117 | int brcmf_debugfs_attach(struct brcmf_pub *drvr); |
84 | void brcmf_debugfs_detach(struct brcmf_pub *drvr); | 118 | void brcmf_debugfs_detach(struct brcmf_pub *drvr); |
85 | struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr); | 119 | struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr); |
120 | void brcmf_debugfs_create_sdio_count(struct brcmf_pub *drvr, | ||
121 | struct brcmf_sdio_count *sdcnt); | ||
86 | #else | 122 | #else |
87 | static inline void brcmf_debugfs_init(void) | 123 | static 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 1dbf2be478c..a07fb01bc36 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 | ||
2956 | static 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 | ||
2963 | static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) | ||
2964 | { | ||
2965 | } | ||
2966 | #endif /* DEBUG */ | ||
2967 | |||
2986 | static int | 2968 | static int |
2987 | brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen) | 2969 | brcmf_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) | |||
3834 | static void brcmf_sdbrcm_release(struct brcmf_sdio *bus) | 3817 | static 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 */ |