aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwl8k.c
diff options
context:
space:
mode:
authorLennert Buytenhek <buytenh@wantstofly.org>2010-01-04 15:56:07 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-01-05 17:13:29 -0500
commitc3cbbe8a5cd2886e13e9c93e059d9761f3715665 (patch)
treeb70577c102ce2ec6ea346cda9f59174e13a313ae /drivers/net/wireless/mwl8k.c
parentc6e9601071173fed2a77f9c435c41f3b33d1018f (diff)
mwl8k: fix changed flags handling in mwl8k_bss_info_changed()
Previously, mwl8k_bss_info_changed() would refuse to do anything if the 'changed' argument indicated that the association status hadn't changed. Fix this up so that it will allow changing things like the preamble type, the slot time and the CTS-to-self protection method without having to reassociate. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwl8k.c')
-rw-r--r--drivers/net/wireless/mwl8k.c52
1 files changed, 33 insertions, 19 deletions
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index d8eff68978f1..fa7b4fe074f5 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -2958,57 +2958,71 @@ static void mwl8k_bss_info_changed(struct ieee80211_hw *hw,
2958 u32 changed) 2958 u32 changed)
2959{ 2959{
2960 struct mwl8k_priv *priv = hw->priv; 2960 struct mwl8k_priv *priv = hw->priv;
2961 u32 ap_legacy_rates;
2961 int rc; 2962 int rc;
2962 2963
2963 if ((changed & BSS_CHANGED_ASSOC) == 0) 2964 if (mwl8k_fw_lock(hw))
2964 return; 2965 return;
2965 2966
2966 priv->capture_beacon = false; 2967 /*
2967 2968 * No need to capture a beacon if we're no longer associated.
2968 rc = mwl8k_fw_lock(hw); 2969 */
2969 if (rc) 2970 if ((changed & BSS_CHANGED_ASSOC) && !vif->bss_conf.assoc)
2970 return; 2971 priv->capture_beacon = false;
2971 2972
2973 /*
2974 * Get the AP's legacy rates.
2975 */
2976 ap_legacy_rates = 0;
2972 if (vif->bss_conf.assoc) { 2977 if (vif->bss_conf.assoc) {
2973 struct ieee80211_sta *ap; 2978 struct ieee80211_sta *ap;
2974 u32 legacy_rate_mask;
2975 2979
2976 rcu_read_lock(); 2980 rcu_read_lock();
2977 ap = ieee80211_find_sta(vif, vif->bss_conf.bssid);
2978 if (ap != NULL)
2979 legacy_rate_mask = ap->supp_rates[IEEE80211_BAND_2GHZ];
2980 rcu_read_unlock();
2981 2981
2982 if (ap == NULL) 2982 ap = ieee80211_find_sta(vif, vif->bss_conf.bssid);
2983 if (ap == NULL) {
2984 rcu_read_unlock();
2983 goto out; 2985 goto out;
2986 }
2984 2987
2985 /* Install rates */ 2988 ap_legacy_rates = ap->supp_rates[IEEE80211_BAND_2GHZ];
2986 rc = mwl8k_cmd_set_rate(hw, vif, legacy_rate_mask); 2989
2990 rcu_read_unlock();
2991 }
2992
2993 if ((changed & BSS_CHANGED_ASSOC) && vif->bss_conf.assoc) {
2994 rc = mwl8k_cmd_set_rate(hw, vif, ap_legacy_rates);
2987 if (rc) 2995 if (rc)
2988 goto out; 2996 goto out;
2989 2997
2990 /* Turn on rate adaptation */
2991 rc = mwl8k_cmd_use_fixed_rate(hw, MWL8K_USE_AUTO_RATE, 2998 rc = mwl8k_cmd_use_fixed_rate(hw, MWL8K_USE_AUTO_RATE,
2992 MWL8K_UCAST_RATE, NULL); 2999 MWL8K_UCAST_RATE, NULL);
2993 if (rc) 3000 if (rc)
2994 goto out; 3001 goto out;
3002 }
2995 3003
2996 /* Set radio preamble */ 3004 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2997 rc = mwl8k_set_radio_preamble(hw, 3005 rc = mwl8k_set_radio_preamble(hw,
2998 vif->bss_conf.use_short_preamble); 3006 vif->bss_conf.use_short_preamble);
2999 if (rc) 3007 if (rc)
3000 goto out; 3008 goto out;
3009 }
3001 3010
3002 /* Set slot time */ 3011 if (changed & BSS_CHANGED_ERP_SLOT) {
3003 rc = mwl8k_cmd_set_slot(hw, vif->bss_conf.use_short_slot); 3012 rc = mwl8k_cmd_set_slot(hw, vif->bss_conf.use_short_slot);
3004 if (rc) 3013 if (rc)
3005 goto out; 3014 goto out;
3015 }
3006 3016
3007 /* Set AID */ 3017 if (((changed & BSS_CHANGED_ASSOC) && vif->bss_conf.assoc) ||
3008 rc = mwl8k_cmd_set_aid(hw, vif, legacy_rate_mask); 3018 (changed & (BSS_CHANGED_ERP_CTS_PROT | BSS_CHANGED_HT))) {
3019 rc = mwl8k_cmd_set_aid(hw, vif, ap_legacy_rates);
3009 if (rc) 3020 if (rc)
3010 goto out; 3021 goto out;
3022 }
3011 3023
3024 if (vif->bss_conf.assoc &&
3025 (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_BEACON_INT))) {
3012 /* 3026 /*
3013 * Finalize the join. Tell rx handler to process 3027 * Finalize the join. Tell rx handler to process
3014 * next beacon from our BSSID. 3028 * next beacon from our BSSID.