diff options
Diffstat (limited to 'drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c')
-rw-r--r-- | drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c | 58 |
1 files changed, 28 insertions, 30 deletions
diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c index ed37e8c2c9b..609f8d0f8c5 100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc_linux.c 355594 2012-09-07 10:22:02Z $ + * $Id: bcmsdh_sdmmc_linux.c 381717 2013-01-29 07:10:21Z $ */ #include <typedefs.h> @@ -136,6 +136,8 @@ static int bcmsdh_sdmmc_probe(struct sdio_func *func, #endif sd_trace(("F2 found, calling bcmsdh_probe...\n")); ret = bcmsdh_probe(&func->dev); + if (ret < 0 && gInstance) + gInstance->func[2] = NULL; } } else { ret = -ENODEV; @@ -153,10 +155,12 @@ static void bcmsdh_sdmmc_remove(struct sdio_func *func) sd_info(("sdio_device: 0x%04x\n", func->device)); sd_info(("Function#: 0x%04x\n", func->num)); - if (func->num == 2) { + if (gInstance->func[2]) { sd_trace(("F2 found, calling bcmsdh_remove...\n")); bcmsdh_remove(&func->dev); - } else if (func->num == 1) { + gInstance->func[2] = NULL; + } + if (func->num == 1) { sdio_claim_host(func); sdio_disable_func(func); sdio_release_host(func); @@ -192,11 +196,13 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev) if (func->num != 2) return 0; - sd_trace_hw4(("%s Enter\n", __FUNCTION__)); - +#ifdef CUSTOMER_HW4 + sd_err(("%s Enter\n", __FUNCTION__)); +#else + sd_trace(("%s Enter\n", __FUNCTION__)); +#endif if (dhd_os_check_wakelock(bcmsdh_get_drvdata())) return -EBUSY; - sdio_flags = sdio_get_host_pm_caps(func); if (!(sdio_flags & MMC_PM_KEEP_POWER)) { @@ -210,16 +216,10 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev) sd_err(("%s: error while trying to keep power\n", __FUNCTION__)); return ret; } - -#if !defined(CUSTOMER_HW4) -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) && !defined(CUSTOMER_HW4) bcmsdh_oob_intr_set(0); -#endif /* defined(OOB_INTR_ONLY) */ -#endif /* !defined(CUSTOMER_HW4) */ +#endif /* OOB_INTR_ONLY && !CUSTOMER_HW4 */ dhd_mmc_suspend = TRUE; -#if defined(CUSTOMER_HW4) && defined(CONFIG_ARCH_TEGRA) - irq_set_irq_wake(390, 1); -#endif smp_mb(); return 0; @@ -227,24 +227,20 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev) static int bcmsdh_sdmmc_resume(struct device *pdev) { -#if !defined(CUSTOMER_HW4) -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) && !defined(CUSTOMER_HW4) struct sdio_func *func = dev_to_sdio_func(pdev); -#endif /* defined(OOB_INTR_ONLY) */ -#endif /* defined(CUSTOMER_HW4) */ - sd_trace_hw4(("%s Enter\n", __FUNCTION__)); - +#endif /* OOB_INTR_ONLY && !CUSTOMER_HW4 */ +#ifdef CUSTOMER_HW4 + sd_err(("%s Enter\n", __FUNCTION__)); +#else + sd_trace(("%s Enter\n", __FUNCTION__)); +#endif dhd_mmc_suspend = FALSE; -#if !defined(CUSTOMER_HW4) -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) && !defined(CUSTOMER_HW4) if ((func->num == 2) && dhd_os_check_if_up(bcmsdh_get_drvdata())) bcmsdh_oob_intr_set(1); -#endif /* (OOB_INTR_ONLY) */ -#endif /* !(CUSTOMER_HW4) */ -#if defined(CUSTOMER_HW4) && defined(CONFIG_ARCH_TEGRA) - if (func->num == 2) - irq_set_irq_wake(390, 0); -#endif +#endif /* OOB_INTR_ONLY && !CUSTOMER_HW4 */ + smp_mb(); return 0; } @@ -412,7 +408,7 @@ int sdio_function_init(void) error = sdio_register_driver(&bcmsdh_sdmmc_driver); if (error && gInstance) { kfree(gInstance); - gInstance = 0; + gInstance = NULL; } return error; @@ -429,6 +425,8 @@ void sdio_function_cleanup(void) sdio_unregister_driver(&bcmsdh_sdmmc_driver); - if (gInstance) + if (gInstance) { kfree(gInstance); + gInstance = NULL; + } } |