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 | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index 5f75f70db5a7..07f10ddee6a5 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
@@ -116,6 +116,60 @@ void ath9k_ps_work(struct work_struct *work) | |||
116 | ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); | 116 | ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP); |
117 | } | 117 | } |
118 | 118 | ||
119 | void ath9k_htc_reset(struct ath9k_htc_priv *priv) | ||
120 | { | ||
121 | struct ath_hw *ah = priv->ah; | ||
122 | struct ath_common *common = ath9k_hw_common(ah); | ||
123 | struct ieee80211_channel *channel = priv->hw->conf.channel; | ||
124 | struct ath9k_hw_cal_data *caldata; | ||
125 | enum htc_phymode mode; | ||
126 | __be16 htc_mode; | ||
127 | u8 cmd_rsp; | ||
128 | int ret; | ||
129 | |||
130 | mutex_lock(&priv->mutex); | ||
131 | ath9k_htc_ps_wakeup(priv); | ||
132 | |||
133 | if (priv->op_flags & OP_ASSOCIATED) | ||
134 | cancel_delayed_work_sync(&priv->ath9k_ani_work); | ||
135 | |||
136 | ieee80211_stop_queues(priv->hw); | ||
137 | htc_stop(priv->htc); | ||
138 | WMI_CMD(WMI_DISABLE_INTR_CMDID); | ||
139 | WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID); | ||
140 | WMI_CMD(WMI_STOP_RECV_CMDID); | ||
141 | |||
142 | caldata = &priv->caldata[channel->hw_value]; | ||
143 | ret = ath9k_hw_reset(ah, ah->curchan, caldata, false); | ||
144 | if (ret) { | ||
145 | ath_err(common, | ||
146 | "Unable to reset device (%u Mhz) reset status %d\n", | ||
147 | channel->center_freq, ret); | ||
148 | } | ||
149 | |||
150 | ath_update_txpow(priv); | ||
151 | |||
152 | WMI_CMD(WMI_START_RECV_CMDID); | ||
153 | ath9k_host_rx_init(priv); | ||
154 | |||
155 | mode = ath9k_htc_get_curmode(priv, ah->curchan); | ||
156 | htc_mode = cpu_to_be16(mode); | ||
157 | WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode); | ||
158 | |||
159 | WMI_CMD(WMI_ENABLE_INTR_CMDID); | ||
160 | htc_start(priv->htc); | ||
161 | |||
162 | if (priv->op_flags & OP_ASSOCIATED) { | ||
163 | ath9k_htc_beacon_config(priv, priv->vif); | ||
164 | ath_start_ani(priv); | ||
165 | } | ||
166 | |||
167 | ieee80211_wake_queues(priv->hw); | ||
168 | |||
169 | ath9k_htc_ps_restore(priv); | ||
170 | mutex_unlock(&priv->mutex); | ||
171 | } | ||
172 | |||
119 | static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, | 173 | static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, |
120 | struct ieee80211_hw *hw, | 174 | struct ieee80211_hw *hw, |
121 | struct ath9k_channel *hchan) | 175 | struct ath9k_channel *hchan) |
@@ -690,7 +744,7 @@ void ath9k_htc_debug_remove_root(void) | |||
690 | /* ANI */ | 744 | /* ANI */ |
691 | /*******/ | 745 | /*******/ |
692 | 746 | ||
693 | static void ath_start_ani(struct ath9k_htc_priv *priv) | 747 | void ath_start_ani(struct ath9k_htc_priv *priv) |
694 | { | 748 | { |
695 | struct ath_common *common = ath9k_hw_common(priv->ah); | 749 | struct ath_common *common = ath9k_hw_common(priv->ah); |
696 | unsigned long timestamp = jiffies_to_msecs(jiffies); | 750 | unsigned long timestamp = jiffies_to_msecs(jiffies); |
@@ -1219,6 +1273,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw) | |||
1219 | u8 cmd_rsp; | 1273 | u8 cmd_rsp; |
1220 | 1274 | ||
1221 | /* Cancel all the running timers/work .. */ | 1275 | /* Cancel all the running timers/work .. */ |
1276 | cancel_work_sync(&priv->fatal_work); | ||
1222 | cancel_work_sync(&priv->ps_work); | 1277 | cancel_work_sync(&priv->ps_work); |
1223 | cancel_delayed_work_sync(&priv->ath9k_led_blink_work); | 1278 | cancel_delayed_work_sync(&priv->ath9k_led_blink_work); |
1224 | ath9k_led_stop_brightness(priv); | 1279 | ath9k_led_stop_brightness(priv); |