brcmfmac: avoid firmware commands when bus is down
authorArend van Spriel <arend.vanspriel@broadcom.com>
Thu, 11 Jul 2019 09:05:10 +0000 (11:05 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 24 Jul 2019 11:51:25 +0000 (14:51 +0300)
Upon rmmod a few attempts are made to inform firmware, but there is
no point as the bus is down and these will fail. Avoid them to keep
the logs clean.

Reported-by: Stefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

index b692689bce53af9ff57543e1fc09496d13e3eefb..a5447519e1ab3c8d0e55ec2e2c3b676fc0d5d2cd 100644 (file)
@@ -1286,17 +1286,21 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
 {
        struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
        struct brcmf_pub *drvr = cfg->pub;
+       bool bus_up = drvr->bus_if->state == BRCMF_BUS_UP;
        s32 err = 0;
 
        brcmf_dbg(TRACE, "Enter\n");
 
        if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) {
-               brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n");
-               err = brcmf_fil_cmd_data_set(vif->ifp,
-                                            BRCMF_C_DISASSOC, NULL, 0);
-               if (err) {
-                       bphy_err(drvr, "WLC_DISASSOC failed (%d)\n", err);
+               if (bus_up) {
+                       brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n");
+                       err = brcmf_fil_cmd_data_set(vif->ifp,
+                                                    BRCMF_C_DISASSOC, NULL, 0);
+                       if (err)
+                               bphy_err(drvr, "WLC_DISASSOC failed (%d)\n",
+                                        err);
                }
+
                if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) ||
                    (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT))
                        cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
@@ -1306,7 +1310,8 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
        clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
        brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
        if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
-               brcmf_set_pmk(vif->ifp, NULL, 0);
+               if (bus_up)
+                       brcmf_set_pmk(vif->ifp, NULL, 0);
                vif->profile.use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
        }
        brcmf_dbg(TRACE, "Exit\n");
@@ -5004,18 +5009,16 @@ static int brcmf_cfg80211_get_channel(struct wiphy *wiphy,
        struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
        struct net_device *ndev = wdev->netdev;
        struct brcmf_pub *drvr = cfg->pub;
-       struct brcmf_if *ifp;
        struct brcmu_chan ch;
        enum nl80211_band band = 0;
        enum nl80211_chan_width width = 0;
        u32 chanspec;
        int freq, err;
 
-       if (!ndev)
+       if (!ndev || drvr->bus_if->state != BRCMF_BUS_UP)
                return -ENODEV;
-       ifp = netdev_priv(ndev);
 
-       err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec);
+       err = brcmf_fil_iovar_int_get(netdev_priv(ndev), "chanspec", &chanspec);
        if (err) {
                bphy_err(drvr, "chanspec failed (%d)\n", err);
                return err;