mirror of https://gitee.com/openkylin/linux.git
rtlwifi: rtl8192ce: Update setting of the media status
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>
This commit is contained in:
parent
1ed03272b5
commit
9d62c5531b
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue