rtw89_iterate_mcc_roles(rtwdev, rtw89_mcc_upd_lmt_iterator, NULL);
 }
 
-void rtw89_chanctx_work(struct work_struct *work)
+void rtw89_chanctx_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                chanctx_work.work);
        rtw89_debug(rtwdev, RTW89_DBG_CHAN,
                    "queue chanctx work for mode %d with delay %d us\n",
                    mode, delay);
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->chanctx_work,
-                                    usecs_to_jiffies(delay));
+       wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->chanctx_work,
+                                usecs_to_jiffies(delay));
 }
 
 void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev)
 
                              const struct cfg80211_chan_def *chandef);
 void rtw89_entity_init(struct rtw89_dev *rtwdev);
 enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev);
-void rtw89_chanctx_work(struct work_struct *work);
+void rtw89_chanctx_work(struct wiphy *wiphy, struct wiphy_work *work);
 void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev);
 void rtw89_queue_chanctx_change(struct rtw89_dev *rtwdev,
                                enum rtw89_chanctx_changes change);
 
        _fw_set_drv_info(rtwdev, CXDRVINFO_ROLE);
 }
 
-void rtw89_coex_act1_work(struct work_struct *work)
+void rtw89_coex_act1_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                coex_act1_work.work);
        mutex_unlock(&rtwdev->mutex);
 }
 
-void rtw89_coex_bt_devinfo_work(struct work_struct *work)
+void rtw89_coex_bt_devinfo_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                coex_bt_devinfo_work.work);
        mutex_unlock(&rtwdev->mutex);
 }
 
-void rtw89_coex_rfk_chk_work(struct work_struct *work)
+void rtw89_coex_rfk_chk_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                coex_rfk_chk_work.work);
                            "[BTC], %s(): EAPOL_End cnt=%d\n",
                            __func__, cnt);
                wl->status.map._4way = false;
-               cancel_delayed_work(&rtwdev->coex_act1_work);
+               wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work);
                break;
        case PACKET_ARP:
                cnt = ++cx->cnt_wl[BTC_WCNT_ARP];
        }
 
        if (delay_work) {
-               cancel_delayed_work(&rtwdev->coex_act1_work);
-               ieee80211_queue_delayed_work(rtwdev->hw,
-                                            &rtwdev->coex_act1_work, delay);
+               wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work);
+               wiphy_delayed_work_queue(rtwdev->hw->wiphy,
+                                        &rtwdev->coex_act1_work, delay);
        }
 
        btc->dm.cnt_notify[BTC_NCNT_SPECIAL_PACKET]++;
        _run_coex(rtwdev, BTC_RSN_NTFY_SPECIFIC_PACKET);
 }
 
-void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_eapol_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                btc.eapol_notify_work);
        mutex_unlock(&rtwdev->mutex);
 }
 
-void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_arp_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                btc.arp_notify_work);
        mutex_unlock(&rtwdev->mutex);
 }
 
-void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_dhcp_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                btc.dhcp_notify_work);
        mutex_unlock(&rtwdev->mutex);
 }
 
-void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_icmp_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                btc.icmp_notify_work);
                a2dp->vendor_id = 0;
                a2dp->flush_time = 0;
                a2dp->play_latency = 1;
-               ieee80211_queue_delayed_work(rtwdev->hw,
-                                            &rtwdev->coex_bt_devinfo_work,
-                                            RTW89_COEX_BT_DEVINFO_WORK_PERIOD);
+               wiphy_delayed_work_queue(rtwdev->hw->wiphy,
+                                        &rtwdev->coex_bt_devinfo_work,
+                                        RTW89_COEX_BT_DEVINFO_WORK_PERIOD);
        }
 
        _run_coex(rtwdev, BTC_RSN_UPDATE_BT_INFO);
                wl->rfk_info.state = BTC_WRFK_STOP;
 
                _write_scbd(rtwdev, BTC_WSCB_WLRFK, false);
