|
@@ -1161,36 +1161,24 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
|
|
u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
|
|
enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
|
|
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) {
|
|
switch (type) {
|
|
case NL80211_IFTYPE_UNSPECIFIED:
|
|
case NL80211_IFTYPE_UNSPECIFIED:
|
|
- bt_msr |= MSR_NOLINK;
|
|
|
|
|
|
+ mode = MSR_NOLINK;
|
|
ledaction = LED_CTL_LINK;
|
|
ledaction = LED_CTL_LINK;
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
"Set Network type to NO LINK!\n");
|
|
"Set Network type to NO LINK!\n");
|
|
break;
|
|
break;
|
|
case NL80211_IFTYPE_ADHOC:
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- bt_msr |= MSR_ADHOC;
|
|
|
|
|
|
+ mode = MSR_ADHOC;
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
"Set Network type to Ad Hoc!\n");
|
|
"Set Network type to Ad Hoc!\n");
|
|
break;
|
|
break;
|
|
case NL80211_IFTYPE_STATION:
|
|
case NL80211_IFTYPE_STATION:
|
|
- bt_msr |= MSR_INFRA;
|
|
|
|
|
|
+ mode = MSR_INFRA;
|
|
ledaction = LED_CTL_LINK;
|
|
ledaction = LED_CTL_LINK;
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
"Set Network type to STA!\n");
|
|
"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");
|
|
"Set Network type to AP!\n");
|
|
break;
|
|
break;
|
|
case NL80211_IFTYPE_MESH_POINT:
|
|
case NL80211_IFTYPE_MESH_POINT:
|
|
- bt_msr |= MSR_ADHOC;
|
|
|
|
|
|
+ mode = MSR_ADHOC;
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
"Set Network type to Mesh Point!\n");
|
|
"Set Network type to Mesh Point!\n");
|
|
break;
|
|
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);
|
|
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);
|
|
rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
|
|
else
|
|
else
|
|
rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
|
|
rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
|