diff options
author | Emil Goode <emilgoode@gmail.com> | 2014-03-09 21:06:51 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-06-07 13:25:34 -0700 |
commit | b020ee793f714e7d293078a1e0ea8a545c33b16f (patch) | |
tree | fa859c3120db7ebaf96a39ed7c2e0a32e86b8af2 /Documentation | |
parent | 5d33fff5ca9aab5ae7d28fc06179a91eb529758e (diff) | |
download | linux-3.10-b020ee793f714e7d293078a1e0ea8a545c33b16f.tar.gz linux-3.10-b020ee793f714e7d293078a1e0ea8a545c33b16f.tar.bz2 linux-3.10-b020ee793f714e7d293078a1e0ea8a545c33b16f.zip |
brcmsmac: fix deadlock on missing firmware
commit 8fc1e8c240aab968db658b2d8d079b4391207a36 upstream.
When brcm80211 firmware is not installed networking hangs.
A deadlock happens because we call ieee80211_unregister_hw()
from the .start callback of struct ieee80211_ops. When .start
is called we are under rtnl lock and ieee80211_unregister_hw()
tries to take it again.
Function call stack:
dev_change_flags()
__dev_change_flags()
__dev_open()
ASSERT_RTNL() <-- Assert rtnl lock
ops->ndo_open()
.ndo_open = ieee80211_open,
ieee80211_open()
ieee80211_do_open()
drv_start()
local->ops->start()
.start = brcms_ops_start,
brcms_ops_start()
brcms_remove()
ieee80211_unregister_hw()
rtnl_lock() <-- Here we deadlock
Introduced by:
commit 25b5632fb35ca61b8ae3eee235edcdc2883f7a5e
("brcmsmac: request firmware in .start() callback")
This patch fixes the bug by removing the call to brcms_remove()
and moves the brcms_request_fw() call to the top of the .start
callback to not initiate anything unless firmware is installed.
Signed-off-by: Emil Goode <emilgoode@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'Documentation')
0 files changed, 0 insertions, 0 deletions