lkml.org 
[lkml]   [2013]   [Apr]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 040/171 ] rtlwifi: rtl8192cu: Fix problem that prevents reassociation
    3.6.11.2 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Larry Finger <Larry.Finger@lwfinger.net>

    [ Upstream commit 9437a248e7cac427c898bdb11bd1ac6844a1ead4 ]

    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>
    Tested-by: Alessandro Lannocca <alessandro.lannocca@gmail.com>
    Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
    Cc: Stable <stable@vger.kernel.org>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 87 +++++++++++----------------
    1 file changed, 35 insertions(+), 52 deletions(-)

    diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
    index b4b2e43..82167ac 100644
    --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
    +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
    @@ -1377,74 +1377,57 @@ void rtl92cu_card_disable(struct ieee80211_hw *hw)

    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 *)(&reg_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 *)(&reg_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 *)(&reg_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 *) (&reg_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 *)(&reg_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 *)(&reg_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 *) (&reg_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;
    }

    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-04-11 23:41    [W:7.152 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site