Commit b5b51509 authored by David S. Miller's avatar David S. Miller
parents dcfcb256 45ba564d
...@@ -1555,6 +1555,8 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) ...@@ -1555,6 +1555,8 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_ADHOC) |
BIT(NL80211_IFTYPE_MESH_POINT); BIT(NL80211_IFTYPE_MESH_POINT);
hw->wiphy->ps_default = false;
hw->queues = 4; hw->queues = 4;
hw->max_rates = 4; hw->max_rates = 4;
hw->channel_change_time = 5000; hw->channel_change_time = 5000;
......
...@@ -173,12 +173,14 @@ static void sta_addba_resp_timer_expired(unsigned long data) ...@@ -173,12 +173,14 @@ static void sta_addba_resp_timer_expired(unsigned long data)
/* check if the TID waits for addBA response */ /* check if the TID waits for addBA response */
spin_lock_bh(&sta->lock); 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); spin_unlock_bh(&sta->lock);
*state = HT_AGG_STATE_IDLE; *state = HT_AGG_STATE_IDLE;
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "timer expired on tid %d but we are not " 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 #endif
return; return;
} }
...@@ -666,21 +668,21 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, ...@@ -666,21 +668,21 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
state = &sta->ampdu_mlme.tid_state_tx[tid]; 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); spin_lock_bh(&sta->lock);
if (!(*state & HT_ADDBA_REQUESTED_MSK)) if (!(*state & HT_ADDBA_REQUESTED_MSK))
goto timer_still_needed; goto out;
if (mgmt->u.action.u.addba_resp.dialog_token != if (mgmt->u.action.u.addba_resp.dialog_token !=
sta->ampdu_mlme.tid_tx[tid]->dialog_token) { sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid); printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
#endif /* CONFIG_MAC80211_HT_DEBUG */ #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 #ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid); printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
#endif /* CONFIG_MAC80211_HT_DEBUG */ #endif /* CONFIG_MAC80211_HT_DEBUG */
...@@ -699,10 +701,6 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, ...@@ -699,10 +701,6 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR); ___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: out:
spin_unlock_bh(&sta->lock); spin_unlock_bh(&sta->lock);
} }
...@@ -661,6 +661,14 @@ struct ieee80211_local { ...@@ -661,6 +661,14 @@ struct ieee80211_local {
*/ */
bool suspended; 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 * quiescing is true during the suspend process _only_ to
* ease timer cancelling etc. * ease timer cancelling etc.
......
...@@ -520,8 +520,8 @@ EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic); ...@@ -520,8 +520,8 @@ EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
*/ */
static bool ieee80211_can_queue_work(struct ieee80211_local *local) static bool ieee80211_can_queue_work(struct ieee80211_local *local)
{ {
if (WARN(local->suspended, "queueing ieee80211 work while " if (WARN(local->suspended && !local->resuming,
"going to suspend\n")) "queueing ieee80211 work while going to suspend\n"))
return false; return false;
return true; return true;
...@@ -1025,13 +1025,9 @@ int ieee80211_reconfig(struct ieee80211_local *local) ...@@ -1025,13 +1025,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
struct sta_info *sta; struct sta_info *sta;
unsigned long flags; unsigned long flags;
int res; int res;
bool from_suspend = local->suspended;
/* if (local->suspended)
* We're going to start the hardware, at that point local->resuming = true;
* we are no longer suspended and can RX frames.
*/
local->suspended = false;
/* restart hardware */ /* restart hardware */
if (local->open_count) { if (local->open_count) {
...@@ -1129,11 +1125,14 @@ int ieee80211_reconfig(struct ieee80211_local *local) ...@@ -1129,11 +1125,14 @@ int ieee80211_reconfig(struct ieee80211_local *local)
* If this is for hw restart things are still running. * If this is for hw restart things are still running.
* We may want to change that later, however. * We may want to change that later, however.
*/ */
if (!from_suspend) if (!local->suspended)
return 0; return 0;
#ifdef CONFIG_PM #ifdef CONFIG_PM
/* first set suspended false, then resuming */
local->suspended = false; local->suspended = false;
mb();
local->resuming = false;
list_for_each_entry(sdata, &local->interfaces, list) { list_for_each_entry(sdata, &local->interfaces, list) {
switch(sdata->vif.type) { switch(sdata->vif.type) {
......
...@@ -1189,6 +1189,7 @@ static long rfkill_fop_ioctl(struct file *file, unsigned int cmd, ...@@ -1189,6 +1189,7 @@ static long rfkill_fop_ioctl(struct file *file, unsigned int cmd,
#endif #endif
static const struct file_operations rfkill_fops = { static const struct file_operations rfkill_fops = {
.owner = THIS_MODULE,
.open = rfkill_fop_open, .open = rfkill_fop_open,
.read = rfkill_fop_read, .read = rfkill_fop_read,
.write = rfkill_fop_write, .write = rfkill_fop_write,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment