{
        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,
        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");
        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;