diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2014-03-04 16:53:50 -0600 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2014-06-09 13:29:05 +0100 |
commit | b65a5347670630ec3230d6f90d28d136c7afc797 (patch) | |
tree | 34a62f9e72eaf73a0423c80156e274baaf3a254e | |
parent | 45abc77821b67dfef4288606ef6992882b12957e (diff) |
rtlwifi: rtl8192cu: Fix too long disable of IRQs
commit a53268be0cb9763f11da4f6fe3fb924cbe3a7d4a upstream.
In commit f78bccd79ba3cd9d9664981b501d57bdb81ab8a4 entitled "rtlwifi:
rtl8192ce: Fix too long disable of IRQs", Olivier Langlois
<olivier@trillion01.com> fixed a problem caused by an extra long disabling
of interrupts. This patch makes the same fix for rtl8192cu.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c index d3920daa3c3..bbd5ebae4a0 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c @@ -1158,6 +1158,17 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw) struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); int err = 0; static bool iqk_initialized; + unsigned long flags; + + /* As this function can take a very long time (up to 350 ms) + * and can be called with irqs disabled, reenable the irqs + * to let the other devices continue being serviced. + * + * It is safe doing so since our own interrupts will only be enabled + * in a subsequent step. + */ + local_save_flags(flags); + local_irq_enable(); rtlhal->hw_type = HARDWARE_TYPE_RTL8192CU; err = _rtl92cu_init_mac(hw); @@ -1171,7 +1182,7 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw) ("Failed to download FW. Init HW without FW now..\n")); err = 1; rtlhal->fw_ready = false; - return err; + goto exit; } else { rtlhal->fw_ready = true; } @@ -1212,6 +1223,8 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw) _update_mac_setting(hw); rtl92c_dm_init(hw); _dump_registers(hw); +exit: + local_irq_restore(flags); return err; } |