-               cancel_delayed_work(&rtwdev->coex_rfk_chk_work);
+               wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_rfk_chk_work);
                break;
        default:
                rtw89_debug(rtwdev, RTW89_DBG_BTC,
                        _run_coex(rtwdev, BTC_RSN_NTFY_WL_RFK);
 
                if (wl->rfk_info.state == BTC_WRFK_START)
-                       ieee80211_queue_delayed_work(rtwdev->hw,
-                                                    &rtwdev->coex_rfk_chk_work,
-                                                    RTW89_COEX_RFK_CHK_WORK_PERIOD);
+                       wiphy_delayed_work_queue(rtwdev->hw->wiphy,
+                                                &rtwdev->coex_rfk_chk_work,
+                                                RTW89_COEX_RFK_CHK_WORK_PERIOD);
        }
 
        rtw89_debug(rtwdev, RTW89_DBG_BTC,
        bool allow;
        int ret;
 
+       lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
        band = FIELD_GET(BTC_RFK_BAND_MAP, phy_map);
 
        rtw89_debug(rtwdev, RTW89_DBG_RFK,
 
 void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
 void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
                                    enum btc_pkt_type pkt_type);
-void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work);
-void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work);
-void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work);
-void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work);
+void rtw89_btc_ntfy_eapol_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_btc_ntfy_arp_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_btc_ntfy_dhcp_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_btc_ntfy_icmp_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
 void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev,
                              struct rtw89_vif_link *rtwvif_link,
                              struct rtw89_sta_link *rtwsta_link,
 void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
                          u32 len, u8 class, u8 func);
 void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m);
-void rtw89_coex_act1_work(struct work_struct *work);
-void rtw89_coex_bt_devinfo_work(struct work_struct *work);
-void rtw89_coex_rfk_chk_work(struct work_struct *work);
+void rtw89_coex_act1_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_coex_bt_devinfo_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_coex_rfk_chk_work(struct wiphy *wiphy, struct wiphy_work *work);
 void rtw89_coex_power_on(struct rtw89_dev *rtwdev);
 void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type);
 void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type);
 
 rtw89_core_tx_btc_spec_pkt_notify(struct rtw89_dev *rtwdev,
                                  struct rtw89_core_tx_request *tx_req)
 {
+       struct wiphy *wiphy = rtwdev->hw->wiphy;
        struct sk_buff *skb = tx_req->skb;
        struct udphdr *udphdr;
 
        if (IEEE80211_SKB_CB(skb)->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO) {
-               ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.eapol_notify_work);
+               wiphy_work_queue(wiphy, &rtwdev->btc.eapol_notify_work);
                return PACKET_EAPOL;
        }
 
        if (skb->protocol == htons(ETH_P_ARP)) {
-               ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.arp_notify_work);
+               wiphy_work_queue(wiphy, &rtwdev->btc.arp_notify_work);
                return PACKET_ARP;
        }
 
                if (((udphdr->source == htons(67) && udphdr->dest == htons(68)) ||
                     (udphdr->source == htons(68) && udphdr->dest == htons(67))) &&
                    skb->len > 282) {
-                       ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.dhcp_notify_work);
+                       wiphy_work_queue(wiphy, &rtwdev->btc.dhcp_notify_work);
                        return PACKET_DHCP;
                }
        }
 
        if (skb->protocol == htons(ETH_P_IP) &&
            ip_hdr(skb)->protocol == IPPROTO_ICMP) {
-               ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.icmp_notify_work);
+               wiphy_work_queue(wiphy, &rtwdev->btc.icmp_notify_work);
                return PACKET_ICMP;
        }
 
        }
 }
 
-static void rtw89_cancel_6ghz_probe_work(struct work_struct *work)
+static void rtw89_cancel_6ghz_probe_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                cancel_6ghz_probe_work);
        }
 
        if (queue_work)
-               ieee80211_queue_work(rtwdev->hw, &rtwdev->cancel_6ghz_probe_work);
+               wiphy_work_queue(rtwdev->hw->wiphy, &rtwdev->cancel_6ghz_probe_work);
 }
 
 static void rtw89_vif_sync_bcn_tsf(struct rtw89_vif_link *rtwvif_link,
        ieee80211_txq_schedule_end(hw, ac);
 }
 
-static void rtw89_ips_work(struct work_struct *work)
+static void rtw89_ips_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                ips_work);
        rtw89_write32_clr(rtwdev, reg, B_AX_A_UC_CAM_MATCH | B_AX_A_BC_CAM_MATCH);
 
        ieee80211_ready_on_channel(hw);
