ath9k_htc: Fix suspend/resume
The HW has to be set to FULLSLEEP mode during suspend, when no interface has been brought up. Not doing this would break resume, as the chip won't be powered up at all. Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
b93996cf67
commit
f933ebed78
|
@ -1024,6 +1024,13 @@ static int ath9k_hif_usb_suspend(struct usb_interface *interface,
|
||||||
struct hif_device_usb *hif_dev =
|
struct hif_device_usb *hif_dev =
|
||||||
(struct hif_device_usb *) usb_get_intfdata(interface);
|
(struct hif_device_usb *) usb_get_intfdata(interface);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The device has to be set to FULLSLEEP mode in case no
|
||||||
|
* interface is up.
|
||||||
|
*/
|
||||||
|
if (!(hif_dev->flags & HIF_USB_START))
|
||||||
|
ath9k_htc_suspend(hif_dev->htc_handle);
|
||||||
|
|
||||||
ath9k_hif_usb_dealloc_urbs(hif_dev);
|
ath9k_hif_usb_dealloc_urbs(hif_dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -455,6 +455,8 @@ u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv);
|
void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv);
|
void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_ps_work(struct work_struct *work);
|
void ath9k_ps_work(struct work_struct *work);
|
||||||
|
bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
|
||||||
|
enum ath9k_power_mode mode);
|
||||||
|
|
||||||
void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv);
|
void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv);
|
||||||
void ath9k_init_leds(struct ath9k_htc_priv *priv);
|
void ath9k_init_leds(struct ath9k_htc_priv *priv);
|
||||||
|
@ -464,6 +466,7 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
|
||||||
u16 devid, char *product);
|
u16 devid, char *product);
|
||||||
void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
|
void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
void ath9k_htc_suspend(struct htc_target *htc_handle);
|
||||||
int ath9k_htc_resume(struct htc_target *htc_handle);
|
int ath9k_htc_resume(struct htc_target *htc_handle);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ATH9K_HTC_DEBUGFS
|
#ifdef CONFIG_ATH9K_HTC_DEBUGFS
|
||||||
|
|
|
@ -891,6 +891,12 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
|
||||||
|
void ath9k_htc_suspend(struct htc_target *htc_handle)
|
||||||
|
{
|
||||||
|
ath9k_htc_setpower(htc_handle->drv_priv, ATH9K_PM_FULL_SLEEP);
|
||||||
|
}
|
||||||
|
|
||||||
int ath9k_htc_resume(struct htc_target *htc_handle)
|
int ath9k_htc_resume(struct htc_target *htc_handle)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -63,7 +63,7 @@ static enum htc_phymode ath9k_htc_get_curmode(struct ath9k_htc_priv *priv,
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
|
bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
|
||||||
enum ath9k_power_mode mode)
|
enum ath9k_power_mode mode)
|
||||||
{
|
{
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
Loading…
Reference in New Issue