if (ar->vif) {
                v |= ar->vif->bss_conf.beacon_int;
 
-               switch (ar->vif->type) {
-               case NL80211_IFTYPE_MESH_POINT:
-               case NL80211_IFTYPE_ADHOC:
-                       v |= BIT(25);
-                       break;
-               case NL80211_IFTYPE_AP:
-                       v |= BIT(24);
-                       pretbtt = (ar->vif->bss_conf.beacon_int - 6) << 16;
-                       break;
-               default:
+               if (ar->enable_beacon) {
+                       switch (ar->vif->type) {
+                       case NL80211_IFTYPE_MESH_POINT:
+                       case NL80211_IFTYPE_ADHOC:
+                               v |= BIT(25);
+                               break;
+                       case NL80211_IFTYPE_AP:
+                               v |= BIT(24);
+                               pretbtt = (ar->vif->bss_conf.beacon_int - 6) <<
+                                         16;
+                               break;
+                       default:
                        break;
+                       }
                }
 
                v |= ar->vif->bss_conf.dtim_period << 16;
        }
 
        ar9170_regwrite_begin(ar);
-
        ar9170_regwrite(AR9170_MAC_REG_PRETBTT, pretbtt);
        ar9170_regwrite(AR9170_MAC_REG_BCN_PERIOD, v);
        ar9170_regwrite_finish();
 
                        goto out;
        }
 
-       if (changed & (BSS_CHANGED_BEACON | BSS_CHANGED_BEACON_ENABLED)) {
+       if (changed & BSS_CHANGED_BEACON_ENABLED)
+               ar->enable_beacon = bss_conf->enable_beacon;
+
+       if (changed & BSS_CHANGED_BEACON) {
                err = ar9170_update_beacon(ar);
                if (err)
                        goto out;
+       }
 
+       if (changed & (BSS_CHANGED_BEACON_ENABLED | BSS_CHANGED_BEACON |
+                      BSS_CHANGED_BEACON_INT)) {
                err = ar9170_set_beacon_timers(ar);
                if (err)
                        goto out;
 #endif /* CONFIG_AR9170_LEDS */
        }
 
-       if (changed & BSS_CHANGED_BEACON_INT) {
-               err = ar9170_set_beacon_timers(ar);
-               if (err)
-                       goto out;
-       }
-
        if (changed & BSS_CHANGED_HT) {
                /* TODO */
                err = 0;