u32 changed)
 {
        struct ieee80211_local *local = sdata->local;
+       static const u8 zero[ETH_ALEN] = { 0 };
 
        if (!changed)
                return;
 
-       if (sdata->vif.type == NL80211_IFTYPE_STATION)
-               sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid;
-       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
+       if (sdata->vif.type == NL80211_IFTYPE_STATION) {
+               /*
+                * While not associated, claim a BSSID of all-zeroes
+                * so that drivers don't do any weird things with the
+                * BSSID at that time.
+                */
+               if (sdata->vif.bss_conf.assoc)
+                       sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid;
+               else
+                       sdata->vif.bss_conf.bssid = zero;
+       } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
                sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid;
        else if (sdata->vif.type == NL80211_IFTYPE_AP)
                sdata->vif.bss_conf.bssid = sdata->dev->dev_addr;
        else if (ieee80211_vif_is_mesh(&sdata->vif)) {
-               static const u8 zero[ETH_ALEN] = { 0 };
                sdata->vif.bss_conf.bssid = zero;
        } else {
                WARN_ON(1);
 
         * changed or not.
         */
        bss_info_changed |= BSS_CHANGED_BASIC_RATES;
+
+       /* And the BSSID changed - we're associated now */
+       bss_info_changed |= BSS_CHANGED_BSSID;
+
        ieee80211_bss_info_change_notify(sdata, bss_info_changed);
 
        /* will be same as sdata */
        }
 
        ieee80211_hw_config(local, config_changed);
+
+       /* And the BSSID changed -- not very interesting here */
+       changed |= BSS_CHANGED_BSSID;
        ieee80211_bss_info_change_notify(sdata, changed);
 
        rcu_read_lock();
                ifmgd->flags &= ~IEEE80211_STA_BSSID_SET;
        }
 
-       if (netif_running(sdata->dev))
-               ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
-
        return ieee80211_sta_commit(sdata);
 }