wl12xx: AP-mode - set STA HT capabilities when adding a STA
authorArik Nemtsov <arik@wizery.com>
Sun, 14 Aug 2011 10:17:27 +0000 (13:17 +0300)
committerLuciano Coelho <coelho@ti.com>
Mon, 22 Aug 2011 09:35:29 +0000 (12:35 +0300)
In addition, set global HT operation mode via ACX_HT_BSS_OPERATION when
a change is detected by usermode

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

index ecbceb6f1ea9dd5c62e7207bf85d4b31857c0531..e047594794aa16408f85c73566ff25d4d65e0288 100644 (file)
@@ -1309,13 +1309,15 @@ out:
 
 int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
                                    struct ieee80211_sta_ht_cap *ht_cap,
-                                   bool allow_ht_operation)
+                                   bool allow_ht_operation, u8 hlid)
 {
        struct wl1271_acx_ht_capabilities *acx;
        int ret = 0;
        u32 ht_capabilites = 0;
 
-       wl1271_debug(DEBUG_ACX, "acx ht capabilities setting");
+       wl1271_debug(DEBUG_ACX, "acx ht capabilities setting "
+                    "sta supp: %d sta cap: %d", ht_cap->ht_supported,
+                    ht_cap->cap);
 
        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
        if (!acx) {
@@ -1323,7 +1325,7 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
                goto out;
        }
 
-       if (allow_ht_operation) {
+       if (allow_ht_operation && ht_cap->ht_supported) {
                /* no need to translate capabilities - use the spec values */
                ht_capabilites = ht_cap->cap;
 
@@ -1338,7 +1340,7 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
                acx->ampdu_min_spacing = ht_cap->ampdu_density;
        }
 
-       acx->hlid = wl->sta_hlid;
+       acx->hlid = hlid;
        acx->ht_capabilites = cpu_to_le32(ht_capabilites);
 
        ret = wl1271_cmd_configure(wl, ACX_PEER_HT_CAP, acx, sizeof(*acx));
index 82c9271b4e8466f53228ca5e57cf91ffb3f00ec3..758c596f62f6042477397b18468151983e3b2a83 100644 (file)
@@ -1268,7 +1268,7 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable,
 int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl);
 int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
                                    struct ieee80211_sta_ht_cap *ht_cap,
-                                   bool allow_ht_operation);
+                                   bool allow_ht_operation, u8 hlid);
 int wl1271_acx_set_ht_information(struct wl1271 *wl,
                                   u16 ht_operation_mode);
 int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl);
index e280d9d7911b2871fd2f2dc613410de6e92396f6..0a0b4b634bd42d729de38c7d16948a0bf6eb1775 100644 (file)
@@ -3124,6 +3124,18 @@ static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
        ret = wl1271_bss_erp_info_changed(wl, bss_conf, changed);
        if (ret < 0)
                goto out;
+
+       /* Handle HT information change */
+       if ((changed & BSS_CHANGED_HT) &&
+           (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
+               ret = wl1271_acx_set_ht_information(wl,
+                                       bss_conf->ht_operation_mode);
+               if (ret < 0) {
+                       wl1271_warning("Set ht information failed %d", ret);
+                       goto out;
+               }
+       }
+
 out:
        return;
 }
@@ -3439,12 +3451,14 @@ sta_not_found:
                }
        }
 
-       /* Handle new association with HT. Do this only after join. */
+       /* Handle new association with HT. Do this after join. */
        if (sta_exists) {
                if ((changed & BSS_CHANGED_HT) &&
                    (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
-                       ret = wl1271_acx_set_ht_capabilities(wl, &sta_ht_cap,
-                                                            true);
+                       ret = wl1271_acx_set_ht_capabilities(wl,
+                                                            &sta_ht_cap,
+                                                            true,
+                                                            wl->sta_hlid);
                        if (ret < 0) {
                                wl1271_warning("Set ht cap true failed %d",
                                               ret);
@@ -3453,8 +3467,10 @@ sta_not_found:
                }
                /* handle new association without HT and disassociation */
                else if (changed & BSS_CHANGED_ASSOC) {
-                       ret = wl1271_acx_set_ht_capabilities(wl, &sta_ht_cap,
-                                                            false);
+                       ret = wl1271_acx_set_ht_capabilities(wl,
+                                                            &sta_ht_cap,
+                                                            false,
+                                                            wl->sta_hlid);
                        if (ret < 0) {
                                wl1271_warning("Set ht cap false failed %d",
                                               ret);
@@ -3463,8 +3479,8 @@ sta_not_found:
                }
        }
 
-       /* Handle HT information change. Only after join. */
-       if (sta_exists && (changed & BSS_CHANGED_HT) &&
+       /* Handle HT information change. Done after join. */
+       if ((changed & BSS_CHANGED_HT) &&
            (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
                ret = wl1271_acx_set_ht_information(wl,
                                        bss_conf->ht_operation_mode);
@@ -3703,6 +3719,10 @@ static int wl1271_op_sta_add(struct ieee80211_hw *hw,
        if (ret < 0)
                goto out_sleep;
 
+       ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true, hlid);
+       if (ret < 0)
+               goto out_sleep;
+
 out_sleep:
        wl1271_ps_elp_sleep(wl);