Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
This commit is contained in:
@@ -272,6 +272,12 @@ static void ieee80211_sta_wmm_params(struct net_device *dev,
|
||||
int count;
|
||||
u8 *pos;
|
||||
|
||||
if (!(ifsta->flags & IEEE80211_STA_WMM_ENABLED))
|
||||
return;
|
||||
|
||||
if (!wmm_param)
|
||||
return;
|
||||
|
||||
if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1)
|
||||
return;
|
||||
count = wmm_param[6] & 0x0f;
|
||||
@@ -799,8 +805,10 @@ static void ieee80211_send_assoc(struct net_device *dev,
|
||||
*pos++ = 1; /* WME ver */
|
||||
*pos++ = 0;
|
||||
}
|
||||
|
||||
/* wmm support is a must to HT */
|
||||
if (wmm && sband->ht_info.ht_supported) {
|
||||
if (wmm && (ifsta->flags & IEEE80211_STA_WMM_ENABLED) &&
|
||||
sband->ht_info.ht_supported) {
|
||||
__le16 tmp = cpu_to_le16(sband->ht_info.cap);
|
||||
pos = skb_put(skb, sizeof(struct ieee80211_ht_cap)+2);
|
||||
*pos++ = WLAN_EID_HT_CAPABILITY;
|
||||
@@ -1269,7 +1277,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
|
||||
|
||||
|
||||
/* examine state machine */
|
||||
spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
|
||||
spin_lock_bh(&sta->lock);
|
||||
|
||||
if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_IDLE) {
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
@@ -1336,7 +1344,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
|
||||
tid_agg_rx->stored_mpdu_num = 0;
|
||||
status = WLAN_STATUS_SUCCESS;
|
||||
end:
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
|
||||
end_no_lock:
|
||||
ieee80211_send_addba_resp(sta->sdata->dev, sta->addr, tid,
|
||||
@@ -1368,10 +1376,10 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev,
|
||||
|
||||
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
||||
|
||||
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_lock_bh(&sta->lock);
|
||||
|
||||
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
printk(KERN_DEBUG "state not HT_ADDBA_REQUESTED_MSK:"
|
||||
"%d\n", *state);
|
||||
goto addba_resp_exit;
|
||||
@@ -1379,7 +1387,7 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev,
|
||||
|
||||
if (mgmt->u.action.u.addba_resp.dialog_token !=
|
||||
sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
@@ -1403,7 +1411,7 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev,
|
||||
ieee80211_wake_queue(hw, sta->tid_to_tx_q[tid]);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
printk(KERN_DEBUG "recipient accepted agg: tid %d \n", tid);
|
||||
} else {
|
||||
printk(KERN_DEBUG "recipient rejected agg: tid %d \n", tid);
|
||||
@@ -1411,7 +1419,7 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev,
|
||||
sta->ampdu_mlme.addba_req_num[tid]++;
|
||||
/* this will allow the state check in stop_BA_session */
|
||||
*state = HT_AGG_STATE_OPERATIONAL;
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
ieee80211_stop_tx_ba_session(hw, sta->addr, tid,
|
||||
WLAN_BACK_INITIATOR);
|
||||
}
|
||||
@@ -1481,17 +1489,17 @@ void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
|
||||
}
|
||||
|
||||
/* check if TID is in operational state */
|
||||
spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
|
||||
spin_lock_bh(&sta->lock);
|
||||
if (sta->ampdu_mlme.tid_state_rx[tid]
|
||||
!= HT_AGG_STATE_OPERATIONAL) {
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
sta->ampdu_mlme.tid_state_rx[tid] =
|
||||
HT_AGG_STATE_REQ_STOP_BA_MSK |
|
||||
(initiator << HT_AGG_STATE_INITIATOR_SHIFT);
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
|
||||
/* stop HW Rx aggregation. ampdu_action existence
|
||||
* already verified in session init so we add the BUG_ON */
|
||||
@@ -1568,10 +1576,10 @@ static void ieee80211_sta_process_delba(struct net_device *dev,
|
||||
ieee80211_sta_stop_rx_ba_session(dev, sta->addr, tid,
|
||||
WLAN_BACK_INITIATOR, 0);
|
||||
else { /* WLAN_BACK_RECIPIENT */
|
||||
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_lock_bh(&sta->lock);
|
||||
sta->ampdu_mlme.tid_state_tx[tid] =
|
||||
HT_AGG_STATE_OPERATIONAL;
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
ieee80211_stop_tx_ba_session(&local->hw, sta->addr, tid,
|
||||
WLAN_BACK_RECIPIENT);
|
||||
}
|
||||
@@ -1608,9 +1616,9 @@ void sta_addba_resp_timer_expired(unsigned long data)
|
||||
|
||||
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
||||
/* check if the TID waits for addBA response */
|
||||
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_lock_bh(&sta->lock);
|
||||
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
*state = HT_AGG_STATE_IDLE;
|
||||
printk(KERN_DEBUG "timer expired on tid %d but we are not "
|
||||
"expecting addBA response there", tid);
|
||||
@@ -1621,7 +1629,7 @@ void sta_addba_resp_timer_expired(unsigned long data)
|
||||
|
||||
/* go through the state check in stop_BA_session */
|
||||
*state = HT_AGG_STATE_OPERATIONAL;
|
||||
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
ieee80211_stop_tx_ba_session(hw, temp_sta->addr, tid,
|
||||
WLAN_BACK_INITIATOR);
|
||||
|
||||
@@ -1987,8 +1995,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
local->hw.conf.channel->center_freq,
|
||||
ifsta->ssid, ifsta->ssid_len);
|
||||
if (bss) {
|
||||
sta->last_rssi = bss->rssi;
|
||||
sta->last_signal = bss->signal;
|
||||
sta->last_qual = bss->qual;
|
||||
sta->last_noise = bss->noise;
|
||||
ieee80211_rx_bss_put(dev, bss);
|
||||
}
|
||||
@@ -2012,8 +2020,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
* to between the sta_info_alloc() and sta_info_insert() above.
|
||||
*/
|
||||
|
||||
sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP |
|
||||
WLAN_STA_AUTHORIZED;
|
||||
set_sta_flags(sta, WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP |
|
||||
WLAN_STA_AUTHORIZED);
|
||||
|
||||
rates = 0;
|
||||
basic_rates = 0;
|
||||
@@ -2057,7 +2065,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
else
|
||||
sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
|
||||
|
||||
if (elems.ht_cap_elem && elems.ht_info_elem && elems.wmm_param) {
|
||||
if (elems.ht_cap_elem && elems.ht_info_elem && elems.wmm_param &&
|
||||
(ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
|
||||
struct ieee80211_ht_bss_info bss_info;
|
||||
ieee80211_ht_cap_ie_to_ht_info(
|
||||
(struct ieee80211_ht_cap *)
|
||||
@@ -2070,8 +2079,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
rate_control_rate_init(sta, local);
|
||||
|
||||
if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
|
||||
sta->flags |= WLAN_STA_WME;
|
||||
if (elems.wmm_param) {
|
||||
set_sta_flags(sta, WLAN_STA_WME);
|
||||
rcu_read_unlock();
|
||||
ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
|
||||
elems.wmm_param_len);
|
||||
@@ -2656,9 +2665,9 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
|
||||
|
||||
bss->timestamp = beacon_timestamp;
|
||||
bss->last_update = jiffies;
|
||||
bss->rssi = rx_status->ssi;
|
||||
bss->signal = rx_status->signal;
|
||||
bss->noise = rx_status->noise;
|
||||
bss->qual = rx_status->qual;
|
||||
if (!beacon && !bss->probe_resp)
|
||||
bss->probe_resp = true;
|
||||
|
||||
@@ -2853,10 +2862,8 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
|
||||
|
||||
ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
|
||||
|
||||
if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
|
||||
ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
|
||||
elems.wmm_param_len);
|
||||
}
|
||||
ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
|
||||
elems.wmm_param_len);
|
||||
|
||||
/* Do not send changes to driver if we are scanning. This removes
|
||||
* requirement that driver's bss_info_changed function needs to be
|
||||
@@ -3456,9 +3463,9 @@ static int ieee80211_sta_config_auth(struct net_device *dev,
|
||||
!ieee80211_sta_match_ssid(ifsta, bss->ssid, bss->ssid_len))
|
||||
continue;
|
||||
|
||||
if (!selected || top_rssi < bss->rssi) {
|
||||
if (!selected || top_rssi < bss->signal) {
|
||||
selected = bss;
|
||||
top_rssi = bss->rssi;
|
||||
top_rssi = bss->signal;
|
||||
}
|
||||
}
|
||||
if (selected)
|
||||
@@ -4089,8 +4096,8 @@ ieee80211_sta_scan_result(struct net_device *dev,
|
||||
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
iwe.cmd = IWEVQUAL;
|
||||
iwe.u.qual.qual = bss->signal;
|
||||
iwe.u.qual.level = bss->rssi;
|
||||
iwe.u.qual.qual = bss->qual;
|
||||
iwe.u.qual.level = bss->signal;
|
||||
iwe.u.qual.noise = bss->noise;
|
||||
iwe.u.qual.updated = local->wstats_flags;
|
||||
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
|
||||
@@ -4266,7 +4273,7 @@ struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
|
||||
if (!sta)
|
||||
return NULL;
|
||||
|
||||
sta->flags |= WLAN_STA_AUTHORIZED;
|
||||
set_sta_flags(sta, WLAN_STA_AUTHORIZED);
|
||||
|
||||
sta->supp_rates[local->hw.conf.channel->band] =
|
||||
sdata->u.sta.supp_rates_bits[local->hw.conf.channel->band];
|
||||
|
Reference in New Issue
Block a user