--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c 2012-03-20 20:03:15.862852351 -0400 +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c 2012-03-20 20:14:48.526635637 -0400 @@ -1265,26 +1265,32 @@ static struct pci_driver brcms_pci_drive /** * This is the main entry point for the WL driver. * - * This function determines if a device pointed to by pdev is a WL device, - * and if so, performs a brcms_attach() on it. - * + * This function is scheduled upon module initialization and + * does the driver registration, which result in brcms_bcma_probe() + * call resulting in the driver bringup. */ -static int __init brcms_module_init(void) +static void brcms_driver_init(struct work_struct *work) { - int error = -ENODEV; + int error; + + error = bcma_driver_register(&brcms_bcma_driver); + if (error) + pr_err("%s: register returned %d\n", __func__, error); +} + +static DECLARE_WORK(brcms_driver_work, brcms_driver_init); +static int __init brcms_module_init(void) +{ #ifdef BCMDBG if (msglevel != 0xdeadbeef) brcm_msg_level = msglevel; -#endif /* BCMDBG */ - - error = pci_register_driver(&brcms_pci_driver); - if (!error) - return 0; - +#endif + if (!schedule_work(&brcms_driver_work)) + return -EBUSY; - return error; + return 0; } /** @@ -1296,6 +1302,7 @@ static int __init brcms_module_init(void */ static void __exit brcms_module_exit(void) { + cancel_work_sync(&brcms_driver_work); pci_unregister_driver(&brcms_pci_driver); }