-       cancel_delayed_work(&rtwvif->roc.roc_work);
-       ieee80211_queue_delayed_work(hw, &rtwvif->roc.roc_work,
-                                    msecs_to_jiffies(rtwvif->roc.duration));
+       wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work);
+       wiphy_delayed_work_queue(hw->wiphy, &rtwvif->roc.roc_work,
+                                msecs_to_jiffies(rtwvif->roc.duration));
 }
 
 void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
        queue_work(rtwdev->txq_wq, &rtwdev->txq_work);
 
        if (hw->conf.flags & IEEE80211_CONF_IDLE)
-               ieee80211_queue_delayed_work(hw, &roc->roc_work,
-                                            msecs_to_jiffies(RTW89_ROC_IDLE_TIMEOUT));
+               wiphy_delayed_work_queue(hw->wiphy, &roc->roc_work,
+                                        msecs_to_jiffies(RTW89_ROC_IDLE_TIMEOUT));
 }
 
-void rtw89_roc_work(struct work_struct *work)
+void rtw89_roc_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_vif *rtwvif = container_of(work, struct rtw89_vif,
                                                roc.roc_work.work);
        ewma_tp_init(&stats->rx_ewma_tp);
 }
 
-static void rtw89_track_work(struct work_struct *work)
+static void rtw89_track_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                track_work.work);
        if (!test_bit(RTW89_FLAG_RUNNING, rtwdev->flags))
                goto out;
 
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
-                                    RTW89_TRACK_WORK_PERIOD);
+       wiphy_delayed_work_queue(wiphy, &rtwdev->track_work,
+                                RTW89_TRACK_WORK_PERIOD);
 
        tfc_changed = rtw89_traffic_stats_track(rtwdev);
        if (rtwdev->scanning)
                rtwdev->ppdu_sts.curr_rx_ppdu_cnt[i] = U8_MAX;
 }
 
