wlcore: reconfigure sta rates on authorization
authorGuy Mishol <guym@ti.com>
Sun, 19 Jun 2016 14:08:58 +0000 (17:08 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 29 Jun 2016 16:03:16 +0000 (19:03 +0300)
Since stations can now be added before association
(NL80211_FEATURE_FULL_AP_CLIENT_STATE support),
no supported rates are set when the station is added
to the fw, resulting in fw recovery.

Fix it by first configuring the AP basic rates as
the station configured rates (when the station is
first added to the driver), and after the station
was authorized re-configure it, now with the actual
supported rates.

Signed-off-by: Guy Mishol <guym@ti.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ti/wlcore/cmd.c
drivers/net/wireless/ti/wlcore/main.c

index 33153565ad6261ed908c8bb4c9a6f2ece45207cb..5f360cecbb0bf6070777216d0f8b26df2bdb8bb7 100644 (file)
@@ -1566,6 +1566,13 @@ int wl12xx_cmd_add_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                cpu_to_le32(wl1271_tx_enabled_rates_get(wl, sta_rates,
                                                        wlvif->band));
 
+       if (!cmd->supported_rates) {
+               wl1271_debug(DEBUG_CMD,
+                            "peer has no supported rates yet, configuring basic rates: 0x%x",
+                            wlvif->basic_rate_set);
+               cmd->supported_rates = cpu_to_le32(wlvif->basic_rate_set);
+       }
+
        wl1271_debug(DEBUG_CMD, "new peer rates=0x%x queues=0x%x",
                     cmd->supported_rates, sta->uapsd_queues);
 
index 10fd24c28ece332f9dd5da7fc5ae9f32f2b727db..a53033deb3d01f54ba368bd8287203565db93ea0 100644 (file)
@@ -5091,6 +5091,11 @@ static int wl12xx_update_sta_state(struct wl1271 *wl,
                if (ret < 0)
                        return ret;
 
+               /* reconfigure rates */
+               ret = wl12xx_cmd_add_peer(wl, wlvif, sta, wl_sta->hlid);
+               if (ret < 0)
+                       return ret;
+
                ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true,
                                                     wl_sta->hlid);
                if (ret)