aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2012-03-02 16:55:49 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-03-05 15:53:59 -0500
commite64a4b708fd5b719b54f7f969895b66bcba71486 (patch)
treeae1b14679701533c2c65b364f325222fa5f34cea
parent549040abbc03e87bdee2964fea5e4c827471d4df (diff)
brcm80211: fmac: remove firmware requests from init_module syscall
As indicated in [1] on netdev mailing list drivers should not block on the init_module() syscall. This patch defers the actual driver registration to a workqueue so the init_module() syscall can complete without delay. [1] http://article.gmane.org/gmane.linux.network/217729/ Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index e7345569e9de..2a1e5ae0c402 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -1181,7 +1181,7 @@ exit:
1181} 1181}
1182#endif /* DEBUG */ 1182#endif /* DEBUG */
1183 1183
1184static int __init brcmfmac_init(void) 1184static void brcmf_driver_init(struct work_struct *work)
1185{ 1185{
1186#ifdef CONFIG_BRCMFMAC_SDIO 1186#ifdef CONFIG_BRCMFMAC_SDIO
1187 brcmf_sdio_init(); 1187 brcmf_sdio_init();
@@ -1189,11 +1189,21 @@ static int __init brcmfmac_init(void)
1189#ifdef CONFIG_BRCMFMAC_USB 1189#ifdef CONFIG_BRCMFMAC_USB
1190 brcmf_usb_init(); 1190 brcmf_usb_init();
1191#endif 1191#endif
1192}
1193static DECLARE_WORK(brcmf_driver_work, brcmf_driver_init);
1194
1195static int __init brcmfmac_module_init(void)
1196{
1197 if (!schedule_work(&brcmf_driver_work))
1198 return -EBUSY;
1199
1192 return 0; 1200 return 0;
1193} 1201}
1194 1202
1195static void __exit brcmfmac_exit(void) 1203static void __exit brcmfmac_module_exit(void)
1196{ 1204{
1205 cancel_work_sync(&brcmf_driver_work);
1206
1197#ifdef CONFIG_BRCMFMAC_SDIO 1207#ifdef CONFIG_BRCMFMAC_SDIO
1198 brcmf_sdio_exit(); 1208 brcmf_sdio_exit();
1199#endif 1209#endif
@@ -1202,5 +1212,5 @@ static void __exit brcmfmac_exit(void)
1202#endif 1212#endif
1203} 1213}
1204 1214
1205module_init(brcmfmac_init); 1215module_init(brcmfmac_module_init);
1206module_exit(brcmfmac_exit); 1216module_exit(brcmfmac_module_exit);