brcmfmac: always print error when PSM's watchdog fires
authorRafał Miłecki <rafal@milecki.pl>
Fri, 24 Feb 2017 16:32:46 +0000 (17:32 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 20 Mar 2017 17:13:37 +0000 (19:13 +0200)
So far we were attaching BRCMF_E_PSM_WATCHDOG event listener in
brcmf_debug_attach which gets compiled only with CONFIG_BRCMDBG. This
event means something went wrong and firmware / hardware usually can't
be expected to work (reliably).

Such a problem is significant for user experience so I believe we should
print an error unconditionally (even with debugging disabled). What can
be indeed optional is dumping bus memory as this is clearly part of
debugging process.

In the future we may also try to extend this listener by trying to
recover from the error or at least signal it to the cfg80211.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h

index 60da86a8d95b0190b22c76e99cfc88543939e1a1..2f2f3a5ad86a6f82199a737e5c21c654a0e4da8d 100644 (file)
@@ -738,6 +738,24 @@ void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked)
        brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
 }
 
+static int brcmf_psm_watchdog_notify(struct brcmf_if *ifp,
+                                    const struct brcmf_event_msg *evtmsg,
+                                    void *data)
+{
+       int err;
+
+       brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
+
+       brcmf_err("PSM's watchdog has fired!\n");
+
+       err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
+                                        evtmsg->datalen);
+       if (err)
+               brcmf_err("Failed to get memory dump, %d\n", err);
+
+       return err;
+}
+
 #ifdef CONFIG_INET
 #define ARPOL_MAX_ENTRIES      8
 static int brcmf_inetaddr_changed(struct notifier_block *nb,
@@ -917,6 +935,10 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
                goto fail;
        }
 
+       /* Attach to events important for core code */
+       brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
+                           brcmf_psm_watchdog_notify);
+
        /* attach firmware event handler */
        brcmf_fweh_attach(drvr);
 
index f4644cf371c7e058401fcba2797fb9bd11f63993..1447a8352383707f35ab04a67c32c7c3bb0d97bc 100644 (file)
@@ -27,8 +27,8 @@
 
 static struct dentry *root_folder;
 
-static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
-                                     size_t len)
+int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
+                              size_t len)
 {
        void *dump;
        size_t ramsize;
@@ -54,24 +54,6 @@ static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
        return 0;
 }
 
-static int brcmf_debug_psm_watchdog_notify(struct brcmf_if *ifp,
-                                          const struct brcmf_event_msg *evtmsg,
-                                          void *data)
-{
-       int err;
-
-       brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
-
-       brcmf_err("PSM's watchdog has fired!\n");
-
-       err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
-                                        evtmsg->datalen);
-       if (err)
-               brcmf_err("Failed to get memory dump, %d\n", err);
-
-       return err;
-}
-
 void brcmf_debugfs_init(void)
 {
        root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
@@ -99,9 +81,7 @@ int brcmf_debug_attach(struct brcmf_pub *drvr)
        if (IS_ERR(drvr->dbgfs_dir))
                return PTR_ERR(drvr->dbgfs_dir);
 
-
-       return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
-                                  brcmf_debug_psm_watchdog_notify);
+       return 0;
 }
 
 void brcmf_debug_detach(struct brcmf_pub *drvr)
index 066126123e9663e89277a28d0dd2fa48ad9f0a72..389166abb520abb1b5ba6eb704045b9f6a7dc496 100644 (file)
@@ -99,6 +99,7 @@ do {                                                                  \
 
 extern int brcmf_msg_level;
 
+struct brcmf_bus;
 struct brcmf_pub;
 #ifdef DEBUG
 void brcmf_debugfs_init(void);
@@ -108,6 +109,8 @@ void brcmf_debug_detach(struct brcmf_pub *drvr);
 struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
 int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
                            int (*read_fn)(struct seq_file *seq, void *data));
+int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
+                              size_t len);
 #else
 static inline void brcmf_debugfs_init(void)
 {
@@ -128,6 +131,12 @@ int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
 {
        return 0;
 }
+static inline
+int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
+                              size_t len)
+{
+       return 0;
+}
 #endif
 
 #endif /* BRCMFMAC_DEBUG_H */