| From ebecdcc12fed5d3c81853dea61a0a78a5aefab52 Mon Sep 17 00:00:00 2001 |
| From: Larry Finger <Larry.Finger@lwfinger.net> |
| Date: Fri, 2 Mar 2012 15:23:36 -0600 |
| Subject: rtlwifi: rtl8192c: Prevent sleeping from invalid context in rtl8192cu |
| |
| From: Larry Finger <Larry.Finger@lwfinger.net> |
| |
| commit ebecdcc12fed5d3c81853dea61a0a78a5aefab52 upstream. |
| |
| When driver rtl8192cu is used with the debug level set to 3 or greater, |
| the result is "sleeping function called from invalid context" due to |
| an rcu_read_lock() call in the DM refresh routine in driver rtl8192c. |
| This lock is not necessary as the USB driver does not use the struct |
| being protected, thus the lock is set only when a PCI interface is |
| active. |
| |
| This bug is reported in https://bugzilla.kernel.org/show_bug.cgi?id=42775. |
| |
| Reported-by: Ronald Wahl <ronald.wahl@raritan.com> |
| Tested-by: Ronald Wahl <ronald.wahl@raritan.com> |
| Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> |
| Cc: Ronald Wahl <ronald.wahl@raritan.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c |
| +++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c |
| @@ -1219,13 +1219,18 @@ static void rtl92c_dm_refresh_rate_adapt |
| ("PreState = %d, CurState = %d\n", |
| p_ra->pre_ratr_state, p_ra->ratr_state)); |
| |
| - rcu_read_lock(); |
| - sta = ieee80211_find_sta(mac->vif, mac->bssid); |
| + /* Only the PCI card uses sta in the update rate table |
| + * callback routine */ |
| + if (rtlhal->interface == INTF_PCI) { |
| + rcu_read_lock(); |
| + sta = ieee80211_find_sta(mac->vif, mac->bssid); |
| + } |
| rtlpriv->cfg->ops->update_rate_tbl(hw, sta, |
| p_ra->ratr_state); |
| |
| p_ra->pre_ratr_state = p_ra->ratr_state; |
| - rcu_read_unlock(); |
| + if (rtlhal->interface == INTF_PCI) |
| + rcu_read_unlock(); |
| } |
| } |
| } |