|
@@ -544,8 +544,13 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
|
|
|
(u8 *)(&fw_current_inps));
|
|
|
}
|
|
|
break; }
|
|
|
- case HW_VAR_KEEP_ALIVE:
|
|
|
- break;
|
|
|
+ case HW_VAR_KEEP_ALIVE: {
|
|
|
+ u8 array[2];
|
|
|
+
|
|
|
+ array[0] = 0xff;
|
|
|
+ array[1] = *((u8 *)val);
|
|
|
+ rtl92c_fill_h2c_cmd(hw, H2C_92C_KEEP_ALIVE_CTRL, 2, array);
|
|
|
+ break; }
|
|
|
default:
|
|
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
|
|
"switch case %d not processed\n", variable);
|
|
@@ -1156,47 +1161,35 @@ 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;
|
|
|
- ledaction = LED_CTL_LINK;
|
|
|
+ mode = MSR_NOLINK;
|
|
|
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");
|
|
|
break;
|
|
|
case NL80211_IFTYPE_AP:
|
|
|
- bt_msr |= MSR_AP;
|
|
|
+ mode = MSR_AP;
|
|
|
+ ledaction = LED_CTL_LINK;
|
|
|
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
|
|
"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;
|
|
@@ -1207,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);
|
|
@@ -1833,7 +1849,6 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
|
|
|
u32 ratr_value;
|
|
|
u8 ratr_index = 0;
|
|
|
u8 nmode = mac->ht_enable;
|
|
|
- u8 mimo_ps = IEEE80211_SMPS_OFF;
|
|
|
u16 shortgi_rate;
|
|
|
u32 tmp_ratr_value;
|
|
|
u8 curtxbw_40mhz = mac->bw_40;
|
|
@@ -1842,6 +1857,7 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
|
|
|
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
|
|
1 : 0;
|
|
|
enum wireless_mode wirelessmode = mac->mode;
|
|
|
+ u32 ratr_mask;
|
|
|
|
|
|
if (rtlhal->current_bandtype == BAND_ON_5G)
|
|
|
ratr_value = sta->supp_rates[1] << 4;
|
|
@@ -1865,19 +1881,13 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
|
|
|
case WIRELESS_MODE_N_24G:
|
|
|
case WIRELESS_MODE_N_5G:
|
|
|
nmode = 1;
|
|
|
- if (mimo_ps == IEEE80211_SMPS_STATIC) {
|
|
|
- ratr_value &= 0x0007F005;
|
|
|
- } else {
|
|
|
- u32 ratr_mask;
|
|
|
-
|
|
|
- if (get_rf_type(rtlphy) == RF_1T2R ||
|
|
|
- get_rf_type(rtlphy) == RF_1T1R)
|
|
|
- ratr_mask = 0x000ff005;
|
|
|
- else
|
|
|
- ratr_mask = 0x0f0ff005;
|
|
|
+ if (get_rf_type(rtlphy) == RF_1T2R ||
|
|
|
+ get_rf_type(rtlphy) == RF_1T1R)
|
|
|
+ ratr_mask = 0x000ff005;
|
|
|
+ else
|
|
|
+ ratr_mask = 0x0f0ff005;
|
|
|
|
|
|
- ratr_value &= ratr_mask;
|
|
|
- }
|
|
|
+ ratr_value &= ratr_mask;
|
|
|
break;
|
|
|
default:
|
|
|
if (rtlphy->rf_type == RF_1T2R)
|
|
@@ -1930,17 +1940,16 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
|
|
|
struct rtl_sta_info *sta_entry = NULL;
|
|
|
u32 ratr_bitmap;
|
|
|
u8 ratr_index;
|
|
|
- u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
|
|
|
- u8 curshortgi_40mhz = curtxbw_40mhz &&
|
|
|
- (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
|
|
- 1 : 0;
|
|
|
+ u8 curtxbw_40mhz = (sta->ht_cap.cap &
|
|
|
+ IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
|
|
|
+ u8 curshortgi_40mhz = (sta->ht_cap.cap &
|
|
|
+ IEEE80211_HT_CAP_SGI_40) ? 1 : 0;
|
|
|
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
|
|
1 : 0;
|
|
|
enum wireless_mode wirelessmode = 0;
|
|
|
bool shortgi = false;
|
|
|
u8 rate_mask[5];
|
|
|
u8 macid = 0;
|
|
|
- u8 mimo_ps = IEEE80211_SMPS_OFF;
|
|
|
|
|
|
sta_entry = (struct rtl_sta_info *) sta->drv_priv;
|
|
|
wirelessmode = sta_entry->wireless_mode;
|
|
@@ -1985,47 +1994,38 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
|
|
|
case WIRELESS_MODE_N_5G:
|
|
|
ratr_index = RATR_INX_WIRELESS_NGB;
|
|
|
|
|
|
- if (mimo_ps == IEEE80211_SMPS_STATIC) {
|
|
|
- if (rssi_level == 1)
|
|
|
- ratr_bitmap &= 0x00070000;
|
|
|
- else if (rssi_level == 2)
|
|
|
- ratr_bitmap &= 0x0007f000;
|
|
|
- else
|
|
|
- ratr_bitmap &= 0x0007f005;
|
|
|
+ if (rtlphy->rf_type == RF_1T2R ||
|
|
|
+ rtlphy->rf_type == RF_1T1R) {
|
|
|
+ if (curtxbw_40mhz) {
|
|
|
+ if (rssi_level == 1)
|
|
|
+ ratr_bitmap &= 0x000f0000;
|
|
|
+ else if (rssi_level == 2)
|
|
|
+ ratr_bitmap &= 0x000ff000;
|
|
|
+ else
|
|
|
+ ratr_bitmap &= 0x000ff015;
|
|
|
+ } else {
|
|
|
+ if (rssi_level == 1)
|
|
|
+ ratr_bitmap &= 0x000f0000;
|
|
|
+ else if (rssi_level == 2)
|
|
|
+ ratr_bitmap &= 0x000ff000;
|
|
|
+ else
|
|
|
+ ratr_bitmap &= 0x000ff005;
|
|
|
+ }
|
|
|
} else {
|
|
|
- if (rtlphy->rf_type == RF_1T2R ||
|
|
|
- rtlphy->rf_type == RF_1T1R) {
|
|
|
- if (curtxbw_40mhz) {
|
|
|
- if (rssi_level == 1)
|
|
|
- ratr_bitmap &= 0x000f0000;
|
|
|
- else if (rssi_level == 2)
|
|
|
- ratr_bitmap &= 0x000ff000;
|
|
|
- else
|
|
|
- ratr_bitmap &= 0x000ff015;
|
|
|
- } else {
|
|
|
- if (rssi_level == 1)
|
|
|
- ratr_bitmap &= 0x000f0000;
|
|
|
- else if (rssi_level == 2)
|
|
|
- ratr_bitmap &= 0x000ff000;
|
|
|
- else
|
|
|
- ratr_bitmap &= 0x000ff005;
|
|
|
- }
|
|
|
+ if (curtxbw_40mhz) {
|
|
|
+ if (rssi_level == 1)
|
|
|
+ ratr_bitmap &= 0x0f0f0000;
|
|
|
+ else if (rssi_level == 2)
|
|
|
+ ratr_bitmap &= 0x0f0ff000;
|
|
|
+ else
|
|
|
+ ratr_bitmap &= 0x0f0ff015;
|
|
|
} else {
|
|
|
- if (curtxbw_40mhz) {
|
|
|
- if (rssi_level == 1)
|
|
|
- ratr_bitmap &= 0x0f0f0000;
|
|
|
- else if (rssi_level == 2)
|
|
|
- ratr_bitmap &= 0x0f0ff000;
|
|
|
- else
|
|
|
- ratr_bitmap &= 0x0f0ff015;
|
|
|
- } else {
|
|
|
- if (rssi_level == 1)
|
|
|
- ratr_bitmap &= 0x0f0f0000;
|
|
|
- else if (rssi_level == 2)
|
|
|
- ratr_bitmap &= 0x0f0ff000;
|
|
|
- else
|
|
|
- ratr_bitmap &= 0x0f0ff005;
|
|
|
- }
|
|
|
+ if (rssi_level == 1)
|
|
|
+ ratr_bitmap &= 0x0f0f0000;
|
|
|
+ else if (rssi_level == 2)
|
|
|
+ ratr_bitmap &= 0x0f0ff000;
|
|
|
+ else
|
|
|
+ ratr_bitmap &= 0x0f0ff005;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2058,9 +2058,6 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
|
|
|
"Rate_index:%x, ratr_val:%x, %5phC\n",
|
|
|
ratr_index, ratr_bitmap, rate_mask);
|
|
|
rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask);
|
|
|
-
|
|
|
- if (macid != 0)
|
|
|
- sta_entry->ratr_index = ratr_index;
|
|
|
}
|
|
|
|
|
|
void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw,
|