Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
b5b5150977
|
@ -1555,6 +1555,8 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
|||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
BIT(NL80211_IFTYPE_MESH_POINT);
|
||||
|
||||
hw->wiphy->ps_default = false;
|
||||
|
||||
hw->queues = 4;
|
||||
hw->max_rates = 4;
|
||||
hw->channel_change_time = 5000;
|
||||
|
|
|
@ -173,12 +173,14 @@ static void sta_addba_resp_timer_expired(unsigned long data)
|
|||
|
||||
/* check if the TID waits for addBA response */
|
||||
spin_lock_bh(&sta->lock);
|
||||
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
|
||||
if ((*state & (HT_ADDBA_REQUESTED_MSK | HT_ADDBA_RECEIVED_MSK)) !=
|
||||
HT_ADDBA_REQUESTED_MSK) {
|
||||
spin_unlock_bh(&sta->lock);
|
||||
*state = HT_AGG_STATE_IDLE;
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "timer expired on tid %d but we are not "
|
||||
"expecting addBA response there", tid);
|
||||
"(or no longer) expecting addBA response there",
|
||||
tid);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
@ -666,21 +668,21 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
|||
|
||||
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
||||
|
||||
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||
|
||||
spin_lock_bh(&sta->lock);
|
||||
|
||||
if (!(*state & HT_ADDBA_REQUESTED_MSK))
|
||||
goto timer_still_needed;
|
||||
goto out;
|
||||
|
||||
if (mgmt->u.action.u.addba_resp.dialog_token !=
|
||||
sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
goto timer_still_needed;
|
||||
goto out;
|
||||
}
|
||||
|
||||
del_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
|
@ -699,10 +701,6 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
|||
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
|
||||
}
|
||||
|
||||
goto out;
|
||||
|
||||
timer_still_needed:
|
||||
add_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||
out:
|
||||
spin_unlock_bh(&sta->lock);
|
||||
}
|
||||
|
|
|
@ -661,6 +661,14 @@ struct ieee80211_local {
|
|||
*/
|
||||
bool suspended;
|
||||
|
||||
/*
|
||||
* Resuming is true while suspended, but when we're reprogramming the
|
||||
* hardware -- at that time it's allowed to use ieee80211_queue_work()
|
||||
* again even though some other parts of the stack are still suspended
|
||||
* and we still drop received frames to avoid waking the stack.
|
||||
*/
|
||||
bool resuming;
|
||||
|
||||
/*
|
||||
* quiescing is true during the suspend process _only_ to
|
||||
* ease timer cancelling etc.
|
||||
|
|
|
@ -520,9 +520,9 @@ EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
|
|||
*/
|
||||
static bool ieee80211_can_queue_work(struct ieee80211_local *local)
|
||||
{
|
||||
if (WARN(local->suspended, "queueing ieee80211 work while "
|
||||
"going to suspend\n"))
|
||||
return false;
|
||||
if (WARN(local->suspended && !local->resuming,
|
||||
"queueing ieee80211 work while going to suspend\n"))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1025,13 +1025,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
struct sta_info *sta;
|
||||
unsigned long flags;
|
||||
int res;
|
||||
bool from_suspend = local->suspended;
|
||||
|
||||
/*
|
||||
* We're going to start the hardware, at that point
|
||||
* we are no longer suspended and can RX frames.
|
||||
*/
|
||||
local->suspended = false;
|
||||
if (local->suspended)
|
||||
local->resuming = true;
|
||||
|
||||
/* restart hardware */
|
||||
if (local->open_count) {
|
||||
|
@ -1129,11 +1125,14 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
* If this is for hw restart things are still running.
|
||||
* We may want to change that later, however.
|
||||
*/
|
||||
if (!from_suspend)
|
||||
if (!local->suspended)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/* first set suspended false, then resuming */
|
||||
local->suspended = false;
|
||||
mb();
|
||||
local->resuming = false;
|
||||
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
switch(sdata->vif.type) {
|
||||
|
|
|
@ -1189,6 +1189,7 @@ static long rfkill_fop_ioctl(struct file *file, unsigned int cmd,
|
|||
#endif
|
||||
|
||||
static const struct file_operations rfkill_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = rfkill_fop_open,
|
||||
.read = rfkill_fop_read,
|
||||
.write = rfkill_fop_write,
|
||||
|
|
Loading…
Reference in a new issue