Commit 7125f01d authored by Kalle Valo's avatar Kalle Valo

ath6kl: implement ath6kl_cfg80211_stop_all()

During suspend we need to stop all vifs, not just the first.
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent ed8491a7
...@@ -1798,7 +1798,7 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar, ...@@ -1798,7 +1798,7 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
case ATH6KL_CFG_SUSPEND_DEEPSLEEP: case ATH6KL_CFG_SUSPEND_DEEPSLEEP:
ath6kl_cfg80211_stop(ar); ath6kl_cfg80211_stop_all(ar);
/* save the current power mode before enabling power save */ /* save the current power mode before enabling power save */
ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode; ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
...@@ -1815,7 +1815,7 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar, ...@@ -1815,7 +1815,7 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
case ATH6KL_CFG_SUSPEND_CUTPOWER: case ATH6KL_CFG_SUSPEND_CUTPOWER:
ath6kl_cfg80211_stop(ar); ath6kl_cfg80211_stop_all(ar);
if (ar->state == ATH6KL_STATE_OFF) { if (ar->state == ATH6KL_STATE_OFF) {
ath6kl_dbg(ATH6KL_DBG_SUSPEND, ath6kl_dbg(ATH6KL_DBG_SUSPEND,
...@@ -2388,22 +2388,8 @@ static struct cfg80211_ops ath6kl_cfg80211_ops = { ...@@ -2388,22 +2388,8 @@ static struct cfg80211_ops ath6kl_cfg80211_ops = {
.mgmt_frame_register = ath6kl_mgmt_frame_register, .mgmt_frame_register = ath6kl_mgmt_frame_register,
}; };
void ath6kl_cfg80211_stop(struct ath6kl *ar) void ath6kl_cfg80211_stop(struct ath6kl_vif *vif)
{ {
struct ath6kl_vif *vif;
/* FIXME: for multi vif */
vif = ath6kl_vif_first(ar);
if (!vif) {
/* save the current power mode before enabling power save */
ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
if (ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER) != 0)
ath6kl_warn("ath6kl_deep_sleep_enable: "
"wmi_powermode_cmd failed\n");
return;
}
switch (vif->sme_state) { switch (vif->sme_state) {
case SME_DISCONNECTED: case SME_DISCONNECTED:
break; break;
...@@ -2420,21 +2406,44 @@ void ath6kl_cfg80211_stop(struct ath6kl *ar) ...@@ -2420,21 +2406,44 @@ void ath6kl_cfg80211_stop(struct ath6kl *ar)
if (test_bit(CONNECTED, &vif->flags) || if (test_bit(CONNECTED, &vif->flags) ||
test_bit(CONNECT_PEND, &vif->flags)) test_bit(CONNECT_PEND, &vif->flags))
ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx); ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx);
vif->sme_state = SME_DISCONNECTED; vif->sme_state = SME_DISCONNECTED;
clear_bit(CONNECTED, &vif->flags); clear_bit(CONNECTED, &vif->flags);
clear_bit(CONNECT_PEND, &vif->flags); clear_bit(CONNECT_PEND, &vif->flags);
/* disable scanning */ /* disable scanning */
if (ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 0xFFFF, 0, 0, if (ath6kl_wmi_scanparams_cmd(vif->ar->wmi, vif->fw_vif_idx, 0xFFFF,
0, 0, 0, 0, 0, 0, 0) != 0) 0, 0, 0, 0, 0, 0, 0, 0, 0) != 0)
printk(KERN_WARNING "ath6kl: failed to disable scan " ath6kl_warn("failed to disable scan during stop\n");
"during suspend\n");
ath6kl_cfg80211_scan_complete_event(vif, true); ath6kl_cfg80211_scan_complete_event(vif, true);
} }
void ath6kl_cfg80211_stop_all(struct ath6kl *ar)
{
struct ath6kl_vif *vif;
vif = ath6kl_vif_first(ar);
if (!vif) {
/* save the current power mode before enabling power save */
ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
if (ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER) != 0)
ath6kl_warn("ath6kl_deep_sleep_enable: "
"wmi_powermode_cmd failed\n");
return;
}
/*
* FIXME: we should take ar->list_lock to protect changes in the
* vif_list, but that's not trivial to do as ath6kl_cfg80211_stop()
* sleeps.
*/
list_for_each_entry(vif, &ar->vif_list, list)
ath6kl_cfg80211_stop(vif);
}
struct ath6kl *ath6kl_core_alloc(struct device *dev) struct ath6kl *ath6kl_core_alloc(struct device *dev)
{ {
struct ath6kl *ar; struct ath6kl *ar;
......
...@@ -52,6 +52,7 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar, ...@@ -52,6 +52,7 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
int ath6kl_cfg80211_resume(struct ath6kl *ar); int ath6kl_cfg80211_resume(struct ath6kl *ar);
void ath6kl_cfg80211_stop(struct ath6kl *ar); void ath6kl_cfg80211_stop(struct ath6kl_vif *vif);
void ath6kl_cfg80211_stop_all(struct ath6kl *ar);
#endif /* ATH6KL_CFG80211_H */ #endif /* ATH6KL_CFG80211_H */
...@@ -1002,12 +1002,11 @@ static int ath6kl_open(struct net_device *dev) ...@@ -1002,12 +1002,11 @@ static int ath6kl_open(struct net_device *dev)
static int ath6kl_close(struct net_device *dev) static int ath6kl_close(struct net_device *dev)
{ {
struct ath6kl *ar = ath6kl_priv(dev);
struct ath6kl_vif *vif = netdev_priv(dev); struct ath6kl_vif *vif = netdev_priv(dev);
netif_stop_queue(dev); netif_stop_queue(dev);
ath6kl_cfg80211_stop(ar); ath6kl_cfg80211_stop(vif);
clear_bit(WLAN_ENABLED, &vif->flags); clear_bit(WLAN_ENABLED, &vif->flags);
......
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