1 From e374cb32e98fb49e17594424b0445d8438825413 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
3 Date: Fri, 24 Feb 2017 17:18:47 +0100
4 Subject: [PATCH] brcmfmac: always print error when PSM's watchdog fires
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 So far we were attaching BRCMF_E_PSM_WATCHDOG event listener in
10 brcmf_debug_attach which gets compiled only with CONFIG_BRCMDBG. This
11 event means something went wrong and firmware / hardware usually can't
12 be expected to work (reliably).
14 Such a problem is significant for user experience so I believe we should
15 print an error unconditionally (even with debugging disabled). What can
16 be indeed optional is dumping bus memory as this is clearly part of
19 In the future we may also try to extend this listener by trying to
20 recover from the error or at least signal it to the cfg80211.
22 Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
24 .../wireless/broadcom/brcm80211/brcmfmac/core.c | 22 ++++++++++++++++++
25 .../wireless/broadcom/brcm80211/brcmfmac/debug.c | 26 +++-------------------
26 .../wireless/broadcom/brcm80211/brcmfmac/debug.h | 9 ++++++++
27 3 files changed, 34 insertions(+), 23 deletions(-)
29 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
30 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
31 @@ -748,6 +748,24 @@ void brcmf_remove_interface(struct brcmf
32 brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
35 +static int brcmf_psm_watchdog_notify(struct brcmf_if *ifp,
36 + const struct brcmf_event_msg *evtmsg,
41 + brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
43 + brcmf_err("PSM's watchdog has fired!\n");
45 + err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
48 + brcmf_err("Failed to get memory dump, %d\n", err);
54 #define ARPOL_MAX_ENTRIES 8
55 static int brcmf_inetaddr_changed(struct notifier_block *nb,
56 @@ -927,6 +945,10 @@ int brcmf_attach(struct device *dev, str
60 + /* Attach to events important for core code */
61 + brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
62 + brcmf_psm_watchdog_notify);
64 /* attach firmware event handler */
65 brcmf_fweh_attach(drvr);
67 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
68 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
71 static struct dentry *root_folder;
73 -static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
75 +int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
80 @@ -54,24 +54,6 @@ static int brcmf_debug_create_memdump(st
84 -static int brcmf_debug_psm_watchdog_notify(struct brcmf_if *ifp,
85 - const struct brcmf_event_msg *evtmsg,
90 - brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
92 - brcmf_err("PSM's watchdog has fired!\n");
94 - err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
97 - brcmf_err("Failed to get memory dump, %d\n", err);
102 void brcmf_debugfs_init(void)
104 root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
105 @@ -99,9 +81,7 @@ int brcmf_debug_attach(struct brcmf_pub
106 if (IS_ERR(drvr->dbgfs_dir))
107 return PTR_ERR(drvr->dbgfs_dir);
110 - return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
111 - brcmf_debug_psm_watchdog_notify);
115 void brcmf_debug_detach(struct brcmf_pub *drvr)
116 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
117 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
118 @@ -99,6 +99,7 @@ do { \
120 extern int brcmf_msg_level;
125 void brcmf_debugfs_init(void);
126 @@ -108,6 +109,8 @@ void brcmf_debug_detach(struct brcmf_pub
127 struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
128 int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
129 int (*read_fn)(struct seq_file *seq, void *data));
130 +int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
133 static inline void brcmf_debugfs_init(void)
135 @@ -128,6 +131,12 @@ int brcmf_debugfs_add_entry(struct brcmf
140 +int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
147 #endif /* BRCMFMAC_DEBUG_H */