-void rtw89_core_update_beacon_work(struct work_struct *work)
+void rtw89_core_update_beacon_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev;
        struct rtw89_vif_link *rtwvif_link = container_of(work, struct rtw89_vif_link,
                return ret;
        }
 
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
-                                    RTW89_TRACK_WORK_PERIOD);
+       wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->track_work,
+                                RTW89_TRACK_WORK_PERIOD);
 
        set_bit(RTW89_FLAG_RUNNING, rtwdev->flags);
 
 
 void rtw89_core_stop(struct rtw89_dev *rtwdev)
 {
+       struct wiphy *wiphy = rtwdev->hw->wiphy;
        struct rtw89_btc *btc = &rtwdev->btc;
 
        /* Prvent to stop twice; enter_ips and ops_stop */
 
        mutex_unlock(&rtwdev->mutex);
 
-       cancel_work_sync(&rtwdev->c2h_work);
-       cancel_work_sync(&rtwdev->cancel_6ghz_probe_work);
-       cancel_work_sync(&btc->eapol_notify_work);
-       cancel_work_sync(&btc->arp_notify_work);
-       cancel_work_sync(&btc->dhcp_notify_work);
-       cancel_work_sync(&btc->icmp_notify_work);
+       wiphy_work_cancel(wiphy, &rtwdev->c2h_work);
+       wiphy_work_cancel(wiphy, &rtwdev->cancel_6ghz_probe_work);
+       wiphy_work_cancel(wiphy, &btc->eapol_notify_work);
+       wiphy_work_cancel(wiphy, &btc->arp_notify_work);
+       wiphy_work_cancel(wiphy, &btc->dhcp_notify_work);
+       wiphy_work_cancel(wiphy, &btc->icmp_notify_work);
        cancel_delayed_work_sync(&rtwdev->txq_reinvoke_work);
-       cancel_delayed_work_sync(&rtwdev->track_work);
-       cancel_delayed_work_sync(&rtwdev->chanctx_work);
-       cancel_delayed_work_sync(&rtwdev->coex_act1_work);
-       cancel_delayed_work_sync(&rtwdev->coex_bt_devinfo_work);
-       cancel_delayed_work_sync(&rtwdev->coex_rfk_chk_work);
-       cancel_delayed_work_sync(&rtwdev->cfo_track_work);
+       wiphy_delayed_work_cancel(wiphy, &rtwdev->track_work);
+       wiphy_delayed_work_cancel(wiphy, &rtwdev->chanctx_work);
+       wiphy_delayed_work_cancel(wiphy, &rtwdev->coex_act1_work);
+       wiphy_delayed_work_cancel(wiphy, &rtwdev->coex_bt_devinfo_work);
+       wiphy_delayed_work_cancel(wiphy, &rtwdev->coex_rfk_chk_work);
+       wiphy_delayed_work_cancel(wiphy, &rtwdev->cfo_track_work);
        cancel_delayed_work_sync(&rtwdev->forbid_ba_work);
-       cancel_delayed_work_sync(&rtwdev->antdiv_work);
+       wiphy_delayed_work_cancel(wiphy, &rtwdev->antdiv_work);
 
        mutex_lock(&rtwdev->mutex);
 
        INIT_WORK(&rtwdev->ba_work, rtw89_core_ba_work);
        INIT_WORK(&rtwdev->txq_work, rtw89_core_txq_work);
        INIT_DELAYED_WORK(&rtwdev->txq_reinvoke_work, rtw89_core_txq_reinvoke_work);
-       INIT_DELAYED_WORK(&rtwdev->track_work, rtw89_track_work);
-       INIT_DELAYED_WORK(&rtwdev->chanctx_work, rtw89_chanctx_work);
-       INIT_DELAYED_WORK(&rtwdev->coex_act1_work, rtw89_coex_act1_work);
-       INIT_DELAYED_WORK(&rtwdev->coex_bt_devinfo_work, rtw89_coex_bt_devinfo_work);
-       INIT_DELAYED_WORK(&rtwdev->coex_rfk_chk_work, rtw89_coex_rfk_chk_work);
-       INIT_DELAYED_WORK(&rtwdev->cfo_track_work, rtw89_phy_cfo_track_work);
+       wiphy_delayed_work_init(&rtwdev->track_work, rtw89_track_work);
+       wiphy_delayed_work_init(&rtwdev->chanctx_work, rtw89_chanctx_work);
+       wiphy_delayed_work_init(&rtwdev->coex_act1_work, rtw89_coex_act1_work);
+       wiphy_delayed_work_init(&rtwdev->coex_bt_devinfo_work, rtw89_coex_bt_devinfo_work);
+       wiphy_delayed_work_init(&rtwdev->coex_rfk_chk_work, rtw89_coex_rfk_chk_work);
+       wiphy_delayed_work_init(&rtwdev->cfo_track_work, rtw89_phy_cfo_track_work);
        INIT_DELAYED_WORK(&rtwdev->forbid_ba_work, rtw89_forbid_ba_work);
-       INIT_DELAYED_WORK(&rtwdev->antdiv_work, rtw89_phy_antdiv_work);
+       wiphy_delayed_work_init(&rtwdev->antdiv_work, rtw89_phy_antdiv_work);
        rtwdev->txq_wq = alloc_workqueue("rtw89_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0);
        if (!rtwdev->txq_wq)
                return -ENOMEM;
        rtw89_init_wait(&rtwdev->wow.wait);
        rtw89_init_wait(&rtwdev->mac.ps_wait);
 
-       INIT_WORK(&rtwdev->c2h_work, rtw89_fw_c2h_work);
-       INIT_WORK(&rtwdev->ips_work, rtw89_ips_work);
+       wiphy_work_init(&rtwdev->c2h_work, rtw89_fw_c2h_work);
+       wiphy_work_init(&rtwdev->ips_work, rtw89_ips_work);
+       wiphy_work_init(&rtwdev->cancel_6ghz_probe_work, rtw89_cancel_6ghz_probe_work);
        INIT_WORK(&rtwdev->load_firmware_work, rtw89_load_firmware_work);
-       INIT_WORK(&rtwdev->cancel_6ghz_probe_work, rtw89_cancel_6ghz_probe_work);
 
        skb_queue_head_init(&rtwdev->c2h_queue);
        rtw89_core_ppdu_sts_init(rtwdev);
        rtwdev->bbs[RTW89_PHY_0].phy_idx = RTW89_PHY_0;
        rtwdev->bbs[RTW89_PHY_1].phy_idx = RTW89_PHY_1;
 
-       INIT_WORK(&btc->eapol_notify_work, rtw89_btc_ntfy_eapol_packet_work);
-       INIT_WORK(&btc->arp_notify_work, rtw89_btc_ntfy_arp_packet_work);
-       INIT_WORK(&btc->dhcp_notify_work, rtw89_btc_ntfy_dhcp_packet_work);
-       INIT_WORK(&btc->icmp_notify_work, rtw89_btc_ntfy_icmp_packet_work);
+       wiphy_work_init(&btc->eapol_notify_work, rtw89_btc_ntfy_eapol_packet_work);
+       wiphy_work_init(&btc->arp_notify_work, rtw89_btc_ntfy_arp_packet_work);
+       wiphy_work_init(&btc->dhcp_notify_work, rtw89_btc_ntfy_dhcp_packet_work);
+       wiphy_work_init(&btc->icmp_notify_work, rtw89_btc_ntfy_icmp_packet_work);
 
        init_completion(&rtwdev->fw.req.completion);
        init_completion(&rtwdev->rfk_wait.completion);
        rtw89_for_each_active_bb(rtwdev, bb)
                bb->dig.bypass_dig = true;
        if (hw_scan && (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE))
-               ieee80211_queue_work(rtwdev->hw, &rtwdev->ips_work);
+               wiphy_work_queue(rtwdev->hw->wiphy, &rtwdev->ips_work);
 }
 
 static void rtw89_read_chip_ver(struct rtw89_dev *rtwdev)
 
        struct rtw89_btc_btf_fwinfo fwinfo;
        struct rtw89_btc_dbg dbg;
 
-       struct work_struct eapol_notify_work;
-       struct work_struct arp_notify_work;
-       struct work_struct dhcp_notify_work;
-       struct work_struct icmp_notify_work;
+       struct wiphy_work eapol_notify_work;
+       struct wiphy_work arp_notify_work;
+       struct wiphy_work dhcp_notify_work;
+       struct wiphy_work icmp_notify_work;
 
        u32 bt_req_len;
 
 
 struct rtw89_roc {
        struct ieee80211_channel chan;
-       struct delayed_work roc_work;
+       struct wiphy_delayed_work roc_work;
        enum ieee80211_roc_type type;
        enum rtw89_roc_state state;
        int duration;
        bool pre_pwr_diff_en;
        bool pwr_diff_en;
        u8 def_tri_idx;
-       struct work_struct update_beacon_work;
+       struct wiphy_work update_beacon_work;
        struct rtw89_addr_cam_entry addr_cam;
        struct rtw89_bssid_cam_entry bssid_cam;
        struct ieee80211_tx_queue_params tx_params[IEEE80211_NUM_ACS];
        struct rtw89_cam_info cam_info;
 
        struct sk_buff_head c2h_queue;
-       struct work_struct c2h_work;
-       struct work_struct ips_work;
+       struct wiphy_work c2h_work;
+       struct wiphy_work ips_work;
+       struct wiphy_work cancel_6ghz_probe_work;
        struct work_struct load_firmware_work;
-       struct work_struct cancel_6ghz_probe_work;
 
        struct list_head early_h2c_list;
 
                struct rtw89_edcca_bak edcca_bak;
        } bbs[RTW89_PHY_NUM];
 
-       struct delayed_work track_work;
-       struct delayed_work chanctx_work;
-       struct delayed_work coex_act1_work;
-       struct delayed_work coex_bt_devinfo_work;
-       struct delayed_work coex_rfk_chk_work;
-       struct delayed_work cfo_track_work;
+       struct wiphy_delayed_work track_work;
+       struct wiphy_delayed_work chanctx_work;
+       struct wiphy_delayed_work coex_act1_work;
+       struct wiphy_delayed_work coex_bt_devinfo_work;
+       struct wiphy_delayed_work coex_rfk_chk_work;
+       struct wiphy_delayed_work cfo_track_work;
        struct delayed_work forbid_ba_work;
-       struct delayed_work antdiv_work;
+       struct wiphy_delayed_work antdiv_work;
        struct rtw89_ppdu_sts_info ppdu_sts;
        u8 total_sta_assoc;
        bool scanning;
                         const struct rtw89_completion_data *data);
 int rtw89_core_start(struct rtw89_dev *rtwdev);
 void rtw89_core_stop(struct rtw89_dev *rtwdev);
