struct rtl_sta_info *sta_entry =
                        (struct rtl_sta_info *) sta->drv_priv;
                sta_entry->mimo_ps = smps;
-               /* rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0); */
+               /* rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0, true); */
 
                info->control.rates[0].idx = 0;
                info->band = hw->conf.chandef.chan->band;
 
                memcpy(sta_entry->mac_addr, sta->addr, ETH_ALEN);
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
                        "Add sta addr is %pM\n", sta->addr);
-               rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
+               rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0, true);
        }
 
        return 0;
                        }
 
                        if (vif->type == NL80211_IFTYPE_STATION)
-                               rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
+                               rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0,
+                                                                  true);
                        rcu_read_unlock();
 
                        /* to avoid AP Disassociation caused by inactivity */
 
                        sta = rtl_find_sta(hw, mac->bssid);
                        if (sta)
                                rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
-                                                                  p_ra->ratr_state);
+                                                       p_ra->ratr_state,
+                                                                  true);
                        rcu_read_unlock();
 
                        p_ra->pre_ratr_state = p_ra->ratr_state;
 
 }
 
 static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 }
 
 void rtl88ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        if (rtlpriv->dm.useramask)
-               rtl88ee_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl88ee_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
        else
                rtl88ee_update_hal_rate_table(hw, sta);
 }
 
                                   u32 add_msr, u32 rm_msr);
 void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl88ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                struct ieee80211_sta *sta, u8 rssi_level);
+                                struct ieee80211_sta *sta, u8 rssi_level,
+                                bool update_bw);
 void rtl88ee_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl88ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl88ee_enable_hw_security_config(struct ieee80211_hw *hw);
 
 }
 
 static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 }
 
 void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        if (rtlpriv->dm.useramask)
-               rtl92ce_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl92ce_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
        else
                rtl92ce_update_hal_rate_table(hw, sta);
 }
 
                                   u32 add_msr, u32 rm_msr);
 void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                struct ieee80211_sta *sta, u8 rssi_level);
-void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                struct ieee80211_sta *sta, u8 rssi_level);
+                                struct ieee80211_sta *sta, u8 rssi_level,
+                                bool update_bw);
 void rtl92ce_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl92ce_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl92ce_enable_hw_security_config(struct ieee80211_hw *hw);
 
 
 static void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw,
                                         struct ieee80211_sta *sta,
-                                        u8 rssi_level)
+                                        u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
 void rtl92cu_update_hal_rate_tbl(struct ieee80211_hw *hw,
                                 struct ieee80211_sta *sta,
-                                u8 rssi_level)
+                                u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        if (rtlpriv->dm.useramask)
-               rtl92cu_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl92cu_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
        else
                rtl92cu_update_hal_rate_table(hw, sta);
 }
 
 bool rtl92cu_phy_mac_config(struct ieee80211_hw *hw);
 void rtl92cu_update_hal_rate_tbl(struct ieee80211_hw *hw,
                                 struct ieee80211_sta *sta,
-                                u8 rssi_level);
+                                u8 rssi_level, bool update_bw);
 
 #endif
 
 }
 
 static void rtl92de_update_hal_rate_mask(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 }
 
 void rtl92de_update_hal_rate_tbl(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        if (rtlpriv->dm.useramask)
-               rtl92de_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl92de_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
        else
                rtl92de_update_hal_rate_table(hw, sta);
 }
 
                                   u32 add_msr, u32 rm_msr);
 void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl92de_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                struct ieee80211_sta *sta, u8 rssi_level);
+                                struct ieee80211_sta *sta, u8 rssi_level,
+                                bool update_bw);
 void rtl92de_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl92de_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl92de_enable_hw_security_config(struct ieee80211_hw *hw);
 
                        sta = rtl_find_sta(hw, mac->bssid);
                        if (sta)
                                rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
-                                                             p_ra->ratr_state);
+                                                             p_ra->ratr_state,
+                                                             true);
                        rcu_read_unlock();
 
                        p_ra->pre_ratr_state = p_ra->ratr_state;
 
 
 static void rtl92ee_update_hal_rate_mask(struct ieee80211_hw *hw,
                                         struct ieee80211_sta *sta,
-                                        u8 rssi_level)
+                                        u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &rtlpriv->phy;
                                       (ratr_index << 28);
        rate_mask[0] = macid;
        rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
-       rate_mask[2] = curtxbw_40mhz;
+       rate_mask[2] = curtxbw_40mhz | ((!update_bw) << 3);
        rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
        rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
        rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
 }
 
 void rtl92ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                struct ieee80211_sta *sta, u8 rssi_level)
+                                struct ieee80211_sta *sta, u8 rssi_level,
+                                bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        if (rtlpriv->dm.useramask)
-               rtl92ee_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl92ee_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
 }
 
 void rtl92ee_update_channel_access_setting(struct ieee80211_hw *hw)
 
                                   u32 add_msr, u32 rm_msr);
 void rtl92ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl92ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                struct ieee80211_sta *sta, u8 rssi_level);
