1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2009-2014 Realtek Corporation.*/
14 static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
15 enum radio_path rfpath, u32 offset);
16 static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
17 enum radio_path rfpath, u32 offset,
19 static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask);
20 static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw);
21 static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
22 static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
24 static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
26 static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw);
27 static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
28 u32 cmdtableidx, u32 cmdtablesz,
29 enum swchnlcmd_id cmdid,
32 static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
33 u8 channel, u8 *stage,
34 u8 *step, u32 *delay);
35 static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
36 enum wireless_mode wirelessmode,
38 static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw);
39 static void rtl92ee_phy_set_io(struct ieee80211_hw *hw);
41 u32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
43 struct rtl_priv *rtlpriv = rtl_priv(hw);
44 u32 returnvalue, originalvalue, bitshift;
46 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
47 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask);
48 originalvalue = rtl_read_dword(rtlpriv, regaddr);
49 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
50 returnvalue = (originalvalue & bitmask) >> bitshift;
52 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
53 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
54 bitmask, regaddr, originalvalue);
59 void rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
60 u32 bitmask, u32 data)
62 struct rtl_priv *rtlpriv = rtl_priv(hw);
63 u32 originalvalue, bitshift;
65 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
66 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
67 regaddr, bitmask, data);
69 if (bitmask != MASKDWORD) {
70 originalvalue = rtl_read_dword(rtlpriv, regaddr);
71 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
72 data = ((originalvalue & (~bitmask)) | (data << bitshift));
75 rtl_write_dword(rtlpriv, regaddr, data);
77 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
78 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
79 regaddr, bitmask, data);
82 u32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw,
83 enum radio_path rfpath, u32 regaddr, u32 bitmask)
85 struct rtl_priv *rtlpriv = rtl_priv(hw);
86 u32 original_value, readback_value, bitshift;
89 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
90 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
91 regaddr, rfpath, bitmask);
93 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
95 original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr);
96 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
97 readback_value = (original_value & bitmask) >> bitshift;
99 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
101 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
102 "regaddr(%#x),rfpath(%#x),bitmask(%#x),original_value(%#x)\n",
103 regaddr, rfpath, bitmask, original_value);
105 return readback_value;
108 void rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw,
109 enum radio_path rfpath,
110 u32 addr, u32 bitmask, u32 data)
112 struct rtl_priv *rtlpriv = rtl_priv(hw);
113 u32 original_value, bitshift;
116 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
117 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
118 addr, bitmask, data, rfpath);
120 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
122 if (bitmask != RFREG_OFFSET_MASK) {
123 original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr);
124 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
125 data = (original_value & (~bitmask)) | (data << bitshift);
128 _rtl92ee_phy_rf_serial_write(hw, rfpath, addr, data);
130 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
132 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
133 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
134 addr, bitmask, data, rfpath);
137 static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
138 enum radio_path rfpath, u32 offset)
140 struct rtl_priv *rtlpriv = rtl_priv(hw);
141 struct rtl_phy *rtlphy = &rtlpriv->phy;
142 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
144 u32 tmplong, tmplong2;
150 if (RT_CANNOT_IO(hw)) {
151 pr_err("return all one\n");
154 tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
155 if (rfpath == RF90_PATH_A)
158 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
159 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
160 (newoffset << 23) | BLSSIREADEDGE;
161 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
162 tmplong & (~BLSSIREADEDGE));
164 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
166 if (rfpath == RF90_PATH_A)
167 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
169 else if (rfpath == RF90_PATH_B)
170 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
173 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
176 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
178 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
179 "RFR-%d Addr[0x%x]=0x%x\n",
180 rfpath, pphyreg->rf_rb, retvalue);
184 static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
185 enum radio_path rfpath, u32 offset,
190 struct rtl_priv *rtlpriv = rtl_priv(hw);
191 struct rtl_phy *rtlphy = &rtlpriv->phy;
192 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
194 if (RT_CANNOT_IO(hw)) {
200 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
201 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
202 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
203 "RFW-%d Addr[0x%x]=0x%x\n", rfpath,
204 pphyreg->rf3wire_offset, data_and_addr);
207 static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask)
211 for (i = 0; i <= 31; i++) {
212 if (((bitmask >> i) & 0x1) == 1)
218 bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw)
220 return _rtl92ee_phy_config_mac_with_headerfile(hw);
223 bool rtl92ee_phy_bb_config(struct ieee80211_hw *hw)
225 struct rtl_priv *rtlpriv = rtl_priv(hw);
226 bool rtstatus = true;
231 phy_init_bb_rf_register_def(hw);
232 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
233 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
234 regval | BIT(13) | BIT(0) | BIT(1));
236 rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
237 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
238 FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
239 FEN_BB_GLB_RSTN | FEN_BBRSTB);
241 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
243 tmp = rtl_read_dword(rtlpriv, 0x4c);
244 rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
246 rtstatus = _rtl92ee_phy_bb8192ee_config_parafile(hw);
248 crystal_cap = rtlpriv->efuse.eeprom_crystalcap & 0x3F;
249 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
250 (crystal_cap | (crystal_cap << 6)));
254 bool rtl92ee_phy_rf_config(struct ieee80211_hw *hw)
256 return rtl92ee_phy_rf6052_config(hw);
259 static bool _check_condition(struct ieee80211_hw *hw,
262 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
263 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
264 u32 _board = rtlefuse->board_type; /*need efuse define*/
265 u32 _interface = rtlhal->interface;
266 u32 _platform = 0x08;/*SupportPlatform */
267 u32 cond = condition;
269 if (condition == 0xCDCDCDCD)
272 cond = condition & 0xFF;
273 if ((_board != cond) && (cond != 0xFF))
276 cond = condition & 0xFF00;
278 if ((_interface & cond) == 0 && cond != 0x07)
281 cond = condition & 0xFF0000;
283 if ((_platform & cond) == 0 && cond != 0x0F)
289 static void _rtl92ee_config_rf_reg(struct ieee80211_hw *hw, u32 addr, u32 data,
290 enum radio_path rfpath, u32 regaddr)
292 if (addr == 0xfe || addr == 0xffe) {
295 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
302 getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
305 while ((getvalue >> 8) != (data >> 8)) {
307 rtl_set_rfreg(hw, rfpath, regaddr,
308 RFREG_OFFSET_MASK, data);
310 getvalue = rtl_get_rfreg(hw, rfpath, addr,
321 getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
324 while (getvalue != data) {
326 rtl_set_rfreg(hw, rfpath, regaddr,
327 RFREG_OFFSET_MASK, data);
329 rtl_set_rfreg(hw, rfpath, 0x18,
330 RFREG_OFFSET_MASK, 0x0fc07);
332 getvalue = rtl_get_rfreg(hw, rfpath, addr,
341 static void _rtl92ee_config_rf_radio_a(struct ieee80211_hw *hw,
344 u32 content = 0x1000; /*RF Content: radio_a_txt*/
345 u32 maskforphyset = (u32)(content & 0xE000);
347 _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_A,
348 addr | maskforphyset);
351 static void _rtl92ee_config_rf_radio_b(struct ieee80211_hw *hw,
354 u32 content = 0x1001; /*RF Content: radio_b_txt*/
355 u32 maskforphyset = (u32)(content & 0xE000);
357 _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_B,
358 addr | maskforphyset);
361 static void _rtl92ee_config_bb_reg(struct ieee80211_hw *hw,
366 else if (addr == 0xfd)
368 else if (addr == 0xfc)
370 else if (addr == 0xfb)
372 else if (addr == 0xfa)
374 else if (addr == 0xf9)
377 rtl_set_bbreg(hw, addr, MASKDWORD , data);
382 static void _rtl92ee_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
384 struct rtl_priv *rtlpriv = rtl_priv(hw);
385 struct rtl_phy *rtlphy = &rtlpriv->phy;
387 u8 band = BAND_ON_2_4G, rf = 0, txnum = 0, sec = 0;
389 for (; band <= BAND_ON_5G; ++band)
390 for (; rf < TX_PWR_BY_RATE_NUM_RF; ++rf)
391 for (; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
392 for (; sec < TX_PWR_BY_RATE_NUM_SECTION; ++sec)
393 rtlphy->tx_power_by_rate_offset
394 [band][rf][txnum][sec] = 0;
397 static void _rtl92ee_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
399 u8 rate_section, u8 txnum,
402 struct rtl_priv *rtlpriv = rtl_priv(hw);
403 struct rtl_phy *rtlphy = &rtlpriv->phy;
405 if (path > RF90_PATH_D) {
406 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
407 "Invalid Rf Path %d\n", path);
411 if (band == BAND_ON_2_4G) {
412 switch (rate_section) {
414 rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
417 rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
420 rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
423 rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
426 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
427 "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
428 rate_section, path, txnum);
432 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
433 "Invalid Band %d\n", band);
437 static u8 _rtl92ee_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
438 u8 band, u8 path, u8 txnum,
441 struct rtl_priv *rtlpriv = rtl_priv(hw);
442 struct rtl_phy *rtlphy = &rtlpriv->phy;
445 if (path > RF90_PATH_D) {
446 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
447 "Invalid Rf Path %d\n", path);
451 if (band == BAND_ON_2_4G) {
452 switch (rate_section) {
454 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
457 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
460 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
463 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
466 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
467 "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
468 rate_section, path, txnum);
472 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
473 "Invalid Band %d()\n", band);
478 static void _rtl92ee_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
480 struct rtl_priv *rtlpriv = rtl_priv(hw);
481 struct rtl_phy *rtlphy = &rtlpriv->phy;
483 u8 base = 0, path = 0;
485 for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
486 if (path == RF90_PATH_A) {
487 raw = (u16)(rtlphy->tx_power_by_rate_offset
488 [BAND_ON_2_4G][path][RF_1TX][3] >> 24) &
490 base = (raw >> 4) * 10 + (raw & 0xF);
491 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
494 } else if (path == RF90_PATH_B) {
495 raw = (u16)(rtlphy->tx_power_by_rate_offset
496 [BAND_ON_2_4G][path][RF_1TX][3] >> 0) &
498 base = (raw >> 4) * 10 + (raw & 0xF);
499 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
503 raw = (u16)(rtlphy->tx_power_by_rate_offset
504 [BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF;
505 base = (raw >> 4) * 10 + (raw & 0xF);
506 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
509 raw = (u16)(rtlphy->tx_power_by_rate_offset
510 [BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF;
511 base = (raw >> 4) * 10 + (raw & 0xF);
512 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
513 HT_MCS0_MCS7, RF_1TX,
516 raw = (u16)(rtlphy->tx_power_by_rate_offset
517 [BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF;
518 base = (raw >> 4) * 10 + (raw & 0xF);
519 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
520 HT_MCS8_MCS15, RF_2TX,
525 static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
532 for (i = 3; i >= 0; --i) {
533 if (i >= start && i <= end) {
534 /* Get the exact value */
535 tmp = (u8)(*data >> (i * 8)) & 0xF;
536 tmp += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
538 /* Change the value to a relative value */
539 tmp = (tmp > base) ? tmp - base : base - tmp;
541 tmp = (u8)(*data >> (i * 8)) & 0xFF;
549 static void phy_convert_txpwr_dbm_to_rel_val(struct ieee80211_hw *hw)
551 struct rtl_priv *rtlpriv = rtl_priv(hw);
552 struct rtl_phy *rtlphy = &rtlpriv->phy;
553 u8 base = 0, rf = 0, band = BAND_ON_2_4G;
555 for (rf = RF90_PATH_A; rf <= RF90_PATH_B; ++rf) {
556 if (rf == RF90_PATH_A) {
557 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
560 _phy_convert_txpower_dbm_to_relative_value(
561 &rtlphy->tx_power_by_rate_offset
562 [band][rf][RF_1TX][2],
564 _phy_convert_txpower_dbm_to_relative_value(
565 &rtlphy->tx_power_by_rate_offset
566 [band][rf][RF_1TX][3],
568 } else if (rf == RF90_PATH_B) {
569 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
572 _phy_convert_txpower_dbm_to_relative_value(
573 &rtlphy->tx_power_by_rate_offset
574 [band][rf][RF_1TX][3],
576 _phy_convert_txpower_dbm_to_relative_value(
577 &rtlphy->tx_power_by_rate_offset
578 [band][rf][RF_1TX][2],
581 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
583 _phy_convert_txpower_dbm_to_relative_value(
584 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][0],
586 _phy_convert_txpower_dbm_to_relative_value(
587 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][1],
590 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
593 _phy_convert_txpower_dbm_to_relative_value(
594 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][4],
596 _phy_convert_txpower_dbm_to_relative_value(
597 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][5],
600 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
603 _phy_convert_txpower_dbm_to_relative_value(
604 &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][6],
607 _phy_convert_txpower_dbm_to_relative_value(
608 &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][7],
612 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
613 "<==phy_convert_txpwr_dbm_to_rel_val()\n");
616 static void _rtl92ee_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
618 _rtl92ee_phy_store_txpower_by_rate_base(hw);
619 phy_convert_txpwr_dbm_to_rel_val(hw);
622 static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw)
624 struct rtl_priv *rtlpriv = rtl_priv(hw);
625 struct rtl_phy *rtlphy = &rtlpriv->phy;
626 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
629 rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_PHY_REG);
631 pr_err("Write BB Reg Fail!!\n");
635 _rtl92ee_phy_init_tx_power_by_rate(hw);
636 if (!rtlefuse->autoload_failflag) {
637 rtlphy->pwrgroup_cnt = 0;
639 phy_config_bb_with_pghdrfile(hw, BASEBAND_CONFIG_PHY_REG);
641 _rtl92ee_phy_txpower_by_rate_configuration(hw);
643 pr_err("BB_PG Reg Fail!!\n");
646 rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_AGC_TAB);
648 pr_err("AGC Table Fail\n");
651 rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
652 RFPGA0_XA_HSSIPARAMETER2,
658 static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
660 struct rtl_priv *rtlpriv = rtl_priv(hw);
665 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8192EMACPHY_Array\n");
666 arraylength = RTL8192EE_MAC_ARRAY_LEN;
667 ptrarray = RTL8192EE_MAC_ARRAY;
668 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
669 "Img:RTL8192EE_MAC_ARRAY LEN %d\n" , arraylength);
670 for (i = 0; i < arraylength; i = i + 2)
671 rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]);
675 #define READ_NEXT_PAIR(v1, v2, i) \
682 static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
688 struct rtl_priv *rtlpriv = rtl_priv(hw);
691 if (configtype == BASEBAND_CONFIG_PHY_REG) {
692 len = RTL8192EE_PHY_REG_ARRAY_LEN;
693 array = RTL8192EE_PHY_REG_ARRAY;
695 for (i = 0; i < len; i = i + 2) {
698 if (v1 < 0xcdcdcdcd) {
699 _rtl92ee_config_bb_reg(hw, v1, v2);
700 } else {/*This line is the start line of branch.*/
701 /* to protect READ_NEXT_PAIR not overrun */
705 if (!_check_condition(hw , array[i])) {
706 /*Discard the following pairs*/
707 READ_NEXT_PAIR(v1, v2, i);
708 while (v2 != 0xDEAD &&
710 v2 != 0xCDCD && i < len - 2) {
711 READ_NEXT_PAIR(v1, v2, i);
713 i -= 2; /* prevent from for-loop += 2*/
715 /* Configure matched pairs and
716 * skip to end of if-else.
718 READ_NEXT_PAIR(v1, v2, i);
719 while (v2 != 0xDEAD &&
721 v2 != 0xCDCD && i < len - 2) {
722 _rtl92ee_config_bb_reg(hw, v1,
724 READ_NEXT_PAIR(v1, v2, i);
727 while (v2 != 0xDEAD && i < len - 2)
728 READ_NEXT_PAIR(v1, v2, i);
732 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
733 len = RTL8192EE_AGC_TAB_ARRAY_LEN;
734 array = RTL8192EE_AGC_TAB_ARRAY;
736 for (i = 0; i < len; i = i + 2) {
739 if (v1 < 0xCDCDCDCD) {
740 rtl_set_bbreg(hw, array[i], MASKDWORD,
744 } else{/*This line is the start line of branch.*/
745 /* to protect READ_NEXT_PAIR not overrun */
749 if (!_check_condition(hw , array[i])) {
750 /*Discard the following pairs*/
751 READ_NEXT_PAIR(v1, v2, i);
752 while (v2 != 0xDEAD &&
756 READ_NEXT_PAIR(v1, v2, i);
758 i -= 2; /* prevent from for-loop += 2*/
760 /* Configure matched pairs and
761 * skip to end of if-else.
763 READ_NEXT_PAIR(v1, v2, i);
764 while (v2 != 0xDEAD &&
773 READ_NEXT_PAIR(v1 , v2 , i);
776 while (v2 != 0xDEAD &&
778 READ_NEXT_PAIR(v1 , v2 , i);
782 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
783 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
791 static u8 _rtl92ee_get_rate_section_index(u32 regaddr)
796 case RTXAGC_A_RATE18_06:
797 case RTXAGC_B_RATE18_06:
800 case RTXAGC_A_RATE54_24:
801 case RTXAGC_B_RATE54_24:
804 case RTXAGC_A_CCK1_MCS32:
805 case RTXAGC_B_CCK1_55_MCS32:
808 case RTXAGC_B_CCK11_A_CCK2_11:
811 case RTXAGC_A_MCS03_MCS00:
812 case RTXAGC_B_MCS03_MCS00:
815 case RTXAGC_A_MCS07_MCS04:
816 case RTXAGC_B_MCS07_MCS04:
819 case RTXAGC_A_MCS11_MCS08:
820 case RTXAGC_B_MCS11_MCS08:
823 case RTXAGC_A_MCS15_MCS12:
824 case RTXAGC_B_MCS15_MCS12:
829 if (regaddr >= 0xC20 && regaddr <= 0xC4C)
830 index = (u8)((regaddr - 0xC20) / 4);
831 else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
832 index = (u8)((regaddr - 0xE20) / 4);
838 static void _rtl92ee_store_tx_power_by_rate(struct ieee80211_hw *hw,
840 enum radio_path rfpath,
841 u32 txnum, u32 regaddr,
842 u32 bitmask, u32 data)
844 struct rtl_priv *rtlpriv = rtl_priv(hw);
845 struct rtl_phy *rtlphy = &rtlpriv->phy;
846 u8 section = _rtl92ee_get_rate_section_index(regaddr);
848 if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
849 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid Band %d\n", band);
853 if (rfpath > MAX_RF_PATH - 1) {
854 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR,
855 "Invalid RfPath %d\n", rfpath);
858 if (txnum > MAX_RF_PATH - 1) {
859 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid TxNum %d\n", txnum);
863 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][section] = data;
866 static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
869 struct rtl_priv *rtlpriv = rtl_priv(hw);
871 u32 *phy_regarray_table_pg;
872 u16 phy_regarray_pg_len;
873 u32 v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0;
875 phy_regarray_pg_len = RTL8192EE_PHY_REG_ARRAY_PG_LEN;
876 phy_regarray_table_pg = RTL8192EE_PHY_REG_ARRAY_PG;
878 if (configtype == BASEBAND_CONFIG_PHY_REG) {
879 for (i = 0; i < phy_regarray_pg_len; i = i + 6) {
880 v1 = phy_regarray_table_pg[i];
881 v2 = phy_regarray_table_pg[i+1];
882 v3 = phy_regarray_table_pg[i+2];
883 v4 = phy_regarray_table_pg[i+3];
884 v5 = phy_regarray_table_pg[i+4];
885 v6 = phy_regarray_table_pg[i+5];
887 if (v1 < 0xcdcdcdcd) {
888 _rtl92ee_store_tx_power_by_rate(hw, v1, v2, v3,
894 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
895 "configtype != BaseBand_Config_PHY_REG\n");
900 #define READ_NEXT_RF_PAIR(v1, v2, i) \
907 bool rtl92ee_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
908 enum radio_path rfpath)
910 struct rtl_priv *rtlpriv = rtl_priv(hw);
918 len = RTL8192EE_RADIOA_ARRAY_LEN;
919 array = RTL8192EE_RADIOA_ARRAY;
920 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
921 "Radio_A:RTL8192EE_RADIOA_ARRAY %d\n" , len);
922 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
923 for (i = 0; i < len; i = i + 2) {
926 if (v1 < 0xcdcdcdcd) {
927 _rtl92ee_config_rf_radio_a(hw, v1, v2);
929 } else {/*This line is the start line of branch.*/
930 /* to protect READ_NEXT_PAIR not overrun */
934 if (!_check_condition(hw , array[i])) {
935 /*Discard the following pairs*/
936 READ_NEXT_RF_PAIR(v1, v2, i);
937 while (v2 != 0xDEAD &&
939 v2 != 0xCDCD && i < len - 2) {
940 READ_NEXT_RF_PAIR(v1, v2, i);
942 i -= 2; /* prevent from for-loop += 2*/
944 /* Configure matched pairs and
945 * skip to end of if-else.
947 READ_NEXT_RF_PAIR(v1, v2, i);
948 while (v2 != 0xDEAD &&
950 v2 != 0xCDCD && i < len - 2) {
951 _rtl92ee_config_rf_radio_a(hw,
954 READ_NEXT_RF_PAIR(v1, v2, i);
957 while (v2 != 0xDEAD && i < len - 2)
958 READ_NEXT_RF_PAIR(v1, v2, i);
965 len = RTL8192EE_RADIOB_ARRAY_LEN;
966 array = RTL8192EE_RADIOB_ARRAY;
967 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
968 "Radio_A:RTL8192EE_RADIOB_ARRAY %d\n" , len);
969 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
970 for (i = 0; i < len; i = i + 2) {
973 if (v1 < 0xcdcdcdcd) {
974 _rtl92ee_config_rf_radio_b(hw, v1, v2);
976 } else {/*This line is the start line of branch.*/
977 /* to protect READ_NEXT_PAIR not overrun */
981 if (!_check_condition(hw , array[i])) {
982 /*Discard the following pairs*/
983 READ_NEXT_RF_PAIR(v1, v2, i);
984 while (v2 != 0xDEAD &&
986 v2 != 0xCDCD && i < len - 2) {
987 READ_NEXT_RF_PAIR(v1, v2, i);
989 i -= 2; /* prevent from for-loop += 2*/
991 /* Configure matched pairs and
992 * skip to end of if-else.
994 READ_NEXT_RF_PAIR(v1, v2, i);
995 while (v2 != 0xDEAD &&
997 v2 != 0xCDCD && i < len - 2) {
998 _rtl92ee_config_rf_radio_b(hw,
1001 READ_NEXT_RF_PAIR(v1, v2, i);
1004 while (v2 != 0xDEAD && i < len - 2)
1005 READ_NEXT_RF_PAIR(v1, v2, i);
1017 void rtl92ee_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
1019 struct rtl_priv *rtlpriv = rtl_priv(hw);
1020 struct rtl_phy *rtlphy = &rtlpriv->phy;
1022 rtlphy->default_initialgain[0] =
1023 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
1024 rtlphy->default_initialgain[1] =
1025 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
1026 rtlphy->default_initialgain[2] =
1027 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
1028 rtlphy->default_initialgain[3] =
1029 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
1031 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1032 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
1033 rtlphy->default_initialgain[0],
1034 rtlphy->default_initialgain[1],
1035 rtlphy->default_initialgain[2],
1036 rtlphy->default_initialgain[3]);
1038 rtlphy->framesync = (u8)rtl_get_bbreg(hw,
1039 ROFDM0_RXDETECTOR3, MASKBYTE0);
1040 rtlphy->framesync_c34 = rtl_get_bbreg(hw,
1041 ROFDM0_RXDETECTOR2, MASKDWORD);
1043 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1044 "Default framesync (0x%x) = 0x%x\n",
1045 ROFDM0_RXDETECTOR3, rtlphy->framesync);
1048 static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw)
1050 struct rtl_priv *rtlpriv = rtl_priv(hw);
1051 struct rtl_phy *rtlphy = &rtlpriv->phy;
1053 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1054 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1056 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
1057 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
1059 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
1060 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
1062 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
1063 RFPGA0_XA_LSSIPARAMETER;
1064 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
1065 RFPGA0_XB_LSSIPARAMETER;
1067 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
1068 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
1070 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
1071 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
1073 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
1074 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
1077 void rtl92ee_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
1079 struct rtl_priv *rtlpriv = rtl_priv(hw);
1080 struct rtl_phy *rtlphy = &rtlpriv->phy;
1084 txpwr_level = rtlphy->cur_cck_txpwridx;
1085 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B,
1087 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1088 if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) >
1090 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
1092 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1093 if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
1094 txpwr_level) > txpwr_dbm)
1095 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw,
1096 WIRELESS_MODE_N_24G,
1098 *powerlevel = txpwr_dbm;
1101 static u8 _rtl92ee_phy_get_ratesection_intxpower_byrate(enum radio_path path,
1104 u8 rate_section = 0;
1107 case DESC92C_RATE1M:
1110 case DESC92C_RATE2M:
1111 case DESC92C_RATE5_5M:
1112 if (path == RF90_PATH_A)
1114 else if (path == RF90_PATH_B)
1117 case DESC92C_RATE11M:
1120 case DESC92C_RATE6M:
1121 case DESC92C_RATE9M:
1122 case DESC92C_RATE12M:
1123 case DESC92C_RATE18M:
1126 case DESC92C_RATE24M:
1127 case DESC92C_RATE36M:
1128 case DESC92C_RATE48M:
1129 case DESC92C_RATE54M:
1132 case DESC92C_RATEMCS0:
1133 case DESC92C_RATEMCS1:
1134 case DESC92C_RATEMCS2:
1135 case DESC92C_RATEMCS3:
1138 case DESC92C_RATEMCS4:
1139 case DESC92C_RATEMCS5:
1140 case DESC92C_RATEMCS6:
1141 case DESC92C_RATEMCS7:
1144 case DESC92C_RATEMCS8:
1145 case DESC92C_RATEMCS9:
1146 case DESC92C_RATEMCS10:
1147 case DESC92C_RATEMCS11:
1150 case DESC92C_RATEMCS12:
1151 case DESC92C_RATEMCS13:
1152 case DESC92C_RATEMCS14:
1153 case DESC92C_RATEMCS15:
1157 WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n");
1160 return rate_section;
1163 static u8 _rtl92ee_get_txpower_by_rate(struct ieee80211_hw *hw,
1164 enum band_type band,
1165 enum radio_path rf, u8 rate)
1167 struct rtl_priv *rtlpriv = rtl_priv(hw);
1168 struct rtl_phy *rtlphy = &rtlpriv->phy;
1169 u8 shift = 0, sec, tx_num;
1172 sec = _rtl92ee_phy_get_ratesection_intxpower_byrate(rf, rate);
1173 tx_num = RF_TX_NUM_NONIMPLEMENT;
1175 if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
1176 if ((rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS15))
1183 case DESC92C_RATE1M:
1184 case DESC92C_RATE6M:
1185 case DESC92C_RATE24M:
1186 case DESC92C_RATEMCS0:
1187 case DESC92C_RATEMCS4:
1188 case DESC92C_RATEMCS8:
1189 case DESC92C_RATEMCS12:
1192 case DESC92C_RATE2M:
1193 case DESC92C_RATE9M:
1194 case DESC92C_RATE36M:
1195 case DESC92C_RATEMCS1:
1196 case DESC92C_RATEMCS5:
1197 case DESC92C_RATEMCS9:
1198 case DESC92C_RATEMCS13:
1201 case DESC92C_RATE5_5M:
1202 case DESC92C_RATE12M:
1203 case DESC92C_RATE48M:
1204 case DESC92C_RATEMCS2:
1205 case DESC92C_RATEMCS6:
1206 case DESC92C_RATEMCS10:
1207 case DESC92C_RATEMCS14:
1210 case DESC92C_RATE11M:
1211 case DESC92C_RATE18M:
1212 case DESC92C_RATE54M:
1213 case DESC92C_RATEMCS3:
1214 case DESC92C_RATEMCS7:
1215 case DESC92C_RATEMCS11:
1216 case DESC92C_RATEMCS15:
1220 WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n");
1224 diff = (u8)(rtlphy->tx_power_by_rate_offset[band][rf][tx_num][sec] >>
1230 static u8 _rtl92ee_get_txpower_index(struct ieee80211_hw *hw,
1231 enum radio_path rfpath, u8 rate,
1234 struct rtl_priv *rtlpriv = rtl_priv(hw);
1235 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
1236 u8 index = (channel - 1);
1240 if (channel < 1 || channel > 14) {
1242 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_DMESG,
1243 "Illegal channel!!\n");
1246 if (IS_CCK_RATE((s8)rate))
1247 tx_power = rtlefuse->txpwrlevel_cck[rfpath][index];
1248 else if (DESC92C_RATE6M <= rate)
1249 tx_power = rtlefuse->txpwrlevel_ht40_1s[rfpath][index];
1252 if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M &&
1253 !IS_CCK_RATE((s8)rate))
1254 tx_power += rtlefuse->txpwr_legacyhtdiff[rfpath][TX_1S];
1256 /* BW20-1S, BW20-2S */
1257 if (bw == HT_CHANNEL_WIDTH_20) {
1258 if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1259 tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_1S];
1260 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1261 tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_2S];
1262 } else if (bw == HT_CHANNEL_WIDTH_20_40) {/* BW40-1S, BW40-2S */
1263 if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1264 tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_1S];
1265 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1266 tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_2S];
1269 if (rtlefuse->eeprom_regulatory != 2)
1270 diff = _rtl92ee_get_txpower_by_rate(hw, BAND_ON_2_4G,
1275 if (tx_power > MAX_POWER_INDEX)
1276 tx_power = MAX_POWER_INDEX;
1281 static void _rtl92ee_set_txpower_index(struct ieee80211_hw *hw, u8 pwr_idx,
1282 enum radio_path rfpath, u8 rate)
1284 struct rtl_priv *rtlpriv = rtl_priv(hw);
1286 if (rfpath == RF90_PATH_A) {
1288 case DESC92C_RATE1M:
1289 rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1,
1292 case DESC92C_RATE2M:
1293 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE1,
1296 case DESC92C_RATE5_5M:
1297 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE2,
1300 case DESC92C_RATE11M:
1301 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE3,
1304 case DESC92C_RATE6M:
1305 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE0,
1308 case DESC92C_RATE9M:
1309 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE1,
1312 case DESC92C_RATE12M:
1313 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE2,
1316 case DESC92C_RATE18M:
1317 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE3,
1320 case DESC92C_RATE24M:
1321 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE0,
1324 case DESC92C_RATE36M:
1325 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE1,
1328 case DESC92C_RATE48M:
1329 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE2,
1332 case DESC92C_RATE54M:
1333 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE3,
1336 case DESC92C_RATEMCS0:
1337 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE0,
1340 case DESC92C_RATEMCS1:
1341 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE1,
1344 case DESC92C_RATEMCS2:
1345 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE2,
1348 case DESC92C_RATEMCS3:
1349 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE3,
1352 case DESC92C_RATEMCS4:
1353 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE0,
1356 case DESC92C_RATEMCS5:
1357 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE1,
1360 case DESC92C_RATEMCS6:
1361 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE2,
1364 case DESC92C_RATEMCS7:
1365 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE3,
1368 case DESC92C_RATEMCS8:
1369 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE0,
1372 case DESC92C_RATEMCS9:
1373 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE1,
1376 case DESC92C_RATEMCS10:
1377 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE2,
1380 case DESC92C_RATEMCS11:
1381 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE3,
1384 case DESC92C_RATEMCS12:
1385 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE0,
1388 case DESC92C_RATEMCS13:
1389 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE1,
1392 case DESC92C_RATEMCS14:
1393 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE2,
1396 case DESC92C_RATEMCS15:
1397 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE3,
1401 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1402 "Invalid Rate!!\n");
1405 } else if (rfpath == RF90_PATH_B) {
1407 case DESC92C_RATE1M:
1408 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE1,
1411 case DESC92C_RATE2M:
1412 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE2,
1415 case DESC92C_RATE5_5M:
1416 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE3,
1419 case DESC92C_RATE11M:
1420 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0,
1423 case DESC92C_RATE6M:
1424 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE0,
1427 case DESC92C_RATE9M:
1428 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE1,
1431 case DESC92C_RATE12M:
1432 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE2,
1435 case DESC92C_RATE18M:
1436 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE3,
1439 case DESC92C_RATE24M:
1440 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE0,
1443 case DESC92C_RATE36M:
1444 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE1,
1447 case DESC92C_RATE48M:
1448 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE2,
1451 case DESC92C_RATE54M:
1452 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE3,
1455 case DESC92C_RATEMCS0:
1456 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE0,
1459 case DESC92C_RATEMCS1:
1460 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE1,
1463 case DESC92C_RATEMCS2:
1464 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE2,
1467 case DESC92C_RATEMCS3:
1468 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE3,
1471 case DESC92C_RATEMCS4:
1472 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE0,
1475 case DESC92C_RATEMCS5:
1476 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE1,
1479 case DESC92C_RATEMCS6:
1480 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE2,
1483 case DESC92C_RATEMCS7:
1484 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE3,
1487 case DESC92C_RATEMCS8:
1488 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE0,
1491 case DESC92C_RATEMCS9:
1492 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE1,
1495 case DESC92C_RATEMCS10:
1496 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE2,
1499 case DESC92C_RATEMCS11:
1500 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE3,
1503 case DESC92C_RATEMCS12:
1504 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE0,
1507 case DESC92C_RATEMCS13:
1508 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE1,
1511 case DESC92C_RATEMCS14:
1512 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE2,
1515 case DESC92C_RATEMCS15:
1516 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE3,
1520 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1521 "Invalid Rate!!\n");
1525 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid RFPath!!\n");
1529 static void phy_set_txpower_index_by_rate_array(struct ieee80211_hw *hw,
1530 enum radio_path rfpath, u8 bw,
1531 u8 channel, u8 *rates, u8 size)
1536 for (i = 0; i < size; i++) {
1537 power_index = _rtl92ee_get_txpower_index(hw, rfpath, rates[i],
1539 _rtl92ee_set_txpower_index(hw, power_index, rfpath, rates[i]);
1543 static void phy_set_txpower_index_by_rate_section(struct ieee80211_hw *hw,
1544 enum radio_path rfpath,
1546 enum rate_section section)
1548 struct rtl_priv *rtlpriv = rtl_priv(hw);
1549 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1550 struct rtl_phy *rtlphy = &rtlpriv->phy;
1552 if (section == CCK) {
1553 u8 cck_rates[] = {DESC92C_RATE1M, DESC92C_RATE2M,
1554 DESC92C_RATE5_5M, DESC92C_RATE11M};
1555 if (rtlhal->current_bandtype == BAND_ON_2_4G)
1556 phy_set_txpower_index_by_rate_array(hw, rfpath,
1557 rtlphy->current_chan_bw,
1558 channel, cck_rates, 4);
1559 } else if (section == OFDM) {
1560 u8 ofdm_rates[] = {DESC92C_RATE6M, DESC92C_RATE9M,
1561 DESC92C_RATE12M, DESC92C_RATE18M,
1562 DESC92C_RATE24M, DESC92C_RATE36M,
1563 DESC92C_RATE48M, DESC92C_RATE54M};
1564 phy_set_txpower_index_by_rate_array(hw, rfpath,
1565 rtlphy->current_chan_bw,
1566 channel, ofdm_rates, 8);
1567 } else if (section == HT_MCS0_MCS7) {
1568 u8 ht_rates1t[] = {DESC92C_RATEMCS0, DESC92C_RATEMCS1,
1569 DESC92C_RATEMCS2, DESC92C_RATEMCS3,
1570 DESC92C_RATEMCS4, DESC92C_RATEMCS5,
1571 DESC92C_RATEMCS6, DESC92C_RATEMCS7};
1572 phy_set_txpower_index_by_rate_array(hw, rfpath,
1573 rtlphy->current_chan_bw,
1574 channel, ht_rates1t, 8);
1575 } else if (section == HT_MCS8_MCS15) {
1576 u8 ht_rates2t[] = {DESC92C_RATEMCS8, DESC92C_RATEMCS9,
1577 DESC92C_RATEMCS10, DESC92C_RATEMCS11,
1578 DESC92C_RATEMCS12, DESC92C_RATEMCS13,
1579 DESC92C_RATEMCS14, DESC92C_RATEMCS15};
1580 phy_set_txpower_index_by_rate_array(hw, rfpath,
1581 rtlphy->current_chan_bw,
1582 channel, ht_rates2t, 8);
1584 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR,
1585 "Invalid RateSection %d\n", section);
1588 void rtl92ee_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1590 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1591 struct rtl_phy *rtlphy = &rtl_priv(hw)->phy;
1592 enum radio_path rfpath;
1594 if (!rtlefuse->txpwr_fromeprom)
1596 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1598 phy_set_txpower_index_by_rate_section(hw, rfpath,
1600 phy_set_txpower_index_by_rate_section(hw, rfpath,
1602 phy_set_txpower_index_by_rate_section(hw, rfpath,
1606 if (rtlphy->num_total_rfpath >= 2)
1607 phy_set_txpower_index_by_rate_section(hw,
1613 static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
1614 enum wireless_mode wirelessmode,
1620 switch (wirelessmode) {
1621 case WIRELESS_MODE_B:
1624 case WIRELESS_MODE_G:
1625 case WIRELESS_MODE_N_24G:
1632 pwrout_dbm = txpwridx / 2 + offset;
1636 void rtl92ee_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1638 struct rtl_priv *rtlpriv = rtl_priv(hw);
1639 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1640 enum io_type iotype;
1642 if (!is_hal_stop(rtlhal)) {
1643 switch (operation) {
1644 case SCAN_OPT_BACKUP_BAND0:
1645 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1646 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1650 case SCAN_OPT_RESTORE:
1651 iotype = IO_CMD_RESUME_DM_BY_SCAN;
1652 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1656 pr_err("Unknown Scan Backup operation.\n");
1662 void rtl92ee_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1664 struct rtl_priv *rtlpriv = rtl_priv(hw);
1665 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1666 struct rtl_phy *rtlphy = &rtlpriv->phy;
1667 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1671 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1672 "Switch to %s bandwidth\n",
1673 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1676 if (is_hal_stop(rtlhal)) {
1677 rtlphy->set_bwmode_inprogress = false;
1681 reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1682 reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1684 switch (rtlphy->current_chan_bw) {
1685 case HT_CHANNEL_WIDTH_20:
1686 reg_bw_opmode |= BW_OPMODE_20MHZ;
1687 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1689 case HT_CHANNEL_WIDTH_20_40:
1690 reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1691 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1692 reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1693 (mac->cur_40_prime_sc << 5);
1694 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1697 pr_err("unknown bandwidth: %#X\n",
1698 rtlphy->current_chan_bw);
1702 switch (rtlphy->current_chan_bw) {
1703 case HT_CHANNEL_WIDTH_20:
1704 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1705 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1706 rtl_set_bbreg(hw, ROFDM0_TXPSEUDONOISEWGT,
1707 (BIT(31) | BIT(30)), 0);
1709 case HT_CHANNEL_WIDTH_20_40:
1710 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1711 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1712 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
1713 (mac->cur_40_prime_sc >> 1));
1714 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00,
1715 mac->cur_40_prime_sc);
1717 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1718 (mac->cur_40_prime_sc ==
1719 HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1722 pr_err("unknown bandwidth: %#X\n",
1723 rtlphy->current_chan_bw);
1726 rtl92ee_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1727 rtlphy->set_bwmode_inprogress = false;
1728 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
1731 void rtl92ee_phy_set_bw_mode(struct ieee80211_hw *hw,
1732 enum nl80211_channel_type ch_type)
1734 struct rtl_priv *rtlpriv = rtl_priv(hw);
1735 struct rtl_phy *rtlphy = &rtlpriv->phy;
1736 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1737 u8 tmp_bw = rtlphy->current_chan_bw;
1739 if (rtlphy->set_bwmode_inprogress)
1741 rtlphy->set_bwmode_inprogress = true;
1742 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1743 rtl92ee_phy_set_bw_mode_callback(hw);
1745 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1746 "false driver sleep or unload\n");
1747 rtlphy->set_bwmode_inprogress = false;
1748 rtlphy->current_chan_bw = tmp_bw;
1752 void rtl92ee_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1754 struct rtl_priv *rtlpriv = rtl_priv(hw);
1755 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1756 struct rtl_phy *rtlphy = &rtlpriv->phy;
1759 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1760 "switch to channel%d\n", rtlphy->current_channel);
1761 if (is_hal_stop(rtlhal))
1764 if (!rtlphy->sw_chnl_inprogress)
1766 if (!_rtl92ee_phy_sw_chnl_step_by_step
1767 (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
1768 &rtlphy->sw_chnl_step, &delay)) {
1774 rtlphy->sw_chnl_inprogress = false;
1778 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
1781 u8 rtl92ee_phy_sw_chnl(struct ieee80211_hw *hw)
1783 struct rtl_priv *rtlpriv = rtl_priv(hw);
1784 struct rtl_phy *rtlphy = &rtlpriv->phy;
1785 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1787 if (rtlphy->sw_chnl_inprogress)
1789 if (rtlphy->set_bwmode_inprogress)
1791 WARN_ONCE((rtlphy->current_channel > 14),
1792 "rtl8192ee: WIRELESS_MODE_G but channel>14");
1793 rtlphy->sw_chnl_inprogress = true;
1794 rtlphy->sw_chnl_stage = 0;
1795 rtlphy->sw_chnl_step = 0;
1796 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1797 rtl92ee_phy_sw_chnl_callback(hw);
1798 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1799 "sw_chnl_inprogress false schedule workitem current channel %d\n",
1800 rtlphy->current_channel);
1801 rtlphy->sw_chnl_inprogress = false;
1803 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1804 "sw_chnl_inprogress false driver sleep or unload\n");
1805 rtlphy->sw_chnl_inprogress = false;
1810 static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1811 u8 channel, u8 *stage, u8 *step,
1814 struct rtl_priv *rtlpriv = rtl_priv(hw);
1815 struct rtl_phy *rtlphy = &rtlpriv->phy;
1816 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1817 u32 precommoncmdcnt;
1818 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
1819 u32 postcommoncmdcnt;
1820 struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
1822 struct swchnlcmd *currentcmd = NULL;
1824 u8 num_total_rfpath = rtlphy->num_total_rfpath;
1826 precommoncmdcnt = 0;
1827 _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1829 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
1830 _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1831 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1833 postcommoncmdcnt = 0;
1835 _rtl92ee_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1836 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
1840 WARN_ONCE((channel < 1 || channel > 14),
1841 "rtl8192ee: illegal channel for Zebra: %d\n", channel);
1843 _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1844 MAX_RFDEPENDCMD_CNT,
1846 RF_CHNLBW, channel, 10);
1848 _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1849 MAX_RFDEPENDCMD_CNT, CMDID_END,
1855 currentcmd = &precommoncmd[*step];
1858 currentcmd = &rfdependcmd[*step];
1861 currentcmd = &postcommoncmd[*step];
1864 pr_err("Invalid 'stage' = %d, Check it!\n",
1869 if (currentcmd->cmdid == CMDID_END) {
1877 switch (currentcmd->cmdid) {
1878 case CMDID_SET_TXPOWEROWER_LEVEL:
1879 rtl92ee_phy_set_txpower_level(hw, channel);
1881 case CMDID_WRITEPORT_ULONG:
1882 rtl_write_dword(rtlpriv, currentcmd->para1,
1885 case CMDID_WRITEPORT_USHORT:
1886 rtl_write_word(rtlpriv, currentcmd->para1,
1887 (u16)currentcmd->para2);
1889 case CMDID_WRITEPORT_UCHAR:
1890 rtl_write_byte(rtlpriv, currentcmd->para1,
1891 (u8)currentcmd->para2);
1893 case CMDID_RF_WRITEREG:
1894 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
1895 rtlphy->rfreg_chnlval[rfpath] =
1896 ((rtlphy->rfreg_chnlval[rfpath] &
1897 0xfffff00) | currentcmd->para2);
1899 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1902 rtlphy->rfreg_chnlval[rfpath]);
1906 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1907 "switch case %#x not processed\n",
1915 (*delay) = currentcmd->msdelay;
1920 static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
1921 u32 cmdtableidx, u32 cmdtablesz,
1922 enum swchnlcmd_id cmdid,
1923 u32 para1, u32 para2, u32 msdelay)
1925 struct swchnlcmd *pcmd;
1927 if (cmdtable == NULL) {
1928 WARN_ONCE(true, "rtl8192ee: cmdtable cannot be NULL.\n");
1932 if (cmdtableidx >= cmdtablesz)
1935 pcmd = cmdtable + cmdtableidx;
1936 pcmd->cmdid = cmdid;
1937 pcmd->para1 = para1;
1938 pcmd->para2 = para2;
1939 pcmd->msdelay = msdelay;
1943 static u8 _rtl92ee_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
1945 u32 reg_eac, reg_e94, reg_e9c;
1947 /* path-A IQK setting */
1948 /* PA/PAD controlled by 0x0 */
1949 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1950 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
1951 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1953 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1954 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1955 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1956 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1958 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82140303);
1959 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160000);
1961 /*LO calibration setting*/
1962 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1964 /*One shot, path A LOK & IQK*/
1965 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1966 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1968 mdelay(IQK_DELAY_TIME);
1970 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1971 reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1972 reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1974 if (!(reg_eac & BIT(28)) &&
1975 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1976 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1984 static u8 _rtl92ee_phy_path_b_iqk(struct ieee80211_hw *hw)
1986 u32 reg_eac, reg_eb4, reg_ebc;
1989 /* PA/PAD controlled by 0x0 */
1990 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1991 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
1992 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1994 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
1995 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1997 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1998 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1999 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2000 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2002 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x821403e2);
2003 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160000);
2005 /* LO calibration setting */
2006 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
2008 /*One shot, path B LOK & IQK*/
2009 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2010 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2012 mdelay(IQK_DELAY_TIME);
2014 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
2015 reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
2016 reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
2018 if (!(reg_eac & BIT(31)) &&
2019 (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2020 (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
2028 static u8 _rtl92ee_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2030 u32 reg_eac, reg_e94, reg_e9c, reg_ea4 , u32temp;
2033 /*Get TXIMR Setting*/
2034 /*Modify RX IQK mode table*/
2035 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2037 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2038 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2039 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2040 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2042 /*PA/PAD control by 0x56, and set = 0x0*/
2043 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2044 rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2047 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2050 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2051 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2053 /*path a IQK setting*/
2054 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2055 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2056 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2057 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2059 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2060 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160c1f);
2062 /*LO calibration Setting*/
2063 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2065 /*one shot,path A LOK & iqk*/
2066 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2067 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2069 mdelay(IQK_DELAY_TIME);
2072 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2073 reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
2074 reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
2076 if (!(reg_eac & BIT(28)) &&
2077 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
2078 (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) {
2081 /* PA/PAD controlled by 0x0 */
2082 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2083 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2087 u32temp = 0x80007C00 | (reg_e94 & 0x3FF0000) |
2088 ((reg_e9c & 0x3FF0000) >> 16);
2089 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2091 /*Modify RX IQK mode table*/
2092 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2094 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2096 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2097 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2098 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2100 /*PA/PAD control by 0x56, and set = 0x0*/
2101 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2102 rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2105 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2108 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2110 /*path a IQK setting*/
2111 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2112 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2113 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2114 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2116 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2117 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160c1f);
2119 /*LO calibration Setting*/
2120 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2121 /*one shot,path A LOK & iqk*/
2122 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2123 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2125 mdelay(IQK_DELAY_TIME);
2127 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2128 reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
2130 /*PA/PAD controlled by 0x0*/
2132 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2133 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2134 /*if Tx is OK, check whether Rx is OK*/
2135 if (!(reg_eac & BIT(27)) &&
2136 (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
2137 (((reg_eac & 0x03FF0000) >> 16) != 0x36))
2143 static u8 _rtl92ee_phy_path_b_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2145 struct rtl_priv *rtlpriv = rtl_priv(hw);
2146 u32 reg_eac, reg_eb4, reg_ebc, reg_ecc, reg_ec4, u32temp;
2149 /*Get TXIMR Setting*/
2150 /*Modify RX IQK mode table*/
2151 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2153 rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2154 rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2155 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2156 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2159 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2160 rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2162 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2165 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2166 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2168 /*path a IQK setting*/
2169 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2170 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2171 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2172 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2174 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2175 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160c1f);
2177 /*LO calibration Setting*/
2178 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2180 /*one shot,path A LOK & iqk*/
2181 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2182 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2184 mdelay(IQK_DELAY_TIME);
2187 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2188 reg_eb4 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, MASKDWORD);
2189 reg_ebc = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, MASKDWORD);
2191 if (!(reg_eac & BIT(31)) &&
2192 (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2193 (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) {
2196 /* PA/PAD controlled by 0x0 */
2197 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2198 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2202 u32temp = 0x80007C00 | (reg_eb4 & 0x3FF0000) |
2203 ((reg_ebc & 0x3FF0000) >> 16);
2204 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2206 /*Modify RX IQK mode table*/
2207 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2208 rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2210 rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2211 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2212 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2215 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2216 rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2219 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2222 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2224 /*path b IQK setting*/
2225 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2226 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2227 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2228 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2230 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2231 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28160c1f);
2233 /*LO calibration Setting*/
2234 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2235 /*one shot,path A LOK & iqk*/
2236 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2237 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2239 mdelay(IQK_DELAY_TIME);
2241 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2242 reg_ec4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASKDWORD);
2243 reg_ecc = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, MASKDWORD);
2244 /*PA/PAD controlled by 0x0*/
2246 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2247 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2248 /*if Tx is OK, check whether Rx is OK*/
2249 if (!(reg_eac & BIT(30)) &&
2250 (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
2251 (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
2254 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "Path B Rx IQK fail!!\n");
2259 static void _rtl92ee_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
2260 bool b_iqk_ok, long result[][8],
2264 u32 oldval_0, x, tx0_a, reg;
2267 if (final_candidate == 0xFF) {
2269 } else if (b_iqk_ok) {
2270 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2271 MASKDWORD) >> 22) & 0x3FF;
2272 x = result[final_candidate][0];
2273 if ((x & 0x00000200) != 0)
2275 tx0_a = (x * oldval_0) >> 8;
2276 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
2277 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
2278 ((x * oldval_0 >> 7) & 0x1));
2279 y = result[final_candidate][1];
2280 if ((y & 0x00000200) != 0)
2282 tx0_c = (y * oldval_0) >> 8;
2283 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
2284 ((tx0_c & 0x3C0) >> 6));
2285 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
2287 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
2288 ((y * oldval_0 >> 7) & 0x1));
2293 reg = result[final_candidate][2];
2294 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2296 reg = result[final_candidate][3] & 0x3F;
2297 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2299 reg = (result[final_candidate][3] >> 6) & 0xF;
2300 rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg);
2304 static void _rtl92ee_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
2305 bool b_iqk_ok, long result[][8],
2309 u32 oldval_1, x, tx1_a, reg;
2312 if (final_candidate == 0xFF) {
2314 } else if (b_iqk_ok) {
2315 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2316 MASKDWORD) >> 22) & 0x3FF;
2317 x = result[final_candidate][4];
2318 if ((x & 0x00000200) != 0)
2320 tx1_a = (x * oldval_1) >> 8;
2321 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx1_a);
2322 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
2323 ((x * oldval_1 >> 7) & 0x1));
2324 y = result[final_candidate][5];
2325 if ((y & 0x00000200) != 0)
2327 tx1_c = (y * oldval_1) >> 8;
2328 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2329 ((tx1_c & 0x3C0) >> 6));
2330 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2332 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
2333 ((y * oldval_1 >> 7) & 0x1));
2338 reg = result[final_candidate][6];
2339 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2341 reg = result[final_candidate][7] & 0x3F;
2342 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2344 reg = (result[final_candidate][7] >> 6) & 0xF;
2345 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0xF0000000, reg);
2349 static void _rtl92ee_phy_save_adda_registers(struct ieee80211_hw *hw,
2350 u32 *addareg, u32 *addabackup,
2355 for (i = 0; i < registernum; i++)
2356 addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
2359 static void _rtl92ee_phy_save_mac_registers(struct ieee80211_hw *hw,
2360 u32 *macreg, u32 *macbackup)
2362 struct rtl_priv *rtlpriv = rtl_priv(hw);
2365 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2366 macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
2368 macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
2371 static void _rtl92ee_phy_reload_adda_registers(struct ieee80211_hw *hw,
2372 u32 *addareg, u32 *addabackup,
2377 for (i = 0; i < regiesternum; i++)
2378 rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
2381 static void _rtl92ee_phy_reload_mac_registers(struct ieee80211_hw *hw,
2382 u32 *macreg, u32 *macbackup)
2384 struct rtl_priv *rtlpriv = rtl_priv(hw);
2387 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2388 rtl_write_byte(rtlpriv, macreg[i], (u8)macbackup[i]);
2389 rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
2392 static void _rtl92ee_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
2393 bool is_patha_on, bool is2t)
2397 for (i = 0; i < IQK_ADDA_REG_NUM; i++)
2398 rtl_set_bbreg(hw, addareg[i], MASKDWORD, 0x0fc01616);
2401 static void _rtl92ee_phy_mac_setting_calibration(struct ieee80211_hw *hw,
2402 u32 *macreg, u32 *macbackup)
2404 rtl_set_bbreg(hw, 0x520, 0x00ff0000, 0xff);
2407 static void _rtl92ee_phy_path_a_standby(struct ieee80211_hw *hw)
2409 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
2410 rtl_set_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK, 0x10000);
2411 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2414 static bool _rtl92ee_phy_simularity_compare(struct ieee80211_hw *hw,
2415 long result[][8], u8 c1, u8 c2)
2417 u32 i, j, diff, simularity_bitmap, bound;
2419 u8 final_candidate[2] = { 0xFF, 0xFF };
2420 bool bresult = true/*, is2t = true*/;
2425 simularity_bitmap = 0;
2427 for (i = 0; i < bound; i++) {
2428 if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
2429 if ((result[c1][i] & 0x00000200) != 0)
2430 tmp1 = result[c1][i] | 0xFFFFFC00;
2432 tmp1 = result[c1][i];
2434 if ((result[c2][i] & 0x00000200) != 0)
2435 tmp2 = result[c2][i] | 0xFFFFFC00;
2437 tmp2 = result[c2][i];
2439 tmp1 = result[c1][i];
2440 tmp2 = result[c2][i];
2443 diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
2445 if (diff > MAX_TOLERANCE) {
2446 if ((i == 2 || i == 6) && !simularity_bitmap) {
2447 if (result[c1][i] + result[c1][i + 1] == 0)
2448 final_candidate[(i / 4)] = c2;
2449 else if (result[c2][i] + result[c2][i + 1] == 0)
2450 final_candidate[(i / 4)] = c1;
2452 simularity_bitmap |= (1 << i);
2454 simularity_bitmap |= (1 << i);
2459 if (simularity_bitmap == 0) {
2460 for (i = 0; i < (bound / 4); i++) {
2461 if (final_candidate[i] != 0xFF) {
2462 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2464 result[final_candidate[i]][j];
2470 if (!(simularity_bitmap & 0x03)) {/*path A TX OK*/
2471 for (i = 0; i < 2; i++)
2472 result[3][i] = result[c1][i];
2474 if (!(simularity_bitmap & 0x0c)) {/*path A RX OK*/
2475 for (i = 2; i < 4; i++)
2476 result[3][i] = result[c1][i];
2478 if (!(simularity_bitmap & 0x30)) {/*path B TX OK*/
2479 for (i = 4; i < 6; i++)
2480 result[3][i] = result[c1][i];
2482 if (!(simularity_bitmap & 0xc0)) {/*path B RX OK*/
2483 for (i = 6; i < 8; i++)
2484 result[3][i] = result[c1][i];
2489 static void _rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw,
2490 long result[][8], u8 t, bool is2t)
2492 struct rtl_priv *rtlpriv = rtl_priv(hw);
2493 struct rtl_phy *rtlphy = &rtlpriv->phy;
2495 u8 patha_ok, pathb_ok;
2496 u8 tmp_0xc50 = (u8)rtl_get_bbreg(hw, 0xc50, MASKBYTE0);
2497 u8 tmp_0xc58 = (u8)rtl_get_bbreg(hw, 0xc58, MASKBYTE0);
2498 u32 adda_reg[IQK_ADDA_REG_NUM] = {
2499 0x85c, 0xe6c, 0xe70, 0xe74,
2500 0xe78, 0xe7c, 0xe80, 0xe84,
2501 0xe88, 0xe8c, 0xed0, 0xed4,
2502 0xed8, 0xedc, 0xee0, 0xeec
2504 u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2505 0x522, 0x550, 0x551, 0x040
2507 u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2508 ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
2509 RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
2513 const u32 retrycount = 2;
2516 _rtl92ee_phy_save_adda_registers(hw, adda_reg,
2517 rtlphy->adda_backup,
2519 _rtl92ee_phy_save_mac_registers(hw, iqk_mac_reg,
2520 rtlphy->iqk_mac_backup);
2521 _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2522 rtlphy->iqk_bb_backup,
2526 _rtl92ee_phy_path_adda_on(hw, adda_reg, true, is2t);
2529 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2530 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2531 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2532 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208200);
2534 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(10), 0x01);
2535 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(26), 0x01);
2536 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 0x01);
2537 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10), 0x01);
2539 _rtl92ee_phy_mac_setting_calibration(hw, iqk_mac_reg,
2540 rtlphy->iqk_mac_backup);
2542 /* IQ calibration setting*/
2543 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2544 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2545 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2547 for (i = 0 ; i < retrycount ; i++) {
2548 patha_ok = _rtl92ee_phy_path_a_iqk(hw, is2t);
2550 if (patha_ok == 0x01) {
2551 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2552 "Path A Tx IQK Success!!\n");
2553 result[t][0] = (rtl_get_bbreg(hw,
2554 RTX_POWER_BEFORE_IQK_A,
2555 MASKDWORD) & 0x3FF0000)
2557 result[t][1] = (rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A,
2558 MASKDWORD) & 0x3FF0000)
2562 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2563 "Path A Tx IQK Fail!!, ret = 0x%x\n",
2567 for (i = 0 ; i < retrycount ; i++) {
2568 patha_ok = _rtl92ee_phy_path_a_rx_iqk(hw, is2t);
2570 if (patha_ok == 0x03) {
2571 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2572 "Path A Rx IQK Success!!\n");
2573 result[t][2] = (rtl_get_bbreg(hw,
2574 RRX_POWER_BEFORE_IQK_A_2,
2575 MASKDWORD) & 0x3FF0000)
2577 result[t][3] = (rtl_get_bbreg(hw,
2578 RRX_POWER_AFTER_IQK_A_2,
2579 MASKDWORD) & 0x3FF0000)
2583 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2584 "Path A Rx IQK Fail!!, ret = 0x%x\n",
2588 if (0x00 == patha_ok)
2589 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2590 "Path A IQK failed!!, ret = 0\n");
2592 _rtl92ee_phy_path_a_standby(hw);
2593 /* Turn Path B ADDA on */
2594 _rtl92ee_phy_path_adda_on(hw, adda_reg, false, is2t);
2596 /* IQ calibration setting */
2597 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2598 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2599 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2601 for (i = 0 ; i < retrycount ; i++) {
2602 pathb_ok = _rtl92ee_phy_path_b_iqk(hw);
2603 if (pathb_ok == 0x01) {
2604 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2605 "Path B Tx IQK Success!!\n");
2606 result[t][4] = (rtl_get_bbreg(hw,
2607 RTX_POWER_BEFORE_IQK_B,
2608 MASKDWORD) & 0x3FF0000)
2610 result[t][5] = (rtl_get_bbreg(hw,
2611 RTX_POWER_AFTER_IQK_B,
2612 MASKDWORD) & 0x3FF0000)
2616 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2617 "Path B Tx IQK Fail!!, ret = 0x%x\n",
2621 for (i = 0 ; i < retrycount ; i++) {
2622 pathb_ok = _rtl92ee_phy_path_b_rx_iqk(hw, is2t);
2623 if (pathb_ok == 0x03) {
2624 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2625 "Path B Rx IQK Success!!\n");
2626 result[t][6] = (rtl_get_bbreg(hw,
2627 RRX_POWER_BEFORE_IQK_B_2,
2628 MASKDWORD) & 0x3FF0000)
2630 result[t][7] = (rtl_get_bbreg(hw,
2631 RRX_POWER_AFTER_IQK_B_2,
2632 MASKDWORD) & 0x3FF0000)
2636 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2637 "Path B Rx IQK Fail!!, ret = 0x%x\n",
2641 if (0x00 == pathb_ok)
2642 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2643 "Path B IQK failed!!, ret = 0\n");
2645 /* Back to BB mode, load original value */
2646 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2647 "IQK:Back to BB mode, load original value!\n");
2648 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0);
2651 /* Reload ADDA power saving parameters */
2652 _rtl92ee_phy_reload_adda_registers(hw, adda_reg,
2653 rtlphy->adda_backup,
2656 /* Reload MAC parameters */
2657 _rtl92ee_phy_reload_mac_registers(hw, iqk_mac_reg,
2658 rtlphy->iqk_mac_backup);
2660 _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2661 rtlphy->iqk_bb_backup,
2664 /* Restore RX initial gain */
2665 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2666 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_0xc50);
2668 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2669 rtl_set_bbreg(hw, 0xc58, MASKBYTE0, tmp_0xc58);
2672 /* load 0xe30 IQC default value */
2673 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2674 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2678 static void _rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2681 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
2682 struct rtl_priv *rtlpriv = rtl_priv(hw);
2684 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2686 if ((tmpreg & 0x70) != 0)
2687 rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2689 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2691 if ((tmpreg & 0x70) != 0) {
2692 rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
2695 rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
2698 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
2699 (rf_a_mode & 0x8FFFF) | 0x10000);
2702 rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2703 (rf_b_mode & 0x8FFFF) | 0x10000);
2705 lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
2707 rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
2711 if ((tmpreg & 0x70) != 0) {
2712 rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2713 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
2716 rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2719 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2723 static void _rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw,
2724 bool bmain, bool is2t)
2726 struct rtl_priv *rtlpriv = rtl_priv(hw);
2727 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2728 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2730 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD , "\n");
2732 if (is_hal_stop(rtlhal)) {
2735 u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
2736 rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
2737 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
2741 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2742 BIT(5) | BIT(6), 0x1);
2744 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2745 BIT(5) | BIT(6), 0x2);
2747 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
2748 rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
2750 /* We use the RF definition of MAIN and AUX,
2751 * left antenna and right antenna repectively.
2752 * Default output at AUX.
2755 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2756 BIT(14) | BIT(13) | BIT(12), 0);
2757 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2758 BIT(5) | BIT(4) | BIT(3), 0);
2759 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2760 rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 0);
2762 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2763 BIT(14) | BIT(13) | BIT(12), 1);
2764 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2765 BIT(5) | BIT(4) | BIT(3), 1);
2766 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2767 rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 1);
2772 #undef IQK_ADDA_REG_NUM
2773 #undef IQK_DELAY_TIME
2775 static u8 rtl92ee_get_rightchnlplace_for_iqk(u8 chnl)
2777 u8 channel_all[59] = {
2778 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2779 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2780 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2781 114, 116, 118, 120, 122, 124, 126, 128, 130,
2782 132, 134, 136, 138, 140, 149, 151, 153, 155,
2783 157, 159, 161, 163, 165
2788 for (place = 14; place < sizeof(channel_all); place++) {
2789 if (channel_all[place] == chnl)
2797 void rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
2799 struct rtl_priv *rtlpriv = rtl_priv(hw);
2800 struct rtl_phy *rtlphy = &rtlpriv->phy;
2802 u8 i, final_candidate;
2803 bool b_patha_ok, b_pathb_ok;
2804 long reg_e94, reg_e9c, reg_ea4, reg_eac;
2805 long reg_eb4, reg_ebc, reg_ec4, reg_ecc;
2806 bool is12simular, is13simular, is23simular;
2808 u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2809 ROFDM0_XARXIQIMBALANCE,
2810 ROFDM0_XBRXIQIMBALANCE,
2811 ROFDM0_ECCATHRESHOLD,
2812 ROFDM0_AGCRSSITABLE,
2813 ROFDM0_XATXIQIMBALANCE,
2814 ROFDM0_XBTXIQIMBALANCE,
2821 _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2822 rtlphy->iqk_bb_backup, 9);
2826 for (i = 0; i < 8; i++) {
2831 if ((i == 0) || (i == 2) || (i == 4) || (i == 6))
2832 result[3][i] = 0x100;
2836 final_candidate = 0xff;
2839 is12simular = false;
2840 is23simular = false;
2841 is13simular = false;
2842 for (i = 0; i < 3; i++) {
2843 _rtl92ee_phy_iq_calibrate(hw, result, i, true);
2845 is12simular = _rtl92ee_phy_simularity_compare(hw,
2849 final_candidate = 0;
2855 is13simular = _rtl92ee_phy_simularity_compare(hw,
2859 final_candidate = 0;
2862 is23simular = _rtl92ee_phy_simularity_compare(hw,
2866 final_candidate = 1;
2868 final_candidate = 3;
2872 for (i = 0; i < 4; i++) {
2873 reg_e94 = result[i][0];
2874 reg_e9c = result[i][1];
2875 reg_ea4 = result[i][2];
2876 reg_eac = result[i][3];
2877 reg_eb4 = result[i][4];
2878 reg_ebc = result[i][5];
2879 reg_ec4 = result[i][6];
2880 reg_ecc = result[i][7];
2883 if (final_candidate != 0xff) {
2884 reg_e94 = result[final_candidate][0];
2885 rtlphy->reg_e94 = reg_e94;
2886 reg_e9c = result[final_candidate][1];
2887 rtlphy->reg_e9c = reg_e9c;
2888 reg_ea4 = result[final_candidate][2];
2889 reg_eac = result[final_candidate][3];
2890 reg_eb4 = result[final_candidate][4];
2891 rtlphy->reg_eb4 = reg_eb4;
2892 reg_ebc = result[final_candidate][5];
2893 rtlphy->reg_ebc = reg_ebc;
2894 reg_ec4 = result[final_candidate][6];
2895 reg_ecc = result[final_candidate][7];
2899 rtlphy->reg_e94 = 0x100;
2900 rtlphy->reg_eb4 = 0x100;
2901 rtlphy->reg_e9c = 0x0;
2902 rtlphy->reg_ebc = 0x0;
2906 _rtl92ee_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
2910 _rtl92ee_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result,
2914 idx = rtl92ee_get_rightchnlplace_for_iqk(rtlphy->current_channel);
2916 /* To Fix BSOD when final_candidate is 0xff */
2917 if (final_candidate < 4) {
2918 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2919 rtlphy->iqk_matrix[idx].value[0][i] =
2920 result[final_candidate][i];
2922 rtlphy->iqk_matrix[idx].iqk_done = true;
2924 _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2925 rtlphy->iqk_bb_backup, 9);
2928 void rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw)
2930 struct rtl_priv *rtlpriv = rtl_priv(hw);
2931 struct rtl_phy *rtlphy = &rtlpriv->phy;
2932 struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
2933 u32 timeout = 2000, timecount = 0;
2935 while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2940 rtlphy->lck_inprogress = true;
2941 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2942 "LCK:Start!!! currentband %x delay %d ms\n",
2943 rtlhal->current_bandtype, timecount);
2945 _rtl92ee_phy_lc_calibrate(hw, false);
2947 rtlphy->lck_inprogress = false;
2950 void rtl92ee_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
2954 void rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
2956 _rtl92ee_phy_set_rfpath_switch(hw, bmain, false);
2959 bool rtl92ee_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2961 struct rtl_priv *rtlpriv = rtl_priv(hw);
2962 struct rtl_phy *rtlphy = &rtlpriv->phy;
2963 bool postprocessing = false;
2965 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2966 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2967 iotype, rtlphy->set_io_inprogress);
2970 case IO_CMD_RESUME_DM_BY_SCAN:
2971 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2972 "[IO CMD] Resume DM after scan.\n");
2973 postprocessing = true;
2975 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
2976 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2977 "[IO CMD] Pause DM before scan.\n");
2978 postprocessing = true;
2981 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2982 "switch case %#x not processed\n", iotype);
2986 if (postprocessing && !rtlphy->set_io_inprogress) {
2987 rtlphy->set_io_inprogress = true;
2988 rtlphy->current_io_type = iotype;
2992 rtl92ee_phy_set_io(hw);
2993 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
2997 static void rtl92ee_phy_set_io(struct ieee80211_hw *hw)
2999 struct rtl_priv *rtlpriv = rtl_priv(hw);
3000 struct rtl_phy *rtlphy = &rtlpriv->phy;
3001 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
3003 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3004 "--->Cmd(%#x), set_io_inprogress(%d)\n",
3005 rtlphy->current_io_type, rtlphy->set_io_inprogress);
3006 switch (rtlphy->current_io_type) {
3007 case IO_CMD_RESUME_DM_BY_SCAN:
3008 rtl92ee_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
3009 rtl92ee_dm_write_cck_cca_thres(hw, rtlphy->initgain_backup.cca);
3010 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE , "no set txpower\n");
3011 rtl92ee_phy_set_txpower_level(hw, rtlphy->current_channel);
3013 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
3015 rtlphy->initgain_backup.xaagccore1 = dm_dig->cur_igvalue;
3016 rtl92ee_dm_write_dig(hw, 0x17);
3017 rtlphy->initgain_backup.cca = dm_dig->cur_cck_cca_thres;
3018 rtl92ee_dm_write_cck_cca_thres(hw, 0x40);
3021 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
3022 "switch case %#x not processed\n",
3023 rtlphy->current_io_type);
3026 rtlphy->set_io_inprogress = false;
3027 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3028 "(%#x)\n", rtlphy->current_io_type);
3031 static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw)
3033 struct rtl_priv *rtlpriv = rtl_priv(hw);
3035 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3036 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3037 /*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/
3038 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3039 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3040 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3043 static void _rtl92ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
3045 struct rtl_priv *rtlpriv = rtl_priv(hw);
3047 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3048 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3050 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3051 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3054 static bool _rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3055 enum rf_pwrstate rfpwr_state)
3057 struct rtl_priv *rtlpriv = rtl_priv(hw);
3058 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3059 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3060 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3061 bool bresult = true;
3063 struct rtl8192_tx_ring *ring = NULL;
3065 switch (rfpwr_state) {
3067 if ((ppsc->rfpwr_state == ERFOFF) &&
3068 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3070 u32 initializecount = 0;
3074 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3075 "IPS Set eRf nic enable\n");
3076 rtstatus = rtl_ps_enable_nic(hw);
3077 } while (!rtstatus && (initializecount < 10));
3078 RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3080 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3081 "Set ERFON sleeping:%d ms\n",
3082 jiffies_to_msecs(jiffies -
3083 ppsc->last_sleep_jiffies));
3084 ppsc->last_awake_jiffies = jiffies;
3085 rtl92ee_phy_set_rf_on(hw);
3087 if (mac->link_state == MAC80211_LINKED)
3088 rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
3090 rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
3093 for (queue_id = 0, i = 0;
3094 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3095 ring = &pcipriv->dev.tx_ring[queue_id];
3096 if (queue_id == BEACON_QUEUE ||
3097 skb_queue_len(&ring->queue) == 0) {
3101 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3102 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3104 skb_queue_len(&ring->queue));
3109 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3110 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3111 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3112 MAX_DOZE_WAITING_TIMES_9x,
3114 skb_queue_len(&ring->queue));
3119 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3120 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3121 "IPS Set eRf nic disable\n");
3122 rtl_ps_disable_nic(hw);
3123 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3125 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
3126 rtlpriv->cfg->ops->led_control(hw,
3129 rtlpriv->cfg->ops->led_control(hw,
3135 if (ppsc->rfpwr_state == ERFOFF)
3137 for (queue_id = 0, i = 0;
3138 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3139 ring = &pcipriv->dev.tx_ring[queue_id];
3140 if (skb_queue_len(&ring->queue) == 0) {
3144 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3145 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3147 skb_queue_len(&ring->queue));
3151 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3152 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3153 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3154 MAX_DOZE_WAITING_TIMES_9x,
3156 skb_queue_len(&ring->queue));
3160 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3161 "Set ERFSLEEP awaked:%d ms\n",
3162 jiffies_to_msecs(jiffies -
3163 ppsc->last_awake_jiffies));
3164 ppsc->last_sleep_jiffies = jiffies;
3165 _rtl92ee_phy_set_rf_sleep(hw);
3168 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
3169 "switch case %#x not processed\n", rfpwr_state);
3174 ppsc->rfpwr_state = rfpwr_state;
3178 bool rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3179 enum rf_pwrstate rfpwr_state)
3181 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3183 bool bresult = false;
3185 if (rfpwr_state == ppsc->rfpwr_state)
3187 bresult = _rtl92ee_phy_set_rf_power_state(hw, rfpwr_state);