From: "John W. Linville" <linville@tuxdriver.com>
To: Larry Finger <Larry.Finger@lwfinger.net>
Cc: "Patrik, Kluba" <pkluba@dension.com>, linux-wireless@vger.kernel.org
Subject: Re: bug: deadlock in rtl8192cu
Date: Wed, 13 Mar 2013 11:26:23 -0400 [thread overview]
Message-ID: <20130313152623.GA10077@tuxdriver.com> (raw)
In-Reply-To: <5140977D.2040403@lwfinger.net>
On Wed, Mar 13, 2013 at 10:13:01AM -0500, Larry Finger wrote:
> Yesterday, Jussi Kivilinna and I found a problem that prevented
> rtl8192cu from reconnecting once it disconnected. That patch is
> attached.
>
> Larry
Is this your patch submission? Or will you be posting separately
(and with a clearer subject/intent)? :-)
> The driver was failing to clear the BSSID when a disconnect happened. That
> prevented a reconnection. This problem is reported at
> https://bugzilla.redhat.com/show_bug.cgi?id=789605,
> https://bugzilla.redhat.com/show_bug.cgi?id=866786,
> https://bugzilla.redhat.com/show_bug.cgi?id=906734, and
> https://bugzilla.kernel.org/show_bug.cgi?id=46171.
>
> Thanks to Jussi Kivilinna for making the critical observation
> that led to the solution.
>
> Reported-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
> Tested-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
> Cc: Stable <stable@vger.kernel.org>
> ---
>
> John,
>
> As you can see by the number of bug reports, this patch should be
> pushed as soon as possible.
>
> Thanks,
>
> Larry
> ---
>
> base.h | 3 +
> pci.c | 2 -
> rtl8192cu/hw.c | 87 ++++++++++++++++++++++-----------------------------------
> 3 files changed, 39 insertions(+), 53 deletions(-)
>
> Index: linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
> ===================================================================
> --- linux-2.6.orig/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
> +++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
> @@ -1377,74 +1377,57 @@ void rtl92cu_card_disable(struct ieee802
>
> void rtl92cu_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
> {
> - /* dummy routine needed for callback from rtl_op_configure_filter() */
> -}
> -
> -/*========================================================================== */
> -
> -static void _rtl92cu_set_check_bssid(struct ieee80211_hw *hw,
> - enum nl80211_iftype type)
> -{
> struct rtl_priv *rtlpriv = rtl_priv(hw);
> - u32 reg_rcr = rtl_read_dword(rtlpriv, REG_RCR);
> struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
> - struct rtl_phy *rtlphy = &(rtlpriv->phy);
> - u8 filterout_non_associated_bssid = false;
> + u32 reg_rcr = rtl_read_dword(rtlpriv, REG_RCR);
>
> - switch (type) {
> - case NL80211_IFTYPE_ADHOC:
> - case NL80211_IFTYPE_STATION:
> - filterout_non_associated_bssid = true;
> - break;
> - case NL80211_IFTYPE_UNSPECIFIED:
> - case NL80211_IFTYPE_AP:
> - default:
> - break;
> - }
> - if (filterout_non_associated_bssid) {
> + if (rtlpriv->psc.rfpwr_state != ERFON)
> + return;
> +
> + if (check_bssid) {
> + u8 tmp;
> if (IS_NORMAL_CHIP(rtlhal->version)) {
> - switch (rtlphy->current_io_type) {
> - case IO_CMD_RESUME_DM_BY_SCAN:
> - reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
> - rtlpriv->cfg->ops->set_hw_reg(hw,
> - HW_VAR_RCR, (u8 *)(®_rcr));
> - /* enable update TSF */
> - _rtl92cu_set_bcn_ctrl_reg(hw, 0, BIT(4));
> - break;
> - case IO_CMD_PAUSE_DM_BY_SCAN:
> - reg_rcr &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);
> - rtlpriv->cfg->ops->set_hw_reg(hw,
> - HW_VAR_RCR, (u8 *)(®_rcr));
> - /* disable update TSF */
> - _rtl92cu_set_bcn_ctrl_reg(hw, BIT(4), 0);
> - break;
> - }
> + reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
> + tmp = BIT(4);
> } else {
> - reg_rcr |= (RCR_CBSSID);
> - rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
> - (u8 *)(®_rcr));
> - _rtl92cu_set_bcn_ctrl_reg(hw, 0, (BIT(4)|BIT(5)));
> + reg_rcr |= RCR_CBSSID;
> + tmp = BIT(4) | BIT(5);
> }
> - } else if (filterout_non_associated_bssid == false) {
> + rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
> + (u8 *) (®_rcr));
> + _rtl92cu_set_bcn_ctrl_reg(hw, 0, tmp);
> + } else {
> + u8 tmp;
> if (IS_NORMAL_CHIP(rtlhal->version)) {
> - reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
> - rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
> - (u8 *)(®_rcr));
> - _rtl92cu_set_bcn_ctrl_reg(hw, BIT(4), 0);
> + reg_rcr &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);
> + tmp = BIT(4);
> } else {
> - reg_rcr &= (~RCR_CBSSID);
> - rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
> - (u8 *)(®_rcr));
> - _rtl92cu_set_bcn_ctrl_reg(hw, (BIT(4)|BIT(5)), 0);
> + reg_rcr &= ~RCR_CBSSID;
> + tmp = BIT(4) | BIT(5);
> }
> + reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
> + rtlpriv->cfg->ops->set_hw_reg(hw,
> + HW_VAR_RCR, (u8 *) (®_rcr));
> + _rtl92cu_set_bcn_ctrl_reg(hw, tmp, 0);
> }
> }
>
> +/*========================================================================== */
> +
> int rtl92cu_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
> {
> + struct rtl_priv *rtlpriv = rtl_priv(hw);
> +
> if (_rtl92cu_set_media_status(hw, type))
> return -EOPNOTSUPP;
> - _rtl92cu_set_check_bssid(hw, type);
> +
> + if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
> + if (type != NL80211_IFTYPE_AP)
> + rtl92cu_set_check_bssid(hw, true);
> + } else {
> + rtl92cu_set_check_bssid(hw, false);
> + }
> +
> return 0;
> }
>
> Index: linux-2.6/drivers/net/wireless/rtlwifi/base.h
> ===================================================================
> --- linux-2.6.orig/drivers/net/wireless/rtlwifi/base.h
> +++ linux-2.6/drivers/net/wireless/rtlwifi/base.h
> @@ -143,5 +143,8 @@ extern struct attribute_group rtl_attrib
> int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
> bool isht, u8 desc_rate, bool first_ampdu);
> bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
> +struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw,
> + u8 *sa, u8 *bssid, u16 tid);
> +void rtl_lps_change_work_callback(struct work_struct *work);
>
> #endif
> Index: linux-2.6/drivers/net/wireless/rtlwifi/pci.c
> ===================================================================
> --- linux-2.6.orig/drivers/net/wireless/rtlwifi/pci.c
> +++ linux-2.6/drivers/net/wireless/rtlwifi/pci.c
> @@ -939,7 +939,7 @@ static void _rtl_pci_prepare_bcn_tasklet
> return;
> }
>
> -static void rtl_lps_leave_work_callback(struct work_struct *work)
> +void rtl_lps_leave_work_callback(struct work_struct *work)
> {
> struct rtl_works *rtlworks =
> container_of(work, struct rtl_works, lps_leave_work);
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
next prev parent reply other threads:[~2013-03-13 15:26 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-12 15:30 bug: deadlock in rtl8192cu Patrik, Kluba
2013-03-12 15:33 ` Patrik, Kluba
2013-03-12 16:34 ` Larry Finger
2013-03-13 14:25 ` Patrik, Kluba
2013-03-13 15:11 ` Patrik, Kluba
2013-03-13 15:13 ` Larry Finger
2013-03-13 15:26 ` John W. Linville [this message]
2013-03-13 15:51 ` Patrik, Kluba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130313152623.GA10077@tuxdriver.com \
--to=linville@tuxdriver.com \
--cc=Larry.Finger@lwfinger.net \
--cc=linux-wireless@vger.kernel.org \
--cc=pkluba@dension.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.