-void rtw89_core_update_beacon_work(struct work_struct *work);
-void rtw89_roc_work(struct work_struct *work);
+void rtw89_core_update_beacon_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_roc_work(struct wiphy *wiphy, struct wiphy_work *work);
 void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
 void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
 void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
 
 
 enqueue:
        skb_queue_tail(&rtwdev->c2h_queue, c2h);
-       ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work);
+       wiphy_work_queue(rtwdev->hw->wiphy, &rtwdev->c2h_work);
 }
 
 static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
                rtw89_hex_dump(rtwdev, RTW89_DBG_FW, "C2H: ", skb->data, skb->len);
 }
 
-void rtw89_fw_c2h_work(struct work_struct *work)
+void rtw89_fw_c2h_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                c2h_work);
 
                                 struct rtw89_vif_link *rtwvif_link,
                                 struct rtw89_sta_link *rtwsta_link);
 void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h);
-void rtw89_fw_c2h_work(struct work_struct *work);
+void rtw89_fw_c2h_work(struct wiphy *wiphy, struct wiphy_work *work);
 int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
                               struct rtw89_vif_link *rtwvif_link,
                               struct rtw89_sta_link *rtwsta_link,
 
        struct rtw89_dev *rtwdev = hw->priv;
 
        /* let previous ips work finish to ensure we don't leave ips twice */
