ath6kl: propagate errors on module setup

This propagates initial platform registration failures and
also HIF initialization failures.

Cc: Naveen Singh <nsingh@atheros.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Luis R. Rodriguez 2011-03-29 17:56:21 -07:00 committed by Greg Kroah-Hartman
parent 0e7fd280fb
commit 711908df76
4 changed files with 37 additions and 35 deletions

View File

@ -125,31 +125,27 @@ ATH_DEBUG_INSTANTIATE_MODULE_VAR(hif,
/* ------ Functions ------ */
int HIFInit(OSDRV_CALLBACKS *callbacks)
{
int status;
AR_DEBUG_ASSERT(callbacks != NULL);
int r;
AR_DEBUG_ASSERT(callbacks != NULL);
A_REGISTER_MODULE_DEBUG_INFO(hif);
A_REGISTER_MODULE_DEBUG_INFO(hif);
/* store the callback handlers */
osdrvCallbacks = *callbacks;
/* store the callback handlers */
osdrvCallbacks = *callbacks;
/* Register with bus driver core */
registered = 1;
/* Register with bus driver core */
AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: HIFInit registering\n"));
registered = 1;
#if defined(CONFIG_PM)
if (callbacks->deviceSuspendHandler && callbacks->deviceResumeHandler) {
ar6k_driver.drv.pm = &ar6k_device_pm_ops;
}
if (callbacks->deviceSuspendHandler && callbacks->deviceResumeHandler)
ar6k_driver.drv.pm = &ar6k_device_pm_ops;
#endif /* CONFIG_PM */
status = sdio_register_driver(&ar6k_driver);
AR_DEBUG_ASSERT(status==0);
if (status != 0) {
return A_ERROR;
}
return 0;
r = sdio_register_driver(&ar6k_driver);
if (r < 0)
return r;
return 0;
}
static int

View File

@ -603,7 +603,7 @@ static int __init
ar6000_init_module(void)
{
static int probed = 0;
int status;
int r;
OSDRV_CALLBACKS osdrvCallbacks;
a_module_debug_support_init();
@ -636,7 +636,9 @@ ar6000_init_module(void)
osdrvCallbacks.devicePowerChangeHandler = ar6000_power_change_ev;
#endif
ar6000_pm_init();
r = ar6000_pm_init();
if (r)
return r;
#ifdef DEBUG
/* Set the debug flags if specified at load time */
@ -655,9 +657,9 @@ ar6000_init_module(void)
memset(&aptcTR, 0, sizeof(APTC_TRAFFIC_RECORD));
#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
status = HIFInit(&osdrvCallbacks);
if (status)
return -ENODEV;
r = HIFInit(&osdrvCallbacks);
if (r)
return r;
return 0;
}

View File

@ -660,24 +660,28 @@ ar6000_set_wlan_state(struct ar6_softc *ar, AR6000_WLAN_STATE state)
return status;
}
void ar6000_pm_init()
int ar6000_pm_init()
{
A_REGISTER_MODULE_DEBUG_INFO(pm);
int r;
A_REGISTER_MODULE_DEBUG_INFO(pm);
#ifdef CONFIG_PM
/*
* Register ar6000_pm_device into system.
* We should also add platform_device into the first item of array
* of devices[] in file arch/xxx/mach-xxx/board-xxxx.c
*/
if (platform_driver_register(&ar6000_pm_device)) {
AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000: fail to register the power control driver.\n"));
}
/*
* Register ar6000_pm_device into system.
* We should also add platform_device into the first item of array
* of devices[] in file arch/xxx/mach-xxx/board-xxxx.c
*/
r = platform_driver_register(&ar6000_pm_device);
if (r < 0)
return -ENODEV;
#endif /* CONFIG_PM */
return 0;
}
void ar6000_pm_exit()
{
#ifdef CONFIG_PM
platform_driver_unregister(&ar6000_pm_device);
platform_driver_unregister(&ar6000_pm_device);
#endif /* CONFIG_PM */
}

View File

@ -178,7 +178,7 @@ int ar6000_power_change_ev(void *context, u32 config);
void ar6000_check_wow_status(struct ar6_softc *ar, struct sk_buff *skb, bool isEvent);
#endif
void ar6000_pm_init(void);
int ar6000_pm_init(void);
void ar6000_pm_exit(void);
#ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT