rtw_core_scan_complete(rtwdev, vif, true);
 
        rtwvif = (struct rtw_vif *)vif->drv_priv;
-       if (rtwvif->net_type == RTW_NET_MGD_LINKED) {
+       if (chan) {
                hal->current_channel = chan;
                hal->current_band_type = chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
        }
                        bool enable)
 {
        struct rtw_vif *rtwvif = vif ? (struct rtw_vif *)vif->drv_priv : NULL;
+       struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info;
        struct rtw_ch_switch_option cs_option = {0};
        struct rtw_chan_list chan_list = {0};
        int ret = 0;
                return -EINVAL;
 
        cs_option.switch_en = enable;
-       cs_option.back_op_en = rtwvif->net_type == RTW_NET_MGD_LINKED;
+       cs_option.back_op_en = scan_info->op_chan != 0;
        if (enable) {
                ret = rtw_hw_scan_prehandle(rtwdev, rtwvif, &chan_list);
                if (ret)
        scan_info->op_pri_ch_idx = hal->current_primary_channel_index;
 }
 
+void rtw_clear_op_chan(struct rtw_dev *rtwdev)
+{
+       struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info;
+
+       scan_info->op_chan = 0;
+       scan_info->op_bw = 0;
+       scan_info->op_pri_ch_idx = 0;
+}
+
 static bool rtw_is_op_chan(struct rtw_dev *rtwdev, u8 channel)
 {
        struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info;
 
 void rtw_fw_scan_notify(struct rtw_dev *rtwdev, bool start);
 void rtw_fw_adaptivity(struct rtw_dev *rtwdev);
 void rtw_store_op_chan(struct rtw_dev *rtwdev);
+void rtw_clear_op_chan(struct rtw_dev *rtwdev);
 void rtw_hw_scan_start(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
                       struct ieee80211_scan_request *req);
 void rtw_hw_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
 
                        rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc);
                        if (rtw_bf_support)
                                rtw_bf_assoc(rtwdev, vif, conf);
-                       rtw_store_op_chan(rtwdev);
                } else {
                        rtw_leave_lps(rtwdev);
                        rtw_bf_disassoc(rtwdev, vif, conf);
        if (changed & BSS_CHANGED_BSSID) {
                ether_addr_copy(rtwvif->bssid, conf->bssid);
                config |= PORT_SET_BSSID;
+               if (is_zero_ether_addr(rtwvif->bssid))
+                       rtw_clear_op_chan(rtwdev);
+               else
+                       rtw_store_op_chan(rtwdev);
        }
 
        if (changed & BSS_CHANGED_BEACON_INT) {