wl12xx: AP mode config in ieee80211_ops.config
authorArik Nemtsov <arik@wizery.com>
Sat, 16 Oct 2010 17:17:02 +0000 (19:17 +0200)
committerLuciano Coelho <coelho@ti.com>
Mon, 24 Jan 2011 20:11:49 +0000 (22:11 +0200)
Separate configuration according to mode. AP has different rate
set configuration and no handling of idle-state.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Reviewed-by: Luciano Coelho <coelho@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/main.c

index 0f16307137a20a4609f97dda8699cbd3028d4cd6..01f3f0264fb455772ba7612f154c73327742f972 100644 (file)
@@ -1362,7 +1362,7 @@ static void wl1271_set_band_rate(struct wl1271 *wl)
                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;
 
@@ -1403,14 +1403,17 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
        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
@@ -1428,6 +1431,8 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
                goto out;
        }
 
+       is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
+
        ret = wl1271_ps_elp_wakeup(wl, false);
        if (ret < 0)
                goto out;
@@ -1439,31 +1444,34 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
                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);
        }