diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/htc_drv_main.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_main.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index dbde491f3d9..5ef07697818 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
@@ -105,6 +105,34 @@ void ath9k_ps_work(struct work_struct *work) | |||
105 | ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); | 105 | ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); |
106 | } | 106 | } |
107 | 107 | ||
108 | static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif) | ||
109 | { | ||
110 | struct ath9k_htc_priv *priv = data; | ||
111 | struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; | ||
112 | |||
113 | if (bss_conf->assoc) { | ||
114 | priv->rearm_ani = true; | ||
115 | priv->reconfig_beacon = true; | ||
116 | } | ||
117 | } | ||
118 | |||
119 | static void ath9k_htc_vif_reconfig(struct ath9k_htc_priv *priv) | ||
120 | { | ||
121 | priv->rearm_ani = false; | ||
122 | priv->reconfig_beacon = false; | ||
123 | |||
124 | ieee80211_iterate_active_interfaces_atomic(priv->hw, | ||
125 | ath9k_htc_vif_iter, priv); | ||
126 | if (priv->rearm_ani) | ||
127 | ath_start_ani(priv); | ||
128 | |||
129 | if (priv->reconfig_beacon) { | ||
130 | ath9k_htc_ps_wakeup(priv); | ||
131 | ath9k_htc_beacon_reconfig(priv); | ||
132 | ath9k_htc_ps_restore(priv); | ||
133 | } | ||
134 | } | ||
135 | |||
108 | void ath9k_htc_reset(struct ath9k_htc_priv *priv) | 136 | void ath9k_htc_reset(struct ath9k_htc_priv *priv) |
109 | { | 137 | { |
110 | struct ath_hw *ah = priv->ah; | 138 | struct ath_hw *ah = priv->ah; |
@@ -119,9 +147,7 @@ void ath9k_htc_reset(struct ath9k_htc_priv *priv) | |||
119 | mutex_lock(&priv->mutex); | 147 | mutex_lock(&priv->mutex); |
120 | ath9k_htc_ps_wakeup(priv); | 148 | ath9k_htc_ps_wakeup(priv); |
121 | 149 | ||
122 | if (priv->op_flags & OP_ASSOCIATED) | 150 | cancel_delayed_work_sync(&priv->ath9k_ani_work); |
123 | cancel_delayed_work_sync(&priv->ath9k_ani_work); | ||
124 | |||
125 | ieee80211_stop_queues(priv->hw); | 151 | ieee80211_stop_queues(priv->hw); |
126 | htc_stop(priv->htc); | 152 | htc_stop(priv->htc); |
127 | WMI_CMD(WMI_DISABLE_INTR_CMDID); | 153 | WMI_CMD(WMI_DISABLE_INTR_CMDID); |
@@ -148,12 +174,7 @@ void ath9k_htc_reset(struct ath9k_htc_priv *priv) | |||
148 | 174 | ||
149 | WMI_CMD(WMI_ENABLE_INTR_CMDID); | 175 | WMI_CMD(WMI_ENABLE_INTR_CMDID); |
150 | htc_start(priv->htc); | 176 | htc_start(priv->htc); |
151 | 177 | ath9k_htc_vif_reconfig(priv); | |
152 | if (priv->op_flags & OP_ASSOCIATED) { | ||
153 | ath9k_htc_beacon_config(priv, priv->vif); | ||
154 | ath_start_ani(priv); | ||
155 | } | ||
156 | |||
157 | ieee80211_wake_queues(priv->hw); | 178 | ieee80211_wake_queues(priv->hw); |
158 | 179 | ||
159 | ath9k_htc_ps_restore(priv); | 180 | ath9k_htc_ps_restore(priv); |
@@ -1491,13 +1512,10 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw, | |||
1491 | ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n", | 1512 | ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n", |
1492 | bss_conf->assoc); | 1513 | bss_conf->assoc); |
1493 | 1514 | ||
1494 | if (bss_conf->assoc) { | 1515 | if (bss_conf->assoc) |
1495 | priv->op_flags |= OP_ASSOCIATED; | ||
1496 | ath_start_ani(priv); | 1516 | ath_start_ani(priv); |
1497 | } else { | 1517 | else |
1498 | priv->op_flags &= ~OP_ASSOCIATED; | ||
1499 | cancel_delayed_work_sync(&priv->ath9k_ani_work); | 1518 | cancel_delayed_work_sync(&priv->ath9k_ani_work); |
1500 | } | ||
1501 | } | 1519 | } |
1502 | 1520 | ||
1503 | if (changed & BSS_CHANGED_BSSID) { | 1521 | if (changed & BSS_CHANGED_BSSID) { |
@@ -1622,8 +1640,7 @@ static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw) | |||
1622 | priv->op_flags |= OP_SCANNING; | 1640 | priv->op_flags |= OP_SCANNING; |
1623 | spin_unlock_bh(&priv->beacon_lock); | 1641 | spin_unlock_bh(&priv->beacon_lock); |
1624 | cancel_work_sync(&priv->ps_work); | 1642 | cancel_work_sync(&priv->ps_work); |
1625 | if (priv->op_flags & OP_ASSOCIATED) | 1643 | cancel_delayed_work_sync(&priv->ath9k_ani_work); |
1626 | cancel_delayed_work_sync(&priv->ath9k_ani_work); | ||
1627 | mutex_unlock(&priv->mutex); | 1644 | mutex_unlock(&priv->mutex); |
1628 | } | 1645 | } |
1629 | 1646 | ||
@@ -1632,14 +1649,11 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw) | |||
1632 | struct ath9k_htc_priv *priv = hw->priv; | 1649 | struct ath9k_htc_priv *priv = hw->priv; |
1633 | 1650 | ||
1634 | mutex_lock(&priv->mutex); | 1651 | mutex_lock(&priv->mutex); |
1635 | ath9k_htc_ps_wakeup(priv); | ||
1636 | spin_lock_bh(&priv->beacon_lock); | 1652 | spin_lock_bh(&priv->beacon_lock); |
1637 | priv->op_flags &= ~OP_SCANNING; | 1653 | priv->op_flags &= ~OP_SCANNING; |
1638 | spin_unlock_bh(&priv->beacon_lock); | 1654 | spin_unlock_bh(&priv->beacon_lock); |
1639 | if (priv->op_flags & OP_ASSOCIATED) { | 1655 | ath9k_htc_ps_wakeup(priv); |
1640 | ath9k_htc_beacon_config(priv, priv->vif); | 1656 | ath9k_htc_vif_reconfig(priv); |
1641 | ath_start_ani(priv); | ||
1642 | } | ||
1643 | ath9k_htc_ps_restore(priv); | 1657 | ath9k_htc_ps_restore(priv); |
1644 | mutex_unlock(&priv->mutex); | 1658 | mutex_unlock(&priv->mutex); |
1645 | } | 1659 | } |