break;
        case BTC_RPT_TYPE_TDMA:
                pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo;
-               if (chip->chip_id == RTL8852A) {
-                       pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo;
-                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo);
+               if (ver->fcxtdma == 1) {
+                       pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v1;
+                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v1);
+               } else if (ver->fcxtdma == 3) {
+                       pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v3;
+                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v3);
                } else {
-                       pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo_v1;
-                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo_v1);
+                       goto err;
                }
                pcinfo->req_fver = ver->fcxtdma;
                break;
                            "[BTC], %s(): check %d %zu\n", __func__,
                            BTC_DCNT_TDMA_NONSYNC,
                            sizeof(dm->tdma_now));
-               if (chip->chip_id == RTL8852A)
+               if (ver->fcxtdma == 1)
                        _chk_btc_err(rtwdev, BTC_DCNT_TDMA_NONSYNC,
                                     memcmp(&dm->tdma_now,
-                                           &pfwinfo->rpt_fbtc_tdma.finfo_v1,
+                                           &pfwinfo->rpt_fbtc_tdma.finfo.v1,
                                            sizeof(dm->tdma_now)));
-               else
+               else if (ver->fcxtdma == 3)
                        _chk_btc_err(rtwdev, BTC_DCNT_TDMA_NONSYNC,
                                     memcmp(&dm->tdma_now,
-                                           &pfwinfo->rpt_fbtc_tdma.finfo,
+                                           &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma,
                                            sizeof(dm->tdma_now)));
+               else
+                       goto err;
                break;
        case BTC_RPT_TYPE_SLOT:
                rtw89_debug(rtwdev, RTW89_DBG_BTC,
 
 static void _append_tdma(struct rtw89_dev *rtwdev)
 {
-       const struct rtw89_chip_info *chip = rtwdev->chip;
        struct rtw89_btc *btc = &rtwdev->btc;
        const struct rtw89_btc_ver *ver = btc->ver;
        struct rtw89_btc_dm *dm = &btc->dm;
        struct rtw89_btc_btf_tlv *tlv;
        struct rtw89_btc_fbtc_tdma *v;
-       struct rtw89_btc_fbtc_tdma_v1 *v1;
+       struct rtw89_btc_fbtc_tdma_v3 *v3;
        u16 len = btc->policy_len;
 
        if (!btc->update_policy_force &&
 
        tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len];
        tlv->type = CXPOLICY_TDMA;
-       if (chip->chip_id == RTL8852A) {
+       if (ver->fcxtdma == 1) {
                v = (struct rtw89_btc_fbtc_tdma *)&tlv->val[0];
                tlv->len = sizeof(*v);
                memcpy(v, &dm->tdma, sizeof(*v));
-               btc->policy_len += BTC_TLV_HDR_LEN  + sizeof(*v);
+               btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v);
        } else {
-               tlv->len = sizeof(*v1);
-               v1 = (struct rtw89_btc_fbtc_tdma_v1 *)&tlv->val[0];
-               v1->fver = ver->fcxtdma;
-               v1->tdma = dm->tdma;
-               btc->policy_len += BTC_TLV_HDR_LEN  + sizeof(*v1);
+               tlv->len = sizeof(*v3);
+               v3 = (struct rtw89_btc_fbtc_tdma_v3 *)&tlv->val[0];
+               v3->fver = ver->fcxtdma;
+               memcpy(&v3->tdma, &dm->tdma, sizeof(v3->tdma));
+               btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v3);
        }
 
        rtw89_debug(rtwdev, RTW89_DBG_BTC,
 
 static void _show_fbtc_tdma(struct rtw89_dev *rtwdev, struct seq_file *m)
 {
-       const struct rtw89_chip_info *chip = rtwdev->chip;
        struct rtw89_btc *btc = &rtwdev->btc;
+       const struct rtw89_btc_ver *ver = btc->ver;
        struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
        struct rtw89_btc_rpt_cmn_info *pcinfo = NULL;
        struct rtw89_btc_fbtc_tdma *t = NULL;
        if (!pcinfo->valid)
                return;
 
-       if (chip->chip_id == RTL8852A)
-               t = &pfwinfo->rpt_fbtc_tdma.finfo;
+       if (ver->fcxtdma == 1)
+               t = &pfwinfo->rpt_fbtc_tdma.finfo.v1;
        else
-               t = &pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma;
+               t = &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma;
 
        seq_printf(m,
                   " %-15s : ", "[tdma_policy]");
 
        u8 option_ctrl;
 } __packed;
 
-struct rtw89_btc_fbtc_tdma_v1 {
+struct rtw89_btc_fbtc_tdma_v3 {
        u8 fver; /* btc_ver::fcxtdma */
        u8 rsvd;
        __le16 rsvd1;
        struct rtw89_btc_fbtc_tdma tdma;
 } __packed;
 
+union rtw89_btc_fbtc_tdma_le32 {
+       struct rtw89_btc_fbtc_tdma v1;
+       struct rtw89_btc_fbtc_tdma_v3 v3;
+};
+
 #define CXMREG_MAX 30
 #define FCXMAX_STEP 255 /*STEP trace record cnt, Max:65535, default:255*/
 #define BTC_CYCLE_SLOT_MAX 48 /* must be even number, non-zero */
 
 struct rtw89_btc_rpt_fbtc_tdma {
        struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */
-       union {
-               struct rtw89_btc_fbtc_tdma finfo; /* info from fw */
-               struct rtw89_btc_fbtc_tdma_v1 finfo_v1; /* info from fw for 52C*/
-       };
+       union rtw89_btc_fbtc_tdma_le32 finfo;
 };
 
 struct rtw89_btc_rpt_fbtc_slots {