wl->basic_rate_set = wl->conf.tx.basic_rate_5;
 }
 
-static int wl1271_handle_idle(struct wl1271 *wl, bool idle)
+static int wl1271_sta_handle_idle(struct wl1271 *wl, bool idle)
 {
        int ret;
 
        struct wl1271 *wl = hw->priv;
        struct ieee80211_conf *conf = &hw->conf;
        int channel, ret = 0;
+       bool is_ap;
 
        channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
 
-       wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
+       wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s"
+                    " changed 0x%x",
                     channel,
                     conf->flags & IEEE80211_CONF_PS ? "on" : "off",
                     conf->power_level,
-                    conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
+                    conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
+                        changed);
 
        /*
         * mac80211 will go to idle nearly immediately after transmitting some
                goto out;
        }
 
+       is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
+
        ret = wl1271_ps_elp_wakeup(wl, false);
        if (ret < 0)
                goto out;
                wl->band = conf->channel->band;
                wl->channel = channel;
 
-               /*
-                * FIXME: the mac80211 should really provide a fixed rate
-                * to use here. for now, just use the smallest possible rate
-                * for the band as a fixed rate for association frames and
-                * other control messages.
-                */
-               if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
-                       wl1271_set_band_rate(wl);
-
-               wl->basic_rate = wl1271_tx_min_rate_get(wl);
-               ret = wl1271_acx_sta_rate_policies(wl);
-               if (ret < 0)
-                       wl1271_warning("rate policy for update channel "
-                                      "failed %d", ret);
+               if (!is_ap) {
+                       /*
+                        * FIXME: the mac80211 should really provide a fixed
+                        * rate to use here. for now, just use the smallest
+                        * possible rate for the band as a fixed rate for
+                        * association frames and other control messages.
+                        */
+                       if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
+                               wl1271_set_band_rate(wl);
 
-               if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
-                       ret = wl1271_join(wl, false);
+                       wl->basic_rate = wl1271_tx_min_rate_get(wl);
+                       ret = wl1271_acx_sta_rate_policies(wl);
                        if (ret < 0)
-                               wl1271_warning("cmd join to update channel "
+                               wl1271_warning("rate policy for channel "
                                               "failed %d", ret);
+
+                       if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
+                               ret = wl1271_join(wl, false);
+                               if (ret < 0)
+                                       wl1271_warning("cmd join on channel "
+                                                      "failed %d", ret);
+                       }
                }
        }
 
-       if (changed & IEEE80211_CONF_CHANGE_IDLE) {
-               ret = wl1271_handle_idle(wl, conf->flags & IEEE80211_CONF_IDLE);
+       if (changed & IEEE80211_CONF_CHANGE_IDLE && !is_ap) {
+               ret = wl1271_sta_handle_idle(wl,
+                                       conf->flags & IEEE80211_CONF_IDLE);
                if (ret < 0)
                        wl1271_warning("idle mode change failed %d", ret);
        }