-       cancel_work_sync(&rtwdev->ips_work);
+       wiphy_work_cancel(hw->wiphy, &rtwdev->ips_work);
 
        mutex_lock(&rtwdev->mutex);
        rtw89_leave_ps_mode(rtwdev);
 
        rtw89_vif_type_mapping(rtwvif_link, false);
 
-       INIT_WORK(&rtwvif_link->update_beacon_work, rtw89_core_update_beacon_work);
+       wiphy_work_init(&rtwvif_link->update_beacon_work, rtw89_core_update_beacon_work);
        INIT_LIST_HEAD(&rtwvif_link->general_pkt_list);
 
        rtwvif_link->hit_rule = 0;
                                          struct rtw89_vif_link *rtwvif_link)
 {
        mutex_unlock(&rtwdev->mutex);
-       cancel_work_sync(&rtwvif_link->update_beacon_work);
+       wiphy_work_cancel(rtwdev->hw->wiphy, &rtwvif_link->update_beacon_work);
        mutex_lock(&rtwdev->mutex);
 
        rtw89_leave_ps_mode(rtwdev);
 
        rtwvif->offchan = false;
        rtwvif->roc.state = RTW89_ROC_IDLE;
-       INIT_DELAYED_WORK(&rtwvif->roc.roc_work, rtw89_roc_work);
+       wiphy_delayed_work_init(&rtwvif->roc.roc_work, rtw89_roc_work);
 
        rtw89_traffic_stats_init(rtwdev, &rtwvif->stats);
 
        rtw89_debug(rtwdev, RTW89_DBG_STATE, "remove vif %pM type %d p2p %d\n",
                    vif->addr, vif->type, vif->p2p);
 
-       cancel_delayed_work_sync(&rtwvif->roc.roc_work);
+       wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work);
 
        mutex_lock(&rtwdev->mutex);
 
 static int rtw89_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
                             bool set)
 {
-       struct rtw89_dev *rtwdev = hw->priv;
        struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
        struct rtw89_vif *rtwvif = rtwsta->rtwvif;
        struct rtw89_vif_link *rtwvif_link;
        unsigned int link_id;
 
        rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
-               ieee80211_queue_work(rtwdev->hw, &rtwvif_link->update_beacon_work);
+               wiphy_work_queue(hw->wiphy, &rtwvif_link->update_beacon_work);
 
        return 0;
 }
        if (!rtwvif)
                return -EINVAL;
 
-       cancel_delayed_work_sync(&rtwvif->roc.roc_work);
+       wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work);
 
        mutex_lock(&rtwdev->mutex);
        rtw89_roc_end(rtwdev, rtwvif);
        int ret;
 
        set_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags);
