aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/htc_drv_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/htc_drv_main.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_main.c56
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
108static 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
119static 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
108void ath9k_htc_reset(struct ath9k_htc_priv *priv) 136void 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}