+                                struct ieee80211_sta *sta, u8 rssi_level,
+                                bool update_bw);
 void rtl92ee_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl92ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl92ee_enable_hw_security_config(struct ieee80211_hw *hw);
 
                        sta = rtl_find_sta(hw, mac->bssid);
                        if (sta)
                                rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
-                                                          ra->ratr_state);
+                                                          ra->ratr_state,
+                                                          true);
                        rcu_read_unlock();
 
                        ra->pre_ratr_state = ra->ratr_state;
 
 
 static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw,
                                         struct ieee80211_sta *sta,
-                                        u8 rssi_level)
+                                        u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 }
 
 void rtl92se_update_hal_rate_tbl(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        if (rtlpriv->dm.useramask)
-               rtl92se_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl92se_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
        else
                rtl92se_update_hal_rate_table(hw, sta);
 }
 
 void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable,
                        u8 *val);
 void rtl92se_update_hal_rate_tbl(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level);
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw);
 void rtl92se_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl92se_gpio_radio_on_off_checking(struct ieee80211_hw *hw,
                                        u8 *valid);
 
 
 static void rtl8723e_update_hal_rate_mask(struct ieee80211_hw *hw,
                                          struct ieee80211_sta *sta,
-                                         u8 rssi_level)
+                                         u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 }
 
 void rtl8723e_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                 struct ieee80211_sta *sta, u8 rssi_level)
+                                 struct ieee80211_sta *sta, u8 rssi_level,
+                                 bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        if (rtlpriv->dm.useramask)
-               rtl8723e_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl8723e_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
        else
                rtl8723e_update_hal_rate_table(hw, sta);
 }
 
                                    u32 add_msr, u32 rm_msr);
 void rtl8723e_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl8723e_update_hal_rate_tbl(struct ieee80211_hw *hw,
-                                 struct ieee80211_sta *sta, u8 rssi_level);
+                                 struct ieee80211_sta *sta, u8 rssi_level,
+                                 bool update_bw);
 void rtl8723e_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl8723e_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl8723e_enable_hw_security_config(struct ieee80211_hw *hw);
 
                        sta = rtl_find_sta(hw, mac->bssid);
                        if (sta)
                                rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
-                                                          p_ra->ratr_state);
+                                                          p_ra->ratr_state,
+                                                          true);
                        rcu_read_unlock();
 
                        p_ra->pre_ratr_state = p_ra->ratr_state;
 
 
 static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
                                           struct ieee80211_sta *sta,
-                                          u8 rssi_level)
+                                          u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
        rate_mask[0] = macid;
        rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) |
                                                      (shortgi ? 0x80 : 0x00);
-       rate_mask[2] = curtxbw_40mhz;
+       rate_mask[2] = curtxbw_40mhz | ((!update_bw) << 3);
 
        rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
        rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
 
 void rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw,
                                   struct ieee80211_sta *sta,
-                                  u8 rssi_level)
+                                  u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        if (rtlpriv->dm.useramask)
-               rtl8723be_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl8723be_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
 }
 
 void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw)
 
 void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw,
                                   struct ieee80211_sta *sta,
-                                  u8 rssi_level);
+                                  u8 rssi_level, bool update_bw);
 void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw);
 
                        sta = rtl_find_sta(hw, mac->bssid);
                        if (sta)
                                rtlpriv->cfg->ops->update_rate_tbl(hw,
-                                               sta, p_ra->ratr_state);
+                                               sta, p_ra->ratr_state, true);
                        rcu_read_unlock();
 
                        p_ra->pre_ratr_state = p_ra->ratr_state;
 
 }
 
 static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &rtlpriv->phy;
 
        rate_mask[0] = macid;
        rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
-       rate_mask[2] = rtlphy->current_chan_bw
+       rate_mask[2] = rtlphy->current_chan_bw | ((!update_bw) << 3)
                           | _rtl8821ae_get_vht_eni(wirelessmode, ratr_bitmap)
                           | _rtl8821ae_get_ra_ldpc(hw, macid, sta_entry, wirelessmode);
 
 }
 
 void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
-               struct ieee80211_sta *sta, u8 rssi_level)
+               struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        if (rtlpriv->dm.useramask)
-               rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level);
+               rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
        else
                /*RT_TRACE(rtlpriv, COMP_RATR,DBG_LOUD,
                           "rtl8821ae_update_hal_rate_tbl() Error! 8821ae FW RA Only\n");*/
 
 void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
 void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
                                   struct ieee80211_sta *sta,
-                                  u8 rssi_level);
+                                  u8 rssi_level, bool update_bw);
 void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw);
 bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
 void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw);
 
        void (*get_hw_reg) (struct ieee80211_hw *hw, u8 variable, u8 *val);
        void (*set_hw_reg) (struct ieee80211_hw *hw, u8 variable, u8 *val);
        void (*update_rate_tbl) (struct ieee80211_hw *hw,
-                             struct ieee80211_sta *sta, u8 rssi_level);
+                             struct ieee80211_sta *sta, u8 rssi_leve,
+                             bool update_bw);
        void (*pre_fill_tx_bd_desc)(struct ieee80211_hw *hw, u8 *tx_bd_desc,
                                    u8 *desc, u8 queue_index,
                                    struct sk_buff *skb, dma_addr_t addr);