return 0;
 }
 
-/* For now, IEEE80211_HW_TIMING_BEACON_ONLY can make things simple to ensure
- * correctness of MCC calculation logic below. We have noticed that once driver
- * declares WIPHY_FLAG_SUPPORTS_MLO, the use of IEEE80211_HW_TIMING_BEACON_ONLY
- * will be restricted. We will make an alternative in driver when it is ready
- * for MLO.
- */
 static u32 rtw89_mcc_get_tbtt_ofst(struct rtw89_dev *rtwdev,
                                   struct rtw89_mcc_role *role, u64 tsf)
 {
        struct rtw89_vif *rtwvif = role->rtwvif;
-       struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
        u32 bcn_intvl_us = ieee80211_tu_to_usec(role->beacon_interval);
-       u64 sync_tsf = vif->bss_conf.sync_tsf;
+       u64 sync_tsf = READ_ONCE(rtwvif->sync_bcn_tsf);
        u32 remainder;
 
        if (tsf < sync_tsf) {
 
                ieee80211_queue_work(rtwdev->hw, &rtwdev->cancel_6ghz_probe_work);
 }
 
+static void rtw89_vif_sync_bcn_tsf(struct rtw89_vif *rtwvif,
+                                  struct ieee80211_hdr *hdr, size_t len)
+{
+       struct ieee80211_mgmt *mgmt = (typeof(mgmt))hdr;
+
+       if (len < offsetof(typeof(*mgmt), u.beacon.variable))
+               return;
+
+       WRITE_ONCE(rtwvif->sync_bcn_tsf, le64_to_cpu(mgmt->u.beacon.timestamp));
+}
+
 static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,
                                    struct ieee80211_vif *vif)
 {
                return;
 
        if (ieee80211_is_beacon(hdr->frame_control)) {
-               if (vif->type == NL80211_IFTYPE_STATION)
+               if (vif->type == NL80211_IFTYPE_STATION) {
+                       rtw89_vif_sync_bcn_tsf(rtwvif, hdr, skb->len);
                        rtw89_fw_h2c_rssi_offload(rtwdev, phy_ppdu);
+               }
                pkt_stat->beacon_nr++;
        }
 
        ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
        ieee80211_hw_set(hw, WANT_MONITOR_VIF);
 
-       /* ref: description of rtw89_mcc_get_tbtt_ofst() in chan.c */
-       ieee80211_hw_set(hw, TIMING_BEACON_ONLY);
-
        if (chip->support_bandwidths & BIT(NL80211_CHAN_WIDTH_160))
                ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
 
 
                ether_addr_copy(rtwvif->bssid, conf->bssid);
                rtw89_cam_bssid_changed(rtwdev, rtwvif);
                rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
+               WRITE_ONCE(rtwvif->sync_bcn_tsf, 0);
        }
 
        if (changed & BSS_CHANGED_BEACON)