-       cancel_delayed_work_sync(&rtwdev->track_work);
+       wiphy_delayed_work_cancel(hw->wiphy, &rtwdev->track_work);
 
        mutex_lock(&rtwdev->mutex);
        ret = rtw89_wow_suspend(rtwdev, wowlan);
        mutex_unlock(&rtwdev->mutex);
 
        clear_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags);
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
-                                    RTW89_TRACK_WORK_PERIOD);
+       wiphy_delayed_work_queue(hw->wiphy, &rtwdev->track_work,
+                                RTW89_TRACK_WORK_PERIOD);
 
        return ret ? 1 : 0;
 }
 
        rtw89_phy_cfo_statistics_reset(rtwdev);
 }
 
-void rtw89_phy_cfo_track_work(struct work_struct *work)
+void rtw89_phy_cfo_track_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                cfo_track_work.work);
                goto out;
        rtw89_leave_ps_mode(rtwdev);
        rtw89_phy_cfo_dm(rtwdev);
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->cfo_track_work,
-                                    msecs_to_jiffies(cfo->cfo_timer_ms));
+       wiphy_delayed_work_queue(wiphy, &rtwdev->cfo_track_work,
+                                msecs_to_jiffies(cfo->cfo_timer_ms));
 out:
        mutex_unlock(&rtwdev->mutex);
 }
 {
        struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
 
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->cfo_track_work,
-                                    msecs_to_jiffies(cfo->cfo_timer_ms));
+       wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->cfo_track_work,
+                                msecs_to_jiffies(cfo->cfo_timer_ms));
 }
 
 void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev)
        }
 
        antdiv->training_count++;
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->antdiv_work,
-                                    state_period);
+       wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->antdiv_work,
+                                state_period);
 }
 
-void rtw89_phy_antdiv_work(struct work_struct *work)
+void rtw89_phy_antdiv_work(struct wiphy *wiphy, struct wiphy_work *work)
 {
        struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
                                                antdiv_work.work);
                return;
 
        antdiv->training_count = 0;
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->antdiv_work, 0);
+       wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->antdiv_work, 0);
 }
 
 static void __rtw89_phy_env_monitor_init(struct rtw89_dev *rtwdev,
 
                                              const struct rtw89_chan *chan,
                                              struct rtw89_h2c_rf_tssi *h2c);
 void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev);
-void rtw89_phy_cfo_track_work(struct work_struct *work);
+void rtw89_phy_cfo_track_work(struct wiphy *wiphy, struct wiphy_work *work);
 void rtw89_phy_cfo_parse(struct rtw89_dev *rtwdev, s16 cfo_val,
                         struct rtw89_rx_phy_ppdu *phy_ppdu);
 void rtw89_phy_stat_track(struct rtw89_dev *rtwdev);
 void rtw89_phy_antdiv_parse(struct rtw89_dev *rtwdev,
                            struct rtw89_rx_phy_ppdu *phy_ppdu);
 void rtw89_phy_antdiv_track(struct rtw89_dev *rtwdev);
-void rtw89_phy_antdiv_work(struct work_struct *work);
+void rtw89_phy_antdiv_work(struct wiphy *wiphy, struct wiphy_work *work);
 void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev,
                             struct rtw89_vif_link *rtwvif_link);
 void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev,
 
 static void ser_reset_trx_st_hdl(struct rtw89_ser *ser, u8 evt)
 {
        struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser);
+       struct wiphy *wiphy = rtwdev->hw->wiphy;
 
        switch (evt) {
        case SER_EV_STATE_IN:
-               cancel_delayed_work_sync(&rtwdev->track_work);
+               wiphy_lock(wiphy);
+               wiphy_delayed_work_cancel(wiphy, &rtwdev->track_work);
+               wiphy_unlock(wiphy);
                drv_stop_tx(ser);
 
                if (hal_stop_dma(ser)) {
                hal_enable_dma(ser);
                drv_resume_rx(ser);
                drv_resume_tx(ser);
-               ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
-                                            RTW89_TRACK_WORK_PERIOD);
+               wiphy_delayed_work_queue(wiphy, &rtwdev->track_work,
+                                        RTW89_TRACK_WORK_PERIOD);
                break;
 
        default: