rtlwifi: rtl8192ce: Update setting of the media status
authorLarry Finger <Larry.Finger@lwfinger.net>
Thu, 18 Dec 2014 09:05:28 +0000 (03:05 -0600)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 24 Dec 2014 16:29:49 +0000 (18:29 +0200)
This patch applies changes found in the latest vendor driver.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/rtlwifi/rtl8192ce/hw.c

index b63b78b..2ee778a 100644 (file)
@@ -1161,36 +1161,24 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
        enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
-       bt_msr &= 0xfc;
+       u8 mode = MSR_NOLINK;
 
-       if (type == NL80211_IFTYPE_UNSPECIFIED ||
-           type == NL80211_IFTYPE_STATION) {
-               _rtl92ce_stop_tx_beacon(hw);
-               _rtl92ce_enable_bcn_sub_func(hw);
-       } else if (type == NL80211_IFTYPE_ADHOC || type == NL80211_IFTYPE_AP ||
-                  type == NL80211_IFTYPE_MESH_POINT) {
-               _rtl92ce_resume_tx_beacon(hw);
-               _rtl92ce_disable_bcn_sub_func(hw);
-       } else {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        "Set HW_VAR_MEDIA_STATUS: No such media status(%x)\n",
-                        type);
-       }
+       bt_msr &= 0xfc;
 
        switch (type) {
        case NL80211_IFTYPE_UNSPECIFIED:
-               bt_msr |= MSR_NOLINK;
+               mode = MSR_NOLINK;
                ledaction = LED_CTL_LINK;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
                         "Set Network type to NO LINK!\n");
                break;
        case NL80211_IFTYPE_ADHOC:
-               bt_msr |= MSR_ADHOC;
+               mode = MSR_ADHOC;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
                         "Set Network type to Ad Hoc!\n");
                break;
        case NL80211_IFTYPE_STATION:
-               bt_msr |= MSR_INFRA;
+               mode = MSR_INFRA;
                ledaction = LED_CTL_LINK;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
                         "Set Network type to STA!\n");
@@ -1201,7 +1189,7 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
                         "Set Network type to AP!\n");
                break;
        case NL80211_IFTYPE_MESH_POINT:
-               bt_msr |= MSR_ADHOC;
+               mode = MSR_ADHOC;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
                         "Set Network type to Mesh Point!\n");
                break;
@@ -1212,9 +1200,32 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
 
        }
 
-       rtl_write_byte(rtlpriv, (MSR), bt_msr);
+       /* MSR_INFRA == Link in infrastructure network;
+        * MSR_ADHOC == Link in ad hoc network;
+        * Therefore, check link state is necessary.
+        *
+        * MSR_AP == AP mode; link state does not matter here.
+        */
+       if (mode != MSR_AP &&
+           rtlpriv->mac80211.link_state < MAC80211_LINKED) {
+               mode = MSR_NOLINK;
+               ledaction = LED_CTL_NO_LINK;
+       }
+       if (mode == MSR_NOLINK || mode == MSR_INFRA) {
+               _rtl92ce_stop_tx_beacon(hw);
+               _rtl92ce_enable_bcn_sub_func(hw);
+       } else if (mode == MSR_ADHOC || mode == MSR_AP) {
+               _rtl92ce_resume_tx_beacon(hw);
+               _rtl92ce_disable_bcn_sub_func(hw);
+       } else {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
+                        "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
+                        mode);
+       }
+       rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
+
        rtlpriv->cfg->ops->led_control(hw, ledaction);
-       if ((bt_msr & MSR_MASK) == MSR_AP)
+       if (mode == MSR_AP)
                rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
        else
                rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);