diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c index b73040428c58..ad52274a3979 100644 --- a/drivers/net/wireless/realtek/rtw89/coex.c +++ b/drivers/net/wireless/realtek/rtw89/coex.c @@ -1142,13 +1142,7 @@ static void _reset_btc_var(struct rtw89_dev *rtwdev, u8 type) if (type & BTC_RESET_MDINFO) { memset(&btc->mdinfo, 0, sizeof(btc->mdinfo)); - - if (ver->fcxinit == 10) - btc->mdinfo.md_v10.ant.isolation = RTW89_BTC_DEFAULT_ANISO; - else if (ver->fcxinit == 7) - btc->mdinfo.md_v7.ant.isolation = RTW89_BTC_DEFAULT_ANISO; - else - btc->mdinfo.md.ant.isolation = RTW89_BTC_DEFAULT_ANISO; + btc->mdinfo.ant.isolation = RTW89_BTC_DEFAULT_ANISO; } } @@ -1169,27 +1163,22 @@ static void _get_reg_status(struct rtw89_dev *rtwdev, u8 type, u8 *val) { struct rtw89_btc *btc = &rtwdev->btc; const struct rtw89_btc_ver *ver = btc->ver; - union rtw89_btc_module_info *md = &btc->mdinfo; + struct rtw89_btc_module *md = &btc->mdinfo; union rtw89_btc_fbtc_mreg_val *pmreg; u32 pre_agc_addr = R_BTC_BB_PRE_AGC_S1; u32 reg_val; - u8 idx, switch_type; - - if (ver->fcxinit == 7) - switch_type = md->md_v7.switch_type; - else - switch_type = md->md.switch_type; + u8 idx; if (btc->btg_pos == RF_PATH_A) pre_agc_addr = R_BTC_BB_PRE_AGC_S0; switch (type) { case BTC_CSTATUS_TXDIV_POS: - if (switch_type == BTC_SWITCH_INTERNAL) + if (md->bt0_sw_type == BTC_SWITCH_INTERNAL) *val = BTC_ANT_DIV_MAIN; break; case BTC_CSTATUS_RXDIV_POS: - if (switch_type == BTC_SWITCH_INTERNAL) + if (md->bt0_sw_type == BTC_SWITCH_INTERNAL) *val = BTC_ANT_DIV_MAIN; break; case BTC_CSTATUS_BB_GNT_MUX: @@ -3098,7 +3087,7 @@ static void _fw_set_drv_info(struct rtw89_dev *rtwdev, u8 index) switch (index) { case CXDRVINFO_INIT: - if (ver->fcxinit == 7) + if (ver->fcxinit == 7 || ver->fcxinit == 107) rtw89_fw_h2c_cxdrv_init_v7(rtwdev, index); else if (ver->fcxinit == 10) rtw89_fw_h2c_cxdrv_init_v10(rtwdev, index); @@ -4206,14 +4195,7 @@ static bool _check_freerun(struct rtw89_dev *rtwdev) struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; struct rtw89_btc_bt_hid_desc *hid = &bt_linfo->hid_desc; - union rtw89_btc_module_info *md = &btc->mdinfo; - const struct rtw89_btc_ver *ver = btc->ver; - u8 isolation; - - if (ver->fcxinit == 7) - isolation = md->md_v7.ant.isolation; - else - isolation = md->md.ant.isolation; + struct rtw89_btc_module *md = &btc->mdinfo; if (btc->ant_type == BTC_ANT_SHARED) { btc->dm.trx_para_level = 0; @@ -4237,7 +4219,7 @@ static bool _check_freerun(struct rtw89_dev *rtwdev) } /* TODO get isolation by BT psd */ - if (isolation >= BTC_FREERUN_ANTISO_MIN) { + if (md->ant.isolation >= BTC_FREERUN_ANTISO_MIN) { btc->dm.trx_para_level = 5; return true; } @@ -6177,21 +6159,14 @@ static void _wl_req_mac(struct rtw89_dev *rtwdev, u8 mac) static void _update_zb_coex_tbl(struct rtw89_dev *rtwdev) { struct rtw89_btc *btc = &rtwdev->btc; - const struct rtw89_btc_ver *ver = btc->ver; u32 zb_tbl0 = 0xda5a5a5a, zb_tbl1 = 0xda5a5a5a; u8 link_mode_chg = btc->cx.wl.link_mode_chg; u8 mode = btc->cx.wl.role_info.link_mode; - u8 wa_type; if (btc->dm.run_reason != BTC_RSN_NTFY_INIT && !link_mode_chg) return; - if (ver->fcxinit == 7) - wa_type = btc->mdinfo.md_v7.wa_type; - else - wa_type = btc->mdinfo.md.wa_type; - - if (!(wa_type & BTC_WA_HFP_ZB)) + if (!(btc->mdinfo.wa_type & BTC_WA_HFP_ZB)) return; if (btc->dm.tdd_bind.rf_band == BIT(RTW89_BAND_5G) || @@ -8106,40 +8081,26 @@ static void _set_init_info(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_cx *cx = &btc->cx; struct rtw89_btc_wl_info *wl = &btc->cx.wl; - if (ver->fcxinit == 10) { - dm->init_info.init_v10.init_mode = wl->coex_mode; - dm->init_info.init_v10.wl_init_ok = wl->status.map.init_ok; - dm->init_info.init_v10.endian_type = BTC_PLATFORM_LITTLE_ENDIAN; + dm->init_info.init_mode = wl->coex_mode; + dm->init_info.wl_init_ok = wl->status.map.init_ok; + dm->init_info.endian_type = BTC_PLATFORM_LITTLE_ENDIAN; + dm->init_info.bt0_function = cx->bt0.func_type; + dm->init_info.bt1_function = cx->bt1.func_type; + dm->init_info.bt2_function = cx->bt_ext.func_type; + dm->init_info.pta_mode = RTW89_MAC_AX_COEX_RTK_MODE; + dm->init_info.pta_direction = RTW89_MAC_AX_COEX_INNER; + dm->init_info.wl_only = dm->wl_only; + dm->init_info.bt_only = dm->bt_only; + dm->init_info.wl_init_ok = wl->status.map.init_ok; + dm->init_info.cx_other = btc->cx.bt_ext.func_type; + dm->init_info.wl_guard_ch = chip->afh_guard_ch; + dm->init_info.dbcc_en = rtwdev->dbcc_en; - dm->init_info.init_v10.module = btc->mdinfo.md_v10; - - dm->init_info.init_v10.bt0_function = cx->bt0.func_type; - dm->init_info.init_v10.bt1_function = cx->bt1.func_type; - dm->init_info.init_v10.bt2_function = cx->bt_ext.func_type; - - dm->init_info.init_v10.pta_mode = RTW89_MAC_AX_COEX_RTK_MODE; - dm->init_info.init_v10.pta_direction = RTW89_MAC_AX_COEX_INNER; - } else if (ver->fcxinit == 7) { - dm->init_info.init_v7.wl_only = (u8)dm->wl_only; - dm->init_info.init_v7.bt_only = (u8)dm->bt_only; - dm->init_info.init_v7.wl_init_ok = (u8)wl->status.map.init_ok; - dm->init_info.init_v7.cx_other = btc->cx.bt_ext.func_type; - dm->init_info.init_v7.wl_guard_ch = chip->afh_guard_ch; - dm->init_info.init_v7.module = btc->mdinfo.md_v7; - } else { - dm->init_info.init.wl_only = (u8)dm->wl_only; - dm->init_info.init.bt_only = (u8)dm->bt_only; - dm->init_info.init.wl_init_ok = (u8)wl->status.map.init_ok; - dm->init_info.init.dbcc_en = rtwdev->dbcc_en; - dm->init_info.init.cx_other = btc->cx.bt_ext.func_type; - dm->init_info.init.wl_guard_ch = chip->afh_guard_ch; - dm->init_info.init.module = btc->mdinfo.md; - } + dm->init_info.module = btc->mdinfo; _fw_set_drv_info(rtwdev, CXDRVINFO_INIT); _fw_set_drv_info(rtwdev, CXDRVINFO_CTRL); @@ -9175,7 +9136,7 @@ void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, static int _show_cx_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz) { - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; + struct rtw89_btc_module *md = &rtwdev->btc.mdinfo; const struct rtw89_chip_info *chip = rtwdev->chip; const struct rtw89_btc_ver *ver = rtwdev->btc.ver; struct rtw89_hal *hal = &rtwdev->hal; @@ -9184,7 +9145,6 @@ static int _show_cx_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz) struct rtw89_btc_bt_info *bt = &btc->cx.bt0; struct rtw89_btc_wl_info *wl = &btc->cx.wl; u32 ver_main = 0, ver_sub = 0, ver_hotfix = 0, id_branch = 0; - u8 cv, rfe, iso, ant_num, ant_single_pos; char *p = buf, *end = buf + bufsz; if (!(dm->coex_info_map & BTC_COEX_INFO_CX)) @@ -9232,25 +9192,12 @@ static int _show_cx_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz) wl->ver_info.build_time, wl->ver_info.build_date, bt->ver_info.fw, bt->run_patch_code ? "patch" : "ROM"); - if (ver->fcxinit == 7) { - cv = md->md_v7.kt_ver; - rfe = md->md_v7.rfe_type; - iso = md->md_v7.ant.isolation; - ant_num = md->md_v7.ant.num; - ant_single_pos = md->md_v7.ant.single_pos; - } else { - cv = md->md.cv; - rfe = md->md.rfe_type; - iso = md->md.ant.isolation; - ant_num = md->md.ant.num; - ant_single_pos = md->md.ant.single_pos; - } - p += scnprintf(p, end - p, " %-15s : cv:%x, rfe_type:0x%x, ant_iso:%d, ant_pg:%d, %s", - "[hw_info]", cv, rfe, iso, ant_num, - ant_num > 1 ? "" : - ant_single_pos ? "1Ant_Pos:S1, " : "1Ant_Pos:S0, "); + "[hw_info]", + md->kt_ver, md->rfe_type, md->ant.isolation, + md->ant.num, md->ant.num > 1 ? "" : + md->ant.single_pos ? "1Ant_Pos:S1, " : "1Ant_Pos:S0, "); p += scnprintf(p, end - p, "3rd_coex:%d, dbcc:%d, tx_num:%d, rx_num:%d\n", @@ -9417,7 +9364,7 @@ static int _show_bt_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz) struct rtw89_btc_bt_info *bt = &cx->bt0; struct rtw89_btc_wl_info *wl = &cx->wl; struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; - union rtw89_btc_module_info *md = &btc->mdinfo; + struct rtw89_btc_module *md = &btc->mdinfo; s8 br_dbm = bt->link_info.bt_txpwr_desc.br_dbm; s8 le_dbm = bt->link_info.bt_txpwr_desc.le_dbm; u8 hw_band = wl->role_info.pta_req_band; @@ -9425,23 +9372,17 @@ static int _show_bt_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz) char *p = buf, *end = buf + bufsz; u8 *afh = bt_linfo->afh_map; u8 *afh_le = bt_linfo->afh_map_le; - u8 bt_pos; if (!(btc->dm.coex_info_map & BTC_COEX_INFO_BT)) return 0; - if (ver->fcxinit == 7) - bt_pos = md->md_v7.bt_pos; - else - bt_pos = md->md.bt_pos; - p += scnprintf(p, end - p, "========== [BT Status] ==========\n"); p += scnprintf(p, end - p, " %-15s : enable:%s, btg:%s%s, connect:%s, ", "[status]", bt->enable.now ? "Y" : "N", bt->btg_type ? "Y" : "N", - (bt->enable.now && (bt->btg_type != bt_pos) ? + (bt->enable.now && (bt->btg_type != md->bt0_pos) ? "(efuse-mismatch!!)" : ""), (bt_linfo->status.map.connect ? "Y" : "N")); diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h index fb4c95ed1904..f7b3523c790c 100644 --- a/drivers/net/wireless/realtek/rtw89/core.h +++ b/drivers/net/wireless/realtek/rtw89/core.h @@ -1501,7 +1501,7 @@ enum rtw89_btc_bt_profile { BTC_PROFILE_MAX = 4, }; -struct rtw89_btc_ant_info { +struct rtw89_btc_ant_info_v0 { u8 type; /* shared, dedicated */ u8 num; u8 isolation; @@ -1537,6 +1537,21 @@ struct rtw89_btc_ant_info_v10 { u8 ant_xmap[2][4]; } __packed; +struct rtw89_btc_ant_info { + u8 type; /* shared, dedicated(non-shared) */ + u8 num; /* antenna count */ + u8 isolation; /* Ant-Iso between WL/BT */ + u8 single_pos; /* wifi 1ss-1ant at 0:S0 or 1:S1 */ + + u8 stream_cnt; /* spatial_stream count: Tx[7:4], Rx[3:0] */ + u8 btg_pos; /* BT0 btg-circuit at 0:WL-S0/1:WL-S1 */ + u8 btg1_pos; /* BT1 btg-circuit at 0:WL-S0/1:WL-S1 */ + u8 func[5]; /* function at 1~5 Ant refer to enum btc_bt_func_type */ + u8 ant_xmap[2][4]; + + u8 diversity; /* only for wifi use 1-antenna */ +}; + enum rtw89_tfc_dir { RTW89_TFC_UL, RTW89_TFC_DL, @@ -2331,8 +2346,8 @@ struct rtw89_btc_wl_info { u32 wcnt[BTC_WCNT_NUM]; }; -struct rtw89_btc_module { - struct rtw89_btc_ant_info ant; +struct rtw89_btc_module_v0 { + struct rtw89_btc_ant_info_v0 ant; u8 rfe_type; u8 cv; @@ -2373,11 +2388,27 @@ struct rtw89_btc_module_v10 { } __packed; union rtw89_btc_module_info { - struct rtw89_btc_module md; + struct rtw89_btc_module_v0 md_v0; struct rtw89_btc_module_v7 md_v7; struct rtw89_btc_module_v10 md_v10; }; +struct rtw89_btc_module { + u8 rfe_type; + u8 wa_type; /* Refer to enum btc_wa_type */ + u8 kt_ver; + u8 kt_ver_adie; + + u8 bt0_pos; /* wl-end view: get from efuse, must compare bt.btg_type*/ + u8 bt0_sw_type; /* BT Ant-switch: None(non-share), Int(BTG), Ext(SPDT)*/ + u8 bt1_pos; /* BTC_BT_ALONE or BTC_BT_BTG */ + u8 bt1_sw_type; + + u8 bt_solo; + + struct rtw89_btc_ant_info ant; +}; + #define RTW89_BTC_DM_MAXSTEP 30 #define RTW89_BTC_DM_CNT_MAX (RTW89_BTC_DM_MAXSTEP * 8) @@ -2387,8 +2418,8 @@ struct rtw89_btc_dm_step { bool step_ov; }; -struct rtw89_btc_init_info { - struct rtw89_btc_module module; +struct rtw89_btc_init_info_v0 { + struct rtw89_btc_module_v0 module; u8 wl_guard_ch; u8 wl_only: 1; @@ -2398,7 +2429,7 @@ struct rtw89_btc_init_info { u8 bt_only: 1; u16 rsvd; -}; +} __packed; struct rtw89_btc_init_info_v7 { u8 wl_guard_ch; @@ -2414,6 +2445,20 @@ struct rtw89_btc_init_info_v7 { struct rtw89_btc_module_v7 module; } __packed; +struct rtw89_btc_init_info_v107 { + u8 wl_guard_ch; + u8 wl_only; + u8 wl_init_ok; + u8 dbcc_en; + + u8 cx_other; + u8 bt_only; + u8 rsvd; + u8 rsvd1; + + struct rtw89_btc_module_v7 module; +} __packed; + struct rtw89_btc_init_info_v10 { u8 endian_type; /* 0: little-endian, 1:big-endian */ u8 init_mode; /* refer to enum BTC_MODE_xxx */ @@ -2426,12 +2471,34 @@ struct rtw89_btc_init_info_v10 { u8 pta_direction; struct rtw89_btc_module_v10 module; -}; +} __packed; union rtw89_btc_init_info_u { - struct rtw89_btc_init_info init; + struct rtw89_btc_init_info_v0 init_v0; struct rtw89_btc_init_info_v7 init_v7; struct rtw89_btc_init_info_v10 init_v10; + struct rtw89_btc_init_info_v107 init_v107; +}; + +struct rtw89_btc_init_info { + u8 endian_type; /* 0: little-endian, 1:big-endian */ + u8 init_mode; /* refer to enum BTC_MODE_xxx */ + u8 wl_init_ok; + u8 bt0_function; + + u8 bt1_function; + u8 bt2_function; + u8 pta_mode; + u8 pta_direction; + + u8 dbcc_en; + u8 cx_other; + u8 bt_only; + u8 wl_only; + + u8 wl_guard_ch; + + struct rtw89_btc_module module; }; struct rtw89_btc_wl_tx_limit_para { @@ -3659,7 +3726,7 @@ struct rtw89_btc_dm { struct rtw89_btc_gnt_ctrl gnt_set[RTW89_MAC_AX_COEX_GNT_NR]; struct rtw89_btc_gnt_ctrl gnt_val[RTW89_MAC_AX_COEX_GNT_NR]; struct rtw89_mac_ax_wl_act wlact_set[BTC_ALL_BT_EZL]; - union rtw89_btc_init_info_u init_info; /* pass to wl_fw if offload */ + struct rtw89_btc_init_info init_info; /* pass to wl_fw if offload */ struct rtw89_btc_rf_trx_para_v9 rf_trx_para; struct rtw89_btc_wl_tx_limit_para wl_tx_limit; struct rtw89_btc_dm_step dm_step; @@ -4012,7 +4079,7 @@ struct rtw89_btc { struct rtw89_btc_cx cx; struct rtw89_btc_dm dm; struct rtw89_btc_ctrl ctrl; - union rtw89_btc_module_info mdinfo; + struct rtw89_btc_module mdinfo; struct rtw89_btc_btf_fwinfo fwinfo; struct rtw89_btc_dbg dbg; diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index 533fb782bda8..520429bddb4f 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -5771,9 +5771,9 @@ int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type) { struct rtw89_btc *btc = &rtwdev->btc; struct rtw89_btc_dm *dm = &btc->dm; - struct rtw89_btc_init_info *init_info = &dm->init_info.init; - struct rtw89_btc_module *module = &init_info->module; - struct rtw89_btc_ant_info *ant = &module->ant; + struct rtw89_btc_init_info *init = &dm->init_info; + struct rtw89_btc_module *md = &init->module; + struct rtw89_btc_ant_info *ant = &md->ant; struct rtw89_h2c_cxinit *h2c; u32 len = sizeof(*h2c); struct sk_buff *skb; @@ -5799,22 +5799,22 @@ int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type) u8_encode_bits(ant->btg_pos, RTW89_H2C_CXINIT_ANT_INFO_BTG_POS) | u8_encode_bits(ant->stream_cnt, RTW89_H2C_CXINIT_ANT_INFO_STREAM_CNT); - h2c->mod_rfe = module->rfe_type; - h2c->mod_cv = module->cv; + h2c->mod_rfe = md->rfe_type; + h2c->mod_cv = md->kt_ver; h2c->mod_info = - u8_encode_bits(module->bt_solo, RTW89_H2C_CXINIT_MOD_INFO_BT_SOLO) | - u8_encode_bits(module->bt_pos, RTW89_H2C_CXINIT_MOD_INFO_BT_POS) | - u8_encode_bits(module->switch_type, RTW89_H2C_CXINIT_MOD_INFO_SW_TYPE) | - u8_encode_bits(module->wa_type, RTW89_H2C_CXINIT_MOD_INFO_WA_TYPE); - h2c->mod_adie_kt = module->kt_ver_adie; - h2c->wl_gch = init_info->wl_guard_ch; + u8_encode_bits(md->bt_solo, RTW89_H2C_CXINIT_MOD_INFO_BT_SOLO) | + u8_encode_bits(md->bt0_pos, RTW89_H2C_CXINIT_MOD_INFO_BT_POS) | + u8_encode_bits(md->bt0_sw_type, RTW89_H2C_CXINIT_MOD_INFO_SW_TYPE) | + u8_encode_bits(md->wa_type, RTW89_H2C_CXINIT_MOD_INFO_WA_TYPE); + h2c->mod_adie_kt = md->kt_ver_adie; + h2c->wl_gch = init->wl_guard_ch; h2c->info = - u8_encode_bits(init_info->wl_only, RTW89_H2C_CXINIT_INFO_WL_ONLY) | - u8_encode_bits(init_info->wl_init_ok, RTW89_H2C_CXINIT_INFO_WL_INITOK) | - u8_encode_bits(init_info->dbcc_en, RTW89_H2C_CXINIT_INFO_DBCC_EN) | - u8_encode_bits(init_info->cx_other, RTW89_H2C_CXINIT_INFO_CX_OTHER) | - u8_encode_bits(init_info->bt_only, RTW89_H2C_CXINIT_INFO_BT_ONLY); + u8_encode_bits(init->wl_only, RTW89_H2C_CXINIT_INFO_WL_ONLY) | + u8_encode_bits(init->wl_init_ok, RTW89_H2C_CXINIT_INFO_WL_INITOK) | + u8_encode_bits(init->dbcc_en, RTW89_H2C_CXINIT_INFO_DBCC_EN) | + u8_encode_bits(init->cx_other, RTW89_H2C_CXINIT_INFO_CX_OTHER) | + u8_encode_bits(init->bt_only, RTW89_H2C_CXINIT_INFO_BT_ONLY); rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, H2C_CAT_OUTSRC, BTFC_SET, @@ -5838,7 +5838,9 @@ int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type) { struct rtw89_btc *btc = &rtwdev->btc; struct rtw89_btc_dm *dm = &btc->dm; - struct rtw89_btc_init_info_v7 *init_info = &dm->init_info.init_v7; + struct rtw89_btc_init_info *init = &dm->init_info; + struct rtw89_btc_module *md = &init->module; + struct rtw89_btc_ant_info *ant = &md->ant; struct rtw89_h2c_cxinit_v7 *h2c; u32 len = sizeof(*h2c); struct sk_buff *skb; @@ -5853,9 +5855,33 @@ int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type) h2c = (struct rtw89_h2c_cxinit_v7 *)skb->data; h2c->hdr.type = type; - h2c->hdr.ver = btc->ver->fcxinit; + h2c->hdr.ver = 7; h2c->hdr.len = len - H2C_LEN_CXDRVHDR_V7; - h2c->init = *init_info; + + h2c->init.wl_guard_ch = init->wl_guard_ch; + h2c->init.wl_only = init->wl_only; + h2c->init.wl_init_ok = init->wl_init_ok; + h2c->init.cx_other = init->cx_other; + h2c->init.bt_only = init->bt_only; + h2c->init.pta_mode = init->pta_mode; + h2c->init.pta_direction = init->pta_direction; + h2c->init.rsvd3 = init->dbcc_en; /* available at v107 */ + + h2c->init.module.rfe_type = md->rfe_type; + h2c->init.module.kt_ver = md->kt_ver; + h2c->init.module.bt_solo = md->bt_solo; + h2c->init.module.bt_pos = md->bt0_pos; + h2c->init.module.switch_type = md->bt0_sw_type; + h2c->init.module.wa_type = md->wa_type; + h2c->init.module.kt_ver_adie = md->kt_ver_adie; + + h2c->init.module.ant.type = ant->type; + h2c->init.module.ant.num = ant->num; + h2c->init.module.ant.isolation = ant->isolation; + h2c->init.module.ant.single_pos = ant->single_pos; + h2c->init.module.ant.diversity = ant->diversity; + h2c->init.module.ant.btg_pos = ant->btg_pos; + h2c->init.module.ant.stream_cnt = ant->stream_cnt; rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, H2C_CAT_OUTSRC, BTFC_SET, @@ -5879,7 +5905,9 @@ int rtw89_fw_h2c_cxdrv_init_v10(struct rtw89_dev *rtwdev, u8 type) { struct rtw89_btc *btc = &rtwdev->btc; struct rtw89_btc_dm *dm = &btc->dm; - struct rtw89_btc_init_info_v10 *init_info = &dm->init_info.init_v10; + struct rtw89_btc_init_info *init = &dm->init_info; + struct rtw89_btc_module *md = &init->module; + struct rtw89_btc_ant_info *ant = &md->ant; struct rtw89_h2c_cxinit_v10 *h2c; u32 len = sizeof(*h2c); struct sk_buff *skb; @@ -5894,9 +5922,38 @@ int rtw89_fw_h2c_cxdrv_init_v10(struct rtw89_dev *rtwdev, u8 type) h2c = (struct rtw89_h2c_cxinit_v10 *)skb->data; h2c->hdr.type = type; - h2c->hdr.ver = btc->ver->fcxinit; + h2c->hdr.ver = 10; h2c->hdr.len = len - H2C_LEN_CXDRVHDR_V7; - h2c->init = *init_info; + + h2c->init.endian_type = init->endian_type; + h2c->init.init_mode = init->init_mode; + h2c->init.wl_init_ok = init->wl_init_ok; + h2c->init.bt0_function = init->bt0_function; + h2c->init.bt1_function = init->bt1_function; + h2c->init.bt2_function = init->bt2_function; + h2c->init.pta_mode = init->pta_mode; + h2c->init.pta_direction = init->pta_direction; + + h2c->init.module.rfe_type = md->rfe_type; + h2c->init.module.wa_type = md->wa_type; + h2c->init.module.kt_ver = md->kt_ver; + h2c->init.module.kt_ver_adie = md->kt_ver_adie; + h2c->init.module.bt0_pos = md->bt0_pos; + h2c->init.module.bt0_sw_type = md->bt0_sw_type; + h2c->init.module.bt1_pos = md->bt1_pos; + h2c->init.module.bt1_sw_type = md->bt1_sw_type; + + h2c->init.module.ant.type = ant->type; + h2c->init.module.ant.num = ant->num; + h2c->init.module.ant.isolation = ant->isolation; + h2c->init.module.ant.single_pos = ant->single_pos; + h2c->init.module.ant.stream_cnt = ant->stream_cnt; + h2c->init.module.ant.btg_pos = ant->btg_pos; + h2c->init.module.ant.btg1_pos = ant->btg1_pos; + + memcpy(h2c->init.module.ant.func, ant->func, sizeof(ant->func)); + memcpy(h2c->init.module.ant.ant_xmap, ant->ant_xmap, + sizeof(ant->ant_xmap)); rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, H2C_CAT_OUTSRC, BTFC_SET, diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h index 67e9c8daff5f..38090105b412 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.h +++ b/drivers/net/wireless/realtek/rtw89/fw.h @@ -2593,6 +2593,11 @@ struct rtw89_h2c_cxinit_v7 { struct rtw89_btc_init_info_v7 init; } __packed; +struct rtw89_h2c_cxinit_v107 { + struct rtw89_h2c_cxhdr_v7 hdr; + struct rtw89_btc_init_info_v107 init; +} __packed; + struct rtw89_h2c_cxinit_v10 { struct rtw89_h2c_cxhdr_v7 hdr; struct rtw89_btc_init_info_v10 init; diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c index e3a17f539ad6..db37ad6653bc 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c @@ -2118,82 +2118,43 @@ static u8 rtw8851b_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_p static void rtw8851b_btc_set_rfe(struct rtw89_dev *rtwdev) { - const struct rtw89_btc_ver *ver = rtwdev->btc.ver; - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; + struct rtw89_btc_module *md = &rtwdev->btc.mdinfo; - if (ver->fcxinit == 7) { - md->md_v7.rfe_type = rtwdev->efuse.rfe_type; - md->md_v7.kt_ver = rtwdev->hal.cv; - md->md_v7.bt_solo = 0; - md->md_v7.switch_type = BTC_SWITCH_INTERNAL; - md->md_v7.ant.isolation = 10; - md->md_v7.kt_ver_adie = rtwdev->hal.acv; + md->rfe_type = rtwdev->efuse.rfe_type; + md->kt_ver = rtwdev->hal.cv; + md->bt_solo = 0; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; + md->ant.isolation = 10; + md->kt_ver_adie = rtwdev->hal.acv; - if (md->md_v7.rfe_type == 0) - return; + if (md->rfe_type == 0) + return; - /* rfe_type 3*n+1: 1-Ant(shared), - * 3*n+2: 2-Ant+Div(non-shared), - * 3*n+3: 2-Ant+no-Div(non-shared) - */ - md->md_v7.ant.num = (md->md_v7.rfe_type % 3 == 1) ? 1 : 2; - /* WL-1ss at S0, btg at s0 (On 1 WL RF) */ - md->md_v7.ant.single_pos = RF_PATH_A; - md->md_v7.ant.btg_pos = RF_PATH_A; - md->md_v7.ant.stream_cnt = 1; + /* rfe_type 3*n+1: 1-Ant(shared), + * 3*n+2: 2-Ant+Div(non-shared), + * 3*n+3: 2-Ant+no-Div(non-shared) + */ + md->ant.num = (md->rfe_type % 3 == 1) ? 1 : 2; + /* WL-1ss at S0, btg at s0 (On 1 WL RF) */ + md->ant.single_pos = RF_PATH_A; + md->ant.btg_pos = RF_PATH_A; + md->ant.stream_cnt = 1; - if (md->md_v7.ant.num == 1) { - md->md_v7.ant.type = BTC_ANT_SHARED; - md->md_v7.bt_pos = BTC_BT_BTG; - md->md_v7.wa_type = 1; - md->md_v7.ant.diversity = 0; - } else { /* ant.num == 2 */ - md->md_v7.ant.type = BTC_ANT_DEDICATED; - md->md_v7.bt_pos = BTC_BT_ALONE; - md->md_v7.switch_type = BTC_SWITCH_EXTERNAL; - md->md_v7.wa_type = 0; - if (md->md_v7.rfe_type % 3 == 2) - md->md_v7.ant.diversity = 1; - } - rtwdev->btc.btg_pos = md->md_v7.ant.btg_pos; - rtwdev->btc.ant_type = md->md_v7.ant.type; - } else { - md->md.rfe_type = rtwdev->efuse.rfe_type; - md->md.cv = rtwdev->hal.cv; - md->md.bt_solo = 0; - md->md.switch_type = BTC_SWITCH_INTERNAL; - md->md.ant.isolation = 10; - md->md.kt_ver_adie = rtwdev->hal.acv; - - if (md->md.rfe_type == 0) - return; - - /* rfe_type 3*n+1: 1-Ant(shared), - * 3*n+2: 2-Ant+Div(non-shared), - * 3*n+3: 2-Ant+no-Div(non-shared) - */ - md->md.ant.num = (md->md.rfe_type % 3 == 1) ? 1 : 2; - /* WL-1ss at S0, btg at s0 (On 1 WL RF) */ - md->md.ant.single_pos = RF_PATH_A; - md->md.ant.btg_pos = RF_PATH_A; - md->md.ant.stream_cnt = 1; - - if (md->md.ant.num == 1) { - md->md.ant.type = BTC_ANT_SHARED; - md->md.bt_pos = BTC_BT_BTG; - md->md.wa_type = 1; - md->md.ant.diversity = 0; - } else { /* ant.num == 2 */ - md->md.ant.type = BTC_ANT_DEDICATED; - md->md.bt_pos = BTC_BT_ALONE; - md->md.switch_type = BTC_SWITCH_EXTERNAL; - md->md.wa_type = 0; - if (md->md.rfe_type % 3 == 2) - md->md.ant.diversity = 1; - } - rtwdev->btc.btg_pos = md->md.ant.btg_pos; - rtwdev->btc.ant_type = md->md.ant.type; + if (md->ant.num == 1) { + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; + md->wa_type = 1; + md->ant.diversity = 0; + } else { /* ant.num == 2 */ + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; + md->bt0_sw_type = BTC_SWITCH_EXTERNAL; + md->wa_type = 0; + if (md->rfe_type % 3 == 2) + md->ant.diversity = 1; } + rtwdev->btc.btg_pos = md->ant.btg_pos; + rtwdev->btc.ant_type = md->ant.type; } static @@ -2217,9 +2178,8 @@ static void rtw8851b_btc_init_cfg(struct rtw89_dev *rtwdev) }; const struct rtw89_chip_info *chip = rtwdev->chip; struct rtw89_btc *btc = &rtwdev->btc; - union rtw89_btc_module_info *md = &btc->mdinfo; - const struct rtw89_btc_ver *ver = btc->ver; - u8 path, path_min, path_max, str_cnt, ant_sing_pos; + struct rtw89_btc_module *md = &btc->mdinfo; + u8 path, path_min, path_max; /* PTA init */ rtw89_mac_coex_init(rtwdev, &coex_params); @@ -2228,17 +2188,9 @@ static void rtw8851b_btc_init_cfg(struct rtw89_dev *rtwdev) chip->ops->btc_set_wl_pri(rtwdev, BTC_PRI_MASK_TX_RESP, true); chip->ops->btc_set_wl_pri(rtwdev, BTC_PRI_MASK_BEACON, true); - if (ver->fcxinit == 7) { - str_cnt = md->md_v7.ant.stream_cnt; - ant_sing_pos = md->md_v7.ant.single_pos; - } else { - str_cnt = md->md.ant.stream_cnt; - ant_sing_pos = md->md.ant.single_pos; - } - /* for 1-Ant && 1-ss case: only 1-path */ - if (str_cnt == 1) { - path_min = ant_sing_pos; + if (md->ant.stream_cnt == 1) { + path_min = md->ant.single_pos; path_max = path_min; } else { path_min = RF_PATH_A; diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c index f32c7c6a4075..5d7b5d1a24b1 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c @@ -1827,56 +1827,30 @@ static u8 rtw8852a_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_p static void rtw8852a_btc_set_rfe(struct rtw89_dev *rtwdev) { - const struct rtw89_btc_ver *ver = rtwdev->btc.ver; - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; + struct rtw89_btc_module *md = &rtwdev->btc.mdinfo; - if (ver->fcxinit == 7) { - md->md_v7.rfe_type = rtwdev->efuse.rfe_type; - md->md_v7.kt_ver = rtwdev->hal.cv; - md->md_v7.bt_solo = 0; - md->md_v7.switch_type = BTC_SWITCH_INTERNAL; + md->rfe_type = rtwdev->efuse.rfe_type; + md->kt_ver = rtwdev->hal.cv; + md->bt_solo = 0; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; - if (md->md_v7.rfe_type > 0) - md->md_v7.ant.num = (md->md_v7.rfe_type % 2 ? 2 : 3); - else - md->md_v7.ant.num = 2; + if (md->rfe_type > 0) + md->ant.num = (md->rfe_type % 2 ? 2 : 3); + else + md->ant.num = 2; - md->md_v7.ant.diversity = 0; - md->md_v7.ant.isolation = 10; + md->ant.diversity = 0; + md->ant.isolation = 10; - if (md->md_v7.ant.num == 3) { - md->md_v7.ant.type = BTC_ANT_DEDICATED; - md->md_v7.bt_pos = BTC_BT_ALONE; - } else { - md->md_v7.ant.type = BTC_ANT_SHARED; - md->md_v7.bt_pos = BTC_BT_BTG; - } - rtwdev->btc.btg_pos = md->md_v7.ant.btg_pos; - rtwdev->btc.ant_type = md->md_v7.ant.type; + if (md->ant.num == 3) { + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; } else { - md->md.rfe_type = rtwdev->efuse.rfe_type; - md->md.cv = rtwdev->hal.cv; - md->md.bt_solo = 0; - md->md.switch_type = BTC_SWITCH_INTERNAL; - - if (md->md.rfe_type > 0) - md->md.ant.num = (md->md.rfe_type % 2 ? 2 : 3); - else - md->md.ant.num = 2; - - md->md.ant.diversity = 0; - md->md.ant.isolation = 10; - - if (md->md.ant.num == 3) { - md->md.ant.type = BTC_ANT_DEDICATED; - md->md.bt_pos = BTC_BT_ALONE; - } else { - md->md.ant.type = BTC_ANT_SHARED; - md->md.bt_pos = BTC_BT_BTG; - } - rtwdev->btc.btg_pos = md->md.ant.btg_pos; - rtwdev->btc.ant_type = md->md.ant.type; + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; } + rtwdev->btc.btg_pos = md->ant.btg_pos; + rtwdev->btc.ant_type = md->ant.type; } static diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c index a45f05309af8..356623341f65 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c @@ -750,56 +750,30 @@ static void rtw8852b_rfk_track(struct rtw89_dev *rtwdev) static void rtw8852b_btc_set_rfe(struct rtw89_dev *rtwdev) { - const struct rtw89_btc_ver *ver = rtwdev->btc.ver; - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; + struct rtw89_btc_module *md = &rtwdev->btc.mdinfo; - if (ver->fcxinit == 7) { - md->md_v7.rfe_type = rtwdev->efuse.rfe_type; - md->md_v7.kt_ver = rtwdev->hal.cv; - md->md_v7.bt_solo = 0; - md->md_v7.switch_type = BTC_SWITCH_INTERNAL; + md->rfe_type = rtwdev->efuse.rfe_type; + md->kt_ver = rtwdev->hal.cv; + md->bt_solo = 0; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; - if (md->md_v7.rfe_type > 0) - md->md_v7.ant.num = (md->md_v7.rfe_type % 2 ? 2 : 3); - else - md->md_v7.ant.num = 2; + if (md->rfe_type > 0) + md->ant.num = (md->rfe_type % 2 ? 2 : 3); + else + md->ant.num = 2; - md->md_v7.ant.diversity = 0; - md->md_v7.ant.isolation = 10; + md->ant.diversity = 0; + md->ant.isolation = 10; - if (md->md_v7.ant.num == 3) { - md->md_v7.ant.type = BTC_ANT_DEDICATED; - md->md_v7.bt_pos = BTC_BT_ALONE; - } else { - md->md_v7.ant.type = BTC_ANT_SHARED; - md->md_v7.bt_pos = BTC_BT_BTG; - } - rtwdev->btc.btg_pos = md->md_v7.ant.btg_pos; - rtwdev->btc.ant_type = md->md_v7.ant.type; + if (md->ant.num == 3) { + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; } else { - md->md.rfe_type = rtwdev->efuse.rfe_type; - md->md.cv = rtwdev->hal.cv; - md->md.bt_solo = 0; - md->md.switch_type = BTC_SWITCH_INTERNAL; - - if (md->md.rfe_type > 0) - md->md.ant.num = (md->md.rfe_type % 2 ? 2 : 3); - else - md->md.ant.num = 2; - - md->md.ant.diversity = 0; - md->md.ant.isolation = 10; - - if (md->md.ant.num == 3) { - md->md.ant.type = BTC_ANT_DEDICATED; - md->md.bt_pos = BTC_BT_ALONE; - } else { - md->md.ant.type = BTC_ANT_SHARED; - md->md.bt_pos = BTC_BT_BTG; - } - rtwdev->btc.btg_pos = md->md.ant.btg_pos; - rtwdev->btc.ant_type = md->md.ant.type; + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; } + rtwdev->btc.btg_pos = md->ant.btg_pos; + rtwdev->btc.ant_type = md->ant.type; } union rtw8852b_btc_wl_txpwr_ctrl { diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c index 8d5dd93626b3..3d93cee562c2 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c @@ -635,46 +635,41 @@ static void rtw8852bt_rfk_track(struct rtw89_dev *rtwdev) static void rtw8852bt_btc_set_rfe(struct rtw89_dev *rtwdev) { - const struct rtw89_btc_ver *ver = rtwdev->btc.ver; - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; + struct rtw89_btc_module *md = &rtwdev->btc.mdinfo; - if (ver->fcxinit == 7) { - md->md_v7.rfe_type = rtwdev->efuse.rfe_type; - md->md_v7.kt_ver = rtwdev->hal.cv; - md->md_v7.kt_ver_adie = rtwdev->hal.acv; - md->md_v7.bt_solo = 0; - md->md_v7.bt_pos = BTC_BT_BTG; - md->md_v7.switch_type = BTC_SWITCH_INTERNAL; - md->md_v7.wa_type = 0; + md->rfe_type = rtwdev->efuse.rfe_type; + md->kt_ver = rtwdev->hal.cv; + md->kt_ver_adie = rtwdev->hal.acv; + md->bt_solo = 0; + md->bt0_pos = BTC_BT_BTG; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; + md->wa_type = 0; - md->md_v7.ant.type = BTC_ANT_SHARED; - md->md_v7.ant.num = 2; - md->md_v7.ant.isolation = 10; - md->md_v7.ant.diversity = 0; - /* WL 1-stream+1-Ant is located at 0:s0(path-A) or 1:s1(path-B) */ - md->md_v7.ant.single_pos = RF_PATH_A; - md->md_v7.ant.btg_pos = RF_PATH_B; + md->ant.type = BTC_ANT_SHARED; + md->ant.num = 2; + md->ant.isolation = 10; + md->ant.diversity = 0; + /* WL 1-stream+1-Ant is located at 0:s0(path-A) or 1:s1(path-B) */ + md->ant.single_pos = RF_PATH_A; + md->ant.btg_pos = RF_PATH_B; - if (md->md_v7.rfe_type == 0) { - rtwdev->btc.dm.error.map.rfe_type0 = true; - return; - } - - md->md_v7.ant.num = (md->md_v7.rfe_type % 2) ? 2 : 3; - md->md_v7.ant.stream_cnt = 2; - md->md_v7.wa_type |= BTC_WA_INIT_SCAN; - - if (md->md_v7.ant.num == 2) { - md->md_v7.ant.type = BTC_ANT_SHARED; - md->md_v7.bt_pos = BTC_BT_BTG; - md->md_v7.wa_type |= BTC_WA_HFP_LAG; - } else { - md->md_v7.ant.type = BTC_ANT_DEDICATED; - md->md_v7.bt_pos = BTC_BT_ALONE; - } - } else { + if (md->rfe_type == 0) { + rtwdev->btc.dm.error.map.rfe_type0 = true; return; } + + md->ant.num = (md->rfe_type % 2) ? 2 : 3; + md->ant.stream_cnt = 2; + md->wa_type |= BTC_WA_INIT_SCAN; + + if (md->ant.num == 2) { + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; + md->wa_type |= BTC_WA_HFP_LAG; + } else { + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; + } } static void diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c index 3dc6dfce082a..c68959b63a01 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c @@ -2608,56 +2608,30 @@ static u8 rtw8852c_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_p static void rtw8852c_btc_set_rfe(struct rtw89_dev *rtwdev) { - const struct rtw89_btc_ver *ver = rtwdev->btc.ver; - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; + struct rtw89_btc_module *md = &rtwdev->btc.mdinfo; - if (ver->fcxinit == 7) { - md->md_v7.rfe_type = rtwdev->efuse.rfe_type; - md->md_v7.kt_ver = rtwdev->hal.cv; - md->md_v7.bt_solo = 0; - md->md_v7.switch_type = BTC_SWITCH_INTERNAL; + md->rfe_type = rtwdev->efuse.rfe_type; + md->kt_ver = rtwdev->hal.cv; + md->bt_solo = 0; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; - if (md->md_v7.rfe_type > 0) - md->md_v7.ant.num = (md->md_v7.rfe_type % 2 ? 2 : 3); - else - md->md_v7.ant.num = 2; + if (md->rfe_type > 0) + md->ant.num = (md->rfe_type % 2 ? 2 : 3); + else + md->ant.num = 2; - md->md_v7.ant.diversity = 0; - md->md_v7.ant.isolation = 10; + md->ant.diversity = 0; + md->ant.isolation = 10; - if (md->md_v7.ant.num == 3) { - md->md_v7.ant.type = BTC_ANT_DEDICATED; - md->md_v7.bt_pos = BTC_BT_ALONE; - } else { - md->md_v7.ant.type = BTC_ANT_SHARED; - md->md_v7.bt_pos = BTC_BT_BTG; - } - rtwdev->btc.btg_pos = md->md_v7.ant.btg_pos; - rtwdev->btc.ant_type = md->md_v7.ant.type; + if (md->ant.num == 3) { + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; } else { - md->md.rfe_type = rtwdev->efuse.rfe_type; - md->md.cv = rtwdev->hal.cv; - md->md.bt_solo = 0; - md->md.switch_type = BTC_SWITCH_INTERNAL; - - if (md->md.rfe_type > 0) - md->md.ant.num = (md->md.rfe_type % 2 ? 2 : 3); - else - md->md.ant.num = 2; - - md->md.ant.diversity = 0; - md->md.ant.isolation = 10; - - if (md->md.ant.num == 3) { - md->md.ant.type = BTC_ANT_DEDICATED; - md->md.bt_pos = BTC_BT_ALONE; - } else { - md->md.ant.type = BTC_ANT_SHARED; - md->md.bt_pos = BTC_BT_BTG; - } - rtwdev->btc.btg_pos = md->md.ant.btg_pos; - rtwdev->btc.ant_type = md->md.ant.type; + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; } + rtwdev->btc.btg_pos = md->ant.btg_pos; + rtwdev->btc.ant_type = md->ant.type; } static void rtw8852c_ctrl_btg_bt_rx(struct rtw89_dev *rtwdev, bool en, diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a.c b/drivers/net/wireless/realtek/rtw89/rtw8922a.c index 854ef9a980bd..2586fd2df8ab 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8922a.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8922a.c @@ -2721,46 +2721,45 @@ static u32 rtw8922a_chan_to_rf18_val(struct rtw89_dev *rtwdev, static void rtw8922a_btc_set_rfe(struct rtw89_dev *rtwdev) { - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; - struct rtw89_btc_module_v7 *module = &md->md_v7; + struct rtw89_btc_module *md = &rtwdev->btc.mdinfo; - module->rfe_type = rtwdev->efuse.rfe_type; - module->kt_ver = rtwdev->hal.cv; - module->bt_solo = 0; - module->switch_type = BTC_SWITCH_INTERNAL; - module->wa_type = 0; + md->rfe_type = rtwdev->efuse.rfe_type; + md->kt_ver = rtwdev->hal.cv; + md->bt_solo = 0; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; + md->wa_type = 0; - module->ant.type = BTC_ANT_SHARED; - module->ant.num = 2; - module->ant.isolation = 10; - module->ant.diversity = 0; - module->ant.single_pos = RF_PATH_A; - module->ant.btg_pos = RF_PATH_B; + md->ant.type = BTC_ANT_SHARED; + md->ant.num = 2; + md->ant.isolation = 10; + md->ant.diversity = 0; + md->ant.single_pos = RF_PATH_A; + md->ant.btg_pos = RF_PATH_B; - if (module->kt_ver <= 1) - module->wa_type |= BTC_WA_HFP_ZB; + if (md->kt_ver <= 1) + md->wa_type |= BTC_WA_HFP_ZB; rtwdev->btc.cx.bt_ext.func_type = BTC_3CX_NONE; - if (module->rfe_type == 0) { + if (md->rfe_type == 0) { rtwdev->btc.dm.error.map.rfe_type0 = true; return; } - module->ant.num = (module->rfe_type % 2) ? 2 : 3; + md->ant.num = (md->rfe_type % 2) ? 2 : 3; - if (module->kt_ver == 0) - module->ant.num = 2; + if (md->kt_ver == 0) + md->ant.num = 2; - if (module->ant.num == 3) { - module->ant.type = BTC_ANT_DEDICATED; - module->bt_pos = BTC_BT_ALONE; + if (md->ant.num == 3) { + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; } else { - module->ant.type = BTC_ANT_SHARED; - module->bt_pos = BTC_BT_BTG; + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; } - rtwdev->btc.btg_pos = module->ant.btg_pos; - rtwdev->btc.ant_type = module->ant.type; + rtwdev->btc.btg_pos = md->ant.btg_pos; + rtwdev->btc.ant_type = md->ant.type; } static @@ -2773,7 +2772,7 @@ void rtw8922a_set_trx_mask(struct rtw89_dev *rtwdev, u8 path, u8 group, u32 val) static void rtw8922a_btc_init_cfg(struct rtw89_dev *rtwdev) { struct rtw89_btc *btc = &rtwdev->btc; - struct rtw89_btc_ant_info_v7 *ant = &btc->mdinfo.md_v7.ant; + struct rtw89_btc_ant_info *ant = &btc->mdinfo.ant; u32 wl_pri, path_min, path_max; u8 path; diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922d.c b/drivers/net/wireless/realtek/rtw89/rtw8922d.c index fd4c92ba3f7b..12c96425a6ff 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8922d.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8922d.c @@ -3170,32 +3170,31 @@ static u32 rtw8922d_chan_to_rf18_val(struct rtw89_dev *rtwdev, static void rtw8922d_btc_set_rfe(struct rtw89_dev *rtwdev) { struct rtw89_btc *btc = &rtwdev->btc; + struct rtw89_btc_module *md = &btc->mdinfo; struct rtw89_btc_dm *dm = &btc->dm; struct rtw89_btc_cx *cx = &btc->cx; - union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo; - struct rtw89_btc_module_v10 *module = &md->md_v10; u8 efuse_bt_func, efuse_ant_info, bt_sw_gpio_pos; u8 is_combo, is_bt_share; rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], %s !!\n", __func__); /* get from final capability of device */ - module->rfe_type = rtwdev->efuse.rfe_type; - module->kt_ver = rtwdev->hal.cv; - module->kt_ver_adie = rtwdev->hal.acv; - module->wa_type = 0; + md->rfe_type = rtwdev->efuse.rfe_type; + md->kt_ver = rtwdev->hal.cv; + md->kt_ver_adie = rtwdev->hal.acv; + md->wa_type = 0; dm->wl_trx_nss_en = 0; - module->ant.num = 2; - module->ant.single_pos = BTC_RF_S0; /* WL 1ss+1Ant 0:s0(A)/ 1:s1(B) */ + md->ant.num = 2; + md->ant.single_pos = BTC_RF_S0; /* WL 1ss+1Ant 0:s0(A)/ 1:s1(B) */ /* set default antenna isolation */ - cx->bt0.ant_iso_to_wl = module->ant.isolation; - cx->bt1.ant_iso_to_wl = module->ant.isolation; + cx->bt0.ant_iso_to_wl = md->ant.isolation; + cx->bt1.ant_iso_to_wl = md->ant.isolation; - module->ant.stream_cnt = 2; - module->ant.btg_pos = BTC_RF_S1; /* BTG0 at WL-S1 */ - module->ant.btg1_pos = BTC_RF_S0; /* BTG1 at WL-S0 if Dual-BTGA */ + md->ant.stream_cnt = 2; + md->ant.btg_pos = BTC_RF_S1; /* BTG0 at WL-S1 */ + md->ant.btg1_pos = BTC_RF_S0; /* BTG1 at WL-S0 if Dual-BTGA */ cx->bt0.band_56G_support = 1; cx->bt1.band_56G_support = 1; @@ -3223,21 +3222,21 @@ static void rtw8922d_btc_set_rfe(struct rtw89_dev *rtwdev) efuse_bt_func &= 0x1f; /* 0xcd[4:0] */ efuse_ant_info = rtwdev->efuse.bt_setting_3; - module->ant.num = (efuse_ant_info & 0xe0) >> 5; /* 0xCE[7:5] */ + md->ant.num = (efuse_ant_info & 0xe0) >> 5; /* 0xCE[7:5] */ is_combo = (efuse_ant_info & 0xe) >> 1; /* 0xCE[3:1] */ is_bt_share = efuse_ant_info & BIT(0); /* 0xCE[0] */ memset(dm->ant_xmap, 0, sizeof(dm->ant_xmap)); /* To-Do: "RFE_TYpe" to "ant.num" translation */ - switch (module->ant.num) { + switch (md->ant.num) { case 1: /* 1-Ant WL-S0 only & BT0 only */ - module->ant.type = BTC_ANT_SHARED; - module->bt0_pos = BTC_BT_BTG; - module->bt0_sw_type = BTC_SWITCH_INTERNAL; - module->ant.btg_pos = BTC_RF_S0; /* BTG0 at WL-S0 */ - module->ant.stream_cnt = 1; - module->ant.func[0] = BTC_EFMAP_BT0; + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; + md->ant.btg_pos = BTC_RF_S0; /* BTG0 at WL-S0 */ + md->ant.stream_cnt = 1; + md->ant.func[0] = BTC_EFMAP_BT0; dm->ant_xmap[BTC_RF_S0][BTC_BT_1ST] = 1; /* BT0 shared with S0*/ dm->ant_xmap[BTC_RF_S1][BTC_BT_1ST] = 0; /* WL 1T1R no RF-S1 */ break; @@ -3245,34 +3244,34 @@ static void rtw8922d_btc_set_rfe(struct rtw89_dev *rtwdev) default: if (is_combo) { if (efuse_bt_func == (BTC_EFMAP_BT0 | BTC_EFMAP_BT1)) - module->ant.func[0] = BTC_EFMAP_BT1; + md->ant.func[0] = BTC_EFMAP_BT1; - module->ant.func[1] = BTC_EFMAP_BT0; + md->ant.func[1] = BTC_EFMAP_BT0; } else { - module->ant.func[0] = BTC_EFMAP_NONE; - module->ant.func[1] = BTC_EFMAP_NONE; + md->ant.func[0] = BTC_EFMAP_NONE; + md->ant.func[1] = BTC_EFMAP_NONE; } if (is_bt_share) { /* WL-S0 + (WL-S1 & BT0-S1) */ - module->ant.type = BTC_ANT_SHARED; - module->bt0_pos = BTC_BT_BTG; - module->bt0_sw_type = BTC_SWITCH_INTERNAL; + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; dm->ant_xmap[BTC_RF_S1][BTC_BT_1ST] = 1; } else { /* WL-S0 + BT0-S1 */ - module->ant.type = BTC_ANT_DEDICATED; - module->bt0_pos = BTC_BT_ALONE; - module->bt0_sw_type = BTC_SWITCH_V1_NONE; + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; + md->bt0_sw_type = BTC_SWITCH_V1_NONE; } - if (module->ant.func[0] == BTC_EFMAP_BT1) { /* if 2nd BT exist */ + if (md->ant.func[0] == BTC_EFMAP_BT1) { /* if 2nd BT exist */ dm->ant_xmap[BTC_RF_S0][BTC_BT_2ND] = 1; - if (module->rfe_type == 12) { /* WL-S0 & BT1 by SPDT */ - module->bt1_pos = BTC_BT_ALONE; + if (md->rfe_type == 12) { /* WL-S0 & BT1 by SPDT */ + md->bt1_pos = BTC_BT_ALONE; /* Todo: set SPDT GPIO-ctrl */ - module->bt1_sw_type = bt_sw_gpio_pos; + md->bt1_sw_type = bt_sw_gpio_pos; } else { /* WL-S0 & BT1-S1 by BTGA */ - module->bt1_pos = BTC_BT_BTG; - module->bt1_sw_type = BTC_SWITCH_INTERNAL; + md->bt1_pos = BTC_BT_BTG; + md->bt1_sw_type = BTC_SWITCH_INTERNAL; } } @@ -3280,48 +3279,48 @@ static void rtw8922d_btc_set_rfe(struct rtw89_dev *rtwdev) break; case 3: /* 3-Ant, 3 different BT-configuration */ if (is_bt_share) { - module->ant.func[0] = BTC_EFMAP_NONE; - module->ant.func[1] = BTC_EFMAP_BT0; - module->ant.func[2] = efuse_bt_func & (~BTC_EFMAP_BT0); - module->ant.type = BTC_ANT_SHARED; - module->bt0_pos = BTC_BT_BTG; - module->bt0_sw_type = BTC_SWITCH_INTERNAL; + md->ant.func[0] = BTC_EFMAP_NONE; + md->ant.func[1] = BTC_EFMAP_BT0; + md->ant.func[2] = efuse_bt_func & (~BTC_EFMAP_BT0); + md->ant.type = BTC_ANT_SHARED; + md->bt0_pos = BTC_BT_BTG; + md->bt0_sw_type = BTC_SWITCH_INTERNAL; dm->ant_xmap[BTC_RF_S1][BTC_BT_1ST] = 1; dm->wl_trx_nss_en = 1; /* 1ss MIMO-PS capability */ } else { - module->ant.func[0] = BTC_EFMAP_NONE; - module->ant.func[1] = BTC_EFMAP_NONE; - module->ant.func[2] = efuse_bt_func; - module->ant.type = BTC_ANT_DEDICATED; - module->bt0_pos = BTC_BT_ALONE; - module->bt0_sw_type = BTC_SWITCH_V1_NONE; + md->ant.func[0] = BTC_EFMAP_NONE; + md->ant.func[1] = BTC_EFMAP_NONE; + md->ant.func[2] = efuse_bt_func; + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; + md->bt0_sw_type = BTC_SWITCH_V1_NONE; } - module->bt1_pos = BTC_BT_ALONE; /* BT1 may exist or not */ - module->bt1_sw_type = BTC_SWITCH_V1_NONE; + md->bt1_pos = BTC_BT_ALONE; /* BT1 may exist or not */ + md->bt1_sw_type = BTC_SWITCH_V1_NONE; break; case 4: /* 4-Ant, WL-S0 + WL-S1 + BT0 + BT1 */ - module->ant.func[0] = BTC_EFMAP_NONE; - module->ant.func[1] = BTC_EFMAP_NONE; - module->ant.func[2] = BTC_EFMAP_BT0; - module->ant.func[3] = efuse_bt_func & (~BTC_EFMAP_BT0); - module->ant.type = BTC_ANT_DEDICATED; - module->bt0_pos = BTC_BT_ALONE; - module->bt0_sw_type = BTC_SWITCH_V1_NONE; - module->bt1_pos = BTC_BT_ALONE; - module->bt1_sw_type = BTC_SWITCH_V1_NONE; + md->ant.func[0] = BTC_EFMAP_NONE; + md->ant.func[1] = BTC_EFMAP_NONE; + md->ant.func[2] = BTC_EFMAP_BT0; + md->ant.func[3] = efuse_bt_func & (~BTC_EFMAP_BT0); + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; + md->bt0_sw_type = BTC_SWITCH_V1_NONE; + md->bt1_pos = BTC_BT_ALONE; + md->bt1_sw_type = BTC_SWITCH_V1_NONE; break; case 5: - module->ant.func[0] = BTC_EFMAP_NONE; - module->ant.func[1] = BTC_EFMAP_NONE; - module->ant.func[2] = BTC_EFMAP_BT0; - module->ant.func[3] = BTC_EFMAP_BT1; - module->ant.func[4] = BTC_EFMAP_ZB; - module->ant.type = BTC_ANT_DEDICATED; - module->bt0_pos = BTC_BT_ALONE; - module->bt0_sw_type = BTC_SWITCH_V1_NONE; - module->bt1_pos = BTC_BT_ALONE; - module->bt1_sw_type = BTC_SWITCH_V1_NONE; + md->ant.func[0] = BTC_EFMAP_NONE; + md->ant.func[1] = BTC_EFMAP_NONE; + md->ant.func[2] = BTC_EFMAP_BT0; + md->ant.func[3] = BTC_EFMAP_BT1; + md->ant.func[4] = BTC_EFMAP_ZB; + md->ant.type = BTC_ANT_DEDICATED; + md->bt0_pos = BTC_BT_ALONE; + md->bt0_sw_type = BTC_SWITCH_V1_NONE; + md->bt1_pos = BTC_BT_ALONE; + md->bt1_sw_type = BTC_SWITCH_V1_NONE; break; } @@ -3333,8 +3332,8 @@ static void rtw8922d_btc_set_rfe(struct rtw89_dev *rtwdev) */ if (dm->wl_trx_nss_en && (dm->wl_trx_nss.tx_limit && dm->wl_trx_nss.rx_limit)) { - module->ant.type = BTC_ANT_DEDICATED; - module->ant.stream_cnt = 1; + md->ant.type = BTC_ANT_DEDICATED; + md->ant.stream_cnt = 1; dm->ant_xmap[BTC_RF_S0][BTC_BT_1ST] = 0; /* wl 1ss-> RF-S0 */ dm->ant_xmap[BTC_RF_S1][BTC_BT_1ST] = 0; /* BT0-> RF-S1 */ dm->ant_xmap[BTC_RF_S0][BTC_BT_2ND] = 0; @@ -3365,10 +3364,10 @@ static void rtw8922d_btc_set_rfe(struct rtw89_dev *rtwdev) /* use GPIO 12~15 for Ext-4-wire-PTA */ cx->bt_ext.hpta_cfg = BIT(12) | BIT(13) | BIT(14) | BIT(15); /* for Ext-SOC locate at Ant-2 */ - if (module->ant.num >= 5) - module->ant.func[4] = BTC_EFMAP_ZB; + if (md->ant.num >= 5) + md->ant.func[4] = BTC_EFMAP_ZB; else - module->ant.func[module->ant.num - 1] = BTC_EFMAP_ZB; + md->ant.func[md->ant.num - 1] = BTC_EFMAP_ZB; break; }