diff options
| author | Arend van Spriel <arend@broadcom.com> | 2012-03-02 16:55:49 -0500 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2012-03-05 15:53:59 -0500 |
| commit | e64a4b708fd5b719b54f7f969895b66bcba71486 (patch) | |
| tree | ae1b14679701533c2c65b364f325222fa5f34cea | |
| parent | 549040abbc03e87bdee2964fea5e4c827471d4df (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.c | 18 |
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 | ||
| 1184 | static int __init brcmfmac_init(void) | 1184 | static 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 | } | ||
| 1193 | static DECLARE_WORK(brcmf_driver_work, brcmf_driver_init); | ||
| 1194 | |||
| 1195 | static 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 | ||
| 1195 | static void __exit brcmfmac_exit(void) | 1203 | static 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 | ||
| 1205 | module_init(brcmfmac_init); | 1215 | module_init(brcmfmac_module_init); |
| 1206 | module_exit(brcmfmac_exit); | 1216 | module_exit(brcmfmac_module_exit); |
