| Starting with commit 66fceb69b72ff7e9cd8da2ca70033982d5376e0e |
| "libertas: Added callback functions to support SDIO suspend/resume." |
| libertas uses new functions from the in kernel sdio framework for |
| suspend and resume that are not backported. |
| |
| --- a/drivers/net/wireless/ath/ath6kl/cfg80211.c |
| +++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c |
| @@ -1963,7 +1963,7 @@ int ath6kl_cfg80211_resume(struct ath6kl |
| return 0; |
| } |
| |
| -#ifdef CONFIG_PM |
| +#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| |
| /* hif layer decides what suspend mode to use */ |
| static int __ath6kl_cfg80211_suspend(struct wiphy *wiphy, |
| @@ -2554,7 +2554,7 @@ static struct cfg80211_ops ath6kl_cfg802 |
| .del_pmksa = ath6kl_del_pmksa, |
| .flush_pmksa = ath6kl_flush_pmksa, |
| CFG80211_TESTMODE_CMD(ath6kl_tm_cmd) |
| -#ifdef CONFIG_PM |
| +#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| .suspend = __ath6kl_cfg80211_suspend, |
| .resume = __ath6kl_cfg80211_resume, |
| #endif |
| --- a/drivers/net/wireless/ath/ath6kl/hif-ops.h |
| +++ b/drivers/net/wireless/ath/ath6kl/hif-ops.h |
| @@ -83,6 +83,7 @@ static inline void ath6kl_hif_cleanup_sc |
| return ar->hif_ops->cleanup_scatter(ar); |
| } |
| |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| static inline int ath6kl_hif_suspend(struct ath6kl *ar, |
| struct cfg80211_wowlan *wow) |
| { |
| @@ -90,6 +91,7 @@ static inline int ath6kl_hif_suspend(str |
| |
| return ar->hif_ops->suspend(ar, wow); |
| } |
| +#endif |
| |
| /* |
| * Read from the ATH6KL through its diagnostic window. No cooperation from |
| @@ -121,12 +123,14 @@ static inline int ath6kl_hif_bmi_write(s |
| return ar->hif_ops->bmi_write(ar, buf, len); |
| } |
| |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| static inline int ath6kl_hif_resume(struct ath6kl *ar) |
| { |
| ath6kl_dbg(ATH6KL_DBG_HIF, "hif resume\n"); |
| |
| return ar->hif_ops->resume(ar); |
| } |
| +#endif |
| |
| static inline int ath6kl_hif_power_on(struct ath6kl *ar) |
| { |
| --- a/drivers/net/wireless/ath/ath6kl/sdio.c |
| +++ b/drivers/net/wireless/ath/ath6kl/sdio.c |
| @@ -782,6 +782,7 @@ out: |
| return ret; |
| } |
| |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| static int ath6kl_sdio_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow) |
| { |
| struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar); |
| @@ -877,6 +878,7 @@ static int ath6kl_sdio_resume(struct ath |
| |
| return 0; |
| } |
| +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ |
| |
| /* set the window address register (using 4-byte register access ). */ |
| static int ath6kl_set_addrwin_reg(struct ath6kl *ar, u32 reg_addr, u32 addr) |
| @@ -1178,8 +1180,10 @@ static const struct ath6kl_hif_ops ath6k |
| .enable_scatter = ath6kl_sdio_enable_scatter, |
| .scat_req_rw = ath6kl_sdio_async_rw_scatter, |
| .cleanup_scatter = ath6kl_sdio_cleanup_scatter, |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| .suspend = ath6kl_sdio_suspend, |
| .resume = ath6kl_sdio_resume, |
| +#endif |
| .diag_read32 = ath6kl_sdio_diag_read32, |
| .diag_write32 = ath6kl_sdio_diag_write32, |
| .bmi_read = ath6kl_sdio_bmi_read, |
| @@ -1189,7 +1193,7 @@ static const struct ath6kl_hif_ops ath6k |
| .stop = ath6kl_sdio_stop, |
| }; |
| |
| -#ifdef CONFIG_PM_SLEEP |
| +#if defined(CONFIG_PM_SLEEP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| |
| /* |
| * Empty handlers so that mmc subsystem doesn't remove us entirely during |
| @@ -1336,7 +1340,9 @@ static struct sdio_driver ath6kl_sdio_dr |
| .id_table = ath6kl_sdio_devices, |
| .probe = ath6kl_sdio_probe, |
| .remove = ath6kl_sdio_remove, |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| .drv.pm = ATH6KL_SDIO_PM_OPS, |
| +#endif |
| }; |
| |
| static int __init ath6kl_sdio_init(void) |
| --- a/drivers/net/wireless/libertas/if_sdio.c |
| +++ b/drivers/net/wireless/libertas/if_sdio.c |
| @@ -1306,6 +1306,7 @@ static void if_sdio_remove(struct sdio_f |
| lbs_deb_leave(LBS_DEB_SDIO); |
| } |
| |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| static int if_sdio_suspend(struct device *dev) |
| { |
| struct sdio_func *func = dev_to_sdio_func(dev); |
| @@ -1359,15 +1360,18 @@ static const struct dev_pm_ops if_sdio_p |
| .suspend = if_sdio_suspend, |
| .resume = if_sdio_resume, |
| }; |
| +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ |
| |
| static struct sdio_driver if_sdio_driver = { |
| .name = "libertas_sdio", |
| .id_table = if_sdio_ids, |
| .probe = if_sdio_probe, |
| .remove = if_sdio_remove, |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| .drv = { |
| .pm = &if_sdio_pm_ops, |
| }, |
| +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ |
| }; |
| |
| /*******************************************************************/ |
| --- a/drivers/net/wireless/mwifiex/sdio.c |
| +++ b/drivers/net/wireless/mwifiex/sdio.c |
| @@ -127,8 +127,10 @@ mwifiex_sdio_remove(struct sdio_func *fu |
| return; |
| |
| if (user_rmmod) { |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| if (adapter->is_suspended) |
| mwifiex_sdio_resume(adapter->dev); |
| +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ |
| |
| for (i = 0; i < adapter->priv_num; i++) |
| if ((GET_BSS_ROLE(adapter->priv[i]) == |
| @@ -148,6 +150,7 @@ mwifiex_sdio_remove(struct sdio_func *fu |
| kfree(card); |
| } |
| |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| /* |
| * SDIO suspend. |
| * |
| @@ -255,6 +258,7 @@ static int mwifiex_sdio_resume(struct de |
| |
| return 0; |
| } |
| +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ |
| |
| /* Device ID for SD8787 */ |
| #define SDIO_DEVICE_ID_MARVELL_8787 (0x9119) |
| @@ -270,10 +274,12 @@ static const struct sdio_device_id mwifi |
| |
| MODULE_DEVICE_TABLE(sdio, mwifiex_ids); |
| |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| static const struct dev_pm_ops mwifiex_sdio_pm_ops = { |
| .suspend = mwifiex_sdio_suspend, |
| .resume = mwifiex_sdio_resume, |
| }; |
| +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ |
| |
| static struct sdio_driver mwifiex_sdio = { |
| .name = "mwifiex_sdio", |
| @@ -282,7 +288,9 @@ static struct sdio_driver mwifiex_sdio = |
| .remove = mwifiex_sdio_remove, |
| .drv = { |
| .owner = THIS_MODULE, |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| .pm = &mwifiex_sdio_pm_ops, |
| +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ |
| } |
| }; |
| |
| --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c |
| +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c |
| @@ -59,7 +59,7 @@ static bool |
| brcmf_pm_resume_error(struct brcmf_sdio_dev *sdiodev) |
| { |
| bool is_err = false; |
| -#ifdef CONFIG_PM_SLEEP |
| +#if defined(CONFIG_PM_SLEEP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| is_err = atomic_read(&sdiodev->suspend); |
| #endif |
| return is_err; |
| @@ -68,7 +68,7 @@ brcmf_pm_resume_error(struct brcmf_sdio_ |
| static void |
| brcmf_pm_resume_wait(struct brcmf_sdio_dev *sdiodev, wait_queue_head_t *wq) |
| { |
| -#ifdef CONFIG_PM_SLEEP |
| +#if defined(CONFIG_PM_SLEEP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| int retry = 0; |
| while (atomic_read(&sdiodev->suspend) && retry++ != 30) |
| wait_event_timeout(*wq, false, HZ/100); |
| @@ -539,7 +539,7 @@ static void brcmf_ops_sdio_remove(struct |
| } |
| } |
| |
| -#ifdef CONFIG_PM_SLEEP |
| +#if defined(CONFIG_PM_SLEEP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| static int brcmf_sdio_suspend(struct device *dev) |
| { |
| mmc_pm_flag_t sdio_flags; |
| @@ -589,7 +589,7 @@ static struct sdio_driver brcmf_sdmmc_dr |
| .remove = brcmf_ops_sdio_remove, |
| .name = "brcmfmac", |
| .id_table = brcmf_sdmmc_ids, |
| -#ifdef CONFIG_PM_SLEEP |
| +#if defined(CONFIG_PM_SLEEP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) |
| .drv = { |
| .pm = &brcmf_sdio_pm_ops, |
| }, |
| |