1 /******************************************************************************
3 * Copyright(c) 2016 - 2017 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 *****************************************************************************/
16 #include "mp_precomp.h"
17 #include "../phydm_precomp.h"
19 #if (RTL8821C_SUPPORT == 1)
20 #if (PHYDM_FW_API_ENABLE_8821C == 1)
21 /* ======================================================================== */
22 /* These following functions can be used for PHY DM only*/
28 enum channel_width bw_8821c;
32 s8 phydm_cck_rssi_8821c(struct dm_struct *dm, u8 lna_idx, u8 vga_idx)
36 /*only use lna2/3/5/7*/
37 s8 lna_gain_table_0[8] = {22, 8, -6, -22, -31, -40, -46, -52};
38 /*only use lna4/8/C/F*/
39 s8 lna_gain_table_1[16] = {10, 6, 2, -2, -6, -10, -14, -17,
40 -20, -24, -28, -31, -34, -37, -40, -44};
42 if (dm->cck_agc_report_type == 0)
43 lna_gain = lna_gain_table_0[lna_idx];
45 lna_gain = lna_gain_table_1[lna_idx];
47 rx_pwr_all = lna_gain - (2 * vga_idx);
54 phydm_rfe_8821c(struct dm_struct *dm, u8 channel)
57 /* Efuse is not wrote now */
58 /* Need to check RFE type finally */
59 /*if (dm->rfe_type == 1) {*/
62 odm_set_bb_reg(dm, R_0xcb0, (MASKBYTE2 | MASKLWORD), 0x704570);
63 odm_set_bb_reg(dm, R_0xeb0, (MASKBYTE2 | MASKLWORD), 0x704570);
64 odm_set_bb_reg(dm, R_0xcb4, MASKBYTE1, 0x45);
65 odm_set_bb_reg(dm, R_0xeb4, MASKBYTE1, 0x45);
66 } else if (channel > 35) {
67 odm_set_bb_reg(dm, R_0xcb0, (MASKBYTE2 | MASKLWORD), 0x174517);
68 odm_set_bb_reg(dm, R_0xeb0, (MASKBYTE2 | MASKLWORD), 0x174517);
69 odm_set_bb_reg(dm, R_0xcb4, MASKBYTE1, 0x45);
70 odm_set_bb_reg(dm, R_0xeb4, MASKBYTE1, 0x45);
75 odm_set_bb_reg(dm, R_0x64, BIT(29) | BIT(28), 0x3);
76 odm_set_bb_reg(dm, R_0x4c, BIT(26) | BIT(25), 0x0);
77 odm_set_bb_reg(dm, R_0x40, BIT(2), 0x1);
80 odm_set_bb_reg(dm, R_0x1990, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x30);
81 odm_set_bb_reg(dm, R_0x1990, (BIT(11) | BIT(10)), 0x3);
84 odm_set_bb_reg(dm, R_0x974, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x3f);
85 odm_set_bb_reg(dm, R_0x974, (BIT(11) | BIT(10)), 0x3);
87 /* delay 400ns for PAPE */
88 odm_set_bb_reg(dm, R_0x810, MASKBYTE3 | BIT(20) | BIT(21) | BIT(22) | BIT(23), 0x211);
90 /* antenna switch table */
91 odm_set_bb_reg(dm, R_0xca0, MASKLWORD, 0xa555);
92 odm_set_bb_reg(dm, R_0xea0, MASKLWORD, 0xa555);
95 odm_set_bb_reg(dm, R_0xcbc, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x0);
96 odm_set_bb_reg(dm, R_0xcbc, (BIT(11) | BIT(10)), 0x0);
97 odm_set_bb_reg(dm, R_0xebc, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x0);
98 odm_set_bb_reg(dm, R_0xebc, (BIT(11) | BIT(10)), 0x0);
105 void phydm_ccapar_8821c(struct dm_struct *dm)
108 u32 cca_ifem[9][4] = {
110 {0x75D97010, 0x75D97010, 0x75D97010, 0x75D97010}, /*Reg82C*/
111 {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
112 {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg838*/
114 {0x75D97010, 0x75D97010, 0x75D97010, 0x75D97010}, /*Reg82C*/
115 {0x00000000, 0x79a0ea28, 0x00000000, 0x79a0ea28}, /*Reg830*/
116 {0x87765541, 0x87766341, 0x87765541, 0x87766341}, /*Reg838*/
118 {0x75D97010, 0x75D97010, 0x75D97010, 0x75D97010}, /*Reg82C*/
119 {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
120 {0x00000000, 0x87746641, 0x00000000, 0x87746641}
123 u32 cca_efem[9][4] = {
125 {0x75A76010, 0x75A76010, 0x75A76010, 0x75A75010}, /*Reg82C*/
126 {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
127 {0x87766651, 0x87766431, 0x87766451, 0x87766431}, /*Reg838*/
129 {0x75A75010, 0x75A75010, 0x75A75010, 0x75A75010}, /*Reg82C*/
130 {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
131 {0x87766431, 0x87766431, 0x87766431, 0x87766431}, /*Reg838*/
133 {0x75BA7010, 0x75BA7010, 0x75BA7010, 0x75BA7010}, /*Reg82C*/
134 {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
135 {0x87766431, 0x87766431, 0x87766431, 0x87766431}
139 u32 reg82c, reg830, reg838;
141 if (dm->cut_version != ODM_CUT_B)
144 if (bw_8821c == CHANNEL_WIDTH_20)
146 else if (bw_8821c == CHANNEL_WIDTH_40)
151 if (central_ch_8821c <= 14) {
152 if (dm->rx_ant_status == BB_PATH_A || dm->rx_ant_status == BB_PATH_B)
157 if (dm->rx_ant_status == BB_PATH_A || dm->rx_ant_status == BB_PATH_B)
163 if (dm->rfe_type == 0) {/*iFEM*/
164 reg82c = (cca_ifem[row][col] != 0) ? cca_ifem[row][col] : reg82c_8821c;
165 reg830 = (cca_ifem[row + 1][col] != 0) ? cca_ifem[row + 1][col] : reg830_8821c;
166 reg838 = (cca_ifem[row + 2][col] != 0) ? cca_ifem[row + 2][col] : reg838_8821c;
168 reg82c = (cca_efem[row][col] != 0) ? cca_efem[row][col] : reg82c_8821c;
169 reg830 = (cca_efem[row + 1][col] != 0) ? cca_efem[row + 1][col] : reg830_8821c;
170 reg838 = (cca_efem[row + 2][col] != 0) ? cca_efem[row + 2][col] : reg838_8821c;
173 odm_set_bb_reg(dm, R_0x82c, MASKDWORD, reg82c);
174 odm_set_bb_reg(dm, R_0x830, MASKDWORD, reg830);
175 odm_set_bb_reg(dm, R_0x838, MASKDWORD, reg838);
177 PHYDM_DBG(dm, ODM_PHY_CONFIG,
178 "[%s]: Update CCA parameters for Bcut (Pkt%d, Intf%d, RFE%d), row = %d, col = %d\n",
179 __func__, dm->package_type, dm->support_interface,
180 dm->rfe_type, row, col);
185 void phydm_ccapar_by_bw_8821c(struct dm_struct *dm,
186 enum channel_width bandwidth)
192 if (dm->cut_version != ODM_CUT_A)
196 reg82c = odm_get_bb_reg(dm, R_0x82c, MASKDWORD);
198 if (bandwidth == CHANNEL_WIDTH_20) {
202 reg82c &= (~(0x0f00f000));
203 reg82c |= ((0x4) << 12);
204 reg82c |= ((0x6) << 24);
205 } else if (bandwidth == CHANNEL_WIDTH_40) {
209 reg82c &= (~(0x0f0f0000));
210 reg82c |= ((0x9) << 16);
211 reg82c |= ((0x6) << 24);
212 } else if (bandwidth == CHANNEL_WIDTH_80) {
218 reg82c &= (~(0x0ffff000));
219 reg82c |= ((0xdb7) << 12);
220 reg82c |= ((0x3) << 24);
223 odm_set_bb_reg(dm, R_0x82c, MASKDWORD, reg82c);
224 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: Update CCA parameters for Acut\n",
230 void phydm_ccapar_by_rxpath_8821c(struct dm_struct *dm)
233 if (dm->cut_version != ODM_CUT_A)
236 if (dm->rx_ant_status == BB_PATH_A || dm->rx_ant_status == BB_PATH_B) {
243 odm_set_bb_reg(dm, R_0x838, 0x0ffffff0, 0x777678);
251 odm_set_bb_reg(dm, R_0x838, 0x0ffffff0, 0x776633);
253 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: Update CCA parameters for Acut\n",
259 void phydm_rxdfirpar_by_bw_8821c(struct dm_struct *dm,
260 enum channel_width bandwidth)
262 if (bandwidth == CHANNEL_WIDTH_40) {
263 /* RX DFIR for BW40 */
264 odm_set_bb_reg(dm, R_0x948, BIT(29) | BIT(28), 0x2);
265 odm_set_bb_reg(dm, R_0x94c, BIT(29) | BIT(28), 0x2);
266 odm_set_bb_reg(dm, R_0xc20, BIT(31), 0x0);
267 odm_set_bb_reg(dm, R_0x8f0, BIT(31), 0x0);
268 } else if (bandwidth == CHANNEL_WIDTH_80) {
269 /* RX DFIR for BW80 */
270 odm_set_bb_reg(dm, R_0x948, BIT(29) | BIT(28), 0x2);
271 odm_set_bb_reg(dm, R_0x94c, BIT(29) | BIT(28), 0x1);
272 odm_set_bb_reg(dm, R_0xc20, BIT(31), 0x0);
273 odm_set_bb_reg(dm, R_0x8f0, BIT(31), 0x1);
275 /* RX DFIR for BW20, BW10 and BW5*/
276 odm_set_bb_reg(dm, R_0x948, BIT(29) | BIT(28), 0x2);
277 odm_set_bb_reg(dm, R_0x94c, BIT(29) | BIT(28), 0x2);
278 odm_set_bb_reg(dm, R_0xc20, BIT(31), 0x1);
279 odm_set_bb_reg(dm, R_0x8f0, BIT(31), 0x0);
281 /* PHYDM_DBG(dm, ODM_PHY_CONFIG, "phydm_rxdfirpar_by_bw_8821c\n");*/
286 phydm_write_txagc_1byte_8821c(struct dm_struct *dm, u32 power_index,
287 enum rf_path path, u8 hw_rate)
289 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
290 u32 offset_txagc[2] = {0x1d00, 0x1d80};
291 u8 rate_idx = (hw_rate & 0xfc), i;
292 u8 rate_offset = (hw_rate & 0x3);
293 u32 txagc_content = 0x0;
295 /* For debug command only!!!! */
298 if (path > RF_PATH_A || hw_rate > 0x53) {
299 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: unsupported path (%d)\n",
305 /* For HW limitation, We can't write TXAGC once a byte. */
306 for (i = 0; i < 4; i++) {
307 if (i != rate_offset)
308 txagc_content = txagc_content | (config_phydm_read_txagc_8821c(dm, path, rate_idx + i) << (i << 3));
310 txagc_content = txagc_content | ((power_index & 0x3f) << (i << 3));
312 odm_set_bb_reg(dm, (offset_txagc[path] + rate_idx), MASKDWORD, txagc_content);
314 odm_write_1byte(dm, (offset_txagc[path] + hw_rate), (power_index & 0x3f));
317 PHYDM_DBG(dm, ODM_PHY_CONFIG,
318 "[%s]: path-%d rate index 0x%x (0x%x) = 0x%x\n", __func__,
319 path, hw_rate, (offset_txagc[path] + hw_rate), power_index);
327 void phydm_init_hw_info_by_rfe_type_8821c(struct dm_struct *dm)
329 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
330 dm->is_init_hw_info_by_rfe = false;
332 * Let original variable rfe_type to be rfe_type_8821c.
333 * Varible rfe_type as symbol is used to identify PHY parameter.
335 dm->rfe_type = dm->rfe_type_expand >> 3;
337 /*2.4G default rf set with wlg or btg*/
338 if (dm->rfe_type_expand == 2 || dm->rfe_type_expand == 4 || dm->rfe_type_expand == 7) {
339 dm->default_rf_set_8821c = SWITCH_TO_BTG;
340 } else if (dm->rfe_type_expand == 0 || dm->rfe_type_expand == 1 ||
341 dm->rfe_type_expand == 3 || dm->rfe_type_expand == 5 ||
342 dm->rfe_type_expand == 6) {
343 dm->default_rf_set_8821c = SWITCH_TO_WLG;
344 } else if (dm->rfe_type_expand == 0x22 || dm->rfe_type_expand == 0x24 ||
345 dm->rfe_type_expand == 0x27 || dm->rfe_type_expand == 0x2a ||
346 dm->rfe_type_expand == 0x2c || dm->rfe_type_expand == 0x2f) {
347 dm->default_rf_set_8821c = SWITCH_TO_BTG;
348 odm_cmn_info_init(dm, ODM_CMNINFO_PACKAGE_TYPE, 1);
349 } else if (dm->rfe_type_expand == 0x20 || dm->rfe_type_expand == 0x21 ||
350 dm->rfe_type_expand == 0x23 || dm->rfe_type_expand == 0x25 ||
351 dm->rfe_type_expand == 0x26 || dm->rfe_type_expand == 0x28 ||
352 dm->rfe_type_expand == 0x29 || dm->rfe_type_expand == 0x2b ||
353 dm->rfe_type_expand == 0x2d || dm->rfe_type_expand == 0x2e) {
354 dm->default_rf_set_8821c = SWITCH_TO_WLG;
355 odm_cmn_info_init(dm, ODM_CMNINFO_PACKAGE_TYPE, 1);
358 if (dm->rfe_type_expand == 3 || dm->rfe_type_expand == 4 ||
359 dm->rfe_type_expand == 0x23 || dm->rfe_type_expand == 0x24 ||
360 dm->rfe_type_expand == 0x2b || dm->rfe_type_expand == 0x2c)
361 dm->default_ant_num_8821c = SWITCH_TO_ANT2;
363 dm->default_ant_num_8821c = SWITCH_TO_ANT1;
365 dm->is_init_hw_info_by_rfe = true;
366 PHYDM_DBG(dm, ODM_PHY_CONFIG, "%s: RFE type (%d), rf set (%s)\n",
367 __FUNCTION__, dm->rfe_type_expand,
368 dm->default_rf_set_8821c == 0 ? "BTG" : "WLG");
373 void phydm_set_gnt_state_8821c(struct dm_struct *dm, boolean gnt_wl_state,
374 boolean gnt_bt_state)
376 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
379 odm_set_bb_reg(dm, R_0x70, BIT(26), 0x1);
387 gnt_val = gnt_val | 0xcc00;
389 gnt_val = gnt_val | 0x4400;
391 odm_set_bb_reg(dm, R_0x1704, MASKLWORD, gnt_val);
392 ODM_delay_us(50); /*waiting before access 0x1700 */
393 odm_set_bb_reg(dm, R_0x1700, MASKDWORD, 0xc00f0038);
396 /* ======================================================================== */
398 /* ======================================================================== */
399 /* These following functions can be used by driver*/
402 u32 config_phydm_read_rf_reg_8821c(struct dm_struct *dm, enum rf_path path,
403 u32 reg_addr, u32 bit_mask)
405 u32 readback_value, direct_addr;
406 u32 offset_read_rf[2] = {0x2800, 0x2c00};
409 if (path > RF_PATH_A) {
410 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: unsupported path (%d)\n",
412 return INVALID_RF_DATA;
415 /* Calculate offset */
417 direct_addr = offset_read_rf[path] + (reg_addr << 2);
419 /* RF register only has 20bits */
420 bit_mask &= RFREGOFFSETMASK;
422 /* Read RF register directly */
423 readback_value = odm_get_bb_reg(dm, direct_addr, bit_mask);
424 PHYDM_DBG(dm, ODM_PHY_CONFIG,
425 "[%s]: RF-%d 0x%x = 0x%x, bit mask = 0x%x\n", __func__, path,
426 reg_addr, readback_value, bit_mask);
427 return readback_value;
432 config_phydm_write_rf_reg_8821c(struct dm_struct *dm, enum rf_path path,
433 u32 reg_addr, u32 bit_mask, u32 data)
435 u32 data_and_addr = 0, data_original = 0;
436 u32 offset_write_rf[2] = {0xc90, 0xe90};
440 if (path > RF_PATH_A) {
441 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: unsupported path (%d)\n",
446 /* Read RF register content first */
448 bit_mask = bit_mask & RFREGOFFSETMASK;
450 if (bit_mask != RFREGOFFSETMASK) {
451 data_original = config_phydm_read_rf_reg_8821c(dm, path, reg_addr, RFREGOFFSETMASK);
453 /* Error handling. RF is disabled */
454 if (config_phydm_read_rf_check_8821c(data_original) == false) {
455 PHYDM_DBG(dm, ODM_PHY_CONFIG,
456 "[%s]: Write fail, RF is disable\n",
462 if (bit_mask != 0xfffff) {
463 for (bit_shift = 0; bit_shift <= 19; bit_shift++) {
464 if (((bit_mask >> bit_shift) & 0x1) == 1)
467 data = ((data_original) & (~bit_mask)) | (data << bit_shift);
471 /* Put write addr in [27:20] and write data in [19:00] */
472 data_and_addr = ((reg_addr << 20) | (data & 0x000fffff)) & 0x0fffffff;
474 /* Write operation */
475 odm_set_bb_reg(dm, offset_write_rf[path], MASKDWORD, data_and_addr);
476 PHYDM_DBG(dm, ODM_PHY_CONFIG,
477 "[%s]: RF-%d 0x%x = 0x%x (original: 0x%x), bit mask = 0x%x\n",
478 __func__, path, reg_addr, data, data_original, bit_mask);
480 #if (defined(CONFIG_RUN_IN_DRV))
481 if (dm->support_interface == ODM_ITRF_PCIE)
483 #elif (defined(CONFIG_RUN_IN_FW))
492 config_phydm_write_txagc_8821c(struct dm_struct *dm, u32 power_index,
493 enum rf_path path, u8 hw_rate)
495 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
496 u32 offset_txagc[2] = {0x1d00, 0x1d80};
497 u8 rate_idx = (hw_rate & 0xfc);
499 /* Input need to be HW rate index, not driver rate index!!!! */
501 if (dm->is_disable_phy_api) {
502 PHYDM_DBG(dm, ODM_PHY_CONFIG,
503 "[%s]: disable PHY API for debug!!\n", __func__);
508 if (path > RF_PATH_A || hw_rate > 0x53) {
509 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: unsupported path (%d)\n",
514 /* driver need to construct a 4-byte power index */
515 odm_set_bb_reg(dm, (offset_txagc[path] + rate_idx), MASKDWORD, power_index);
517 PHYDM_DBG(dm, ODM_PHY_CONFIG,
518 "[%s]: path-%d rate index 0x%x (0x%x) = 0x%x\n", __func__,
519 path, hw_rate, (offset_txagc[path] + hw_rate), power_index);
527 u8 config_phydm_read_txagc_8821c(struct dm_struct *dm, enum rf_path path,
530 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
533 /* Input need to be HW rate index, not driver rate index!!!! */
536 if (path > RF_PATH_A || hw_rate > 0x53) {
537 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: unsupported path (%d)\n",
539 return INVALID_TXAGC_DATA;
542 /* Disable TX AGC report */
543 odm_set_bb_reg(dm, R_0x1998, BIT(16), 0x0); /* need to check */
545 /* Set data rate index (bit0~6) and path index (bit7) */
546 odm_set_bb_reg(dm, R_0x1998, MASKBYTE0, (hw_rate | (path << 7)));
548 /* Enable TXAGC report */
549 odm_set_bb_reg(dm, R_0x1998, BIT(16), 0x1);
551 /* Read TX AGC report */
552 read_back_data = (u8)odm_get_bb_reg(dm, R_0xd30, 0x7f0000);
554 /* Driver have to disable TXAGC report after reading TXAGC (ref. user guide v11) */
555 odm_set_bb_reg(dm, R_0x1998, BIT(16), 0x0);
557 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: path-%d rate index 0x%x = 0x%x\n",
558 __func__, path, hw_rate, read_back_data);
559 return read_back_data;
567 config_phydm_switch_band_8821c(struct dm_struct *dm, u8 central_ch)
570 boolean rf_reg_status = true;
572 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]======================>\n",
575 if (dm->is_disable_phy_api) {
576 PHYDM_DBG(dm, ODM_PHY_CONFIG,
577 "[%s]: disable PHY API for debug!!\n", __func__);
581 rf_reg18 = config_phydm_read_rf_reg_8821c(dm, RF_PATH_A, 0x18, RFREGOFFSETMASK);
582 rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg18);
584 if (central_ch <= 14) {
587 /* Enable CCK block */
588 odm_set_bb_reg(dm, R_0x808, BIT(28), 0x1);
590 /* Disable MAC CCK check */
591 odm_set_bb_reg(dm, R_0x454, BIT(7), 0x0);
593 /* Disable BB CCK check */
594 odm_set_bb_reg(dm, R_0xa80, BIT(18), 0x0);
597 odm_set_bb_reg(dm, R_0x814, 0x0000FC00, 15); /*default value*/
600 rf_reg18 = (rf_reg18 & (~(BIT(16) | BIT(9) | BIT(8))));
601 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
603 if (dm->default_rf_set_8821c == SWITCH_TO_BTG)
604 config_phydm_switch_rf_set_8821c(dm, SWITCH_TO_BTG);
605 else if (dm->default_rf_set_8821c == SWITCH_TO_WLG)
606 config_phydm_switch_rf_set_8821c(dm, SWITCH_TO_WLG);
608 /*RF TXA_TANK LUT mode*/
609 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, BIT(6), 0x1);
612 odm_set_rf_reg(dm, RF_PATH_A, RF_0x64, 0x0000f, 0xf);
614 } else if (central_ch > 35) {
617 /* Enable BB CCK check */
618 odm_set_bb_reg(dm, R_0xa80, BIT(18), 0x1);
620 /* Enable CCK check */
621 odm_set_bb_reg(dm, R_0x454, BIT(7), 0x1);
623 /* Disable CCK block */
624 odm_set_bb_reg(dm, R_0x808, BIT(28), 0x0);
627 odm_set_bb_reg(dm, R_0x814, 0x0000FC00, 15); /*default value*/
628 /*odm_set_bb_reg(dm, R_0x814, 0x0000FC00, 34); CCA mask = 13.6us*/
631 rf_reg18 = (rf_reg18 & (~(BIT(16) | BIT(9) | BIT(8))));
632 rf_reg18 = (rf_reg18 | BIT(8) | BIT(16));
633 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
635 config_phydm_switch_rf_set_8821c(dm, SWITCH_TO_WLA);
637 /*RF TXA_TANK LUT mode*/
638 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, BIT(6), 0x0);
641 PHYDM_DBG(dm, ODM_PHY_CONFIG,
642 "[%s]: Fail to switch band (ch: %d)\n", __func__,
647 odm_set_rf_reg(dm, RF_PATH_A, RF_0x18, RFREGOFFSETMASK, rf_reg18);
649 if (phydm_rfe_8821c(dm, central_ch) == false)
652 if (!rf_reg_status) {
653 PHYDM_DBG(dm, ODM_PHY_CONFIG,
654 "[%s]: Fail to switch band (ch: %d), because writing RF register is fail\n",
655 __func__, central_ch);
659 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: Success to switch band (ch: %d)\n",
660 __func__, central_ch);
666 config_phydm_switch_channel_8821c(struct dm_struct *dm, u8 central_ch)
668 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
669 u32 rf_reg18, rf_reg_b8 = 0;
670 boolean rf_reg_status = true;
672 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]====================>\n", __func__);
674 if (dm->is_disable_phy_api) {
675 PHYDM_DBG(dm, ODM_PHY_CONFIG,
676 "[%s]: disable PHY API for debug!!\n", __func__);
680 central_ch_8821c = central_ch;
681 rf_reg18 = config_phydm_read_rf_reg_8821c(dm, RF_PATH_A, 0x18, RFREGOFFSETMASK);
682 rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg18);
684 if (dm->cut_version == ODM_CUT_A) {
685 rf_reg_b8 = config_phydm_read_rf_reg_8821c(dm, RF_PATH_A, 0xb8, RFREGOFFSETMASK);
686 rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg_b8);
689 /* Switch band and channel */
690 if (central_ch <= 14) {
693 /* 1. RF band and channel*/
694 rf_reg18 = (rf_reg18 & (~(BIT(18) | BIT(17) | MASKBYTE0)));
695 rf_reg18 = (rf_reg18 | central_ch);
697 /* 2. AGC table selection */
698 odm_set_bb_reg(dm, R_0xc1c, 0x00000F00, 0x0);
699 dig_t->agc_table_idx = 0x0;
701 /* 3. Set central frequency for clock offset tracking */
702 odm_set_bb_reg(dm, R_0x860, 0x1ffe0000, 0x96a);
704 /* Fix A-cut LCK fail issue @ 5285MHz~5375MHz, 0xb8[19]=0x0 */
705 if (dm->cut_version == ODM_CUT_A)
706 rf_reg_b8 = rf_reg_b8 | BIT(19);
708 /* CCK TX filter parameters */
709 if (central_ch == 14) {
710 odm_set_bb_reg(dm, R_0xa24, MASKDWORD, 0x0000b81c);
711 odm_set_bb_reg(dm, R_0xa28, MASKLWORD, 0x0000);
712 odm_set_bb_reg(dm, R_0xaac, MASKDWORD, 0x00003667);
714 odm_set_bb_reg(dm, R_0xa24, MASKDWORD, rega24_8821c);
715 odm_set_bb_reg(dm, R_0xa28, MASKLWORD, (rega28_8821c & MASKLWORD));
716 odm_set_bb_reg(dm, R_0xaac, MASKDWORD, regaac_8821c);
719 } else if (central_ch > 35) {
722 /* 1. RF band and channel*/
723 rf_reg18 = (rf_reg18 & (~(BIT(18) | BIT(17) | MASKBYTE0)));
724 rf_reg18 = (rf_reg18 | central_ch);
726 if (central_ch >= 36 && central_ch <= 64) {
728 } else if ((central_ch >= 100) && (central_ch <= 140)) {
729 rf_reg18 = (rf_reg18 | BIT(17));
730 } else if (central_ch > 140) {
731 rf_reg18 = (rf_reg18 | BIT(18));
733 PHYDM_DBG(dm, ODM_PHY_CONFIG,
734 "[%s]: Fail to switch channel (RF18) (ch: %d)\n",
735 __func__, central_ch);
739 /* 2. AGC table selection */
740 if (central_ch >= 36 && central_ch <= 64) {
741 odm_set_bb_reg(dm, R_0xc1c, 0x00000F00, 0x1);
742 dig_t->agc_table_idx = 0x1;
743 } else if ((central_ch >= 100) && (central_ch <= 144)) {
744 odm_set_bb_reg(dm, R_0xc1c, 0x00000F00, 0x2);
745 dig_t->agc_table_idx = 0x2;
746 } else if (central_ch >= 149) {
747 odm_set_bb_reg(dm, R_0xc1c, 0x00000F00, 0x3);
748 dig_t->agc_table_idx = 0x3;
750 PHYDM_DBG(dm, ODM_PHY_CONFIG,
751 "[%s]: Fail to switch channel (AGC) (ch: %d)\n",
752 __func__, central_ch);
756 /* 3. Set central frequency for clock offset tracking */
757 if (central_ch >= 36 && central_ch <= 48) {
758 odm_set_bb_reg(dm, R_0x860, 0x1ffe0000, 0x494);
759 } else if ((central_ch >= 52) && (central_ch <= 64)) {
760 odm_set_bb_reg(dm, R_0x860, 0x1ffe0000, 0x453);
761 } else if ((central_ch >= 100) && (central_ch <= 116)) {
762 odm_set_bb_reg(dm, R_0x860, 0x1ffe0000, 0x452);
763 } else if ((central_ch >= 118) && (central_ch <= 177)) {
764 odm_set_bb_reg(dm, R_0x860, 0x1ffe0000, 0x412);
766 PHYDM_DBG(dm, ODM_PHY_CONFIG,
767 "[%s]: Fail to switch channel (fc_area) (ch: %d)\n",
768 __func__, central_ch);
772 /* Fix A-cut LCK fail issue @ 5285MHz~5375MHz, 0xb8[19]=0x0 */
773 if (dm->cut_version == ODM_CUT_A) {
774 if (central_ch >= 57 && central_ch <= 75)
775 rf_reg_b8 = rf_reg_b8 & (~BIT(19));
777 rf_reg_b8 = rf_reg_b8 | BIT(19);
780 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
781 /*notch 5760 spur by CSI_MASK*/
782 if (central_ch == 153)
783 phydm_csi_mask_setting(dm, FUNC_ENABLE, (u32)central_ch, 20, 5760, PHYDM_DONT_CARE);
784 else if (central_ch == 151)
785 phydm_csi_mask_setting(dm, FUNC_ENABLE, (u32)central_ch, 40, 5760, PHYDM_DONT_CARE);
786 else if (central_ch == 155)
787 phydm_csi_mask_setting(dm, FUNC_ENABLE, (u32)central_ch, 80, 5760, PHYDM_DONT_CARE);
789 phydm_csi_mask_setting(dm, FUNC_DISABLE, (u32)central_ch, 80, 5760, PHYDM_DONT_CARE);
793 PHYDM_DBG(dm, ODM_PHY_CONFIG,
794 "[%s]: Fail to switch band (ch: %d)\n", __func__,
799 odm_set_rf_reg(dm, RF_PATH_A, RF_0x18, RFREGOFFSETMASK, rf_reg18);
801 if (dm->cut_version == ODM_CUT_A)
802 odm_set_rf_reg(dm, RF_PATH_A, RF_0xb8, RFREGOFFSETMASK, rf_reg_b8);
804 if (!rf_reg_status) {
805 PHYDM_DBG(dm, ODM_PHY_CONFIG,
806 "[%s]: Fail to switch channel (ch: %d), because writing RF register is fail\n",
807 __func__, central_ch);
811 phydm_ccapar_8821c(dm);
812 PHYDM_DBG(dm, ODM_PHY_CONFIG,
813 "[%s]: Success to switch channel (ch: %d)\n", __func__,
820 config_phydm_switch_bandwidth_8821c(struct dm_struct *dm, u8 primary_ch_idx,
821 enum channel_width bandwidth)
824 boolean rf_reg_status = true;
827 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]===================>\n", __func__);
829 if (dm->is_disable_phy_api) {
830 PHYDM_DBG(dm, ODM_PHY_CONFIG,
831 "[%s]: disable PHY API for debug!!\n", __func__);
836 if (bandwidth >= CHANNEL_WIDTH_MAX || (bandwidth == CHANNEL_WIDTH_40 && primary_ch_idx > 2) || (bandwidth == CHANNEL_WIDTH_80 && primary_ch_idx > 4)) {
837 PHYDM_DBG(dm, ODM_PHY_CONFIG,
838 "[%s]: Fail to switch bandwidth (bw: %d, primary ch: %d)\n",
839 __func__, bandwidth, primary_ch_idx);
843 if (central_ch_8821c == 165 && !(*dm->mp_mode))
844 bandwidth = CHANNEL_WIDTH_20;
846 bw_8821c = bandwidth;
847 rf_reg18 = config_phydm_read_rf_reg_8821c(dm, RF_PATH_A, 0x18, RFREGOFFSETMASK);
848 rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg18);
850 /* Switch bandwidth */
852 case CHANNEL_WIDTH_20: {
853 /* Small BW([7:6]) = 0, primary channel ([5:2]) = 0, rf mode([1:0]) = 20M */
855 odm_set_bb_reg(dm, R_0x8ac, MASKBYTE0, CHANNEL_WIDTH_20);
857 /* ADC clock = 160M clock for BW20 */
858 odm_set_bb_reg(dm, R_0x8ac, (BIT(9) | BIT(8)), 0x0);
859 odm_set_bb_reg(dm, R_0x8ac, BIT(16), 0x1);
861 /* DAC clock = 160M clock for BW20 */
862 odm_set_bb_reg(dm, R_0x8ac, (BIT(21) | BIT(20)), 0x0);
863 odm_set_bb_reg(dm, R_0x8ac, BIT(28), 0x1);
865 bb_reg8ac = odm_get_bb_reg(dm, R_0x8ac, MASKDWORD);
866 bb_reg8ac &= 0xffcffc00;
867 bb_reg8ac |= 0x10010000;
868 odm_set_bb_reg(dm, R_0x8ac, MASKDWORD, bb_reg8ac);
870 /* ADC buffer clock */
871 odm_set_bb_reg(dm, R_0x8c4, BIT(30), 0x1);
874 rf_reg18 = (rf_reg18 | BIT(11) | BIT(10));
878 case CHANNEL_WIDTH_40: {
879 /* Small BW([7:6]) = 0, primary channel ([5:2]) = sub-channel, rf mode([1:0]) = 40M */
880 /*odm_set_bb_reg(dm, R_0x8ac, MASKBYTE0, (((primary_ch_idx & 0xf) << 2) | CHANNEL_WIDTH_40));*/
882 /* CCK primary channel */
883 if (primary_ch_idx == 1)
884 odm_set_bb_reg(dm, R_0xa00, BIT(4), primary_ch_idx);
886 odm_set_bb_reg(dm, R_0xa00, BIT(4), 0);
888 /* ADC clock = 160M clock for BW40 */
889 odm_set_bb_reg(dm, R_0x8ac, (BIT(11) | BIT(10)), 0x0);
890 odm_set_bb_reg(dm, R_0x8ac, BIT(17), 0x1);
892 /* DAC clock = 160M clock for BW20 */
893 odm_set_bb_reg(dm, R_0x8ac, (BIT(23) | BIT(22)), 0x0);
894 odm_set_bb_reg(dm, R_0x8ac, BIT(29), 0x1);
896 bb_reg8ac = odm_get_bb_reg(dm, R_0x8ac, MASKDWORD);
897 bb_reg8ac &= 0xff3ff300;
898 bb_reg8ac |= 0x20020000 | ((primary_ch_idx & 0xf) << 2) | CHANNEL_WIDTH_40;
899 odm_set_bb_reg(dm, R_0x8ac, MASKDWORD, bb_reg8ac);
901 /* ADC buffer clock */
902 odm_set_bb_reg(dm, R_0x8c4, BIT(30), 0x1);
905 rf_reg18 = (rf_reg18 & (~(BIT(11) | BIT(10))));
906 rf_reg18 = (rf_reg18 | BIT(11));
910 case CHANNEL_WIDTH_80: {
911 /* Small BW([7:6]) = 0, primary channel ([5:2]) = sub-channel, rf mode([1:0]) = 80M */
913 odm_set_bb_reg(dm, R_0x8ac, MASKBYTE0, (((primary_ch_idx & 0xf) << 2) | CHANNEL_WIDTH_80));
915 /* ADC clock = 160M clock for BW80 */
916 odm_set_bb_reg(dm, R_0x8ac, (BIT(13) | BIT(12)), 0x0);
917 odm_set_bb_reg(dm, R_0x8ac, BIT(18), 0x1);
919 /* DAC clock = 160M clock for BW20 */
920 odm_set_bb_reg(dm, R_0x8ac, (BIT(25) | BIT(24)), 0x0);
921 odm_set_bb_reg(dm, R_0x8ac, BIT(30), 0x1);
923 bb_reg8ac = odm_get_bb_reg(dm, R_0x8ac, MASKDWORD);
924 bb_reg8ac &= 0xfcffcf00;
925 bb_reg8ac |= 0x40040000 | ((primary_ch_idx & 0xf) << 2) | CHANNEL_WIDTH_80;
926 odm_set_bb_reg(dm, R_0x8ac, MASKDWORD, bb_reg8ac);
928 /* ADC buffer clock */
929 odm_set_bb_reg(dm, R_0x8c4, BIT(30), 0x1);
932 rf_reg18 = (rf_reg18 & (~(BIT(11) | BIT(10))));
933 rf_reg18 = (rf_reg18 | BIT(10));
937 case CHANNEL_WIDTH_5: {
938 /* Small BW([7:6]) = 1, primary channel ([5:2]) = 0, rf mode([1:0]) = 20M */
940 odm_set_bb_reg(dm, R_0x8ac, MASKBYTE0, (BIT(6) | CHANNEL_WIDTH_20));
942 /* ADC clock = 40M clock */
943 odm_set_bb_reg(dm, R_0x8ac, (BIT(9) | BIT(8)), 0x2);
944 odm_set_bb_reg(dm, R_0x8ac, BIT(16), 0x0);
946 /* DAC clock = 160M clock for BW20 */
947 odm_set_bb_reg(dm, R_0x8ac, (BIT(21) | BIT(20)), 0x2);
948 odm_set_bb_reg(dm, R_0x8ac, BIT(28), 0x0);
950 bb_reg8ac = odm_get_bb_reg(dm, R_0x8ac, MASKDWORD);
951 bb_reg8ac &= 0xefcefc00;
952 bb_reg8ac |= (0x2 << 20) | (0x2 << 8) | BIT(6);
953 odm_set_bb_reg(dm, R_0x8ac, MASKDWORD, bb_reg8ac);
955 /* ADC buffer clock */
956 odm_set_bb_reg(dm, R_0x8c4, BIT(30), 0x0);
957 odm_set_bb_reg(dm, R_0x8c8, BIT(31), 0x1);
960 rf_reg18 = (rf_reg18 | BIT(11) | BIT(10));
964 case CHANNEL_WIDTH_10: {
965 /* Small BW([7:6]) = 1, primary channel ([5:2]) = 0, rf mode([1:0]) = 20M */
967 odm_set_bb_reg(dm, R_0x8ac, MASKBYTE0, (BIT(7) | CHANNEL_WIDTH_20));
969 /* ADC clock = 80M clock */
970 odm_set_bb_reg(dm, R_0x8ac, (BIT(9) | BIT(8)), 0x3);
971 odm_set_bb_reg(dm, R_0x8ac, BIT(16), 0x0);
973 /* DAC clock = 160M clock for BW20 */
974 odm_set_bb_reg(dm, R_0x8ac, (BIT(21) | BIT(20)), 0x3);
975 odm_set_bb_reg(dm, R_0x8ac, BIT(28), 0x0);
977 bb_reg8ac = odm_get_bb_reg(dm, R_0x8ac, MASKDWORD);
978 bb_reg8ac &= 0xefcefc00;
979 bb_reg8ac |= (0x3 << 20) | (0x3 << 8) | BIT(7);
980 odm_set_bb_reg(dm, R_0x8ac, MASKDWORD, bb_reg8ac);
982 /* ADC buffer clock */
983 odm_set_bb_reg(dm, R_0x8c4, BIT(30), 0x0);
984 odm_set_bb_reg(dm, R_0x8c8, BIT(31), 0x1);
987 rf_reg18 = (rf_reg18 | BIT(11) | BIT(10));
992 PHYDM_DBG(dm, ODM_PHY_CONFIG,
993 "[%s]: Fail to switch bandwidth (bw: %d, primary ch: %d)\n",
994 __func__, bandwidth, primary_ch_idx);
997 /* Write RF register */
998 odm_set_rf_reg(dm, RF_PATH_A, RF_0x18, RFREGOFFSETMASK, rf_reg18);
1000 if (!rf_reg_status) {
1001 PHYDM_DBG(dm, ODM_PHY_CONFIG,
1002 "[%s]: Fail to switch bandwidth (bw: %d, primary ch: %d), because writing RF register is fail\n",
1003 __func__, bandwidth, primary_ch_idx);
1007 /* Modify RX DFIR parameters */
1008 phydm_rxdfirpar_by_bw_8821c(dm, bandwidth);
1010 /* Modify CCA parameters */
1011 phydm_ccapar_by_bw_8821c(dm, bandwidth);
1012 phydm_ccapar_8821c(dm);
1014 /* Toggle RX path to avoid RX dead zone issue */
1015 /*odm_set_bb_reg(dm, R_0x808, MASKBYTE0, 0x0);*/
1016 /*odm_set_bb_reg(dm, R_0x808, MASKBYTE0, 0x11);*/
1018 PHYDM_DBG(dm, ODM_PHY_CONFIG,
1019 "[%s]: Success to switch bandwidth (bw: %d, primary ch: %d)\n",
1020 __func__, bandwidth, primary_ch_idx);
1026 config_phydm_switch_channel_bw_8821c(struct dm_struct *dm, u8 central_ch,
1028 enum channel_width bandwidth)
1031 if (config_phydm_switch_band_8821c(dm, central_ch) == false)
1034 /* Switch channel */
1035 if (config_phydm_switch_channel_8821c(dm, central_ch) == false)
1038 /* Switch bandwidth */
1039 if (config_phydm_switch_bandwidth_8821c(dm, primary_ch_idx, bandwidth) == false)
1047 config_phydm_trx_mode_8821c(struct dm_struct *dm, enum bb_path tx_path,
1048 enum bb_path rx_path, boolean is_tx2_path)
1055 config_phydm_parameter_init_8821c(struct dm_struct *dm,
1056 enum odm_parameter_init type)
1058 if (type == ODM_PRE_SETTING) {
1059 odm_set_bb_reg(dm, R_0x808, (BIT(28) | BIT(29)), 0x0);
1060 PHYDM_DBG(dm, ODM_PHY_CONFIG,
1061 "[%s]: Pre setting: disable OFDM and CCK block\n",
1063 } else if (type == ODM_POST_SETTING) {
1064 odm_set_bb_reg(dm, R_0x808, (BIT(28) | BIT(29)), 0x3);
1065 PHYDM_DBG(dm, ODM_PHY_CONFIG,
1066 "[%s]: Post setting: enable OFDM and CCK block\n",
1068 rega24_8821c = odm_get_bb_reg(dm, R_0xa24, MASKDWORD);
1069 rega28_8821c = odm_get_bb_reg(dm, R_0xa28, MASKDWORD);
1070 regaac_8821c = odm_get_bb_reg(dm, R_0xaac, MASKDWORD);
1071 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1072 } else if (type == ODM_INIT_FW_SETTING) {
1073 u8 h2c_content[4] = {0};
1075 h2c_content[0] = dm->rfe_type_expand;
1076 h2c_content[1] = dm->rf_type;
1077 h2c_content[2] = dm->cut_version;
1078 h2c_content[3] = (dm->tx_ant_status << 4) | dm->rx_ant_status;
1080 odm_fill_h2c_cmd(dm, PHYDM_H2C_FW_GENERAL_INIT, 4, h2c_content);
1083 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: Wrong type!!\n", __func__);
1091 void config_phydm_switch_rf_set_8821c(struct dm_struct *dm, u8 rf_set)
1093 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1094 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1095 void *adapter = dm->adapter;
1096 PMGNT_INFO mgnt_info = &(((PADAPTER)(adapter))->MgntInfo);
1101 odm_set_bb_reg(dm, R_0x1080, BIT(16), 0x1);
1102 odm_set_bb_reg(dm, R_0x00, BIT(26), 0x1);
1103 /*odm_set_mac_reg(dm, R_0x70, BIT(26), 0x1);*/
1104 /*odm_set_mac_reg(dm, R_0x1704, MASKLWORD, 0x4000);*/
1105 /*odm_set_mac_reg(dm, R_0x1700, (BIT(31) | BIT(30)), 0x3); */
1107 bb_reg32 = odm_get_bb_reg(dm, R_0xcb8, MASKDWORD);
1111 dm->current_rf_set_8821c = SWITCH_TO_BTG;
1113 bb_reg32 = (bb_reg32 | BIT(16));
1114 bb_reg32 &= (~(BIT(18) | BIT(20) | BIT(21) | BIT(22) | BIT(23)));
1115 odm_set_bb_reg(dm, R_0xa84, MASKBYTE2, 0xe);
1116 odm_set_bb_reg(dm, R_0xa80, MASKLWORD, 0xfc84);
1118 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1119 if (*dm->mp_mode == true && mgnt_info->RegPHYParaFromFolder == 0) {
1121 if (*dm->mp_mode == true) {
1123 odm_set_bb_reg(dm, R_0xaa8, 0x1f0000, 0x14);
1124 odm_config_bb_with_header_file(dm, CONFIG_BB_AGC_TAB_DIFF);
1125 /*Toggle initial gain twice for valid gain table*/
1126 odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm), 0x22);
1127 odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm), 0x20);
1132 dm->current_rf_set_8821c = SWITCH_TO_WLG;
1134 bb_reg32 = (bb_reg32 | BIT(20) | BIT(21) | BIT(22));
1135 bb_reg32 &= (~(BIT(16) | BIT(18) | BIT(23)));
1136 odm_set_bb_reg(dm, R_0xa84, MASKBYTE2, 0x12);
1137 odm_set_bb_reg(dm, R_0xa80, MASKLWORD, 0x7532);
1139 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1140 if (*dm->mp_mode == true && mgnt_info->RegPHYParaFromFolder == 0) {
1142 if (*dm->mp_mode == true) {
1144 odm_set_bb_reg(dm, R_0xaa8, 0x1f0000, 0x13);
1145 odm_config_bb_with_header_file(dm, CONFIG_BB_AGC_TAB_DIFF);
1146 /*Toggle initial gain twice for valid gain table*/
1147 odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm), 0x22);
1148 odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm), 0x20);
1153 dm->current_rf_set_8821c = SWITCH_TO_WLA;
1155 bb_reg32 = (bb_reg32 | BIT(20) | BIT(22) | BIT(23));
1156 bb_reg32 &= (~(BIT(16) | BIT(18) | BIT(21)));
1161 dm->current_rf_set_8821c = SWITCH_TO_BT;
1168 odm_set_bb_reg(dm, R_0xcb8, MASKDWORD, bb_reg32);
1173 void config_phydm_set_ant_path(struct dm_struct *dm, u8 rf_set, u8 ant_num)
1175 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1176 boolean switch_polarity_inverse = false;
1177 u8 regval_0xcb7 = 0;
1179 dm->current_ant_num_8821c = ant_num;
1180 config_phydm_switch_rf_set_8821c(dm, rf_set);
1182 if (rf_set == SWITCH_TO_BT)
1183 phydm_set_gnt_state_8821c(dm, false, true); /* GNT_WL=0, GNT_BT=1 for BT test */
1185 phydm_set_gnt_state_8821c(dm, true, false); /* GNT_WL=1, GNT_BT=0 for WL test */
1187 /*switch does not exist*/
1188 if (dm->rfe_type_expand == 0x5 || dm->rfe_type_expand == 0x6 ||
1189 dm->rfe_type_expand == 0x25 || dm->rfe_type_expand == 0x26 ||
1190 dm->rfe_type_expand == 0x2a || dm->rfe_type_expand == 0x2d ||
1191 dm->rfe_type_expand == 0x2e)
1194 if (dm->current_ant_num_8821c) /*Ant1 = 0, Ant2 = 1*/
1195 switch_polarity_inverse = !switch_polarity_inverse;
1197 if (rf_set == SWITCH_TO_WLG)
1198 switch_polarity_inverse = !switch_polarity_inverse;
1200 /*set antenna control by WL 0xcb4[29:28]*/
1201 odm_set_bb_reg(dm, R_0x4c, BIT(24) | BIT(23), 0x2);
1203 /*set RFE_ctrl8 and RFE_ctrl9 as antenna control pins by software*/
1204 odm_set_bb_reg(dm, R_0xcb4, 0x000000ff, 0x77);
1206 /*0xcb4[29:28] = 2b'01 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0*/
1207 regval_0xcb7 = (!switch_polarity_inverse ? 0x1 : 0x2);
1209 odm_set_bb_reg(dm, R_0xcb4, 0x30000000, regval_0xcb7);
1214 u32 query_phydm_trx_capability_8821c(struct dm_struct *dm)
1216 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1217 u32 value32 = 0x00000000;
1219 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: trx_capability = 0x%x\n", __func__,
1228 u32 query_phydm_stbc_capability_8821c(struct dm_struct *dm)
1230 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1231 u32 value32 = 0x00010001;
1233 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: stbc_capability = 0x%x\n",
1242 u32 query_phydm_ldpc_capability_8821c(struct dm_struct *dm)
1244 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1245 u32 value32 = 0x01000100;
1247 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: ldpc_capability = 0x%x\n",
1256 u32 query_phydm_txbf_parameters_8821c(struct dm_struct *dm)
1258 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1259 u32 value32 = 0x00030003;
1261 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: txbf_parameters = 0x%x\n",
1270 u32 query_phydm_txbf_capability_8821c(struct dm_struct *dm)
1272 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1273 u32 value32 = 0x01010001;
1275 PHYDM_DBG(dm, ODM_PHY_CONFIG, "[%s]: txbf_capability = 0x%x\n",
1284 u8 query_phydm_default_rf_set_8821c(struct dm_struct *dm)
1286 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1287 return dm->default_rf_set_8821c;
1294 u8 query_phydm_current_rf_set_8821c(struct dm_struct *dm)
1296 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1297 return dm->current_rf_set_8821c;
1304 u8 query_phydm_rfetype_8821c(struct dm_struct *dm)
1306 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1307 return dm->rfe_type_expand;
1314 u8 query_phydm_current_ant_num_8821c(struct dm_struct *dm)
1316 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1317 u32 regval_0xcb4 = odm_get_bb_reg(dm, R_0xcb4, BIT(29) | BIT(28));
1319 if (dm->current_rf_set_8821c == SWITCH_TO_BTG || dm->current_rf_set_8821c == SWITCH_TO_WLA || dm->current_rf_set_8821c == SWITCH_TO_BT) {
1320 if (regval_0xcb4 == 1)
1321 dm->current_ant_num_8821c = SWITCH_TO_ANT1;
1322 else if (regval_0xcb4 == 2)
1323 dm->current_ant_num_8821c = SWITCH_TO_ANT2;
1324 else if (regval_0xcb4 == 1)
1325 dm->current_ant_num_8821c = SWITCH_TO_ANT2;
1326 else if (regval_0xcb4 == 2)
1327 dm->current_ant_num_8821c = SWITCH_TO_ANT1;
1330 return dm->current_ant_num_8821c;
1337 u8 query_phydm_ant_num_map_8821c(struct dm_struct *dm)
1339 #if (PHYDM_FW_API_FUNC_ENABLE_8821C == 1)
1340 u8 mapping_table = 0;
1342 /* mapping table meaning
1343 * 1: choose ant1 or ant2
1349 if (dm->rfe_type_expand == 0 || dm->rfe_type_expand == 7 || dm->rfe_type_expand == 0x20 ||
1350 dm->rfe_type_expand == 0x27 || dm->rfe_type_expand == 0x28 || dm->rfe_type_expand == 0x2f)
1352 else if (dm->rfe_type_expand == 1 || dm->rfe_type_expand == 2 || dm->rfe_type_expand == 0x21 ||
1353 dm->rfe_type_expand == 0x22 || dm->rfe_type_expand == 0x29 || dm->rfe_type_expand == 0x2a)
1355 else if (dm->rfe_type_expand == 3 || dm->rfe_type_expand == 4 || dm->rfe_type_expand == 0x23 ||
1356 dm->rfe_type_expand == 0x24 || dm->rfe_type_expand == 0x2b || dm->rfe_type_expand == 0x2c)
1358 else if (dm->rfe_type_expand == 5 || dm->rfe_type_expand == 6 || dm->rfe_type_expand == 0x25 ||
1359 dm->rfe_type_expand == 0x26 || dm->rfe_type_expand == 0x2d || dm->rfe_type_expand == 0x2e)
1362 return mapping_table;
1368 /* ======================================================================== */
1369 #endif /*PHYDM_FW_API_ENABLE_8821C == 1*/
1370 #endif /* RTL8821C_SUPPORT == 1 */