15bd4f692SLarry Finger // SPDX-License-Identifier: GPL-2.0
25bd4f692SLarry Finger /* Copyright(c) 2009-2012 Realtek Corporation.*/
3f1d2b4d3SLarry Finger
4f1d2b4d3SLarry Finger #include "../wifi.h"
5f1d2b4d3SLarry Finger #include "../pci.h"
6f1d2b4d3SLarry Finger #include "../ps.h"
7f1d2b4d3SLarry Finger #include "../core.h"
8f1d2b4d3SLarry Finger #include "reg.h"
9f1d2b4d3SLarry Finger #include "def.h"
10f1d2b4d3SLarry Finger #include "phy.h"
11f1d2b4d3SLarry Finger #include "rf.h"
12f1d2b4d3SLarry Finger #include "dm.h"
13f1d2b4d3SLarry Finger #include "table.h"
14f1d2b4d3SLarry Finger #include "sw.h"
15f1d2b4d3SLarry Finger #include "hw.h"
16f1d2b4d3SLarry Finger
17f1d2b4d3SLarry Finger #define MAX_RF_IMR_INDEX 12
18f1d2b4d3SLarry Finger #define MAX_RF_IMR_INDEX_NORMAL 13
19f1d2b4d3SLarry Finger #define RF_REG_NUM_FOR_C_CUT_5G 6
20f1d2b4d3SLarry Finger #define RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA 7
21f1d2b4d3SLarry Finger #define RF_REG_NUM_FOR_C_CUT_2G 5
22f1d2b4d3SLarry Finger #define RF_CHNL_NUM_5G 19
23f1d2b4d3SLarry Finger #define RF_CHNL_NUM_5G_40M 17
24f1d2b4d3SLarry Finger #define TARGET_CHNL_NUM_5G 221
25f1d2b4d3SLarry Finger #define TARGET_CHNL_NUM_2G 14
26f1d2b4d3SLarry Finger #define CV_CURVE_CNT 64
27f1d2b4d3SLarry Finger
28f1d2b4d3SLarry Finger static u32 rf_reg_for_5g_swchnl_normal[MAX_RF_IMR_INDEX_NORMAL] = {
29f1d2b4d3SLarry Finger 0, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x0
30f1d2b4d3SLarry Finger };
31f1d2b4d3SLarry Finger
32f1d2b4d3SLarry Finger static u8 rf_reg_for_c_cut_5g[RF_REG_NUM_FOR_C_CUT_5G] = {
33f1d2b4d3SLarry Finger RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G4, RF_SYN_G5, RF_SYN_G6
34f1d2b4d3SLarry Finger };
35f1d2b4d3SLarry Finger
36f1d2b4d3SLarry Finger static u8 rf_reg_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
37f1d2b4d3SLarry Finger RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G7, RF_SYN_G8
38f1d2b4d3SLarry Finger };
39f1d2b4d3SLarry Finger
40f1d2b4d3SLarry Finger static u8 rf_for_c_cut_5g_internal_pa[RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
41f1d2b4d3SLarry Finger 0x0B, 0x48, 0x49, 0x4B, 0x03, 0x04, 0x0E
42f1d2b4d3SLarry Finger };
43f1d2b4d3SLarry Finger
44f1d2b4d3SLarry Finger static u32 rf_reg_mask_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
45f1d2b4d3SLarry Finger BIT(19) | BIT(18) | BIT(17) | BIT(14) | BIT(1),
46f1d2b4d3SLarry Finger BIT(10) | BIT(9),
47f1d2b4d3SLarry Finger BIT(18) | BIT(17) | BIT(16) | BIT(1),
48f1d2b4d3SLarry Finger BIT(2) | BIT(1),
49f1d2b4d3SLarry Finger BIT(15) | BIT(14) | BIT(13) | BIT(12) | BIT(11)
50f1d2b4d3SLarry Finger };
51f1d2b4d3SLarry Finger
52f1d2b4d3SLarry Finger static u8 rf_chnl_5g[RF_CHNL_NUM_5G] = {
53f1d2b4d3SLarry Finger 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108,
54f1d2b4d3SLarry Finger 112, 116, 120, 124, 128, 132, 136, 140
55f1d2b4d3SLarry Finger };
56f1d2b4d3SLarry Finger
57f1d2b4d3SLarry Finger static u8 rf_chnl_5g_40m[RF_CHNL_NUM_5G_40M] = {
58f1d2b4d3SLarry Finger 38, 42, 46, 50, 54, 58, 62, 102, 106, 110, 114,
59f1d2b4d3SLarry Finger 118, 122, 126, 130, 134, 138
60f1d2b4d3SLarry Finger };
61f1d2b4d3SLarry Finger static u32 rf_reg_pram_c_5g[5][RF_REG_NUM_FOR_C_CUT_5G] = {
62f1d2b4d3SLarry Finger {0xE43BE, 0xFC638, 0x77C0A, 0xDE471, 0xd7110, 0x8EB04},
63f1d2b4d3SLarry Finger {0xE43BE, 0xFC078, 0xF7C1A, 0xE0C71, 0xD7550, 0xAEB04},
64f1d2b4d3SLarry Finger {0xE43BF, 0xFF038, 0xF7C0A, 0xDE471, 0xE5550, 0xAEB04},
65f1d2b4d3SLarry Finger {0xE43BF, 0xFF079, 0xF7C1A, 0xDE471, 0xE5550, 0xAEB04},
66f1d2b4d3SLarry Finger {0xE43BF, 0xFF038, 0xF7C1A, 0xDE471, 0xd7550, 0xAEB04}
67f1d2b4d3SLarry Finger };
68f1d2b4d3SLarry Finger
69f1d2b4d3SLarry Finger static u32 rf_reg_param_for_c_cut_2g[3][RF_REG_NUM_FOR_C_CUT_2G] = {
70f1d2b4d3SLarry Finger {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},
71f1d2b4d3SLarry Finger {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},
72f1d2b4d3SLarry Finger {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}
73f1d2b4d3SLarry Finger };
74f1d2b4d3SLarry Finger
75f1d2b4d3SLarry Finger static u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF;
76f1d2b4d3SLarry Finger
77f1d2b4d3SLarry Finger static u32 rf_pram_c_5g_int_pa[3][RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
78f1d2b4d3SLarry Finger {0x01a00, 0x40443, 0x00eb5, 0x89bec, 0x94a12, 0x94a12, 0x94a12},
79f1d2b4d3SLarry Finger {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a52, 0x94a52, 0x94a52},
80f1d2b4d3SLarry Finger {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a12, 0x94a12, 0x94a12}
81f1d2b4d3SLarry Finger };
82f1d2b4d3SLarry Finger
83f1d2b4d3SLarry Finger /* [mode][patha+b][reg] */
84f1d2b4d3SLarry Finger static u32 rf_imr_param_normal[1][3][MAX_RF_IMR_INDEX_NORMAL] = {
85f1d2b4d3SLarry Finger {
86f1d2b4d3SLarry Finger /* channel 1-14. */
87f1d2b4d3SLarry Finger {
88f1d2b4d3SLarry Finger 0x70000, 0x00ff0, 0x4400f, 0x00ff0, 0x0, 0x0, 0x0,
89f1d2b4d3SLarry Finger 0x0, 0x0, 0x64888, 0xe266c, 0x00090, 0x22fff
90f1d2b4d3SLarry Finger },
91f1d2b4d3SLarry Finger /* path 36-64 */
92f1d2b4d3SLarry Finger {
93f1d2b4d3SLarry Finger 0x70000, 0x22880, 0x4470f, 0x55880, 0x00070, 0x88000,
94f1d2b4d3SLarry Finger 0x0, 0x88080, 0x70000, 0x64a82, 0xe466c, 0x00090,
95f1d2b4d3SLarry Finger 0x32c9a
96f1d2b4d3SLarry Finger },
97f1d2b4d3SLarry Finger /* 100 -165 */
98f1d2b4d3SLarry Finger {
99f1d2b4d3SLarry Finger 0x70000, 0x44880, 0x4477f, 0x77880, 0x00070, 0x88000,
100f1d2b4d3SLarry Finger 0x0, 0x880b0, 0x0, 0x64b82, 0xe466c, 0x00090, 0x32c9a
101f1d2b4d3SLarry Finger }
102f1d2b4d3SLarry Finger }
103f1d2b4d3SLarry Finger };
104f1d2b4d3SLarry Finger
105f1d2b4d3SLarry Finger static u32 curveindex_5g[TARGET_CHNL_NUM_5G] = {0};
106f1d2b4d3SLarry Finger
107f1d2b4d3SLarry Finger static u32 curveindex_2g[TARGET_CHNL_NUM_2G] = {0};
108f1d2b4d3SLarry Finger
109f1d2b4d3SLarry Finger static u32 targetchnl_5g[TARGET_CHNL_NUM_5G] = {
110f1d2b4d3SLarry Finger 25141, 25116, 25091, 25066, 25041,
111f1d2b4d3SLarry Finger 25016, 24991, 24966, 24941, 24917,
112f1d2b4d3SLarry Finger 24892, 24867, 24843, 24818, 24794,
113f1d2b4d3SLarry Finger 24770, 24765, 24721, 24697, 24672,
114f1d2b4d3SLarry Finger 24648, 24624, 24600, 24576, 24552,
115f1d2b4d3SLarry Finger 24528, 24504, 24480, 24457, 24433,
116f1d2b4d3SLarry Finger 24409, 24385, 24362, 24338, 24315,
117f1d2b4d3SLarry Finger 24291, 24268, 24245, 24221, 24198,
118f1d2b4d3SLarry Finger 24175, 24151, 24128, 24105, 24082,
119f1d2b4d3SLarry Finger 24059, 24036, 24013, 23990, 23967,
120f1d2b4d3SLarry Finger 23945, 23922, 23899, 23876, 23854,
121f1d2b4d3SLarry Finger 23831, 23809, 23786, 23764, 23741,
122f1d2b4d3SLarry Finger 23719, 23697, 23674, 23652, 23630,
123f1d2b4d3SLarry Finger 23608, 23586, 23564, 23541, 23519,
124f1d2b4d3SLarry Finger 23498, 23476, 23454, 23432, 23410,
125f1d2b4d3SLarry Finger 23388, 23367, 23345, 23323, 23302,
126f1d2b4d3SLarry Finger 23280, 23259, 23237, 23216, 23194,
127f1d2b4d3SLarry Finger 23173, 23152, 23130, 23109, 23088,
128f1d2b4d3SLarry Finger 23067, 23046, 23025, 23003, 22982,
129f1d2b4d3SLarry Finger 22962, 22941, 22920, 22899, 22878,
130f1d2b4d3SLarry Finger 22857, 22837, 22816, 22795, 22775,
131f1d2b4d3SLarry Finger 22754, 22733, 22713, 22692, 22672,
132f1d2b4d3SLarry Finger 22652, 22631, 22611, 22591, 22570,
133f1d2b4d3SLarry Finger 22550, 22530, 22510, 22490, 22469,
134f1d2b4d3SLarry Finger 22449, 22429, 22409, 22390, 22370,
135f1d2b4d3SLarry Finger 22350, 22336, 22310, 22290, 22271,
136f1d2b4d3SLarry Finger 22251, 22231, 22212, 22192, 22173,
137f1d2b4d3SLarry Finger 22153, 22134, 22114, 22095, 22075,
138f1d2b4d3SLarry Finger 22056, 22037, 22017, 21998, 21979,
139f1d2b4d3SLarry Finger 21960, 21941, 21921, 21902, 21883,
140f1d2b4d3SLarry Finger 21864, 21845, 21826, 21807, 21789,
141f1d2b4d3SLarry Finger 21770, 21751, 21732, 21713, 21695,
142f1d2b4d3SLarry Finger 21676, 21657, 21639, 21620, 21602,
143f1d2b4d3SLarry Finger 21583, 21565, 21546, 21528, 21509,
144f1d2b4d3SLarry Finger 21491, 21473, 21454, 21436, 21418,
145f1d2b4d3SLarry Finger 21400, 21381, 21363, 21345, 21327,
146f1d2b4d3SLarry Finger 21309, 21291, 21273, 21255, 21237,
147f1d2b4d3SLarry Finger 21219, 21201, 21183, 21166, 21148,
148f1d2b4d3SLarry Finger 21130, 21112, 21095, 21077, 21059,
149f1d2b4d3SLarry Finger 21042, 21024, 21007, 20989, 20972,
150f1d2b4d3SLarry Finger 25679, 25653, 25627, 25601, 25575,
151f1d2b4d3SLarry Finger 25549, 25523, 25497, 25471, 25446,
152f1d2b4d3SLarry Finger 25420, 25394, 25369, 25343, 25318,
153f1d2b4d3SLarry Finger 25292, 25267, 25242, 25216, 25191,
154f1d2b4d3SLarry Finger 25166
155f1d2b4d3SLarry Finger };
156f1d2b4d3SLarry Finger
157f1d2b4d3SLarry Finger /* channel 1~14 */
158f1d2b4d3SLarry Finger static u32 targetchnl_2g[TARGET_CHNL_NUM_2G] = {
159f1d2b4d3SLarry Finger 26084, 26030, 25976, 25923, 25869, 25816, 25764,
160f1d2b4d3SLarry Finger 25711, 25658, 25606, 25554, 25502, 25451, 25328
161f1d2b4d3SLarry Finger };
162f1d2b4d3SLarry Finger
163b05897caSColin Ian King static const u8 channel_all[59] = {
164b05897caSColin Ian King 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
165b05897caSColin Ian King 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
166b05897caSColin Ian King 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
167b05897caSColin Ian King 114, 116, 118, 120, 122, 124, 126, 128, 130,
168b05897caSColin Ian King 132, 134, 136, 138, 140, 149, 151, 153, 155,
169b05897caSColin Ian King 157, 159, 161, 163, 165
170b05897caSColin Ian King };
171b05897caSColin Ian King
rtl92d_phy_query_bb_reg(struct ieee80211_hw * hw,u32 regaddr,u32 bitmask)172f1d2b4d3SLarry Finger u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
173f1d2b4d3SLarry Finger {
174f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
175f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
176f1d2b4d3SLarry Finger u32 returnvalue, originalvalue, bitshift;
177f1d2b4d3SLarry Finger
1786bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
179f1d2b4d3SLarry Finger regaddr, bitmask);
180f1d2b4d3SLarry Finger if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) {
181f1d2b4d3SLarry Finger u8 dbi_direct = 0;
182f1d2b4d3SLarry Finger
183f1d2b4d3SLarry Finger /* mac1 use phy0 read radio_b. */
184f1d2b4d3SLarry Finger /* mac0 use phy1 read radio_b. */
185f1d2b4d3SLarry Finger if (rtlhal->during_mac1init_radioa)
186f1d2b4d3SLarry Finger dbi_direct = BIT(3);
187f1d2b4d3SLarry Finger else if (rtlhal->during_mac0init_radiob)
188f1d2b4d3SLarry Finger dbi_direct = BIT(3) | BIT(2);
189f1d2b4d3SLarry Finger originalvalue = rtl92de_read_dword_dbi(hw, (u16)regaddr,
190f1d2b4d3SLarry Finger dbi_direct);
191f1d2b4d3SLarry Finger } else {
192f1d2b4d3SLarry Finger originalvalue = rtl_read_dword(rtlpriv, regaddr);
193f1d2b4d3SLarry Finger }
1946bbaf100SSu Hui bitshift = calculate_bit_shift(bitmask);
195f1d2b4d3SLarry Finger returnvalue = (originalvalue & bitmask) >> bitshift;
1966bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
197f1d2b4d3SLarry Finger "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
198f1d2b4d3SLarry Finger bitmask, regaddr, originalvalue);
199f1d2b4d3SLarry Finger return returnvalue;
200f1d2b4d3SLarry Finger }
201f1d2b4d3SLarry Finger
rtl92d_phy_set_bb_reg(struct ieee80211_hw * hw,u32 regaddr,u32 bitmask,u32 data)202f1d2b4d3SLarry Finger void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
203f1d2b4d3SLarry Finger u32 regaddr, u32 bitmask, u32 data)
204f1d2b4d3SLarry Finger {
205f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
206f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
207f1d2b4d3SLarry Finger u8 dbi_direct = 0;
208f1d2b4d3SLarry Finger u32 originalvalue, bitshift;
209f1d2b4d3SLarry Finger
2106bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
211f1d2b4d3SLarry Finger "regaddr(%#x), bitmask(%#x), data(%#x)\n",
212f1d2b4d3SLarry Finger regaddr, bitmask, data);
213f1d2b4d3SLarry Finger if (rtlhal->during_mac1init_radioa)
214f1d2b4d3SLarry Finger dbi_direct = BIT(3);
215f1d2b4d3SLarry Finger else if (rtlhal->during_mac0init_radiob)
216f1d2b4d3SLarry Finger /* mac0 use phy1 write radio_b. */
217f1d2b4d3SLarry Finger dbi_direct = BIT(3) | BIT(2);
218f1d2b4d3SLarry Finger if (bitmask != MASKDWORD) {
219f1d2b4d3SLarry Finger if (rtlhal->during_mac1init_radioa ||
220f1d2b4d3SLarry Finger rtlhal->during_mac0init_radiob)
221f1d2b4d3SLarry Finger originalvalue = rtl92de_read_dword_dbi(hw,
222f1d2b4d3SLarry Finger (u16) regaddr,
223f1d2b4d3SLarry Finger dbi_direct);
224f1d2b4d3SLarry Finger else
225f1d2b4d3SLarry Finger originalvalue = rtl_read_dword(rtlpriv, regaddr);
2266bbaf100SSu Hui bitshift = calculate_bit_shift(bitmask);
227f1d2b4d3SLarry Finger data = ((originalvalue & (~bitmask)) | (data << bitshift));
228f1d2b4d3SLarry Finger }
229f1d2b4d3SLarry Finger if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob)
230f1d2b4d3SLarry Finger rtl92de_write_dword_dbi(hw, (u16) regaddr, data, dbi_direct);
231f1d2b4d3SLarry Finger else
232f1d2b4d3SLarry Finger rtl_write_dword(rtlpriv, regaddr, data);
2336bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
234f1d2b4d3SLarry Finger "regaddr(%#x), bitmask(%#x), data(%#x)\n",
235f1d2b4d3SLarry Finger regaddr, bitmask, data);
236f1d2b4d3SLarry Finger }
237f1d2b4d3SLarry Finger
_rtl92d_phy_rf_serial_read(struct ieee80211_hw * hw,enum radio_path rfpath,u32 offset)238f1d2b4d3SLarry Finger static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
239f1d2b4d3SLarry Finger enum radio_path rfpath, u32 offset)
240f1d2b4d3SLarry Finger {
241f1d2b4d3SLarry Finger
242f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
243f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
244f1d2b4d3SLarry Finger struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
245f1d2b4d3SLarry Finger u32 newoffset;
246f1d2b4d3SLarry Finger u32 tmplong, tmplong2;
247f1d2b4d3SLarry Finger u8 rfpi_enable = 0;
248f1d2b4d3SLarry Finger u32 retvalue;
249f1d2b4d3SLarry Finger
250f1d2b4d3SLarry Finger newoffset = offset;
251f1d2b4d3SLarry Finger tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
252f1d2b4d3SLarry Finger if (rfpath == RF90_PATH_A)
253f1d2b4d3SLarry Finger tmplong2 = tmplong;
254f1d2b4d3SLarry Finger else
255f1d2b4d3SLarry Finger tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
256f1d2b4d3SLarry Finger tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
257f1d2b4d3SLarry Finger (newoffset << 23) | BLSSIREADEDGE;
258f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
259f1d2b4d3SLarry Finger tmplong & (~BLSSIREADEDGE));
260f1d2b4d3SLarry Finger udelay(10);
261f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
262f1d2b4d3SLarry Finger udelay(50);
263f1d2b4d3SLarry Finger udelay(50);
264f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
265f1d2b4d3SLarry Finger tmplong | BLSSIREADEDGE);
266f1d2b4d3SLarry Finger udelay(10);
267f1d2b4d3SLarry Finger if (rfpath == RF90_PATH_A)
268f1d2b4d3SLarry Finger rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
269f1d2b4d3SLarry Finger BIT(8));
270f1d2b4d3SLarry Finger else if (rfpath == RF90_PATH_B)
271f1d2b4d3SLarry Finger rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
272f1d2b4d3SLarry Finger BIT(8));
273f1d2b4d3SLarry Finger if (rfpi_enable)
274f1d2b4d3SLarry Finger retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
275f1d2b4d3SLarry Finger BLSSIREADBACKDATA);
276f1d2b4d3SLarry Finger else
277f1d2b4d3SLarry Finger retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
278f1d2b4d3SLarry Finger BLSSIREADBACKDATA);
2796bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x] = 0x%x\n",
280f1d2b4d3SLarry Finger rfpath, pphyreg->rf_rb, retvalue);
281f1d2b4d3SLarry Finger return retvalue;
282f1d2b4d3SLarry Finger }
283f1d2b4d3SLarry Finger
_rtl92d_phy_rf_serial_write(struct ieee80211_hw * hw,enum radio_path rfpath,u32 offset,u32 data)284f1d2b4d3SLarry Finger static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
285f1d2b4d3SLarry Finger enum radio_path rfpath,
286f1d2b4d3SLarry Finger u32 offset, u32 data)
287f1d2b4d3SLarry Finger {
288f1d2b4d3SLarry Finger u32 data_and_addr;
289f1d2b4d3SLarry Finger u32 newoffset;
290f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
291f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
292f1d2b4d3SLarry Finger struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
293f1d2b4d3SLarry Finger
294f1d2b4d3SLarry Finger newoffset = offset;
295f1d2b4d3SLarry Finger /* T65 RF */
296f1d2b4d3SLarry Finger data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
297f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
2986bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
299f1d2b4d3SLarry Finger rfpath, pphyreg->rf3wire_offset, data_and_addr);
300f1d2b4d3SLarry Finger }
301f1d2b4d3SLarry Finger
rtl92d_phy_query_rf_reg(struct ieee80211_hw * hw,enum radio_path rfpath,u32 regaddr,u32 bitmask)302f1d2b4d3SLarry Finger u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
303f1d2b4d3SLarry Finger enum radio_path rfpath, u32 regaddr, u32 bitmask)
304f1d2b4d3SLarry Finger {
305f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
306f1d2b4d3SLarry Finger u32 original_value, readback_value, bitshift;
307f1d2b4d3SLarry Finger
3086bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
309f1d2b4d3SLarry Finger "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
310f1d2b4d3SLarry Finger regaddr, rfpath, bitmask);
31192541dd9SPing-Ke Shih spin_lock(&rtlpriv->locks.rf_lock);
312f1d2b4d3SLarry Finger original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
3136bbaf100SSu Hui bitshift = calculate_bit_shift(bitmask);
314f1d2b4d3SLarry Finger readback_value = (original_value & bitmask) >> bitshift;
31592541dd9SPing-Ke Shih spin_unlock(&rtlpriv->locks.rf_lock);
3166bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
317f1d2b4d3SLarry Finger "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
318f1d2b4d3SLarry Finger regaddr, rfpath, bitmask, original_value);
319f1d2b4d3SLarry Finger return readback_value;
320f1d2b4d3SLarry Finger }
321f1d2b4d3SLarry Finger
rtl92d_phy_set_rf_reg(struct ieee80211_hw * hw,enum radio_path rfpath,u32 regaddr,u32 bitmask,u32 data)322f1d2b4d3SLarry Finger void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
323f1d2b4d3SLarry Finger u32 regaddr, u32 bitmask, u32 data)
324f1d2b4d3SLarry Finger {
325f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
326f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
327f1d2b4d3SLarry Finger u32 original_value, bitshift;
328f1d2b4d3SLarry Finger
3296bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
330f1d2b4d3SLarry Finger "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
331f1d2b4d3SLarry Finger regaddr, bitmask, data, rfpath);
332f1d2b4d3SLarry Finger if (bitmask == 0)
333f1d2b4d3SLarry Finger return;
33492541dd9SPing-Ke Shih spin_lock(&rtlpriv->locks.rf_lock);
335f1d2b4d3SLarry Finger if (rtlphy->rf_mode != RF_OP_BY_FW) {
336f1d2b4d3SLarry Finger if (bitmask != RFREG_OFFSET_MASK) {
337f1d2b4d3SLarry Finger original_value = _rtl92d_phy_rf_serial_read(hw,
338f1d2b4d3SLarry Finger rfpath, regaddr);
3396bbaf100SSu Hui bitshift = calculate_bit_shift(bitmask);
340f1d2b4d3SLarry Finger data = ((original_value & (~bitmask)) |
341f1d2b4d3SLarry Finger (data << bitshift));
342f1d2b4d3SLarry Finger }
343f1d2b4d3SLarry Finger _rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
344f1d2b4d3SLarry Finger }
34592541dd9SPing-Ke Shih spin_unlock(&rtlpriv->locks.rf_lock);
3466bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
347f1d2b4d3SLarry Finger "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
348f1d2b4d3SLarry Finger regaddr, bitmask, data, rfpath);
349f1d2b4d3SLarry Finger }
350f1d2b4d3SLarry Finger
rtl92d_phy_mac_config(struct ieee80211_hw * hw)351f1d2b4d3SLarry Finger bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
352f1d2b4d3SLarry Finger {
353f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
354f1d2b4d3SLarry Finger u32 i;
355f1d2b4d3SLarry Finger u32 arraylength;
356f1d2b4d3SLarry Finger u32 *ptrarray;
357f1d2b4d3SLarry Finger
3586bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
359f1d2b4d3SLarry Finger arraylength = MAC_2T_ARRAYLENGTH;
360f1d2b4d3SLarry Finger ptrarray = rtl8192de_mac_2tarray;
3616bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Img:Rtl819XMAC_Array\n");
362f1d2b4d3SLarry Finger for (i = 0; i < arraylength; i = i + 2)
363f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
364f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
365f1d2b4d3SLarry Finger /* improve 2-stream TX EVM */
366f1d2b4d3SLarry Finger /* rtl_write_byte(rtlpriv, 0x14,0x71); */
367f1d2b4d3SLarry Finger /* AMPDU aggregation number 9 */
368f1d2b4d3SLarry Finger /* rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); */
369f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x0B);
370f1d2b4d3SLarry Finger } else {
371f1d2b4d3SLarry Finger /* 92D need to test to decide the num. */
372f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x07);
373f1d2b4d3SLarry Finger }
374f1d2b4d3SLarry Finger return true;
375f1d2b4d3SLarry Finger }
376f1d2b4d3SLarry Finger
_rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw * hw)377f1d2b4d3SLarry Finger static void _rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
378f1d2b4d3SLarry Finger {
379f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
380f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
381f1d2b4d3SLarry Finger
382f1d2b4d3SLarry Finger /* RF Interface Sowrtware Control */
383f1d2b4d3SLarry Finger /* 16 LSBs if read 32-bit from 0x870 */
384f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
385f1d2b4d3SLarry Finger /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
386f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
387f1d2b4d3SLarry Finger /* 16 LSBs if read 32-bit from 0x874 */
388f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
389f1d2b4d3SLarry Finger /* 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) */
390f1d2b4d3SLarry Finger
391f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
392f1d2b4d3SLarry Finger /* RF Interface Readback Value */
393f1d2b4d3SLarry Finger /* 16 LSBs if read 32-bit from 0x8E0 */
394f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
395f1d2b4d3SLarry Finger /* 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) */
396f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
397f1d2b4d3SLarry Finger /* 16 LSBs if read 32-bit from 0x8E4 */
398f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
399f1d2b4d3SLarry Finger /* 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) */
400f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
401f1d2b4d3SLarry Finger
402f1d2b4d3SLarry Finger /* RF Interface Output (and Enable) */
403f1d2b4d3SLarry Finger /* 16 LSBs if read 32-bit from 0x860 */
404f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
405f1d2b4d3SLarry Finger /* 16 LSBs if read 32-bit from 0x864 */
406f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
407f1d2b4d3SLarry Finger
408f1d2b4d3SLarry Finger /* RF Interface (Output and) Enable */
409f1d2b4d3SLarry Finger /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
410f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
411f1d2b4d3SLarry Finger /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
412f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
413f1d2b4d3SLarry Finger
414f1d2b4d3SLarry Finger /* Addr of LSSI. Wirte RF register by driver */
415f1d2b4d3SLarry Finger /* LSSI Parameter */
416f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
417f1d2b4d3SLarry Finger RFPGA0_XA_LSSIPARAMETER;
418f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
419f1d2b4d3SLarry Finger RFPGA0_XB_LSSIPARAMETER;
420f1d2b4d3SLarry Finger
421f1d2b4d3SLarry Finger /* RF parameter */
422f1d2b4d3SLarry Finger /* BB Band Select */
423f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
424f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
425f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
426f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
427f1d2b4d3SLarry Finger
428f1d2b4d3SLarry Finger /* Tx AGC Gain Stage (same for all path. Should we remove this?) */
429f1d2b4d3SLarry Finger /* Tx gain stage */
430f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
431f1d2b4d3SLarry Finger /* Tx gain stage */
432f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
433f1d2b4d3SLarry Finger /* Tx gain stage */
434f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
435f1d2b4d3SLarry Finger /* Tx gain stage */
436f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
437f1d2b4d3SLarry Finger
438f1d2b4d3SLarry Finger /* Tranceiver A~D HSSI Parameter-1 */
439f1d2b4d3SLarry Finger /* wire control parameter1 */
440f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
441f1d2b4d3SLarry Finger /* wire control parameter1 */
442f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
443f1d2b4d3SLarry Finger
444f1d2b4d3SLarry Finger /* Tranceiver A~D HSSI Parameter-2 */
445f1d2b4d3SLarry Finger /* wire control parameter2 */
446f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
447f1d2b4d3SLarry Finger /* wire control parameter2 */
448f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
449f1d2b4d3SLarry Finger
450f1d2b4d3SLarry Finger /* RF switch Control */
451f1d2b4d3SLarry Finger /* TR/Ant switch control */
452f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
453f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
454f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
455f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
456f1d2b4d3SLarry Finger
457f1d2b4d3SLarry Finger /* AGC control 1 */
458f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
459f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
460f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
461f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
462f1d2b4d3SLarry Finger
463f1d2b4d3SLarry Finger /* AGC control 2 */
464f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
465f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
466f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
467f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
468f1d2b4d3SLarry Finger
469f1d2b4d3SLarry Finger /* RX AFE control 1 */
470f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbal = ROFDM0_XARXIQIMBALANCE;
471f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbal = ROFDM0_XBRXIQIMBALANCE;
472f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBALANCE;
473f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBALANCE;
474f1d2b4d3SLarry Finger
475f1d2b4d3SLarry Finger /*RX AFE control 1 */
476f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
477f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
478f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
479f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
480f1d2b4d3SLarry Finger
481f1d2b4d3SLarry Finger /* Tx AFE control 1 */
482b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbal = ROFDM0_XATXIQIMBALANCE;
483b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbal = ROFDM0_XBTXIQIMBALANCE;
484b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTXIQIMBALANCE;
485b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTXIQIMBALANCE;
486f1d2b4d3SLarry Finger
487f1d2b4d3SLarry Finger /* Tx AFE control 2 */
488b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATXAFE;
489b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTXAFE;
490b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTXAFE;
491b83faedaSLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTXAFE;
492f1d2b4d3SLarry Finger
493f1d2b4d3SLarry Finger /* Tranceiver LSSI Readback SI mode */
494f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
495f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
496f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_C].rf_rb = RFPGA0_XC_LSSIREADBACK;
497f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_D].rf_rb = RFPGA0_XD_LSSIREADBACK;
498f1d2b4d3SLarry Finger
499f1d2b4d3SLarry Finger /* Tranceiver LSSI Readback PI mode */
500f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVERA_HSPI_READBACK;
501f1d2b4d3SLarry Finger rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVERB_HSPI_READBACK;
502f1d2b4d3SLarry Finger }
503f1d2b4d3SLarry Finger
_rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw * hw,u8 configtype)504f1d2b4d3SLarry Finger static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
505f1d2b4d3SLarry Finger u8 configtype)
506f1d2b4d3SLarry Finger {
507f1d2b4d3SLarry Finger int i;
508f1d2b4d3SLarry Finger u32 *phy_regarray_table;
509f1d2b4d3SLarry Finger u32 *agctab_array_table = NULL;
510f1d2b4d3SLarry Finger u32 *agctab_5garray_table;
511f1d2b4d3SLarry Finger u16 phy_reg_arraylen, agctab_arraylen = 0, agctab_5garraylen;
512f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
513f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
514f1d2b4d3SLarry Finger
515f1d2b4d3SLarry Finger /* Normal chip,Mac0 use AGC_TAB.txt for 2G and 5G band. */
516f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
517f1d2b4d3SLarry Finger agctab_arraylen = AGCTAB_ARRAYLENGTH;
518f1d2b4d3SLarry Finger agctab_array_table = rtl8192de_agctab_array;
5196bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
520f1d2b4d3SLarry Finger " ===> phy:MAC0, Rtl819XAGCTAB_Array\n");
521f1d2b4d3SLarry Finger } else {
522f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
523f1d2b4d3SLarry Finger agctab_arraylen = AGCTAB_2G_ARRAYLENGTH;
524f1d2b4d3SLarry Finger agctab_array_table = rtl8192de_agctab_2garray;
5256bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
526f1d2b4d3SLarry Finger " ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n");
527f1d2b4d3SLarry Finger } else {
528f1d2b4d3SLarry Finger agctab_5garraylen = AGCTAB_5G_ARRAYLENGTH;
529f1d2b4d3SLarry Finger agctab_5garray_table = rtl8192de_agctab_5garray;
5306bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
531f1d2b4d3SLarry Finger " ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n");
532f1d2b4d3SLarry Finger
533f1d2b4d3SLarry Finger }
534f1d2b4d3SLarry Finger }
535f1d2b4d3SLarry Finger phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH;
536f1d2b4d3SLarry Finger phy_regarray_table = rtl8192de_phy_reg_2tarray;
5376bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
538f1d2b4d3SLarry Finger " ===> phy:Rtl819XPHY_REG_Array_PG\n");
539f1d2b4d3SLarry Finger if (configtype == BASEBAND_CONFIG_PHY_REG) {
540f1d2b4d3SLarry Finger for (i = 0; i < phy_reg_arraylen; i = i + 2) {
541f1d2b4d3SLarry Finger rtl_addr_delay(phy_regarray_table[i]);
542f1d2b4d3SLarry Finger rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,
543f1d2b4d3SLarry Finger phy_regarray_table[i + 1]);
544f1d2b4d3SLarry Finger udelay(1);
5456bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
546f1d2b4d3SLarry Finger "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
547f1d2b4d3SLarry Finger phy_regarray_table[i],
548f1d2b4d3SLarry Finger phy_regarray_table[i + 1]);
549f1d2b4d3SLarry Finger }
550f1d2b4d3SLarry Finger } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
551f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
552f1d2b4d3SLarry Finger for (i = 0; i < agctab_arraylen; i = i + 2) {
553f1d2b4d3SLarry Finger rtl_set_bbreg(hw, agctab_array_table[i],
554f1d2b4d3SLarry Finger MASKDWORD,
555f1d2b4d3SLarry Finger agctab_array_table[i + 1]);
556f1d2b4d3SLarry Finger /* Add 1us delay between BB/RF register
557f1d2b4d3SLarry Finger * setting. */
558f1d2b4d3SLarry Finger udelay(1);
5596bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
5605856cd5bSOleg Drokin "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
561f1d2b4d3SLarry Finger agctab_array_table[i],
562f1d2b4d3SLarry Finger agctab_array_table[i + 1]);
563f1d2b4d3SLarry Finger }
5646bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
565f1d2b4d3SLarry Finger "Normal Chip, MAC0, load Rtl819XAGCTAB_Array\n");
566f1d2b4d3SLarry Finger } else {
567f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
568f1d2b4d3SLarry Finger for (i = 0; i < agctab_arraylen; i = i + 2) {
569f1d2b4d3SLarry Finger rtl_set_bbreg(hw, agctab_array_table[i],
570f1d2b4d3SLarry Finger MASKDWORD,
571f1d2b4d3SLarry Finger agctab_array_table[i + 1]);
572f1d2b4d3SLarry Finger /* Add 1us delay between BB/RF register
573f1d2b4d3SLarry Finger * setting. */
574f1d2b4d3SLarry Finger udelay(1);
5756bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
5765856cd5bSOleg Drokin "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
577f1d2b4d3SLarry Finger agctab_array_table[i],
578f1d2b4d3SLarry Finger agctab_array_table[i + 1]);
579f1d2b4d3SLarry Finger }
5806bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
581f1d2b4d3SLarry Finger "Load Rtl819XAGCTAB_2GArray\n");
582f1d2b4d3SLarry Finger } else {
583f1d2b4d3SLarry Finger for (i = 0; i < agctab_5garraylen; i = i + 2) {
584f1d2b4d3SLarry Finger rtl_set_bbreg(hw,
585f1d2b4d3SLarry Finger agctab_5garray_table[i],
586f1d2b4d3SLarry Finger MASKDWORD,
587f1d2b4d3SLarry Finger agctab_5garray_table[i + 1]);
588f1d2b4d3SLarry Finger /* Add 1us delay between BB/RF registeri
589f1d2b4d3SLarry Finger * setting. */
590f1d2b4d3SLarry Finger udelay(1);
5916bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
5925856cd5bSOleg Drokin "The Rtl819XAGCTAB_5GArray_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
593f1d2b4d3SLarry Finger agctab_5garray_table[i],
594f1d2b4d3SLarry Finger agctab_5garray_table[i + 1]);
595f1d2b4d3SLarry Finger }
5966bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
597f1d2b4d3SLarry Finger "Load Rtl819XAGCTAB_5GArray\n");
598f1d2b4d3SLarry Finger }
599f1d2b4d3SLarry Finger }
600f1d2b4d3SLarry Finger }
601f1d2b4d3SLarry Finger return true;
602f1d2b4d3SLarry Finger }
603f1d2b4d3SLarry Finger
_rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw * hw,u32 regaddr,u32 bitmask,u32 data)604f1d2b4d3SLarry Finger static void _rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
605f1d2b4d3SLarry Finger u32 regaddr, u32 bitmask,
606f1d2b4d3SLarry Finger u32 data)
607f1d2b4d3SLarry Finger {
608f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
609f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
610f1d2b4d3SLarry Finger int index;
611f1d2b4d3SLarry Finger
612f1d2b4d3SLarry Finger if (regaddr == RTXAGC_A_RATE18_06)
613f1d2b4d3SLarry Finger index = 0;
614f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_A_RATE54_24)
615f1d2b4d3SLarry Finger index = 1;
616f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_A_CCK1_MCS32)
617f1d2b4d3SLarry Finger index = 6;
618f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
619f1d2b4d3SLarry Finger index = 7;
620f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_A_MCS03_MCS00)
621f1d2b4d3SLarry Finger index = 2;
622f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_A_MCS07_MCS04)
623f1d2b4d3SLarry Finger index = 3;
624f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_A_MCS11_MCS08)
625f1d2b4d3SLarry Finger index = 4;
626f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_A_MCS15_MCS12)
627f1d2b4d3SLarry Finger index = 5;
628f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_RATE18_06)
629f1d2b4d3SLarry Finger index = 8;
630f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_RATE54_24)
631f1d2b4d3SLarry Finger index = 9;
632f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
633f1d2b4d3SLarry Finger index = 14;
634f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
635f1d2b4d3SLarry Finger index = 15;
636f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_MCS03_MCS00)
637f1d2b4d3SLarry Finger index = 10;
638f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_MCS07_MCS04)
639f1d2b4d3SLarry Finger index = 11;
640f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_MCS11_MCS08)
641f1d2b4d3SLarry Finger index = 12;
642f1d2b4d3SLarry Finger else if (regaddr == RTXAGC_B_MCS15_MCS12)
643f1d2b4d3SLarry Finger index = 13;
644f1d2b4d3SLarry Finger else
645f1d2b4d3SLarry Finger return;
646f1d2b4d3SLarry Finger
647f1d2b4d3SLarry Finger rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index] = data;
6486bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
649f1d2b4d3SLarry Finger "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
650f1d2b4d3SLarry Finger rtlphy->pwrgroup_cnt, index,
651f1d2b4d3SLarry Finger rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index]);
652f1d2b4d3SLarry Finger if (index == 13)
653f1d2b4d3SLarry Finger rtlphy->pwrgroup_cnt++;
654f1d2b4d3SLarry Finger }
655f1d2b4d3SLarry Finger
_rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw * hw,u8 configtype)656f1d2b4d3SLarry Finger static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
657f1d2b4d3SLarry Finger u8 configtype)
658f1d2b4d3SLarry Finger {
659f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
660f1d2b4d3SLarry Finger int i;
661f1d2b4d3SLarry Finger u32 *phy_regarray_table_pg;
662f1d2b4d3SLarry Finger u16 phy_regarray_pg_len;
663f1d2b4d3SLarry Finger
664f1d2b4d3SLarry Finger phy_regarray_pg_len = PHY_REG_ARRAY_PG_LENGTH;
665f1d2b4d3SLarry Finger phy_regarray_table_pg = rtl8192de_phy_reg_array_pg;
666f1d2b4d3SLarry Finger if (configtype == BASEBAND_CONFIG_PHY_REG) {
667f1d2b4d3SLarry Finger for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
668f1d2b4d3SLarry Finger rtl_addr_delay(phy_regarray_table_pg[i]);
669f1d2b4d3SLarry Finger _rtl92d_store_pwrindex_diffrate_offset(hw,
670f1d2b4d3SLarry Finger phy_regarray_table_pg[i],
671f1d2b4d3SLarry Finger phy_regarray_table_pg[i + 1],
672f1d2b4d3SLarry Finger phy_regarray_table_pg[i + 2]);
673f1d2b4d3SLarry Finger }
674f1d2b4d3SLarry Finger } else {
6756bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
676f1d2b4d3SLarry Finger "configtype != BaseBand_Config_PHY_REG\n");
677f1d2b4d3SLarry Finger }
678f1d2b4d3SLarry Finger return true;
679f1d2b4d3SLarry Finger }
680f1d2b4d3SLarry Finger
_rtl92d_phy_bb_config(struct ieee80211_hw * hw)681f1d2b4d3SLarry Finger static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
682f1d2b4d3SLarry Finger {
683f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
684f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
685f1d2b4d3SLarry Finger struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
686369956aeSColin Ian King bool rtstatus;
687f1d2b4d3SLarry Finger
6886bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
689f1d2b4d3SLarry Finger rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
690f1d2b4d3SLarry Finger BASEBAND_CONFIG_PHY_REG);
691f1d2b4d3SLarry Finger if (!rtstatus) {
692b8c79f45SLarry Finger pr_err("Write BB Reg Fail!!\n");
693f1d2b4d3SLarry Finger return false;
694f1d2b4d3SLarry Finger }
695f1d2b4d3SLarry Finger
696f1d2b4d3SLarry Finger /* if (rtlphy->rf_type == RF_1T2R) {
697f1d2b4d3SLarry Finger * _rtl92c_phy_bb_config_1t(hw);
6986bf8bc19SLarry Finger * rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n");
699f1d2b4d3SLarry Finger *} */
700f1d2b4d3SLarry Finger
701f1d2b4d3SLarry Finger if (rtlefuse->autoload_failflag == false) {
702f1d2b4d3SLarry Finger rtlphy->pwrgroup_cnt = 0;
703f1d2b4d3SLarry Finger rtstatus = _rtl92d_phy_config_bb_with_pgheaderfile(hw,
704f1d2b4d3SLarry Finger BASEBAND_CONFIG_PHY_REG);
705f1d2b4d3SLarry Finger }
706f1d2b4d3SLarry Finger if (!rtstatus) {
707b8c79f45SLarry Finger pr_err("BB_PG Reg Fail!!\n");
708f1d2b4d3SLarry Finger return false;
709f1d2b4d3SLarry Finger }
710f1d2b4d3SLarry Finger rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
711f1d2b4d3SLarry Finger BASEBAND_CONFIG_AGC_TAB);
712f1d2b4d3SLarry Finger if (!rtstatus) {
713b8c79f45SLarry Finger pr_err("AGC Table Fail\n");
714f1d2b4d3SLarry Finger return false;
715f1d2b4d3SLarry Finger }
716f1d2b4d3SLarry Finger rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
717f1d2b4d3SLarry Finger RFPGA0_XA_HSSIPARAMETER2, 0x200));
718f1d2b4d3SLarry Finger
719f1d2b4d3SLarry Finger return true;
720f1d2b4d3SLarry Finger }
721f1d2b4d3SLarry Finger
rtl92d_phy_bb_config(struct ieee80211_hw * hw)722f1d2b4d3SLarry Finger bool rtl92d_phy_bb_config(struct ieee80211_hw *hw)
723f1d2b4d3SLarry Finger {
724f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
725f1d2b4d3SLarry Finger u16 regval;
726f1d2b4d3SLarry Finger u32 regvaldw;
727f1d2b4d3SLarry Finger u8 value;
728f1d2b4d3SLarry Finger
729f1d2b4d3SLarry Finger _rtl92d_phy_init_bb_rf_register_definition(hw);
730f1d2b4d3SLarry Finger regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
731f1d2b4d3SLarry Finger rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
732f1d2b4d3SLarry Finger regval | BIT(13) | BIT(0) | BIT(1));
733f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
734f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
735f1d2b4d3SLarry Finger /* 0x1f bit7 bit6 represent for mac0/mac1 driver ready */
736f1d2b4d3SLarry Finger value = rtl_read_byte(rtlpriv, REG_RF_CTRL);
737f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_RF_CTRL, value | RF_EN | RF_RSTB |
738f1d2b4d3SLarry Finger RF_SDMRSTB);
739f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA |
740b83faedaSLarry Finger FEN_DIO_PCIE | FEN_BB_GLB_RSTN | FEN_BBRSTB);
741f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
742f1d2b4d3SLarry Finger if (!(IS_92D_SINGLEPHY(rtlpriv->rtlhal.version))) {
743f1d2b4d3SLarry Finger regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
744f1d2b4d3SLarry Finger rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
745f1d2b4d3SLarry Finger }
746f1d2b4d3SLarry Finger
747f1d2b4d3SLarry Finger return _rtl92d_phy_bb_config(hw);
748f1d2b4d3SLarry Finger }
749f1d2b4d3SLarry Finger
rtl92d_phy_rf_config(struct ieee80211_hw * hw)750f1d2b4d3SLarry Finger bool rtl92d_phy_rf_config(struct ieee80211_hw *hw)
751f1d2b4d3SLarry Finger {
752f1d2b4d3SLarry Finger return rtl92d_phy_rf6052_config(hw);
753f1d2b4d3SLarry Finger }
754f1d2b4d3SLarry Finger
rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw * hw,enum rf_content content,enum radio_path rfpath)755f1d2b4d3SLarry Finger bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
756f1d2b4d3SLarry Finger enum rf_content content,
757f1d2b4d3SLarry Finger enum radio_path rfpath)
758f1d2b4d3SLarry Finger {
759f1d2b4d3SLarry Finger int i;
760f1d2b4d3SLarry Finger u32 *radioa_array_table;
761f1d2b4d3SLarry Finger u32 *radiob_array_table;
762f1d2b4d3SLarry Finger u16 radioa_arraylen, radiob_arraylen;
763f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
764f1d2b4d3SLarry Finger
765f1d2b4d3SLarry Finger radioa_arraylen = RADIOA_2T_ARRAYLENGTH;
766f1d2b4d3SLarry Finger radioa_array_table = rtl8192de_radioa_2tarray;
767f1d2b4d3SLarry Finger radiob_arraylen = RADIOB_2T_ARRAYLENGTH;
768f1d2b4d3SLarry Finger radiob_array_table = rtl8192de_radiob_2tarray;
769f1d2b4d3SLarry Finger if (rtlpriv->efuse.internal_pa_5g[0]) {
770f1d2b4d3SLarry Finger radioa_arraylen = RADIOA_2T_INT_PA_ARRAYLENGTH;
771f1d2b4d3SLarry Finger radioa_array_table = rtl8192de_radioa_2t_int_paarray;
772f1d2b4d3SLarry Finger }
773f1d2b4d3SLarry Finger if (rtlpriv->efuse.internal_pa_5g[1]) {
774f1d2b4d3SLarry Finger radiob_arraylen = RADIOB_2T_INT_PA_ARRAYLENGTH;
775f1d2b4d3SLarry Finger radiob_array_table = rtl8192de_radiob_2t_int_paarray;
776f1d2b4d3SLarry Finger }
7776bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
778f1d2b4d3SLarry Finger "PHY_ConfigRFWithHeaderFile() Radio_A:Rtl819XRadioA_1TArray\n");
7796bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
780f1d2b4d3SLarry Finger "PHY_ConfigRFWithHeaderFile() Radio_B:Rtl819XRadioB_1TArray\n");
7816bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
782f1d2b4d3SLarry Finger
783f1d2b4d3SLarry Finger /* this only happens when DMDP, mac0 start on 2.4G,
784f1d2b4d3SLarry Finger * mac1 start on 5G, mac 0 has to set phy0&phy1
785f1d2b4d3SLarry Finger * pathA or mac1 has to set phy0&phy1 pathA */
786f1d2b4d3SLarry Finger if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
7876bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
788f1d2b4d3SLarry Finger " ===> althougth Path A, we load radiob.txt\n");
789f1d2b4d3SLarry Finger radioa_arraylen = radiob_arraylen;
790f1d2b4d3SLarry Finger radioa_array_table = radiob_array_table;
791f1d2b4d3SLarry Finger }
792f1d2b4d3SLarry Finger switch (rfpath) {
793f1d2b4d3SLarry Finger case RF90_PATH_A:
794f1d2b4d3SLarry Finger for (i = 0; i < radioa_arraylen; i = i + 2) {
795f1d2b4d3SLarry Finger rtl_rfreg_delay(hw, rfpath, radioa_array_table[i],
796f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
797f1d2b4d3SLarry Finger radioa_array_table[i + 1]);
798f1d2b4d3SLarry Finger }
799f1d2b4d3SLarry Finger break;
800f1d2b4d3SLarry Finger case RF90_PATH_B:
801f1d2b4d3SLarry Finger for (i = 0; i < radiob_arraylen; i = i + 2) {
802f1d2b4d3SLarry Finger rtl_rfreg_delay(hw, rfpath, radiob_array_table[i],
803f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
804f1d2b4d3SLarry Finger radiob_array_table[i + 1]);
805f1d2b4d3SLarry Finger }
806f1d2b4d3SLarry Finger break;
807f1d2b4d3SLarry Finger case RF90_PATH_C:
808f1d2b4d3SLarry Finger case RF90_PATH_D:
809b8c79f45SLarry Finger pr_err("switch case %#x not processed\n", rfpath);
810f1d2b4d3SLarry Finger break;
811f1d2b4d3SLarry Finger }
812f1d2b4d3SLarry Finger return true;
813f1d2b4d3SLarry Finger }
814f1d2b4d3SLarry Finger
rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw * hw)815f1d2b4d3SLarry Finger void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
816f1d2b4d3SLarry Finger {
817f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
818f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
819f1d2b4d3SLarry Finger
820f1d2b4d3SLarry Finger rtlphy->default_initialgain[0] =
821f1d2b4d3SLarry Finger (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
822f1d2b4d3SLarry Finger rtlphy->default_initialgain[1] =
823f1d2b4d3SLarry Finger (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
824f1d2b4d3SLarry Finger rtlphy->default_initialgain[2] =
825f1d2b4d3SLarry Finger (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
826f1d2b4d3SLarry Finger rtlphy->default_initialgain[3] =
827f1d2b4d3SLarry Finger (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
8286bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
829f1d2b4d3SLarry Finger "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
830f1d2b4d3SLarry Finger rtlphy->default_initialgain[0],
831f1d2b4d3SLarry Finger rtlphy->default_initialgain[1],
832f1d2b4d3SLarry Finger rtlphy->default_initialgain[2],
833f1d2b4d3SLarry Finger rtlphy->default_initialgain[3]);
834f1d2b4d3SLarry Finger rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
835f1d2b4d3SLarry Finger MASKBYTE0);
836f1d2b4d3SLarry Finger rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
837f1d2b4d3SLarry Finger MASKDWORD);
8386bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
839f1d2b4d3SLarry Finger "Default framesync (0x%x) = 0x%x\n",
840f1d2b4d3SLarry Finger ROFDM0_RXDETECTOR3, rtlphy->framesync);
841f1d2b4d3SLarry Finger }
842f1d2b4d3SLarry Finger
_rtl92d_get_txpower_index(struct ieee80211_hw * hw,u8 channel,u8 * cckpowerlevel,u8 * ofdmpowerlevel)843f1d2b4d3SLarry Finger static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
844f1d2b4d3SLarry Finger u8 *cckpowerlevel, u8 *ofdmpowerlevel)
845f1d2b4d3SLarry Finger {
846f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
847f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
848f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
849f1d2b4d3SLarry Finger struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
850f1d2b4d3SLarry Finger u8 index = (channel - 1);
851f1d2b4d3SLarry Finger
852f1d2b4d3SLarry Finger /* 1. CCK */
853f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
854f1d2b4d3SLarry Finger /* RF-A */
855f1d2b4d3SLarry Finger cckpowerlevel[RF90_PATH_A] =
856f1d2b4d3SLarry Finger rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
857f1d2b4d3SLarry Finger /* RF-B */
858f1d2b4d3SLarry Finger cckpowerlevel[RF90_PATH_B] =
859f1d2b4d3SLarry Finger rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
860f1d2b4d3SLarry Finger } else {
861f1d2b4d3SLarry Finger cckpowerlevel[RF90_PATH_A] = 0;
862f1d2b4d3SLarry Finger cckpowerlevel[RF90_PATH_B] = 0;
863f1d2b4d3SLarry Finger }
864f1d2b4d3SLarry Finger /* 2. OFDM for 1S or 2S */
865f1d2b4d3SLarry Finger if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
866f1d2b4d3SLarry Finger /* Read HT 40 OFDM TX power */
867f1d2b4d3SLarry Finger ofdmpowerlevel[RF90_PATH_A] =
868f1d2b4d3SLarry Finger rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
869f1d2b4d3SLarry Finger ofdmpowerlevel[RF90_PATH_B] =
870f1d2b4d3SLarry Finger rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
871f1d2b4d3SLarry Finger } else if (rtlphy->rf_type == RF_2T2R) {
872f1d2b4d3SLarry Finger /* Read HT 40 OFDM TX power */
873f1d2b4d3SLarry Finger ofdmpowerlevel[RF90_PATH_A] =
874f1d2b4d3SLarry Finger rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
875f1d2b4d3SLarry Finger ofdmpowerlevel[RF90_PATH_B] =
876f1d2b4d3SLarry Finger rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
877f1d2b4d3SLarry Finger }
878f1d2b4d3SLarry Finger }
879f1d2b4d3SLarry Finger
_rtl92d_ccxpower_index_check(struct ieee80211_hw * hw,u8 channel,u8 * cckpowerlevel,u8 * ofdmpowerlevel)880f1d2b4d3SLarry Finger static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
881f1d2b4d3SLarry Finger u8 channel, u8 *cckpowerlevel, u8 *ofdmpowerlevel)
882f1d2b4d3SLarry Finger {
883f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
884f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
885f1d2b4d3SLarry Finger
886f1d2b4d3SLarry Finger rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
887f1d2b4d3SLarry Finger rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
888f1d2b4d3SLarry Finger }
889f1d2b4d3SLarry Finger
_rtl92c_phy_get_rightchnlplace(u8 chnl)890f1d2b4d3SLarry Finger static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
891f1d2b4d3SLarry Finger {
892533ccdaeSNathan Chancellor u8 place = chnl;
893f1d2b4d3SLarry Finger
894f1d2b4d3SLarry Finger if (chnl > 14) {
895*96e54437SBitterblue Smith for (place = 14; place < ARRAY_SIZE(channel_all); place++) {
896*96e54437SBitterblue Smith if (channel_all[place] == chnl) {
897f1d2b4d3SLarry Finger place++;
898f1d2b4d3SLarry Finger break;
899f1d2b4d3SLarry Finger }
900f1d2b4d3SLarry Finger }
901f1d2b4d3SLarry Finger }
902f1d2b4d3SLarry Finger return place;
903f1d2b4d3SLarry Finger }
904f1d2b4d3SLarry Finger
rtl92d_phy_set_txpower_level(struct ieee80211_hw * hw,u8 channel)905f1d2b4d3SLarry Finger void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
906f1d2b4d3SLarry Finger {
907f1d2b4d3SLarry Finger struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
908f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
909f1d2b4d3SLarry Finger u8 cckpowerlevel[2], ofdmpowerlevel[2];
910f1d2b4d3SLarry Finger
911f1d2b4d3SLarry Finger if (!rtlefuse->txpwr_fromeprom)
912f1d2b4d3SLarry Finger return;
913f1d2b4d3SLarry Finger channel = _rtl92c_phy_get_rightchnlplace(channel);
914f1d2b4d3SLarry Finger _rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
915f1d2b4d3SLarry Finger &ofdmpowerlevel[0]);
916f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
917f1d2b4d3SLarry Finger _rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
918f1d2b4d3SLarry Finger &ofdmpowerlevel[0]);
919f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
920f1d2b4d3SLarry Finger rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
921f1d2b4d3SLarry Finger rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
922f1d2b4d3SLarry Finger }
923f1d2b4d3SLarry Finger
rtl92d_phy_set_bw_mode(struct ieee80211_hw * hw,enum nl80211_channel_type ch_type)924f1d2b4d3SLarry Finger void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
925f1d2b4d3SLarry Finger enum nl80211_channel_type ch_type)
926f1d2b4d3SLarry Finger {
927f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
928f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
929f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
930f1d2b4d3SLarry Finger struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
931f1d2b4d3SLarry Finger unsigned long flag = 0;
932f1d2b4d3SLarry Finger u8 reg_prsr_rsc;
933f1d2b4d3SLarry Finger u8 reg_bw_opmode;
934f1d2b4d3SLarry Finger
935f1d2b4d3SLarry Finger if (rtlphy->set_bwmode_inprogress)
936f1d2b4d3SLarry Finger return;
937f1d2b4d3SLarry Finger if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
9386bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
939f1d2b4d3SLarry Finger "FALSE driver sleep or unload\n");
940f1d2b4d3SLarry Finger return;
941f1d2b4d3SLarry Finger }
942f1d2b4d3SLarry Finger rtlphy->set_bwmode_inprogress = true;
9436bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
944f1d2b4d3SLarry Finger rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
945f1d2b4d3SLarry Finger "20MHz" : "40MHz");
946f1d2b4d3SLarry Finger reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
947f1d2b4d3SLarry Finger reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
948f1d2b4d3SLarry Finger switch (rtlphy->current_chan_bw) {
949f1d2b4d3SLarry Finger case HT_CHANNEL_WIDTH_20:
950f1d2b4d3SLarry Finger reg_bw_opmode |= BW_OPMODE_20MHZ;
951f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
952f1d2b4d3SLarry Finger break;
953f1d2b4d3SLarry Finger case HT_CHANNEL_WIDTH_20_40:
954f1d2b4d3SLarry Finger reg_bw_opmode &= ~BW_OPMODE_20MHZ;
955f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
956f1d2b4d3SLarry Finger
957f1d2b4d3SLarry Finger reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
958f1d2b4d3SLarry Finger (mac->cur_40_prime_sc << 5);
959f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
960f1d2b4d3SLarry Finger break;
961f1d2b4d3SLarry Finger default:
962b8c79f45SLarry Finger pr_err("unknown bandwidth: %#X\n",
963b8c79f45SLarry Finger rtlphy->current_chan_bw);
964f1d2b4d3SLarry Finger break;
965f1d2b4d3SLarry Finger }
966f1d2b4d3SLarry Finger switch (rtlphy->current_chan_bw) {
967f1d2b4d3SLarry Finger case HT_CHANNEL_WIDTH_20:
968f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
969f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
970f1d2b4d3SLarry Finger /* SET BIT10 BIT11 for receive cck */
971f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
972f1d2b4d3SLarry Finger BIT(11), 3);
973f1d2b4d3SLarry Finger break;
974f1d2b4d3SLarry Finger case HT_CHANNEL_WIDTH_20_40:
975f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
976f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
977f1d2b4d3SLarry Finger /* Set Control channel to upper or lower.
978f1d2b4d3SLarry Finger * These settings are required only for 40MHz */
979f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
980f1d2b4d3SLarry Finger rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
981f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND,
982f1d2b4d3SLarry Finger (mac->cur_40_prime_sc >> 1));
983f1d2b4d3SLarry Finger rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
984f1d2b4d3SLarry Finger }
985f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
986f1d2b4d3SLarry Finger /* SET BIT10 BIT11 for receive cck */
987f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
988f1d2b4d3SLarry Finger BIT(11), 0);
989f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
990f1d2b4d3SLarry Finger (mac->cur_40_prime_sc ==
991f1d2b4d3SLarry Finger HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
992f1d2b4d3SLarry Finger break;
993f1d2b4d3SLarry Finger default:
994b8c79f45SLarry Finger pr_err("unknown bandwidth: %#X\n",
995b8c79f45SLarry Finger rtlphy->current_chan_bw);
996f1d2b4d3SLarry Finger break;
997f1d2b4d3SLarry Finger
998f1d2b4d3SLarry Finger }
999f1d2b4d3SLarry Finger rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1000f1d2b4d3SLarry Finger rtlphy->set_bwmode_inprogress = false;
10016bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
1002f1d2b4d3SLarry Finger }
1003f1d2b4d3SLarry Finger
_rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw * hw)1004f1d2b4d3SLarry Finger static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
1005f1d2b4d3SLarry Finger {
1006f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0);
1007f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0);
1008f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x00);
1009f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0);
1010f1d2b4d3SLarry Finger }
1011f1d2b4d3SLarry Finger
rtl92d_phy_switch_wirelessband(struct ieee80211_hw * hw,u8 band)1012f1d2b4d3SLarry Finger static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
1013f1d2b4d3SLarry Finger {
1014f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1015f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1016f1d2b4d3SLarry Finger u8 value8;
1017f1d2b4d3SLarry Finger
10186bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
1019f1d2b4d3SLarry Finger rtlhal->bandset = band;
1020f1d2b4d3SLarry Finger rtlhal->current_bandtype = band;
1021f1d2b4d3SLarry Finger if (IS_92D_SINGLEPHY(rtlhal->version))
1022f1d2b4d3SLarry Finger rtlhal->bandset = BAND_ON_BOTH;
1023f1d2b4d3SLarry Finger /* stop RX/Tx */
1024f1d2b4d3SLarry Finger _rtl92d_phy_stop_trx_before_changeband(hw);
1025f1d2b4d3SLarry Finger /* reconfig BB/RF according to wireless mode */
1026f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1027f1d2b4d3SLarry Finger /* BB & RF Config */
10286bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n");
1029f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 1)
1030f1d2b4d3SLarry Finger _rtl92d_phy_config_bb_with_headerfile(hw,
1031f1d2b4d3SLarry Finger BASEBAND_CONFIG_AGC_TAB);
1032f1d2b4d3SLarry Finger } else {
1033f1d2b4d3SLarry Finger /* 5G band */
10346bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n");
1035f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 1)
1036f1d2b4d3SLarry Finger _rtl92d_phy_config_bb_with_headerfile(hw,
1037f1d2b4d3SLarry Finger BASEBAND_CONFIG_AGC_TAB);
1038f1d2b4d3SLarry Finger }
1039f1d2b4d3SLarry Finger rtl92d_update_bbrf_configuration(hw);
1040f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G)
1041f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1042f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1043f1d2b4d3SLarry Finger
1044f1d2b4d3SLarry Finger /* 20M BW. */
1045f1d2b4d3SLarry Finger /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); */
1046f1d2b4d3SLarry Finger rtlhal->reloadtxpowerindex = true;
1047f1d2b4d3SLarry Finger /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */
1048f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1049f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1050f1d2b4d3SLarry Finger 0 ? REG_MAC0 : REG_MAC1));
1051f1d2b4d3SLarry Finger value8 |= BIT(1);
1052f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1053f1d2b4d3SLarry Finger 0 ? REG_MAC0 : REG_MAC1), value8);
1054f1d2b4d3SLarry Finger } else {
1055f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1056f1d2b4d3SLarry Finger 0 ? REG_MAC0 : REG_MAC1));
1057f1d2b4d3SLarry Finger value8 &= (~BIT(1));
1058f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1059f1d2b4d3SLarry Finger 0 ? REG_MAC0 : REG_MAC1), value8);
1060f1d2b4d3SLarry Finger }
1061f1d2b4d3SLarry Finger mdelay(1);
10626bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n");
1063f1d2b4d3SLarry Finger }
1064f1d2b4d3SLarry Finger
_rtl92d_phy_reload_imr_setting(struct ieee80211_hw * hw,u8 channel,u8 rfpath)1065f1d2b4d3SLarry Finger static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
1066f1d2b4d3SLarry Finger u8 channel, u8 rfpath)
1067f1d2b4d3SLarry Finger {
1068f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1069f1d2b4d3SLarry Finger u32 imr_num = MAX_RF_IMR_INDEX;
1070f1d2b4d3SLarry Finger u32 rfmask = RFREG_OFFSET_MASK;
1071f1d2b4d3SLarry Finger u8 group, i;
1072f1d2b4d3SLarry Finger unsigned long flag = 0;
1073f1d2b4d3SLarry Finger
10746bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath);
1075f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
10766bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1077f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1078f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
1079f1d2b4d3SLarry Finger /* fc area 0xd2c */
1080f1d2b4d3SLarry Finger if (channel > 99)
1081f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1082f1d2b4d3SLarry Finger BIT(14), 2);
1083f1d2b4d3SLarry Finger else
1084f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1085f1d2b4d3SLarry Finger BIT(14), 1);
1086f1d2b4d3SLarry Finger /* leave 0 for channel1-14. */
1087f1d2b4d3SLarry Finger group = channel <= 64 ? 1 : 2;
1088f1d2b4d3SLarry Finger imr_num = MAX_RF_IMR_INDEX_NORMAL;
1089f1d2b4d3SLarry Finger for (i = 0; i < imr_num; i++)
1090f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)rfpath,
1091f1d2b4d3SLarry Finger rf_reg_for_5g_swchnl_normal[i], rfmask,
1092f1d2b4d3SLarry Finger rf_imr_param_normal[0][group][i]);
1093f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0);
1094f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 1);
1095f1d2b4d3SLarry Finger } else {
1096f1d2b4d3SLarry Finger /* G band. */
10976bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
1098f1d2b4d3SLarry Finger "Load RF IMR parameters for G band. IMR already setting %d\n",
1099f1d2b4d3SLarry Finger rtlpriv->rtlhal.load_imrandiqk_setting_for2g);
11006bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1101f1d2b4d3SLarry Finger if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
11026bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
1103f1d2b4d3SLarry Finger "Load RF IMR parameters for G band. %d\n",
1104f1d2b4d3SLarry Finger rfpath);
1105f1d2b4d3SLarry Finger rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1106f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1107f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1108f1d2b4d3SLarry Finger 0x00f00000, 0xf);
1109f1d2b4d3SLarry Finger imr_num = MAX_RF_IMR_INDEX_NORMAL;
1110f1d2b4d3SLarry Finger for (i = 0; i < imr_num; i++) {
1111f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)rfpath,
1112f1d2b4d3SLarry Finger rf_reg_for_5g_swchnl_normal[i],
1113f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
1114f1d2b4d3SLarry Finger rf_imr_param_normal[0][0][i]);
1115f1d2b4d3SLarry Finger }
1116f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1117f1d2b4d3SLarry Finger 0x00f00000, 0);
1118f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN | BCCKEN, 3);
1119f1d2b4d3SLarry Finger rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1120f1d2b4d3SLarry Finger }
1121f1d2b4d3SLarry Finger }
11226bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1123f1d2b4d3SLarry Finger }
1124f1d2b4d3SLarry Finger
_rtl92d_phy_enable_rf_env(struct ieee80211_hw * hw,u8 rfpath,u32 * pu4_regval)1125f1d2b4d3SLarry Finger static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
1126f1d2b4d3SLarry Finger u8 rfpath, u32 *pu4_regval)
1127f1d2b4d3SLarry Finger {
1128f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1129f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
1130f1d2b4d3SLarry Finger struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1131f1d2b4d3SLarry Finger
11326bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
1133f1d2b4d3SLarry Finger /*----Store original RFENV control type----*/
1134f1d2b4d3SLarry Finger switch (rfpath) {
1135f1d2b4d3SLarry Finger case RF90_PATH_A:
1136f1d2b4d3SLarry Finger case RF90_PATH_C:
1137f1d2b4d3SLarry Finger *pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
1138f1d2b4d3SLarry Finger break;
1139f1d2b4d3SLarry Finger case RF90_PATH_B:
1140f1d2b4d3SLarry Finger case RF90_PATH_D:
1141f1d2b4d3SLarry Finger *pu4_regval =
1142f1d2b4d3SLarry Finger rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
1143f1d2b4d3SLarry Finger break;
1144f1d2b4d3SLarry Finger }
1145f1d2b4d3SLarry Finger /*----Set RF_ENV enable----*/
1146f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
1147f1d2b4d3SLarry Finger udelay(1);
1148f1d2b4d3SLarry Finger /*----Set RF_ENV output high----*/
1149f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
1150f1d2b4d3SLarry Finger udelay(1);
1151f1d2b4d3SLarry Finger /* Set bit number of Address and Data for RF register */
1152f1d2b4d3SLarry Finger /* Set 1 to 4 bits for 8255 */
1153f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
1154f1d2b4d3SLarry Finger udelay(1);
1155f1d2b4d3SLarry Finger /*Set 0 to 12 bits for 8255 */
1156f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
1157f1d2b4d3SLarry Finger udelay(1);
11586bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
1159f1d2b4d3SLarry Finger }
1160f1d2b4d3SLarry Finger
_rtl92d_phy_restore_rf_env(struct ieee80211_hw * hw,u8 rfpath,u32 * pu4_regval)1161f1d2b4d3SLarry Finger static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
1162f1d2b4d3SLarry Finger u32 *pu4_regval)
1163f1d2b4d3SLarry Finger {
1164f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1165f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
1166f1d2b4d3SLarry Finger struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1167f1d2b4d3SLarry Finger
11686bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
1169f1d2b4d3SLarry Finger /*----Restore RFENV control type----*/
1170f1d2b4d3SLarry Finger switch (rfpath) {
1171f1d2b4d3SLarry Finger case RF90_PATH_A:
1172f1d2b4d3SLarry Finger case RF90_PATH_C:
1173f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
1174f1d2b4d3SLarry Finger break;
1175f1d2b4d3SLarry Finger case RF90_PATH_B:
1176f1d2b4d3SLarry Finger case RF90_PATH_D:
1177f1d2b4d3SLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
1178f1d2b4d3SLarry Finger *pu4_regval);
1179f1d2b4d3SLarry Finger break;
1180f1d2b4d3SLarry Finger }
11816bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
1182f1d2b4d3SLarry Finger }
1183f1d2b4d3SLarry Finger
_rtl92d_phy_switch_rf_setting(struct ieee80211_hw * hw,u8 channel)1184f1d2b4d3SLarry Finger static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
1185f1d2b4d3SLarry Finger {
1186f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1187f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
1188f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1189f1d2b4d3SLarry Finger u8 path = rtlhal->current_bandtype ==
1190f1d2b4d3SLarry Finger BAND_ON_5G ? RF90_PATH_A : RF90_PATH_B;
1191f1d2b4d3SLarry Finger u8 index = 0, i = 0, rfpath = RF90_PATH_A;
1192f1d2b4d3SLarry Finger bool need_pwr_down = false, internal_pa = false;
1193f1d2b4d3SLarry Finger u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
1194f1d2b4d3SLarry Finger
11956bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n");
1196f1d2b4d3SLarry Finger /* config path A for 5G */
1197f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_5G) {
11986bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1199f1d2b4d3SLarry Finger u4tmp = curveindex_5g[channel - 1];
1200f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1201f1d2b4d3SLarry Finger "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
1202f1d2b4d3SLarry Finger for (i = 0; i < RF_CHNL_NUM_5G; i++) {
1203f1d2b4d3SLarry Finger if (channel == rf_chnl_5g[i] && channel <= 140)
1204f1d2b4d3SLarry Finger index = 0;
1205f1d2b4d3SLarry Finger }
1206f1d2b4d3SLarry Finger for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) {
1207f1d2b4d3SLarry Finger if (channel == rf_chnl_5g_40m[i] && channel <= 140)
1208f1d2b4d3SLarry Finger index = 1;
1209f1d2b4d3SLarry Finger }
1210f1d2b4d3SLarry Finger if (channel == 149 || channel == 155 || channel == 161)
1211f1d2b4d3SLarry Finger index = 2;
1212f1d2b4d3SLarry Finger else if (channel == 151 || channel == 153 || channel == 163
1213f1d2b4d3SLarry Finger || channel == 165)
1214f1d2b4d3SLarry Finger index = 3;
1215f1d2b4d3SLarry Finger else if (channel == 157 || channel == 159)
1216f1d2b4d3SLarry Finger index = 4;
1217f1d2b4d3SLarry Finger
1218f1d2b4d3SLarry Finger if (rtlhal->macphymode == DUALMAC_DUALPHY
1219f1d2b4d3SLarry Finger && rtlhal->interfaceindex == 1) {
1220f1d2b4d3SLarry Finger need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
1221f1d2b4d3SLarry Finger rtlhal->during_mac1init_radioa = true;
1222f1d2b4d3SLarry Finger /* asume no this case */
1223f1d2b4d3SLarry Finger if (need_pwr_down)
1224f1d2b4d3SLarry Finger _rtl92d_phy_enable_rf_env(hw, path,
1225f1d2b4d3SLarry Finger &u4regvalue);
1226f1d2b4d3SLarry Finger }
1227f1d2b4d3SLarry Finger for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) {
1228f1d2b4d3SLarry Finger if (i == 0 && (rtlhal->macphymode == DUALMAC_DUALPHY)) {
1229f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)path,
1230f1d2b4d3SLarry Finger rf_reg_for_c_cut_5g[i],
1231f1d2b4d3SLarry Finger RFREG_OFFSET_MASK, 0xE439D);
1232f1d2b4d3SLarry Finger } else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) {
1233f1d2b4d3SLarry Finger u4tmp2 = (rf_reg_pram_c_5g[index][i] &
1234f1d2b4d3SLarry Finger 0x7FF) | (u4tmp << 11);
1235f1d2b4d3SLarry Finger if (channel == 36)
1236f1d2b4d3SLarry Finger u4tmp2 &= ~(BIT(7) | BIT(6));
1237f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)path,
1238f1d2b4d3SLarry Finger rf_reg_for_c_cut_5g[i],
1239f1d2b4d3SLarry Finger RFREG_OFFSET_MASK, u4tmp2);
1240f1d2b4d3SLarry Finger } else {
1241f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)path,
1242f1d2b4d3SLarry Finger rf_reg_for_c_cut_5g[i],
1243f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
1244f1d2b4d3SLarry Finger rf_reg_pram_c_5g[index][i]);
1245f1d2b4d3SLarry Finger }
12466bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1247f1d2b4d3SLarry Finger "offset 0x%x value 0x%x path %d index %d readback 0x%x\n",
1248f1d2b4d3SLarry Finger rf_reg_for_c_cut_5g[i],
1249f1d2b4d3SLarry Finger rf_reg_pram_c_5g[index][i],
1250f1d2b4d3SLarry Finger path, index,
1251f1d2b4d3SLarry Finger rtl_get_rfreg(hw, (enum radio_path)path,
1252f1d2b4d3SLarry Finger rf_reg_for_c_cut_5g[i],
1253f1d2b4d3SLarry Finger RFREG_OFFSET_MASK));
1254f1d2b4d3SLarry Finger }
1255f1d2b4d3SLarry Finger if (need_pwr_down)
1256f1d2b4d3SLarry Finger _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1257f1d2b4d3SLarry Finger if (rtlhal->during_mac1init_radioa)
1258f1d2b4d3SLarry Finger rtl92d_phy_powerdown_anotherphy(hw, false);
1259f1d2b4d3SLarry Finger if (channel < 149)
1260f1d2b4d3SLarry Finger value = 0x07;
1261f1d2b4d3SLarry Finger else if (channel >= 149)
1262f1d2b4d3SLarry Finger value = 0x02;
1263f1d2b4d3SLarry Finger if (channel >= 36 && channel <= 64)
1264f1d2b4d3SLarry Finger index = 0;
1265f1d2b4d3SLarry Finger else if (channel >= 100 && channel <= 140)
1266f1d2b4d3SLarry Finger index = 1;
1267f1d2b4d3SLarry Finger else
1268f1d2b4d3SLarry Finger index = 2;
1269f1d2b4d3SLarry Finger for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1270f1d2b4d3SLarry Finger rfpath++) {
1271f1d2b4d3SLarry Finger if (rtlhal->macphymode == DUALMAC_DUALPHY &&
1272f1d2b4d3SLarry Finger rtlhal->interfaceindex == 1) /* MAC 1 5G */
1273f1d2b4d3SLarry Finger internal_pa = rtlpriv->efuse.internal_pa_5g[1];
1274f1d2b4d3SLarry Finger else
1275f1d2b4d3SLarry Finger internal_pa =
1276f1d2b4d3SLarry Finger rtlpriv->efuse.internal_pa_5g[rfpath];
1277f1d2b4d3SLarry Finger if (internal_pa) {
1278f1d2b4d3SLarry Finger for (i = 0;
1279f1d2b4d3SLarry Finger i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA;
1280f1d2b4d3SLarry Finger i++) {
1281f1d2b4d3SLarry Finger rtl_set_rfreg(hw, rfpath,
1282f1d2b4d3SLarry Finger rf_for_c_cut_5g_internal_pa[i],
1283f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
1284f1d2b4d3SLarry Finger rf_pram_c_5g_int_pa[index][i]);
12856bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
1286f1d2b4d3SLarry Finger "offset 0x%x value 0x%x path %d index %d\n",
1287f1d2b4d3SLarry Finger rf_for_c_cut_5g_internal_pa[i],
1288f1d2b4d3SLarry Finger rf_pram_c_5g_int_pa[index][i],
1289f1d2b4d3SLarry Finger rfpath, index);
1290f1d2b4d3SLarry Finger }
1291f1d2b4d3SLarry Finger } else {
1292f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
1293f1d2b4d3SLarry Finger mask, value);
1294f1d2b4d3SLarry Finger }
1295f1d2b4d3SLarry Finger }
1296f1d2b4d3SLarry Finger } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
12976bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1298f1d2b4d3SLarry Finger u4tmp = curveindex_2g[channel - 1];
1299f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1300f1d2b4d3SLarry Finger "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
1301f1d2b4d3SLarry Finger if (channel == 1 || channel == 2 || channel == 4 || channel == 9
1302f1d2b4d3SLarry Finger || channel == 10 || channel == 11 || channel == 12)
1303f1d2b4d3SLarry Finger index = 0;
1304f1d2b4d3SLarry Finger else if (channel == 3 || channel == 13 || channel == 14)
1305f1d2b4d3SLarry Finger index = 1;
1306f1d2b4d3SLarry Finger else if (channel >= 5 && channel <= 8)
1307f1d2b4d3SLarry Finger index = 2;
1308f1d2b4d3SLarry Finger if (rtlhal->macphymode == DUALMAC_DUALPHY) {
1309f1d2b4d3SLarry Finger path = RF90_PATH_A;
1310f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
1311f1d2b4d3SLarry Finger need_pwr_down =
1312f1d2b4d3SLarry Finger rtl92d_phy_enable_anotherphy(hw, true);
1313f1d2b4d3SLarry Finger rtlhal->during_mac0init_radiob = true;
1314f1d2b4d3SLarry Finger
1315f1d2b4d3SLarry Finger if (need_pwr_down)
1316f1d2b4d3SLarry Finger _rtl92d_phy_enable_rf_env(hw, path,
1317f1d2b4d3SLarry Finger &u4regvalue);
1318f1d2b4d3SLarry Finger }
1319f1d2b4d3SLarry Finger }
1320f1d2b4d3SLarry Finger for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) {
1321f1d2b4d3SLarry Finger if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7)
1322f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)path,
1323f1d2b4d3SLarry Finger rf_reg_for_c_cut_2g[i],
1324f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
1325f1d2b4d3SLarry Finger (rf_reg_param_for_c_cut_2g[index][i] |
1326f1d2b4d3SLarry Finger BIT(17)));
1327f1d2b4d3SLarry Finger else
1328f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)path,
1329f1d2b4d3SLarry Finger rf_reg_for_c_cut_2g[i],
1330f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
1331f1d2b4d3SLarry Finger rf_reg_param_for_c_cut_2g
1332f1d2b4d3SLarry Finger [index][i]);
13336bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1334f1d2b4d3SLarry Finger "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n",
1335f1d2b4d3SLarry Finger rf_reg_for_c_cut_2g[i],
1336f1d2b4d3SLarry Finger rf_reg_param_for_c_cut_2g[index][i],
1337f1d2b4d3SLarry Finger rf_reg_mask_for_c_cut_2g[i], path, index,
1338f1d2b4d3SLarry Finger rtl_get_rfreg(hw, (enum radio_path)path,
1339f1d2b4d3SLarry Finger rf_reg_for_c_cut_2g[i],
1340f1d2b4d3SLarry Finger RFREG_OFFSET_MASK));
1341f1d2b4d3SLarry Finger }
1342f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1343f1d2b4d3SLarry Finger "cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
1344f1d2b4d3SLarry Finger rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1345f1d2b4d3SLarry Finger
1346f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
1347f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
1348f1d2b4d3SLarry Finger rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1349f1d2b4d3SLarry Finger if (need_pwr_down)
1350f1d2b4d3SLarry Finger _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1351f1d2b4d3SLarry Finger if (rtlhal->during_mac0init_radiob)
1352f1d2b4d3SLarry Finger rtl92d_phy_powerdown_anotherphy(hw, true);
1353f1d2b4d3SLarry Finger }
13546bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1355f1d2b4d3SLarry Finger }
1356f1d2b4d3SLarry Finger
rtl92d_get_rightchnlplace_for_iqk(u8 chnl)1357f1d2b4d3SLarry Finger u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
1358f1d2b4d3SLarry Finger {
1359533ccdaeSNathan Chancellor u8 place;
1360f1d2b4d3SLarry Finger
1361f1d2b4d3SLarry Finger if (chnl > 14) {
136269831173SKees Cook for (place = 14; place < ARRAY_SIZE(channel_all); place++) {
1363f1d2b4d3SLarry Finger if (channel_all[place] == chnl)
1364f1d2b4d3SLarry Finger return place - 13;
1365f1d2b4d3SLarry Finger }
1366f1d2b4d3SLarry Finger }
1367f1d2b4d3SLarry Finger
1368f1d2b4d3SLarry Finger return 0;
1369f1d2b4d3SLarry Finger }
1370f1d2b4d3SLarry Finger
1371f1d2b4d3SLarry Finger #define MAX_TOLERANCE 5
1372f1d2b4d3SLarry Finger #define IQK_DELAY_TIME 1 /* ms */
1373f1d2b4d3SLarry Finger #define MAX_TOLERANCE_92D 3
1374f1d2b4d3SLarry Finger
1375f1d2b4d3SLarry Finger /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
_rtl92d_phy_patha_iqk(struct ieee80211_hw * hw,bool configpathb)1376f1d2b4d3SLarry Finger static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
1377f1d2b4d3SLarry Finger {
1378f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1379f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1380f1d2b4d3SLarry Finger u32 regeac, rege94, rege9c, regea4;
1381f1d2b4d3SLarry Finger u8 result = 0;
1382f1d2b4d3SLarry Finger
1383f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK!\n");
1384f1d2b4d3SLarry Finger /* path-A IQK setting */
1385f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1386f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
1387f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
1388f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
1389f1d2b4d3SLarry Finger } else {
1390f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c22);
1391f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c22);
1392f1d2b4d3SLarry Finger }
1393f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
1394f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160206);
1395f1d2b4d3SLarry Finger /* path-B IQK setting */
1396f1d2b4d3SLarry Finger if (configpathb) {
1397f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
1398f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
1399f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
1400f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160206);
1401f1d2b4d3SLarry Finger }
1402f1d2b4d3SLarry Finger /* LO calibration setting */
1403f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1404f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1405f1d2b4d3SLarry Finger /* One shot, path A LOK & IQK */
1406f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path A LOK & IQK!\n");
1407f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1408f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1409f1d2b4d3SLarry Finger /* delay x ms */
1410f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1411f1d2b4d3SLarry Finger "Delay %d ms for One shot, path A LOK & IQK\n",
1412f1d2b4d3SLarry Finger IQK_DELAY_TIME);
1413f1d2b4d3SLarry Finger mdelay(IQK_DELAY_TIME);
1414f1d2b4d3SLarry Finger /* Check failed */
1415f1d2b4d3SLarry Finger regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1416f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1417f1d2b4d3SLarry Finger rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1418f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94);
1419f1d2b4d3SLarry Finger rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1420f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c);
1421f1d2b4d3SLarry Finger regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1422f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4);
1423f1d2b4d3SLarry Finger if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
1424f1d2b4d3SLarry Finger (((rege9c & 0x03FF0000) >> 16) != 0x42))
1425f1d2b4d3SLarry Finger result |= 0x01;
1426f1d2b4d3SLarry Finger else /* if Tx not OK, ignore Rx */
1427f1d2b4d3SLarry Finger return result;
1428f1d2b4d3SLarry Finger /* if Tx is OK, check whether Rx is OK */
1429f1d2b4d3SLarry Finger if (!(regeac & BIT(27)) && (((regea4 & 0x03FF0000) >> 16) != 0x132) &&
1430f1d2b4d3SLarry Finger (((regeac & 0x03FF0000) >> 16) != 0x36))
1431f1d2b4d3SLarry Finger result |= 0x02;
1432f1d2b4d3SLarry Finger else
1433f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A Rx IQK fail!!\n");
1434f1d2b4d3SLarry Finger return result;
1435f1d2b4d3SLarry Finger }
1436f1d2b4d3SLarry Finger
1437f1d2b4d3SLarry Finger /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
_rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw * hw,bool configpathb)1438f1d2b4d3SLarry Finger static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
1439f1d2b4d3SLarry Finger bool configpathb)
1440f1d2b4d3SLarry Finger {
1441f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1442f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1443f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
1444f1d2b4d3SLarry Finger u32 regeac, rege94, rege9c, regea4;
1445f1d2b4d3SLarry Finger u8 result = 0;
1446f1d2b4d3SLarry Finger u8 i;
1447f1d2b4d3SLarry Finger u8 retrycount = 2;
1448b83faedaSLarry Finger u32 TXOKBIT = BIT(28), RXOKBIT = BIT(27);
1449f1d2b4d3SLarry Finger
1450f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 1) { /* PHY1 */
1451b83faedaSLarry Finger TXOKBIT = BIT(31);
1452b83faedaSLarry Finger RXOKBIT = BIT(30);
1453f1d2b4d3SLarry Finger }
1454f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK!\n");
1455f1d2b4d3SLarry Finger /* path-A IQK setting */
1456f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1457f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1458f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1459f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140307);
1460f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68160960);
1461f1d2b4d3SLarry Finger /* path-B IQK setting */
1462f1d2b4d3SLarry Finger if (configpathb) {
1463f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1464f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1465f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82110000);
1466f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68110000);
1467f1d2b4d3SLarry Finger }
1468f1d2b4d3SLarry Finger /* LO calibration setting */
1469f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1470f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1471f1d2b4d3SLarry Finger /* path-A PA on */
1472f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x07000f60);
1473f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD, 0x66e60e30);
1474f1d2b4d3SLarry Finger for (i = 0; i < retrycount; i++) {
1475f1d2b4d3SLarry Finger /* One shot, path A LOK & IQK */
1476f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1477f1d2b4d3SLarry Finger "One shot, path A LOK & IQK!\n");
1478f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1479f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1480f1d2b4d3SLarry Finger /* delay x ms */
1481f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1482f1d2b4d3SLarry Finger "Delay %d ms for One shot, path A LOK & IQK.\n",
1483f1d2b4d3SLarry Finger IQK_DELAY_TIME);
1484f1d2b4d3SLarry Finger mdelay(IQK_DELAY_TIME * 10);
1485f1d2b4d3SLarry Finger /* Check failed */
1486f1d2b4d3SLarry Finger regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1487f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1488f1d2b4d3SLarry Finger rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1489f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94);
1490f1d2b4d3SLarry Finger rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1491f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c);
1492f1d2b4d3SLarry Finger regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1493f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4);
1494b83faedaSLarry Finger if (!(regeac & TXOKBIT) &&
1495f1d2b4d3SLarry Finger (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
1496f1d2b4d3SLarry Finger result |= 0x01;
1497f1d2b4d3SLarry Finger } else { /* if Tx not OK, ignore Rx */
1498f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1499f1d2b4d3SLarry Finger "Path A Tx IQK fail!!\n");
1500f1d2b4d3SLarry Finger continue;
1501f1d2b4d3SLarry Finger }
1502f1d2b4d3SLarry Finger
1503f1d2b4d3SLarry Finger /* if Tx is OK, check whether Rx is OK */
1504b83faedaSLarry Finger if (!(regeac & RXOKBIT) &&
1505f1d2b4d3SLarry Finger (((regea4 & 0x03FF0000) >> 16) != 0x132)) {
1506f1d2b4d3SLarry Finger result |= 0x02;
1507f1d2b4d3SLarry Finger break;
1508f1d2b4d3SLarry Finger } else {
1509f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1510f1d2b4d3SLarry Finger "Path A Rx IQK fail!!\n");
1511f1d2b4d3SLarry Finger }
1512f1d2b4d3SLarry Finger }
1513f1d2b4d3SLarry Finger /* path A PA off */
1514f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1515f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup[0]);
1516f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD,
1517f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup[1]);
1518f1d2b4d3SLarry Finger return result;
1519f1d2b4d3SLarry Finger }
1520f1d2b4d3SLarry Finger
1521f1d2b4d3SLarry Finger /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
_rtl92d_phy_pathb_iqk(struct ieee80211_hw * hw)1522f1d2b4d3SLarry Finger static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
1523f1d2b4d3SLarry Finger {
1524f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1525f1d2b4d3SLarry Finger u32 regeac, regeb4, regebc, regec4, regecc;
1526f1d2b4d3SLarry Finger u8 result = 0;
1527f1d2b4d3SLarry Finger
1528f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQK!\n");
1529f1d2b4d3SLarry Finger /* One shot, path B LOK & IQK */
1530f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path A LOK & IQK!\n");
1531f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
1532f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
1533f1d2b4d3SLarry Finger /* delay x ms */
1534f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1535f1d2b4d3SLarry Finger "Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME);
1536f1d2b4d3SLarry Finger mdelay(IQK_DELAY_TIME);
1537f1d2b4d3SLarry Finger /* Check failed */
1538f1d2b4d3SLarry Finger regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1539f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1540f1d2b4d3SLarry Finger regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1541f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4);
1542f1d2b4d3SLarry Finger regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1543f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc);
1544f1d2b4d3SLarry Finger regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1545f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4);
1546f1d2b4d3SLarry Finger regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1547f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc);
1548f1d2b4d3SLarry Finger if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
1549f1d2b4d3SLarry Finger (((regebc & 0x03FF0000) >> 16) != 0x42))
1550f1d2b4d3SLarry Finger result |= 0x01;
1551f1d2b4d3SLarry Finger else
1552f1d2b4d3SLarry Finger return result;
1553f1d2b4d3SLarry Finger if (!(regeac & BIT(30)) && (((regec4 & 0x03FF0000) >> 16) != 0x132) &&
1554f1d2b4d3SLarry Finger (((regecc & 0x03FF0000) >> 16) != 0x36))
1555f1d2b4d3SLarry Finger result |= 0x02;
1556f1d2b4d3SLarry Finger else
1557f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B Rx IQK fail!!\n");
1558f1d2b4d3SLarry Finger return result;
1559f1d2b4d3SLarry Finger }
1560f1d2b4d3SLarry Finger
1561f1d2b4d3SLarry Finger /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
_rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw * hw)1562f1d2b4d3SLarry Finger static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
1563f1d2b4d3SLarry Finger {
1564f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1565f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
1566f1d2b4d3SLarry Finger u32 regeac, regeb4, regebc, regec4, regecc;
1567f1d2b4d3SLarry Finger u8 result = 0;
1568f1d2b4d3SLarry Finger u8 i;
1569f1d2b4d3SLarry Finger u8 retrycount = 2;
1570f1d2b4d3SLarry Finger
1571f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQK!\n");
1572f1d2b4d3SLarry Finger /* path-A IQK setting */
1573f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1574f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1575f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1576f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82110000);
1577f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68110000);
1578f1d2b4d3SLarry Finger
1579f1d2b4d3SLarry Finger /* path-B IQK setting */
1580f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1581f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1582f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140307);
1583f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68160960);
1584f1d2b4d3SLarry Finger
1585f1d2b4d3SLarry Finger /* LO calibration setting */
1586f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1587f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1588f1d2b4d3SLarry Finger
1589f1d2b4d3SLarry Finger /* path-B PA on */
1590f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x0f600700);
1591f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD, 0x061f0d30);
1592f1d2b4d3SLarry Finger
1593f1d2b4d3SLarry Finger for (i = 0; i < retrycount; i++) {
1594f1d2b4d3SLarry Finger /* One shot, path B LOK & IQK */
1595f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1596f1d2b4d3SLarry Finger "One shot, path A LOK & IQK!\n");
1597f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xfa000000);
1598f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1599f1d2b4d3SLarry Finger
1600f1d2b4d3SLarry Finger /* delay x ms */
1601f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1602f1d2b4d3SLarry Finger "Delay %d ms for One shot, path B LOK & IQK.\n", 10);
1603f1d2b4d3SLarry Finger mdelay(IQK_DELAY_TIME * 10);
1604f1d2b4d3SLarry Finger
1605f1d2b4d3SLarry Finger /* Check failed */
1606f1d2b4d3SLarry Finger regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1607f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1608f1d2b4d3SLarry Finger regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1609f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4);
1610f1d2b4d3SLarry Finger regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1611f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc);
1612f1d2b4d3SLarry Finger regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1613f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4);
1614f1d2b4d3SLarry Finger regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1615f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc);
1616f1d2b4d3SLarry Finger if (!(regeac & BIT(31)) &&
1617f1d2b4d3SLarry Finger (((regeb4 & 0x03FF0000) >> 16) != 0x142))
1618f1d2b4d3SLarry Finger result |= 0x01;
1619f1d2b4d3SLarry Finger else
1620f1d2b4d3SLarry Finger continue;
1621f1d2b4d3SLarry Finger if (!(regeac & BIT(30)) &&
1622f1d2b4d3SLarry Finger (((regec4 & 0x03FF0000) >> 16) != 0x132)) {
1623f1d2b4d3SLarry Finger result |= 0x02;
1624f1d2b4d3SLarry Finger break;
1625f1d2b4d3SLarry Finger } else {
1626f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1627f1d2b4d3SLarry Finger "Path B Rx IQK fail!!\n");
1628f1d2b4d3SLarry Finger }
1629f1d2b4d3SLarry Finger }
1630f1d2b4d3SLarry Finger
1631f1d2b4d3SLarry Finger /* path B PA off */
1632f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1633f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup[0]);
1634f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD,
1635f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup[2]);
1636f1d2b4d3SLarry Finger return result;
1637f1d2b4d3SLarry Finger }
1638f1d2b4d3SLarry Finger
_rtl92d_phy_save_adda_registers(struct ieee80211_hw * hw,u32 * adda_reg,u32 * adda_backup,u32 regnum)1639f1d2b4d3SLarry Finger static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
1640f1d2b4d3SLarry Finger u32 *adda_reg, u32 *adda_backup,
1641f1d2b4d3SLarry Finger u32 regnum)
1642f1d2b4d3SLarry Finger {
1643f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1644f1d2b4d3SLarry Finger u32 i;
1645f1d2b4d3SLarry Finger
1646f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Save ADDA parameters.\n");
1647f1d2b4d3SLarry Finger for (i = 0; i < regnum; i++)
1648f1d2b4d3SLarry Finger adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], MASKDWORD);
1649f1d2b4d3SLarry Finger }
1650f1d2b4d3SLarry Finger
_rtl92d_phy_save_mac_registers(struct ieee80211_hw * hw,u32 * macreg,u32 * macbackup)1651f1d2b4d3SLarry Finger static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
1652f1d2b4d3SLarry Finger u32 *macreg, u32 *macbackup)
1653f1d2b4d3SLarry Finger {
1654f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1655f1d2b4d3SLarry Finger u32 i;
1656f1d2b4d3SLarry Finger
1657f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Save MAC parameters.\n");
1658f1d2b4d3SLarry Finger for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1659f1d2b4d3SLarry Finger macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
1660f1d2b4d3SLarry Finger macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1661f1d2b4d3SLarry Finger }
1662f1d2b4d3SLarry Finger
_rtl92d_phy_reload_adda_registers(struct ieee80211_hw * hw,u32 * adda_reg,u32 * adda_backup,u32 regnum)1663f1d2b4d3SLarry Finger static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
1664f1d2b4d3SLarry Finger u32 *adda_reg, u32 *adda_backup,
1665f1d2b4d3SLarry Finger u32 regnum)
1666f1d2b4d3SLarry Finger {
1667f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1668f1d2b4d3SLarry Finger u32 i;
1669f1d2b4d3SLarry Finger
1670f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1671f1d2b4d3SLarry Finger "Reload ADDA power saving parameters !\n");
1672f1d2b4d3SLarry Finger for (i = 0; i < regnum; i++)
1673f1d2b4d3SLarry Finger rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, adda_backup[i]);
1674f1d2b4d3SLarry Finger }
1675f1d2b4d3SLarry Finger
_rtl92d_phy_reload_mac_registers(struct ieee80211_hw * hw,u32 * macreg,u32 * macbackup)1676f1d2b4d3SLarry Finger static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
1677f1d2b4d3SLarry Finger u32 *macreg, u32 *macbackup)
1678f1d2b4d3SLarry Finger {
1679f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1680f1d2b4d3SLarry Finger u32 i;
1681f1d2b4d3SLarry Finger
1682f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Reload MAC parameters !\n");
1683f1d2b4d3SLarry Finger for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1684f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
1685f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
1686f1d2b4d3SLarry Finger }
1687f1d2b4d3SLarry Finger
_rtl92d_phy_path_adda_on(struct ieee80211_hw * hw,u32 * adda_reg,bool patha_on,bool is2t)1688f1d2b4d3SLarry Finger static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
1689f1d2b4d3SLarry Finger u32 *adda_reg, bool patha_on, bool is2t)
1690f1d2b4d3SLarry Finger {
1691f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1692f1d2b4d3SLarry Finger u32 pathon;
1693f1d2b4d3SLarry Finger u32 i;
1694f1d2b4d3SLarry Finger
1695f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "ADDA ON.\n");
1696f1d2b4d3SLarry Finger pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
1697f1d2b4d3SLarry Finger if (patha_on)
1698f1d2b4d3SLarry Finger pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
1699f1d2b4d3SLarry Finger 0x04db25a4 : 0x0b1b25a4;
1700f1d2b4d3SLarry Finger for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1701f1d2b4d3SLarry Finger rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, pathon);
1702f1d2b4d3SLarry Finger }
1703f1d2b4d3SLarry Finger
_rtl92d_phy_mac_setting_calibration(struct ieee80211_hw * hw,u32 * macreg,u32 * macbackup)1704f1d2b4d3SLarry Finger static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1705f1d2b4d3SLarry Finger u32 *macreg, u32 *macbackup)
1706f1d2b4d3SLarry Finger {
1707f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1708f1d2b4d3SLarry Finger u32 i;
1709f1d2b4d3SLarry Finger
1710f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "MAC settings for Calibration.\n");
1711f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, macreg[0], 0x3F);
1712f1d2b4d3SLarry Finger
1713f1d2b4d3SLarry Finger for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1714f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
1715f1d2b4d3SLarry Finger (~BIT(3))));
1716f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
1717f1d2b4d3SLarry Finger }
1718f1d2b4d3SLarry Finger
_rtl92d_phy_patha_standby(struct ieee80211_hw * hw)1719f1d2b4d3SLarry Finger static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
1720f1d2b4d3SLarry Finger {
1721f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1722f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A standby mode!\n");
1723f1d2b4d3SLarry Finger
1724f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
1725f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD, 0x00010000);
1726f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1727f1d2b4d3SLarry Finger }
1728f1d2b4d3SLarry Finger
_rtl92d_phy_pimode_switch(struct ieee80211_hw * hw,bool pi_mode)1729f1d2b4d3SLarry Finger static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
1730f1d2b4d3SLarry Finger {
1731f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1732f1d2b4d3SLarry Finger u32 mode;
1733f1d2b4d3SLarry Finger
1734f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1735f1d2b4d3SLarry Finger "BB Switch to %s mode!\n", pi_mode ? "PI" : "SI");
1736f1d2b4d3SLarry Finger mode = pi_mode ? 0x01000100 : 0x01000000;
1737f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
1738f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
1739f1d2b4d3SLarry Finger }
1740f1d2b4d3SLarry Finger
_rtl92d_phy_iq_calibrate(struct ieee80211_hw * hw,long result[][8],u8 t,bool is2t)1741f1d2b4d3SLarry Finger static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
1742f1d2b4d3SLarry Finger u8 t, bool is2t)
1743f1d2b4d3SLarry Finger {
1744f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1745f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
1746f1d2b4d3SLarry Finger u32 i;
1747f1d2b4d3SLarry Finger u8 patha_ok, pathb_ok;
1748f1d2b4d3SLarry Finger static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1749f1d2b4d3SLarry Finger RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1750f1d2b4d3SLarry Finger 0xe78, 0xe7c, 0xe80, 0xe84,
1751f1d2b4d3SLarry Finger 0xe88, 0xe8c, 0xed0, 0xed4,
1752f1d2b4d3SLarry Finger 0xed8, 0xedc, 0xee0, 0xeec
1753f1d2b4d3SLarry Finger };
1754f1d2b4d3SLarry Finger static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1755f1d2b4d3SLarry Finger 0x522, 0x550, 0x551, 0x040
1756f1d2b4d3SLarry Finger };
1757f1d2b4d3SLarry Finger static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1758f1d2b4d3SLarry Finger RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1759f1d2b4d3SLarry Finger RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1760f1d2b4d3SLarry Finger RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1761f1d2b4d3SLarry Finger RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1762f1d2b4d3SLarry Finger ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1763f1d2b4d3SLarry Finger };
1764f1d2b4d3SLarry Finger const u32 retrycount = 2;
1765f1d2b4d3SLarry Finger u32 bbvalue;
1766f1d2b4d3SLarry Finger
1767f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 2.4G :Start!!!\n");
1768f1d2b4d3SLarry Finger if (t == 0) {
1769f1d2b4d3SLarry Finger bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1770f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue);
1771f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1772f1d2b4d3SLarry Finger is2t ? "2T2R" : "1T1R");
1773f1d2b4d3SLarry Finger
1774f1d2b4d3SLarry Finger /* Save ADDA parameters, turn Path A ADDA on */
1775f1d2b4d3SLarry Finger _rtl92d_phy_save_adda_registers(hw, adda_reg,
1776f1d2b4d3SLarry Finger rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1777f1d2b4d3SLarry Finger _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1778f1d2b4d3SLarry Finger rtlphy->iqk_mac_backup);
1779f1d2b4d3SLarry Finger _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1780f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup, IQK_BB_REG_NUM);
1781f1d2b4d3SLarry Finger }
1782f1d2b4d3SLarry Finger _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1783f1d2b4d3SLarry Finger if (t == 0)
1784f1d2b4d3SLarry Finger rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1785f1d2b4d3SLarry Finger RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1786f1d2b4d3SLarry Finger
1787f1d2b4d3SLarry Finger /* Switch BB to PI mode to do IQ Calibration. */
1788f1d2b4d3SLarry Finger if (!rtlphy->rfpi_enable)
1789f1d2b4d3SLarry Finger _rtl92d_phy_pimode_switch(hw, true);
1790f1d2b4d3SLarry Finger
1791f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1792f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
1793f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
1794f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22204000);
1795f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1796f1d2b4d3SLarry Finger if (is2t) {
1797f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD,
1798f1d2b4d3SLarry Finger 0x00010000);
1799f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, MASKDWORD,
1800f1d2b4d3SLarry Finger 0x00010000);
1801f1d2b4d3SLarry Finger }
1802f1d2b4d3SLarry Finger /* MAC settings */
1803f1d2b4d3SLarry Finger _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1804f1d2b4d3SLarry Finger rtlphy->iqk_mac_backup);
1805f1d2b4d3SLarry Finger /* Page B init */
1806f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1807f1d2b4d3SLarry Finger if (is2t)
1808f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
1809f1d2b4d3SLarry Finger /* IQ calibration setting */
1810f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n");
1811f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1812f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
1813f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1814f1d2b4d3SLarry Finger for (i = 0; i < retrycount; i++) {
1815f1d2b4d3SLarry Finger patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
1816f1d2b4d3SLarry Finger if (patha_ok == 0x03) {
1817f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1818f1d2b4d3SLarry Finger "Path A IQK Success!!\n");
1819f1d2b4d3SLarry Finger result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1820f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1821f1d2b4d3SLarry Finger result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1822f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1823f1d2b4d3SLarry Finger result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
1824f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1825f1d2b4d3SLarry Finger result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
1826f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1827f1d2b4d3SLarry Finger break;
1828f1d2b4d3SLarry Finger } else if (i == (retrycount - 1) && patha_ok == 0x01) {
1829f1d2b4d3SLarry Finger /* Tx IQK OK */
1830f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1831f1d2b4d3SLarry Finger "Path A IQK Only Tx Success!!\n");
1832f1d2b4d3SLarry Finger
1833f1d2b4d3SLarry Finger result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1834f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1835f1d2b4d3SLarry Finger result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1836f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1837f1d2b4d3SLarry Finger }
1838f1d2b4d3SLarry Finger }
1839f1d2b4d3SLarry Finger if (0x00 == patha_ok)
1840f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK failed!!\n");
1841f1d2b4d3SLarry Finger if (is2t) {
1842f1d2b4d3SLarry Finger _rtl92d_phy_patha_standby(hw);
1843f1d2b4d3SLarry Finger /* Turn Path B ADDA on */
1844f1d2b4d3SLarry Finger _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
1845f1d2b4d3SLarry Finger for (i = 0; i < retrycount; i++) {
1846f1d2b4d3SLarry Finger pathb_ok = _rtl92d_phy_pathb_iqk(hw);
1847f1d2b4d3SLarry Finger if (pathb_ok == 0x03) {
1848f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1849f1d2b4d3SLarry Finger "Path B IQK Success!!\n");
1850f1d2b4d3SLarry Finger result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1851f1d2b4d3SLarry Finger MASKDWORD) & 0x3FF0000) >> 16;
1852f1d2b4d3SLarry Finger result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1853f1d2b4d3SLarry Finger MASKDWORD) & 0x3FF0000) >> 16;
1854f1d2b4d3SLarry Finger result[t][6] = (rtl_get_bbreg(hw, 0xec4,
1855f1d2b4d3SLarry Finger MASKDWORD) & 0x3FF0000) >> 16;
1856f1d2b4d3SLarry Finger result[t][7] = (rtl_get_bbreg(hw, 0xecc,
1857f1d2b4d3SLarry Finger MASKDWORD) & 0x3FF0000) >> 16;
1858f1d2b4d3SLarry Finger break;
1859f1d2b4d3SLarry Finger } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1860f1d2b4d3SLarry Finger /* Tx IQK OK */
1861f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1862f1d2b4d3SLarry Finger "Path B Only Tx IQK Success!!\n");
1863f1d2b4d3SLarry Finger result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1864f1d2b4d3SLarry Finger MASKDWORD) & 0x3FF0000) >> 16;
1865f1d2b4d3SLarry Finger result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1866f1d2b4d3SLarry Finger MASKDWORD) & 0x3FF0000) >> 16;
1867f1d2b4d3SLarry Finger }
1868f1d2b4d3SLarry Finger }
1869f1d2b4d3SLarry Finger if (0x00 == pathb_ok)
1870f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1871f1d2b4d3SLarry Finger "Path B IQK failed!!\n");
1872f1d2b4d3SLarry Finger }
1873f1d2b4d3SLarry Finger
1874f1d2b4d3SLarry Finger /* Back to BB mode, load original value */
1875f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1876f1d2b4d3SLarry Finger "IQK:Back to BB mode, load original value!\n");
1877f1d2b4d3SLarry Finger
1878f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
1879f1d2b4d3SLarry Finger if (t != 0) {
1880f1d2b4d3SLarry Finger /* Switch back BB to SI mode after finish IQ Calibration. */
1881f1d2b4d3SLarry Finger if (!rtlphy->rfpi_enable)
1882f1d2b4d3SLarry Finger _rtl92d_phy_pimode_switch(hw, false);
1883f1d2b4d3SLarry Finger /* Reload ADDA power saving parameters */
1884f1d2b4d3SLarry Finger _rtl92d_phy_reload_adda_registers(hw, adda_reg,
1885f1d2b4d3SLarry Finger rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1886f1d2b4d3SLarry Finger /* Reload MAC parameters */
1887f1d2b4d3SLarry Finger _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
1888f1d2b4d3SLarry Finger rtlphy->iqk_mac_backup);
1889f1d2b4d3SLarry Finger if (is2t)
1890f1d2b4d3SLarry Finger _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1891f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup,
1892f1d2b4d3SLarry Finger IQK_BB_REG_NUM);
1893f1d2b4d3SLarry Finger else
1894f1d2b4d3SLarry Finger _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1895f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup,
1896f1d2b4d3SLarry Finger IQK_BB_REG_NUM - 1);
1897f1d2b4d3SLarry Finger /* load 0xe30 IQC default value */
1898f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
1899f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
1900f1d2b4d3SLarry Finger }
1901f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n");
1902f1d2b4d3SLarry Finger }
1903f1d2b4d3SLarry Finger
_rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw * hw,long result[][8],u8 t)1904f1d2b4d3SLarry Finger static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
1905f1d2b4d3SLarry Finger long result[][8], u8 t)
1906f1d2b4d3SLarry Finger {
1907f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
1908f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
1909f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1910f1d2b4d3SLarry Finger u8 patha_ok, pathb_ok;
1911f1d2b4d3SLarry Finger static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1912f1d2b4d3SLarry Finger RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1913f1d2b4d3SLarry Finger 0xe78, 0xe7c, 0xe80, 0xe84,
1914f1d2b4d3SLarry Finger 0xe88, 0xe8c, 0xed0, 0xed4,
1915f1d2b4d3SLarry Finger 0xed8, 0xedc, 0xee0, 0xeec
1916f1d2b4d3SLarry Finger };
1917f1d2b4d3SLarry Finger static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1918f1d2b4d3SLarry Finger 0x522, 0x550, 0x551, 0x040
1919f1d2b4d3SLarry Finger };
1920f1d2b4d3SLarry Finger static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1921f1d2b4d3SLarry Finger RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1922f1d2b4d3SLarry Finger RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1923f1d2b4d3SLarry Finger RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1924f1d2b4d3SLarry Finger RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1925f1d2b4d3SLarry Finger ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1926f1d2b4d3SLarry Finger };
1927f1d2b4d3SLarry Finger u32 bbvalue;
1928f1d2b4d3SLarry Finger bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
1929f1d2b4d3SLarry Finger
1930f1d2b4d3SLarry Finger /* Note: IQ calibration must be performed after loading
1931f1d2b4d3SLarry Finger * PHY_REG.txt , and radio_a, radio_b.txt */
1932f1d2b4d3SLarry Finger
1933f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 5G NORMAL:Start!!!\n");
1934f1d2b4d3SLarry Finger mdelay(IQK_DELAY_TIME * 20);
1935f1d2b4d3SLarry Finger if (t == 0) {
1936f1d2b4d3SLarry Finger bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1937f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue);
1938f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1939f1d2b4d3SLarry Finger is2t ? "2T2R" : "1T1R");
1940f1d2b4d3SLarry Finger /* Save ADDA parameters, turn Path A ADDA on */
1941f1d2b4d3SLarry Finger _rtl92d_phy_save_adda_registers(hw, adda_reg,
1942f1d2b4d3SLarry Finger rtlphy->adda_backup,
1943f1d2b4d3SLarry Finger IQK_ADDA_REG_NUM);
1944f1d2b4d3SLarry Finger _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1945f1d2b4d3SLarry Finger rtlphy->iqk_mac_backup);
1946f1d2b4d3SLarry Finger if (is2t)
1947f1d2b4d3SLarry Finger _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1948f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup,
1949f1d2b4d3SLarry Finger IQK_BB_REG_NUM);
1950f1d2b4d3SLarry Finger else
1951f1d2b4d3SLarry Finger _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1952f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup,
1953f1d2b4d3SLarry Finger IQK_BB_REG_NUM - 1);
1954f1d2b4d3SLarry Finger }
1955f1d2b4d3SLarry Finger _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1956f1d2b4d3SLarry Finger /* MAC settings */
1957f1d2b4d3SLarry Finger _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1958f1d2b4d3SLarry Finger rtlphy->iqk_mac_backup);
1959f1d2b4d3SLarry Finger if (t == 0)
1960f1d2b4d3SLarry Finger rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1961f1d2b4d3SLarry Finger RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1962f1d2b4d3SLarry Finger /* Switch BB to PI mode to do IQ Calibration. */
1963f1d2b4d3SLarry Finger if (!rtlphy->rfpi_enable)
1964f1d2b4d3SLarry Finger _rtl92d_phy_pimode_switch(hw, true);
1965f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1966f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
1967f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
1968f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208000);
1969f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1970f1d2b4d3SLarry Finger
1971f1d2b4d3SLarry Finger /* Page B init */
1972f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1973f1d2b4d3SLarry Finger if (is2t)
1974f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
1975f1d2b4d3SLarry Finger /* IQ calibration setting */
1976f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n");
1977f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1978f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x10007c00);
1979f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1980f1d2b4d3SLarry Finger patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
1981f1d2b4d3SLarry Finger if (patha_ok == 0x03) {
1982f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Success!!\n");
1983f1d2b4d3SLarry Finger result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1984f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1985f1d2b4d3SLarry Finger result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1986f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1987f1d2b4d3SLarry Finger result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
1988f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1989f1d2b4d3SLarry Finger result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
1990f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1991f1d2b4d3SLarry Finger } else if (patha_ok == 0x01) { /* Tx IQK OK */
1992f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
1993f1d2b4d3SLarry Finger "Path A IQK Only Tx Success!!\n");
1994f1d2b4d3SLarry Finger
1995f1d2b4d3SLarry Finger result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1996f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1997f1d2b4d3SLarry Finger result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1998f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
1999f1d2b4d3SLarry Finger } else {
2000f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Fail!!\n");
2001f1d2b4d3SLarry Finger }
2002f1d2b4d3SLarry Finger if (is2t) {
2003f1d2b4d3SLarry Finger /* _rtl92d_phy_patha_standby(hw); */
2004f1d2b4d3SLarry Finger /* Turn Path B ADDA on */
2005f1d2b4d3SLarry Finger _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2006f1d2b4d3SLarry Finger pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
2007f1d2b4d3SLarry Finger if (pathb_ok == 0x03) {
2008f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2009f1d2b4d3SLarry Finger "Path B IQK Success!!\n");
2010f1d2b4d3SLarry Finger result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2011f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
2012f1d2b4d3SLarry Finger result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2013f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
2014f1d2b4d3SLarry Finger result[t][6] = (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
2015f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
2016f1d2b4d3SLarry Finger result[t][7] = (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
2017f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
2018f1d2b4d3SLarry Finger } else if (pathb_ok == 0x01) { /* Tx IQK OK */
2019f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2020f1d2b4d3SLarry Finger "Path B Only Tx IQK Success!!\n");
2021f1d2b4d3SLarry Finger result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2022f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
2023f1d2b4d3SLarry Finger result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2024f1d2b4d3SLarry Finger 0x3FF0000) >> 16;
2025f1d2b4d3SLarry Finger } else {
2026f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2027f1d2b4d3SLarry Finger "Path B IQK failed!!\n");
2028f1d2b4d3SLarry Finger }
2029f1d2b4d3SLarry Finger }
2030f1d2b4d3SLarry Finger
2031f1d2b4d3SLarry Finger /* Back to BB mode, load original value */
2032f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2033f1d2b4d3SLarry Finger "IQK:Back to BB mode, load original value!\n");
2034f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
2035f1d2b4d3SLarry Finger if (t != 0) {
2036f1d2b4d3SLarry Finger if (is2t)
2037f1d2b4d3SLarry Finger _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2038f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup,
2039f1d2b4d3SLarry Finger IQK_BB_REG_NUM);
2040f1d2b4d3SLarry Finger else
2041f1d2b4d3SLarry Finger _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2042f1d2b4d3SLarry Finger rtlphy->iqk_bb_backup,
2043f1d2b4d3SLarry Finger IQK_BB_REG_NUM - 1);
2044f1d2b4d3SLarry Finger /* Reload MAC parameters */
2045f1d2b4d3SLarry Finger _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2046f1d2b4d3SLarry Finger rtlphy->iqk_mac_backup);
2047f1d2b4d3SLarry Finger /* Switch back BB to SI mode after finish IQ Calibration. */
2048f1d2b4d3SLarry Finger if (!rtlphy->rfpi_enable)
2049f1d2b4d3SLarry Finger _rtl92d_phy_pimode_switch(hw, false);
2050f1d2b4d3SLarry Finger /* Reload ADDA power saving parameters */
2051f1d2b4d3SLarry Finger _rtl92d_phy_reload_adda_registers(hw, adda_reg,
2052f1d2b4d3SLarry Finger rtlphy->adda_backup,
2053f1d2b4d3SLarry Finger IQK_ADDA_REG_NUM);
2054f1d2b4d3SLarry Finger }
2055f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n");
2056f1d2b4d3SLarry Finger }
2057f1d2b4d3SLarry Finger
_rtl92d_phy_simularity_compare(struct ieee80211_hw * hw,long result[][8],u8 c1,u8 c2)2058f1d2b4d3SLarry Finger static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
2059f1d2b4d3SLarry Finger long result[][8], u8 c1, u8 c2)
2060f1d2b4d3SLarry Finger {
2061f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2062f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2063f1d2b4d3SLarry Finger u32 i, j, diff, sim_bitmap, bound;
2064f1d2b4d3SLarry Finger u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */
2065f1d2b4d3SLarry Finger bool bresult = true;
2066f1d2b4d3SLarry Finger bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2067f1d2b4d3SLarry Finger
2068f1d2b4d3SLarry Finger if (is2t)
2069f1d2b4d3SLarry Finger bound = 8;
2070f1d2b4d3SLarry Finger else
2071f1d2b4d3SLarry Finger bound = 4;
2072f1d2b4d3SLarry Finger sim_bitmap = 0;
2073f1d2b4d3SLarry Finger for (i = 0; i < bound; i++) {
2074f1d2b4d3SLarry Finger diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] -
2075f1d2b4d3SLarry Finger result[c2][i]) : (result[c2][i] - result[c1][i]);
2076f1d2b4d3SLarry Finger if (diff > MAX_TOLERANCE_92D) {
2077f1d2b4d3SLarry Finger if ((i == 2 || i == 6) && !sim_bitmap) {
2078f1d2b4d3SLarry Finger if (result[c1][i] + result[c1][i + 1] == 0)
2079f1d2b4d3SLarry Finger final_candidate[(i / 4)] = c2;
2080f1d2b4d3SLarry Finger else if (result[c2][i] + result[c2][i + 1] == 0)
2081f1d2b4d3SLarry Finger final_candidate[(i / 4)] = c1;
2082f1d2b4d3SLarry Finger else
2083f1d2b4d3SLarry Finger sim_bitmap = sim_bitmap | (1 << i);
2084f1d2b4d3SLarry Finger } else {
2085f1d2b4d3SLarry Finger sim_bitmap = sim_bitmap | (1 << i);
2086f1d2b4d3SLarry Finger }
2087f1d2b4d3SLarry Finger }
2088f1d2b4d3SLarry Finger }
2089f1d2b4d3SLarry Finger if (sim_bitmap == 0) {
2090f1d2b4d3SLarry Finger for (i = 0; i < (bound / 4); i++) {
2091f1d2b4d3SLarry Finger if (final_candidate[i] != 0xFF) {
2092f1d2b4d3SLarry Finger for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2093f1d2b4d3SLarry Finger result[3][j] =
2094f1d2b4d3SLarry Finger result[final_candidate[i]][j];
2095f1d2b4d3SLarry Finger bresult = false;
2096f1d2b4d3SLarry Finger }
2097f1d2b4d3SLarry Finger }
2098f1d2b4d3SLarry Finger return bresult;
2099f1d2b4d3SLarry Finger }
2100f1d2b4d3SLarry Finger if (!(sim_bitmap & 0x0F)) { /* path A OK */
2101f1d2b4d3SLarry Finger for (i = 0; i < 4; i++)
2102f1d2b4d3SLarry Finger result[3][i] = result[c1][i];
2103f1d2b4d3SLarry Finger } else if (!(sim_bitmap & 0x03)) { /* path A, Tx OK */
2104f1d2b4d3SLarry Finger for (i = 0; i < 2; i++)
2105f1d2b4d3SLarry Finger result[3][i] = result[c1][i];
2106f1d2b4d3SLarry Finger }
2107f1d2b4d3SLarry Finger if (!(sim_bitmap & 0xF0) && is2t) { /* path B OK */
2108f1d2b4d3SLarry Finger for (i = 4; i < 8; i++)
2109f1d2b4d3SLarry Finger result[3][i] = result[c1][i];
2110f1d2b4d3SLarry Finger } else if (!(sim_bitmap & 0x30)) { /* path B, Tx OK */
2111f1d2b4d3SLarry Finger for (i = 4; i < 6; i++)
2112f1d2b4d3SLarry Finger result[3][i] = result[c1][i];
2113f1d2b4d3SLarry Finger }
2114f1d2b4d3SLarry Finger return false;
2115f1d2b4d3SLarry Finger }
2116f1d2b4d3SLarry Finger
_rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw * hw,bool iqk_ok,long result[][8],u8 final_candidate,bool txonly)2117f1d2b4d3SLarry Finger static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
2118f1d2b4d3SLarry Finger bool iqk_ok, long result[][8],
2119f1d2b4d3SLarry Finger u8 final_candidate, bool txonly)
2120f1d2b4d3SLarry Finger {
2121f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2122f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2123f1d2b4d3SLarry Finger u32 oldval_0, val_x, tx0_a, reg;
2124f1d2b4d3SLarry Finger long val_y, tx0_c;
2125f1d2b4d3SLarry Finger bool is2t = IS_92D_SINGLEPHY(rtlhal->version) ||
2126f1d2b4d3SLarry Finger rtlhal->macphymode == DUALMAC_DUALPHY;
2127f1d2b4d3SLarry Finger
2128f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2129f1d2b4d3SLarry Finger "Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed");
2130f1d2b4d3SLarry Finger if (final_candidate == 0xFF) {
2131f1d2b4d3SLarry Finger return;
2132f1d2b4d3SLarry Finger } else if (iqk_ok) {
2133b83faedaSLarry Finger oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2134f1d2b4d3SLarry Finger MASKDWORD) >> 22) & 0x3FF; /* OFDM0_D */
2135f1d2b4d3SLarry Finger val_x = result[final_candidate][0];
2136f1d2b4d3SLarry Finger if ((val_x & 0x00000200) != 0)
2137f1d2b4d3SLarry Finger val_x = val_x | 0xFFFFFC00;
2138f1d2b4d3SLarry Finger tx0_a = (val_x * oldval_0) >> 8;
2139f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2140f1d2b4d3SLarry Finger "X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n",
2141f1d2b4d3SLarry Finger val_x, tx0_a, oldval_0);
2142b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
2143f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
2144f1d2b4d3SLarry Finger ((val_x * oldval_0 >> 7) & 0x1));
2145f1d2b4d3SLarry Finger val_y = result[final_candidate][1];
2146f1d2b4d3SLarry Finger if ((val_y & 0x00000200) != 0)
2147f1d2b4d3SLarry Finger val_y = val_y | 0xFFFFFC00;
2148f1d2b4d3SLarry Finger /* path B IQK result + 3 */
2149f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 1 &&
2150f1d2b4d3SLarry Finger rtlhal->current_bandtype == BAND_ON_5G)
2151f1d2b4d3SLarry Finger val_y += 3;
2152f1d2b4d3SLarry Finger tx0_c = (val_y * oldval_0) >> 8;
2153f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2154f1d2b4d3SLarry Finger "Y = 0x%lx, tx0_c = 0x%lx\n",
2155f1d2b4d3SLarry Finger val_y, tx0_c);
2156b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
2157f1d2b4d3SLarry Finger ((tx0_c & 0x3C0) >> 6));
2158b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
2159f1d2b4d3SLarry Finger (tx0_c & 0x3F));
2160f1d2b4d3SLarry Finger if (is2t)
2161f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
2162f1d2b4d3SLarry Finger ((val_y * oldval_0 >> 7) & 0x1));
2163f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n",
2164b83faedaSLarry Finger rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2165f1d2b4d3SLarry Finger MASKDWORD));
2166f1d2b4d3SLarry Finger if (txonly) {
2167f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "only Tx OK\n");
2168f1d2b4d3SLarry Finger return;
2169f1d2b4d3SLarry Finger }
2170f1d2b4d3SLarry Finger reg = result[final_candidate][2];
2171f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2172f1d2b4d3SLarry Finger reg = result[final_candidate][3] & 0x3F;
2173f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2174f1d2b4d3SLarry Finger reg = (result[final_candidate][3] >> 6) & 0xF;
2175f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
2176f1d2b4d3SLarry Finger }
2177f1d2b4d3SLarry Finger }
2178f1d2b4d3SLarry Finger
_rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw * hw,bool iqk_ok,long result[][8],u8 final_candidate,bool txonly)2179f1d2b4d3SLarry Finger static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
2180f1d2b4d3SLarry Finger bool iqk_ok, long result[][8], u8 final_candidate, bool txonly)
2181f1d2b4d3SLarry Finger {
2182f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2183f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2184f1d2b4d3SLarry Finger u32 oldval_1, val_x, tx1_a, reg;
2185f1d2b4d3SLarry Finger long val_y, tx1_c;
2186f1d2b4d3SLarry Finger
2187f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n",
2188f1d2b4d3SLarry Finger iqk_ok ? "Success" : "Failed");
2189f1d2b4d3SLarry Finger if (final_candidate == 0xFF) {
2190f1d2b4d3SLarry Finger return;
2191f1d2b4d3SLarry Finger } else if (iqk_ok) {
2192b83faedaSLarry Finger oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
2193f1d2b4d3SLarry Finger MASKDWORD) >> 22) & 0x3FF;
2194f1d2b4d3SLarry Finger val_x = result[final_candidate][4];
2195f1d2b4d3SLarry Finger if ((val_x & 0x00000200) != 0)
2196f1d2b4d3SLarry Finger val_x = val_x | 0xFFFFFC00;
2197f1d2b4d3SLarry Finger tx1_a = (val_x * oldval_1) >> 8;
2198f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n",
2199f1d2b4d3SLarry Finger val_x, tx1_a);
2200b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
2201f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
2202f1d2b4d3SLarry Finger ((val_x * oldval_1 >> 7) & 0x1));
2203f1d2b4d3SLarry Finger val_y = result[final_candidate][5];
2204f1d2b4d3SLarry Finger if ((val_y & 0x00000200) != 0)
2205f1d2b4d3SLarry Finger val_y = val_y | 0xFFFFFC00;
2206f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_5G)
2207f1d2b4d3SLarry Finger val_y += 3;
2208f1d2b4d3SLarry Finger tx1_c = (val_y * oldval_1) >> 8;
2209f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n",
2210f1d2b4d3SLarry Finger val_y, tx1_c);
2211b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2212f1d2b4d3SLarry Finger ((tx1_c & 0x3C0) >> 6));
2213b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2214f1d2b4d3SLarry Finger (tx1_c & 0x3F));
2215f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30),
2216f1d2b4d3SLarry Finger ((val_y * oldval_1 >> 7) & 0x1));
2217f1d2b4d3SLarry Finger if (txonly)
2218f1d2b4d3SLarry Finger return;
2219f1d2b4d3SLarry Finger reg = result[final_candidate][6];
2220f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2221f1d2b4d3SLarry Finger reg = result[final_candidate][7] & 0x3F;
2222f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2223f1d2b4d3SLarry Finger reg = (result[final_candidate][7] >> 6) & 0xF;
2224f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
2225f1d2b4d3SLarry Finger }
2226f1d2b4d3SLarry Finger }
2227f1d2b4d3SLarry Finger
rtl92d_phy_iq_calibrate(struct ieee80211_hw * hw)2228f1d2b4d3SLarry Finger void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
2229f1d2b4d3SLarry Finger {
2230f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2231f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2232f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2233f1d2b4d3SLarry Finger long result[4][8];
2234f1d2b4d3SLarry Finger u8 i, final_candidate, indexforchannel;
2235f1d2b4d3SLarry Finger bool patha_ok, pathb_ok;
2236f1d2b4d3SLarry Finger long rege94, rege9c, regea4, regeac, regeb4;
2237f1d2b4d3SLarry Finger long regebc, regec4, regecc, regtmp = 0;
2238f1d2b4d3SLarry Finger bool is12simular, is13simular, is23simular;
2239f1d2b4d3SLarry Finger unsigned long flag = 0;
2240f1d2b4d3SLarry Finger
2241f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2242f1d2b4d3SLarry Finger "IQK:Start!!!channel %d\n", rtlphy->current_channel);
2243f1d2b4d3SLarry Finger for (i = 0; i < 8; i++) {
2244f1d2b4d3SLarry Finger result[0][i] = 0;
2245f1d2b4d3SLarry Finger result[1][i] = 0;
2246f1d2b4d3SLarry Finger result[2][i] = 0;
2247f1d2b4d3SLarry Finger result[3][i] = 0;
2248f1d2b4d3SLarry Finger }
2249f1d2b4d3SLarry Finger final_candidate = 0xff;
2250f1d2b4d3SLarry Finger patha_ok = false;
2251f1d2b4d3SLarry Finger pathb_ok = false;
2252f1d2b4d3SLarry Finger is12simular = false;
2253f1d2b4d3SLarry Finger is23simular = false;
2254f1d2b4d3SLarry Finger is13simular = false;
2255f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2256f1d2b4d3SLarry Finger "IQK !!!currentband %d\n", rtlhal->current_bandtype);
2257f1d2b4d3SLarry Finger rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
2258f1d2b4d3SLarry Finger for (i = 0; i < 3; i++) {
2259f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_5G) {
2260f1d2b4d3SLarry Finger _rtl92d_phy_iq_calibrate_5g_normal(hw, result, i);
2261f1d2b4d3SLarry Finger } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
2262f1d2b4d3SLarry Finger if (IS_92D_SINGLEPHY(rtlhal->version))
2263f1d2b4d3SLarry Finger _rtl92d_phy_iq_calibrate(hw, result, i, true);
2264f1d2b4d3SLarry Finger else
2265f1d2b4d3SLarry Finger _rtl92d_phy_iq_calibrate(hw, result, i, false);
2266f1d2b4d3SLarry Finger }
2267f1d2b4d3SLarry Finger if (i == 1) {
2268f1d2b4d3SLarry Finger is12simular = _rtl92d_phy_simularity_compare(hw, result,
2269f1d2b4d3SLarry Finger 0, 1);
2270f1d2b4d3SLarry Finger if (is12simular) {
2271f1d2b4d3SLarry Finger final_candidate = 0;
2272f1d2b4d3SLarry Finger break;
2273f1d2b4d3SLarry Finger }
2274f1d2b4d3SLarry Finger }
2275f1d2b4d3SLarry Finger if (i == 2) {
2276f1d2b4d3SLarry Finger is13simular = _rtl92d_phy_simularity_compare(hw, result,
2277f1d2b4d3SLarry Finger 0, 2);
2278f1d2b4d3SLarry Finger if (is13simular) {
2279f1d2b4d3SLarry Finger final_candidate = 0;
2280f1d2b4d3SLarry Finger break;
2281f1d2b4d3SLarry Finger }
2282f1d2b4d3SLarry Finger is23simular = _rtl92d_phy_simularity_compare(hw, result,
2283f1d2b4d3SLarry Finger 1, 2);
2284f1d2b4d3SLarry Finger if (is23simular) {
2285f1d2b4d3SLarry Finger final_candidate = 1;
2286f1d2b4d3SLarry Finger } else {
2287f1d2b4d3SLarry Finger for (i = 0; i < 8; i++)
2288f1d2b4d3SLarry Finger regtmp += result[3][i];
2289f1d2b4d3SLarry Finger
2290f1d2b4d3SLarry Finger if (regtmp != 0)
2291f1d2b4d3SLarry Finger final_candidate = 3;
2292f1d2b4d3SLarry Finger else
2293f1d2b4d3SLarry Finger final_candidate = 0xFF;
2294f1d2b4d3SLarry Finger }
2295f1d2b4d3SLarry Finger }
2296f1d2b4d3SLarry Finger }
2297f1d2b4d3SLarry Finger rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
2298f1d2b4d3SLarry Finger for (i = 0; i < 4; i++) {
2299f1d2b4d3SLarry Finger rege94 = result[i][0];
2300f1d2b4d3SLarry Finger rege9c = result[i][1];
2301f1d2b4d3SLarry Finger regea4 = result[i][2];
2302f1d2b4d3SLarry Finger regeac = result[i][3];
2303f1d2b4d3SLarry Finger regeb4 = result[i][4];
2304f1d2b4d3SLarry Finger regebc = result[i][5];
2305f1d2b4d3SLarry Finger regec4 = result[i][6];
2306f1d2b4d3SLarry Finger regecc = result[i][7];
2307f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2308f1d2b4d3SLarry Finger "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2309f1d2b4d3SLarry Finger rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2310f1d2b4d3SLarry Finger regecc);
2311f1d2b4d3SLarry Finger }
2312f1d2b4d3SLarry Finger if (final_candidate != 0xff) {
2313f1d2b4d3SLarry Finger rtlphy->reg_e94 = rege94 = result[final_candidate][0];
2314f1d2b4d3SLarry Finger rtlphy->reg_e9c = rege9c = result[final_candidate][1];
2315f1d2b4d3SLarry Finger regea4 = result[final_candidate][2];
2316f1d2b4d3SLarry Finger regeac = result[final_candidate][3];
2317f1d2b4d3SLarry Finger rtlphy->reg_eb4 = regeb4 = result[final_candidate][4];
2318f1d2b4d3SLarry Finger rtlphy->reg_ebc = regebc = result[final_candidate][5];
2319f1d2b4d3SLarry Finger regec4 = result[final_candidate][6];
2320f1d2b4d3SLarry Finger regecc = result[final_candidate][7];
2321f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2322f1d2b4d3SLarry Finger "IQK: final_candidate is %x\n", final_candidate);
2323f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2324f1d2b4d3SLarry Finger "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2325f1d2b4d3SLarry Finger rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2326f1d2b4d3SLarry Finger regecc);
2327f1d2b4d3SLarry Finger patha_ok = pathb_ok = true;
2328f1d2b4d3SLarry Finger } else {
2329f1d2b4d3SLarry Finger rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; /* X default value */
2330f1d2b4d3SLarry Finger rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0; /* Y default value */
2331f1d2b4d3SLarry Finger }
2332f1d2b4d3SLarry Finger if ((rege94 != 0) /*&&(regea4 != 0) */)
2333f1d2b4d3SLarry Finger _rtl92d_phy_patha_fill_iqk_matrix(hw, patha_ok, result,
2334f1d2b4d3SLarry Finger final_candidate, (regea4 == 0));
2335f1d2b4d3SLarry Finger if (IS_92D_SINGLEPHY(rtlhal->version)) {
2336f1d2b4d3SLarry Finger if ((regeb4 != 0) /*&&(regec4 != 0) */)
2337f1d2b4d3SLarry Finger _rtl92d_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result,
2338f1d2b4d3SLarry Finger final_candidate, (regec4 == 0));
2339f1d2b4d3SLarry Finger }
2340f1d2b4d3SLarry Finger if (final_candidate != 0xFF) {
2341f1d2b4d3SLarry Finger indexforchannel = rtl92d_get_rightchnlplace_for_iqk(
2342f1d2b4d3SLarry Finger rtlphy->current_channel);
2343f1d2b4d3SLarry Finger
2344f1d2b4d3SLarry Finger for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2345f1d2b4d3SLarry Finger rtlphy->iqk_matrix[indexforchannel].
2346f1d2b4d3SLarry Finger value[0][i] = result[final_candidate][i];
2347f1d2b4d3SLarry Finger rtlphy->iqk_matrix[indexforchannel].iqk_done =
2348f1d2b4d3SLarry Finger true;
2349f1d2b4d3SLarry Finger
23506bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
2351f1d2b4d3SLarry Finger "IQK OK indexforchannel %d\n", indexforchannel);
2352f1d2b4d3SLarry Finger }
2353f1d2b4d3SLarry Finger }
2354f1d2b4d3SLarry Finger
rtl92d_phy_reload_iqk_setting(struct ieee80211_hw * hw,u8 channel)2355f1d2b4d3SLarry Finger void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
2356f1d2b4d3SLarry Finger {
2357f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2358f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2359f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2360f1d2b4d3SLarry Finger u8 indexforchannel;
2361f1d2b4d3SLarry Finger
23626bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel);
2363f1d2b4d3SLarry Finger /*------Do IQK for normal chip and test chip 5G band------- */
2364f1d2b4d3SLarry Finger indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
23656bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n",
2366f1d2b4d3SLarry Finger indexforchannel,
2367f1d2b4d3SLarry Finger rtlphy->iqk_matrix[indexforchannel].iqk_done);
2368f1d2b4d3SLarry Finger if (0 && !rtlphy->iqk_matrix[indexforchannel].iqk_done &&
2369f1d2b4d3SLarry Finger rtlphy->need_iqk) {
2370f1d2b4d3SLarry Finger /* Re Do IQK. */
23716bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
2372f1d2b4d3SLarry Finger "Do IQK Matrix reg for channel:%d....\n", channel);
2373f1d2b4d3SLarry Finger rtl92d_phy_iq_calibrate(hw);
2374f1d2b4d3SLarry Finger } else {
2375f1d2b4d3SLarry Finger /* Just load the value. */
2376f1d2b4d3SLarry Finger /* 2G band just load once. */
2377f1d2b4d3SLarry Finger if (((!rtlhal->load_imrandiqk_setting_for2g) &&
2378f1d2b4d3SLarry Finger indexforchannel == 0) || indexforchannel > 0) {
23796bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
2380f1d2b4d3SLarry Finger "Just Read IQK Matrix reg for channel:%d....\n",
2381f1d2b4d3SLarry Finger channel);
238293fbc1ebSPing-Ke Shih if (rtlphy->iqk_matrix[indexforchannel].value[0][0] != 0)
2383f1d2b4d3SLarry Finger _rtl92d_phy_patha_fill_iqk_matrix(hw, true,
238493fbc1ebSPing-Ke Shih rtlphy->iqk_matrix[indexforchannel].value, 0,
238593fbc1ebSPing-Ke Shih rtlphy->iqk_matrix[indexforchannel].value[0][2] == 0);
2386f1d2b4d3SLarry Finger if (IS_92D_SINGLEPHY(rtlhal->version)) {
2387f1d2b4d3SLarry Finger if ((rtlphy->iqk_matrix[
2388f1d2b4d3SLarry Finger indexforchannel].value[0][4] != 0)
2389f1d2b4d3SLarry Finger /*&&(regec4 != 0) */)
2390f1d2b4d3SLarry Finger _rtl92d_phy_pathb_fill_iqk_matrix(hw,
2391f1d2b4d3SLarry Finger true,
2392f1d2b4d3SLarry Finger rtlphy->iqk_matrix[
2393f1d2b4d3SLarry Finger indexforchannel].value, 0,
2394f1d2b4d3SLarry Finger (rtlphy->iqk_matrix[
2395f1d2b4d3SLarry Finger indexforchannel].value[0][6]
2396f1d2b4d3SLarry Finger == 0));
2397f1d2b4d3SLarry Finger }
2398f1d2b4d3SLarry Finger }
2399f1d2b4d3SLarry Finger }
2400f1d2b4d3SLarry Finger rtlphy->need_iqk = false;
24016bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2402f1d2b4d3SLarry Finger }
2403f1d2b4d3SLarry Finger
_rtl92d_phy_get_abs(u32 val1,u32 val2)2404f1d2b4d3SLarry Finger static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
2405f1d2b4d3SLarry Finger {
2406f1d2b4d3SLarry Finger u32 ret;
2407f1d2b4d3SLarry Finger
2408f1d2b4d3SLarry Finger if (val1 >= val2)
2409f1d2b4d3SLarry Finger ret = val1 - val2;
2410f1d2b4d3SLarry Finger else
2411f1d2b4d3SLarry Finger ret = val2 - val1;
2412f1d2b4d3SLarry Finger return ret;
2413f1d2b4d3SLarry Finger }
2414f1d2b4d3SLarry Finger
_rtl92d_is_legal_5g_channel(struct ieee80211_hw * hw,u8 channel)2415f1d2b4d3SLarry Finger static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
2416f1d2b4d3SLarry Finger {
2417f1d2b4d3SLarry Finger
2418f1d2b4d3SLarry Finger int i;
2419f1d2b4d3SLarry Finger
242069831173SKees Cook for (i = 0; i < ARRAY_SIZE(channel5g); i++)
2421bb6fa826SLarry Finger if (channel == channel5g[i])
2422f1d2b4d3SLarry Finger return true;
2423f1d2b4d3SLarry Finger return false;
2424f1d2b4d3SLarry Finger }
2425f1d2b4d3SLarry Finger
_rtl92d_phy_calc_curvindex(struct ieee80211_hw * hw,u32 * targetchnl,u32 * curvecount_val,bool is5g,u32 * curveindex)2426f1d2b4d3SLarry Finger static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
2427f1d2b4d3SLarry Finger u32 *targetchnl, u32 * curvecount_val,
2428f1d2b4d3SLarry Finger bool is5g, u32 *curveindex)
2429f1d2b4d3SLarry Finger {
2430f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2431f1d2b4d3SLarry Finger u32 smallest_abs_val = 0xffffffff, u4tmp;
2432f1d2b4d3SLarry Finger u8 i, j;
2433f1d2b4d3SLarry Finger u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
2434f1d2b4d3SLarry Finger
2435f1d2b4d3SLarry Finger for (i = 0; i < chnl_num; i++) {
2436f1d2b4d3SLarry Finger if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
2437f1d2b4d3SLarry Finger continue;
2438f1d2b4d3SLarry Finger curveindex[i] = 0;
2439f1d2b4d3SLarry Finger for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
2440f1d2b4d3SLarry Finger u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
2441f1d2b4d3SLarry Finger curvecount_val[j]);
2442f1d2b4d3SLarry Finger
2443f1d2b4d3SLarry Finger if (u4tmp < smallest_abs_val) {
2444f1d2b4d3SLarry Finger curveindex[i] = j;
2445f1d2b4d3SLarry Finger smallest_abs_val = u4tmp;
2446f1d2b4d3SLarry Finger }
2447f1d2b4d3SLarry Finger }
2448f1d2b4d3SLarry Finger smallest_abs_val = 0xffffffff;
2449f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
2450f1d2b4d3SLarry Finger i, curveindex[i]);
2451f1d2b4d3SLarry Finger }
2452f1d2b4d3SLarry Finger }
2453f1d2b4d3SLarry Finger
_rtl92d_phy_reload_lck_setting(struct ieee80211_hw * hw,u8 channel)2454f1d2b4d3SLarry Finger static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
2455f1d2b4d3SLarry Finger u8 channel)
2456f1d2b4d3SLarry Finger {
2457f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2458f1d2b4d3SLarry Finger u8 erfpath = rtlpriv->rtlhal.current_bandtype ==
2459f1d2b4d3SLarry Finger BAND_ON_5G ? RF90_PATH_A :
2460f1d2b4d3SLarry Finger IS_92D_SINGLEPHY(rtlpriv->rtlhal.version) ?
2461f1d2b4d3SLarry Finger RF90_PATH_B : RF90_PATH_A;
2462f1d2b4d3SLarry Finger u32 u4tmp = 0, u4regvalue = 0;
2463f1d2b4d3SLarry Finger bool bneed_powerdown_radio = false;
2464f1d2b4d3SLarry Finger
24656bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath);
2466f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n",
2467f1d2b4d3SLarry Finger rtlpriv->rtlhal.current_bandtype);
2468f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "channel = %d\n", channel);
2469f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */
2470f1d2b4d3SLarry Finger u4tmp = curveindex_5g[channel-1];
2471f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2472f1d2b4d3SLarry Finger "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
2473f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2474f1d2b4d3SLarry Finger rtlpriv->rtlhal.interfaceindex == 1) {
2475f1d2b4d3SLarry Finger bneed_powerdown_radio =
2476f1d2b4d3SLarry Finger rtl92d_phy_enable_anotherphy(hw, false);
2477f1d2b4d3SLarry Finger rtlpriv->rtlhal.during_mac1init_radioa = true;
2478f1d2b4d3SLarry Finger /* asume no this case */
2479f1d2b4d3SLarry Finger if (bneed_powerdown_radio)
2480f1d2b4d3SLarry Finger _rtl92d_phy_enable_rf_env(hw, erfpath,
2481f1d2b4d3SLarry Finger &u4regvalue);
2482f1d2b4d3SLarry Finger }
2483f1d2b4d3SLarry Finger rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2484f1d2b4d3SLarry Finger if (bneed_powerdown_radio)
2485f1d2b4d3SLarry Finger _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2486f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.during_mac1init_radioa)
2487f1d2b4d3SLarry Finger rtl92d_phy_powerdown_anotherphy(hw, false);
2488f1d2b4d3SLarry Finger } else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
2489f1d2b4d3SLarry Finger u4tmp = curveindex_2g[channel-1];
2490f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2491f1d2b4d3SLarry Finger "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
2492f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2493f1d2b4d3SLarry Finger rtlpriv->rtlhal.interfaceindex == 0) {
2494f1d2b4d3SLarry Finger bneed_powerdown_radio =
2495f1d2b4d3SLarry Finger rtl92d_phy_enable_anotherphy(hw, true);
2496f1d2b4d3SLarry Finger rtlpriv->rtlhal.during_mac0init_radiob = true;
2497f1d2b4d3SLarry Finger if (bneed_powerdown_radio)
2498f1d2b4d3SLarry Finger _rtl92d_phy_enable_rf_env(hw, erfpath,
2499f1d2b4d3SLarry Finger &u4regvalue);
2500f1d2b4d3SLarry Finger }
2501f1d2b4d3SLarry Finger rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2502f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2503f1d2b4d3SLarry Finger "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
2504f1d2b4d3SLarry Finger rtl_get_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800));
2505f1d2b4d3SLarry Finger if (bneed_powerdown_radio)
2506f1d2b4d3SLarry Finger _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2507f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.during_mac0init_radiob)
2508f1d2b4d3SLarry Finger rtl92d_phy_powerdown_anotherphy(hw, true);
2509f1d2b4d3SLarry Finger }
25106bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2511f1d2b4d3SLarry Finger }
2512f1d2b4d3SLarry Finger
_rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw * hw,bool is2t)2513f1d2b4d3SLarry Finger static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
2514f1d2b4d3SLarry Finger {
2515f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2516f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2517f1d2b4d3SLarry Finger struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2518f1d2b4d3SLarry Finger u8 tmpreg, index, rf_mode[2];
2519f1d2b4d3SLarry Finger u8 path = is2t ? 2 : 1;
2520f1d2b4d3SLarry Finger u8 i;
2521f1d2b4d3SLarry Finger u32 u4tmp, offset;
2522f1d2b4d3SLarry Finger u32 curvecount_val[CV_CURVE_CNT * 2] = {0};
2523f1d2b4d3SLarry Finger u16 timeout = 800, timecount = 0;
2524f1d2b4d3SLarry Finger
2525f1d2b4d3SLarry Finger /* Check continuous TX and Packet TX */
2526f1d2b4d3SLarry Finger tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2527f1d2b4d3SLarry Finger /* if Deal with contisuous TX case, disable all continuous TX */
2528f1d2b4d3SLarry Finger /* if Deal with Packet TX case, block all queues */
2529f1d2b4d3SLarry Finger if ((tmpreg & 0x70) != 0)
2530f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2531f1d2b4d3SLarry Finger else
2532f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2533f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F);
2534f1d2b4d3SLarry Finger for (index = 0; index < path; index++) {
2535f1d2b4d3SLarry Finger /* 1. Read original RF mode */
2536f1d2b4d3SLarry Finger offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2537f1d2b4d3SLarry Finger rf_mode[index] = rtl_read_byte(rtlpriv, offset);
2538f1d2b4d3SLarry Finger /* 2. Set RF mode = standby mode */
2539f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)index, RF_AC,
2540f1d2b4d3SLarry Finger RFREG_OFFSET_MASK, 0x010000);
2541f1d2b4d3SLarry Finger if (rtlpci->init_ready) {
2542f1d2b4d3SLarry Finger /* switch CV-curve control by LC-calibration */
2543f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2544f1d2b4d3SLarry Finger BIT(17), 0x0);
2545f1d2b4d3SLarry Finger /* 4. Set LC calibration begin */
2546f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2547f1d2b4d3SLarry Finger 0x08000, 0x01);
2548f1d2b4d3SLarry Finger }
2549f1d2b4d3SLarry Finger u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6,
2550f1d2b4d3SLarry Finger RFREG_OFFSET_MASK);
2551f1d2b4d3SLarry Finger while ((!(u4tmp & BIT(11))) && timecount <= timeout) {
2552f1d2b4d3SLarry Finger mdelay(50);
2553f1d2b4d3SLarry Finger timecount += 50;
2554f1d2b4d3SLarry Finger u4tmp = rtl_get_rfreg(hw, (enum radio_path)index,
2555f1d2b4d3SLarry Finger RF_SYN_G6, RFREG_OFFSET_MASK);
2556f1d2b4d3SLarry Finger }
2557f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2558f1d2b4d3SLarry Finger "PHY_LCK finish delay for %d ms=2\n", timecount);
25590409d504SKaixu Xia rtl_get_rfreg(hw, index, RF_SYN_G4, RFREG_OFFSET_MASK);
2560f1d2b4d3SLarry Finger if (index == 0 && rtlhal->interfaceindex == 0) {
2561f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2562f1d2b4d3SLarry Finger "path-A / 5G LCK\n");
2563f1d2b4d3SLarry Finger } else {
2564f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2565f1d2b4d3SLarry Finger "path-B / 2.4G LCK\n");
2566f1d2b4d3SLarry Finger }
25670d5e743dSKees Cook memset(curvecount_val, 0, sizeof(curvecount_val));
2568f1d2b4d3SLarry Finger /* Set LC calibration off */
2569f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2570f1d2b4d3SLarry Finger 0x08000, 0x0);
2571f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "set RF 0x18[15] = 0\n");
2572f1d2b4d3SLarry Finger /* save Curve-counting number */
2573f1d2b4d3SLarry Finger for (i = 0; i < CV_CURVE_CNT; i++) {
2574f1d2b4d3SLarry Finger u32 readval = 0, readval2 = 0;
2575f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)index, 0x3F,
2576f1d2b4d3SLarry Finger 0x7f, i);
2577f1d2b4d3SLarry Finger
2578f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)index, 0x4D,
2579f1d2b4d3SLarry Finger RFREG_OFFSET_MASK, 0x0);
2580f1d2b4d3SLarry Finger readval = rtl_get_rfreg(hw, (enum radio_path)index,
2581f1d2b4d3SLarry Finger 0x4F, RFREG_OFFSET_MASK);
2582f1d2b4d3SLarry Finger curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5;
2583f1d2b4d3SLarry Finger /* reg 0x4f [4:0] */
2584f1d2b4d3SLarry Finger /* reg 0x50 [19:10] */
2585f1d2b4d3SLarry Finger readval2 = rtl_get_rfreg(hw, (enum radio_path)index,
2586f1d2b4d3SLarry Finger 0x50, 0xffc00);
2587f1d2b4d3SLarry Finger curvecount_val[2 * i] = (((readval & 0x1F) << 10) |
2588f1d2b4d3SLarry Finger readval2);
2589f1d2b4d3SLarry Finger }
2590f1d2b4d3SLarry Finger if (index == 0 && rtlhal->interfaceindex == 0)
2591f1d2b4d3SLarry Finger _rtl92d_phy_calc_curvindex(hw, targetchnl_5g,
2592f1d2b4d3SLarry Finger curvecount_val,
2593f1d2b4d3SLarry Finger true, curveindex_5g);
2594f1d2b4d3SLarry Finger else
2595f1d2b4d3SLarry Finger _rtl92d_phy_calc_curvindex(hw, targetchnl_2g,
2596f1d2b4d3SLarry Finger curvecount_val,
2597f1d2b4d3SLarry Finger false, curveindex_2g);
2598f1d2b4d3SLarry Finger /* switch CV-curve control mode */
2599f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2600f1d2b4d3SLarry Finger BIT(17), 0x1);
2601f1d2b4d3SLarry Finger }
2602f1d2b4d3SLarry Finger
2603f1d2b4d3SLarry Finger /* Restore original situation */
2604f1d2b4d3SLarry Finger for (index = 0; index < path; index++) {
2605f1d2b4d3SLarry Finger offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2606f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, offset, 0x50);
2607f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, offset, rf_mode[index]);
2608f1d2b4d3SLarry Finger }
2609f1d2b4d3SLarry Finger if ((tmpreg & 0x70) != 0)
2610f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2611f1d2b4d3SLarry Finger else /*Deal with Packet TX case */
2612f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2613f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00);
2614f1d2b4d3SLarry Finger _rtl92d_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel);
2615f1d2b4d3SLarry Finger }
2616f1d2b4d3SLarry Finger
_rtl92d_phy_lc_calibrate(struct ieee80211_hw * hw,bool is2t)2617f1d2b4d3SLarry Finger static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2618f1d2b4d3SLarry Finger {
2619f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2620f1d2b4d3SLarry Finger
2621f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "cosa PHY_LCK ver=2\n");
2622f1d2b4d3SLarry Finger _rtl92d_phy_lc_calibrate_sw(hw, is2t);
2623f1d2b4d3SLarry Finger }
2624f1d2b4d3SLarry Finger
rtl92d_phy_lc_calibrate(struct ieee80211_hw * hw)2625f1d2b4d3SLarry Finger void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
2626f1d2b4d3SLarry Finger {
2627f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2628f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2629f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2630f1d2b4d3SLarry Finger u32 timeout = 2000, timecount = 0;
2631f1d2b4d3SLarry Finger
2632f1d2b4d3SLarry Finger while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2633f1d2b4d3SLarry Finger udelay(50);
2634f1d2b4d3SLarry Finger timecount += 50;
2635f1d2b4d3SLarry Finger }
2636f1d2b4d3SLarry Finger
2637f1d2b4d3SLarry Finger rtlphy->lck_inprogress = true;
2638f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK,
2639f1d2b4d3SLarry Finger "LCK:Start!!! currentband %x delay %d ms\n",
2640f1d2b4d3SLarry Finger rtlhal->current_bandtype, timecount);
2641f1d2b4d3SLarry Finger if (IS_92D_SINGLEPHY(rtlhal->version)) {
2642f1d2b4d3SLarry Finger _rtl92d_phy_lc_calibrate(hw, true);
2643f1d2b4d3SLarry Finger } else {
2644f1d2b4d3SLarry Finger /* For 1T1R */
2645f1d2b4d3SLarry Finger _rtl92d_phy_lc_calibrate(hw, false);
2646f1d2b4d3SLarry Finger }
2647f1d2b4d3SLarry Finger rtlphy->lck_inprogress = false;
2648f1d2b4d3SLarry Finger RTPRINT(rtlpriv, FINIT, INIT_IQK, "LCK:Finish!!!\n");
2649f1d2b4d3SLarry Finger }
2650f1d2b4d3SLarry Finger
rtl92d_phy_ap_calibrate(struct ieee80211_hw * hw,s8 delta)265108aba42fSArnd Bergmann void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
2652f1d2b4d3SLarry Finger {
2653f1d2b4d3SLarry Finger return;
2654f1d2b4d3SLarry Finger }
2655f1d2b4d3SLarry Finger
_rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd * cmdtable,u32 cmdtableidx,u32 cmdtablesz,enum swchnlcmd_id cmdid,u32 para1,u32 para2,u32 msdelay)2656f1d2b4d3SLarry Finger static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
2657f1d2b4d3SLarry Finger u32 cmdtableidx, u32 cmdtablesz, enum swchnlcmd_id cmdid,
2658f1d2b4d3SLarry Finger u32 para1, u32 para2, u32 msdelay)
2659f1d2b4d3SLarry Finger {
2660f1d2b4d3SLarry Finger struct swchnlcmd *pcmd;
2661f1d2b4d3SLarry Finger
2662f1d2b4d3SLarry Finger if (cmdtable == NULL) {
2663531940f9SLarry Finger WARN_ONCE(true, "rtl8192de: cmdtable cannot be NULL\n");
2664f1d2b4d3SLarry Finger return false;
2665f1d2b4d3SLarry Finger }
2666f1d2b4d3SLarry Finger if (cmdtableidx >= cmdtablesz)
2667f1d2b4d3SLarry Finger return false;
2668f1d2b4d3SLarry Finger
2669f1d2b4d3SLarry Finger pcmd = cmdtable + cmdtableidx;
2670f1d2b4d3SLarry Finger pcmd->cmdid = cmdid;
2671f1d2b4d3SLarry Finger pcmd->para1 = para1;
2672f1d2b4d3SLarry Finger pcmd->para2 = para2;
2673f1d2b4d3SLarry Finger pcmd->msdelay = msdelay;
2674f1d2b4d3SLarry Finger return true;
2675f1d2b4d3SLarry Finger }
2676f1d2b4d3SLarry Finger
rtl92d_phy_reset_iqk_result(struct ieee80211_hw * hw)2677f1d2b4d3SLarry Finger void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
2678f1d2b4d3SLarry Finger {
2679f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2680f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2681f1d2b4d3SLarry Finger u8 i;
2682f1d2b4d3SLarry Finger
26836bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
268469831173SKees Cook "settings regs %zu default regs %d\n",
268569831173SKees Cook ARRAY_SIZE(rtlphy->iqk_matrix),
2686f1d2b4d3SLarry Finger IQK_MATRIX_REG_NUM);
2687f1d2b4d3SLarry Finger /* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
2688f1d2b4d3SLarry Finger for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
2689f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][0] = 0x100;
2690f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][2] = 0x100;
2691f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][4] = 0x100;
2692f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][6] = 0x100;
2693f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][1] = 0x0;
2694f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][3] = 0x0;
2695f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][5] = 0x0;
2696f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].value[0][7] = 0x0;
2697f1d2b4d3SLarry Finger rtlphy->iqk_matrix[i].iqk_done = false;
2698f1d2b4d3SLarry Finger }
2699f1d2b4d3SLarry Finger }
2700f1d2b4d3SLarry Finger
_rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw * hw,u8 channel,u8 * stage,u8 * step,u32 * delay)2701f1d2b4d3SLarry Finger static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
2702f1d2b4d3SLarry Finger u8 channel, u8 *stage, u8 *step,
2703f1d2b4d3SLarry Finger u32 *delay)
2704f1d2b4d3SLarry Finger {
2705f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2706f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2707f1d2b4d3SLarry Finger struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
2708f1d2b4d3SLarry Finger u32 precommoncmdcnt;
2709f1d2b4d3SLarry Finger struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
2710f1d2b4d3SLarry Finger u32 postcommoncmdcnt;
2711f1d2b4d3SLarry Finger struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
2712f1d2b4d3SLarry Finger u32 rfdependcmdcnt;
2713f1d2b4d3SLarry Finger struct swchnlcmd *currentcmd = NULL;
2714f1d2b4d3SLarry Finger u8 rfpath;
2715f1d2b4d3SLarry Finger u8 num_total_rfpath = rtlphy->num_total_rfpath;
2716f1d2b4d3SLarry Finger
2717f1d2b4d3SLarry Finger precommoncmdcnt = 0;
2718f1d2b4d3SLarry Finger _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2719f1d2b4d3SLarry Finger MAX_PRECMD_CNT,
2720f1d2b4d3SLarry Finger CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
2721f1d2b4d3SLarry Finger _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2722f1d2b4d3SLarry Finger MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
2723f1d2b4d3SLarry Finger postcommoncmdcnt = 0;
2724f1d2b4d3SLarry Finger _rtl92d_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
2725f1d2b4d3SLarry Finger MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
2726f1d2b4d3SLarry Finger rfdependcmdcnt = 0;
2727f1d2b4d3SLarry Finger _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2728f1d2b4d3SLarry Finger MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
2729f1d2b4d3SLarry Finger RF_CHNLBW, channel, 0);
2730f1d2b4d3SLarry Finger _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2731f1d2b4d3SLarry Finger MAX_RFDEPENDCMD_CNT, CMDID_END,
2732f1d2b4d3SLarry Finger 0, 0, 0);
2733f1d2b4d3SLarry Finger
2734f1d2b4d3SLarry Finger do {
2735f1d2b4d3SLarry Finger switch (*stage) {
2736f1d2b4d3SLarry Finger case 0:
2737f1d2b4d3SLarry Finger currentcmd = &precommoncmd[*step];
2738f1d2b4d3SLarry Finger break;
2739f1d2b4d3SLarry Finger case 1:
2740f1d2b4d3SLarry Finger currentcmd = &rfdependcmd[*step];
2741f1d2b4d3SLarry Finger break;
2742f1d2b4d3SLarry Finger case 2:
2743f1d2b4d3SLarry Finger currentcmd = &postcommoncmd[*step];
2744f1d2b4d3SLarry Finger break;
2745f1d2b4d3SLarry Finger }
2746f1d2b4d3SLarry Finger if (currentcmd->cmdid == CMDID_END) {
2747f1d2b4d3SLarry Finger if ((*stage) == 2) {
2748f1d2b4d3SLarry Finger return true;
2749f1d2b4d3SLarry Finger } else {
2750f1d2b4d3SLarry Finger (*stage)++;
2751f1d2b4d3SLarry Finger (*step) = 0;
2752f1d2b4d3SLarry Finger continue;
2753f1d2b4d3SLarry Finger }
2754f1d2b4d3SLarry Finger }
2755f1d2b4d3SLarry Finger switch (currentcmd->cmdid) {
2756f1d2b4d3SLarry Finger case CMDID_SET_TXPOWEROWER_LEVEL:
2757f1d2b4d3SLarry Finger rtl92d_phy_set_txpower_level(hw, channel);
2758f1d2b4d3SLarry Finger break;
2759f1d2b4d3SLarry Finger case CMDID_WRITEPORT_ULONG:
2760f1d2b4d3SLarry Finger rtl_write_dword(rtlpriv, currentcmd->para1,
2761f1d2b4d3SLarry Finger currentcmd->para2);
2762f1d2b4d3SLarry Finger break;
2763f1d2b4d3SLarry Finger case CMDID_WRITEPORT_USHORT:
2764f1d2b4d3SLarry Finger rtl_write_word(rtlpriv, currentcmd->para1,
2765f1d2b4d3SLarry Finger (u16)currentcmd->para2);
2766f1d2b4d3SLarry Finger break;
2767f1d2b4d3SLarry Finger case CMDID_WRITEPORT_UCHAR:
2768f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, currentcmd->para1,
2769f1d2b4d3SLarry Finger (u8)currentcmd->para2);
2770f1d2b4d3SLarry Finger break;
2771f1d2b4d3SLarry Finger case CMDID_RF_WRITEREG:
2772f1d2b4d3SLarry Finger for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
2773f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[rfpath] =
2774f1d2b4d3SLarry Finger ((rtlphy->rfreg_chnlval[rfpath] &
2775f1d2b4d3SLarry Finger 0xffffff00) | currentcmd->para2);
2776f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.current_bandtype ==
2777f1d2b4d3SLarry Finger BAND_ON_5G) {
2778f1d2b4d3SLarry Finger if (currentcmd->para2 > 99)
2779f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[rfpath] =
2780f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval
2781f1d2b4d3SLarry Finger [rfpath] | (BIT(18));
2782f1d2b4d3SLarry Finger else
2783f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[rfpath] =
2784f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval
2785f1d2b4d3SLarry Finger [rfpath] & (~BIT(18));
2786f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[rfpath] |=
2787f1d2b4d3SLarry Finger (BIT(16) | BIT(8));
2788f1d2b4d3SLarry Finger } else {
2789f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[rfpath] &=
2790f1d2b4d3SLarry Finger ~(BIT(8) | BIT(16) | BIT(18));
2791f1d2b4d3SLarry Finger }
2792f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)rfpath,
2793f1d2b4d3SLarry Finger currentcmd->para1,
2794f1d2b4d3SLarry Finger RFREG_OFFSET_MASK,
2795f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[rfpath]);
2796f1d2b4d3SLarry Finger _rtl92d_phy_reload_imr_setting(hw, channel,
2797f1d2b4d3SLarry Finger rfpath);
2798f1d2b4d3SLarry Finger }
2799f1d2b4d3SLarry Finger _rtl92d_phy_switch_rf_setting(hw, channel);
2800f1d2b4d3SLarry Finger /* do IQK when all parameters are ready */
2801f1d2b4d3SLarry Finger rtl92d_phy_reload_iqk_setting(hw, channel);
2802f1d2b4d3SLarry Finger break;
2803f1d2b4d3SLarry Finger default:
2804b8c79f45SLarry Finger pr_err("switch case %#x not processed\n",
2805ad574889SJoe Perches currentcmd->cmdid);
2806f1d2b4d3SLarry Finger break;
2807f1d2b4d3SLarry Finger }
2808f1d2b4d3SLarry Finger break;
2809f1d2b4d3SLarry Finger } while (true);
2810f1d2b4d3SLarry Finger (*delay) = currentcmd->msdelay;
2811f1d2b4d3SLarry Finger (*step)++;
2812f1d2b4d3SLarry Finger return false;
2813f1d2b4d3SLarry Finger }
2814f1d2b4d3SLarry Finger
rtl92d_phy_sw_chnl(struct ieee80211_hw * hw)2815f1d2b4d3SLarry Finger u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
2816f1d2b4d3SLarry Finger {
2817f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2818f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2819f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2820f1d2b4d3SLarry Finger u32 delay;
2821f1d2b4d3SLarry Finger u32 timeout = 1000, timecount = 0;
2822f1d2b4d3SLarry Finger u8 channel = rtlphy->current_channel;
2823f1d2b4d3SLarry Finger u32 ret_value;
2824f1d2b4d3SLarry Finger
2825f1d2b4d3SLarry Finger if (rtlphy->sw_chnl_inprogress)
2826f1d2b4d3SLarry Finger return 0;
2827f1d2b4d3SLarry Finger if (rtlphy->set_bwmode_inprogress)
2828f1d2b4d3SLarry Finger return 0;
2829f1d2b4d3SLarry Finger
2830f1d2b4d3SLarry Finger if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
28316bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
2832f1d2b4d3SLarry Finger "sw_chnl_inprogress false driver sleep or unload\n");
2833f1d2b4d3SLarry Finger return 0;
2834f1d2b4d3SLarry Finger }
2835f1d2b4d3SLarry Finger while (rtlphy->lck_inprogress && timecount < timeout) {
2836f1d2b4d3SLarry Finger mdelay(50);
2837f1d2b4d3SLarry Finger timecount += 50;
2838f1d2b4d3SLarry Finger }
2839f1d2b4d3SLarry Finger if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
2840f1d2b4d3SLarry Finger rtlhal->bandset == BAND_ON_BOTH) {
2841f1d2b4d3SLarry Finger ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
2842f1d2b4d3SLarry Finger MASKDWORD);
2843f1d2b4d3SLarry Finger if (rtlphy->current_channel > 14 && !(ret_value & BIT(0)))
2844f1d2b4d3SLarry Finger rtl92d_phy_switch_wirelessband(hw, BAND_ON_5G);
2845f1d2b4d3SLarry Finger else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0)))
2846f1d2b4d3SLarry Finger rtl92d_phy_switch_wirelessband(hw, BAND_ON_2_4G);
2847f1d2b4d3SLarry Finger }
2848f1d2b4d3SLarry Finger switch (rtlhal->current_bandtype) {
2849f1d2b4d3SLarry Finger case BAND_ON_5G:
2850f1d2b4d3SLarry Finger /* Get first channel error when change between
2851f1d2b4d3SLarry Finger * 5G and 2.4G band. */
285269831173SKees Cook if (WARN_ONCE(channel <= 14, "rtl8192de: 5G but channel<=14\n"))
2853f1d2b4d3SLarry Finger return 0;
2854f1d2b4d3SLarry Finger break;
2855f1d2b4d3SLarry Finger case BAND_ON_2_4G:
2856f1d2b4d3SLarry Finger /* Get first channel error when change between
2857f1d2b4d3SLarry Finger * 5G and 2.4G band. */
285869831173SKees Cook if (WARN_ONCE(channel > 14, "rtl8192de: 2G but channel>14\n"))
2859f1d2b4d3SLarry Finger return 0;
2860f1d2b4d3SLarry Finger break;
2861f1d2b4d3SLarry Finger default:
2862531940f9SLarry Finger WARN_ONCE(true, "rtl8192de: Invalid WirelessMode(%#x)!!\n",
2863f1d2b4d3SLarry Finger rtlpriv->mac80211.mode);
2864f1d2b4d3SLarry Finger break;
2865f1d2b4d3SLarry Finger }
2866f1d2b4d3SLarry Finger rtlphy->sw_chnl_inprogress = true;
2867f1d2b4d3SLarry Finger if (channel == 0)
2868f1d2b4d3SLarry Finger channel = 1;
2869f1d2b4d3SLarry Finger rtlphy->sw_chnl_stage = 0;
2870f1d2b4d3SLarry Finger rtlphy->sw_chnl_step = 0;
28716bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
2872f1d2b4d3SLarry Finger "switch to channel%d\n", rtlphy->current_channel);
2873f1d2b4d3SLarry Finger
2874f1d2b4d3SLarry Finger do {
2875f1d2b4d3SLarry Finger if (!rtlphy->sw_chnl_inprogress)
2876f1d2b4d3SLarry Finger break;
2877f1d2b4d3SLarry Finger if (!_rtl92d_phy_sw_chnl_step_by_step(hw,
2878f1d2b4d3SLarry Finger rtlphy->current_channel,
2879f1d2b4d3SLarry Finger &rtlphy->sw_chnl_stage, &rtlphy->sw_chnl_step, &delay)) {
2880f1d2b4d3SLarry Finger if (delay > 0)
2881f1d2b4d3SLarry Finger mdelay(delay);
2882f1d2b4d3SLarry Finger else
2883f1d2b4d3SLarry Finger continue;
2884f1d2b4d3SLarry Finger } else {
2885f1d2b4d3SLarry Finger rtlphy->sw_chnl_inprogress = false;
2886f1d2b4d3SLarry Finger }
2887f1d2b4d3SLarry Finger break;
2888f1d2b4d3SLarry Finger } while (true);
28896bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
2890f1d2b4d3SLarry Finger rtlphy->sw_chnl_inprogress = false;
2891f1d2b4d3SLarry Finger return 1;
2892f1d2b4d3SLarry Finger }
2893f1d2b4d3SLarry Finger
rtl92d_phy_set_io(struct ieee80211_hw * hw)2894f1d2b4d3SLarry Finger static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
2895f1d2b4d3SLarry Finger {
2896f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2897f1d2b4d3SLarry Finger struct dig_t *de_digtable = &rtlpriv->dm_digtable;
2898f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2899f1d2b4d3SLarry Finger
29006bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2901f1d2b4d3SLarry Finger "--->Cmd(%#x), set_io_inprogress(%d)\n",
2902f1d2b4d3SLarry Finger rtlphy->current_io_type, rtlphy->set_io_inprogress);
2903f1d2b4d3SLarry Finger switch (rtlphy->current_io_type) {
2904f1d2b4d3SLarry Finger case IO_CMD_RESUME_DM_BY_SCAN:
2905f1d2b4d3SLarry Finger de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2906f1d2b4d3SLarry Finger rtl92d_dm_write_dig(hw);
2907f1d2b4d3SLarry Finger rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
2908f1d2b4d3SLarry Finger break;
2909f1d2b4d3SLarry Finger case IO_CMD_PAUSE_DM_BY_SCAN:
2910f1d2b4d3SLarry Finger rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
2911f1d2b4d3SLarry Finger de_digtable->cur_igvalue = 0x37;
2912f1d2b4d3SLarry Finger rtl92d_dm_write_dig(hw);
2913f1d2b4d3SLarry Finger break;
2914f1d2b4d3SLarry Finger default:
2915b8c79f45SLarry Finger pr_err("switch case %#x not processed\n",
2916ad574889SJoe Perches rtlphy->current_io_type);
2917f1d2b4d3SLarry Finger break;
2918f1d2b4d3SLarry Finger }
2919f1d2b4d3SLarry Finger rtlphy->set_io_inprogress = false;
29206bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
2921f1d2b4d3SLarry Finger rtlphy->current_io_type);
2922f1d2b4d3SLarry Finger }
2923f1d2b4d3SLarry Finger
rtl92d_phy_set_io_cmd(struct ieee80211_hw * hw,enum io_type iotype)2924f1d2b4d3SLarry Finger bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2925f1d2b4d3SLarry Finger {
2926f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2927f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
2928f1d2b4d3SLarry Finger bool postprocessing = false;
2929f1d2b4d3SLarry Finger
29306bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2931f1d2b4d3SLarry Finger "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2932f1d2b4d3SLarry Finger iotype, rtlphy->set_io_inprogress);
2933f1d2b4d3SLarry Finger do {
2934f1d2b4d3SLarry Finger switch (iotype) {
2935f1d2b4d3SLarry Finger case IO_CMD_RESUME_DM_BY_SCAN:
29366bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2937f1d2b4d3SLarry Finger "[IO CMD] Resume DM after scan\n");
2938f1d2b4d3SLarry Finger postprocessing = true;
2939f1d2b4d3SLarry Finger break;
2940f1d2b4d3SLarry Finger case IO_CMD_PAUSE_DM_BY_SCAN:
29416bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2942f1d2b4d3SLarry Finger "[IO CMD] Pause DM before scan\n");
2943f1d2b4d3SLarry Finger postprocessing = true;
2944f1d2b4d3SLarry Finger break;
2945f1d2b4d3SLarry Finger default:
2946b8c79f45SLarry Finger pr_err("switch case %#x not processed\n",
2947b8c79f45SLarry Finger iotype);
2948f1d2b4d3SLarry Finger break;
2949f1d2b4d3SLarry Finger }
2950f1d2b4d3SLarry Finger } while (false);
2951f1d2b4d3SLarry Finger if (postprocessing && !rtlphy->set_io_inprogress) {
2952f1d2b4d3SLarry Finger rtlphy->set_io_inprogress = true;
2953f1d2b4d3SLarry Finger rtlphy->current_io_type = iotype;
2954f1d2b4d3SLarry Finger } else {
2955f1d2b4d3SLarry Finger return false;
2956f1d2b4d3SLarry Finger }
2957f1d2b4d3SLarry Finger rtl92d_phy_set_io(hw);
29586bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
2959f1d2b4d3SLarry Finger return true;
2960f1d2b4d3SLarry Finger }
2961f1d2b4d3SLarry Finger
_rtl92d_phy_set_rfon(struct ieee80211_hw * hw)2962f1d2b4d3SLarry Finger static void _rtl92d_phy_set_rfon(struct ieee80211_hw *hw)
2963f1d2b4d3SLarry Finger {
2964f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2965f1d2b4d3SLarry Finger
2966f1d2b4d3SLarry Finger /* a. SYS_CLKR 0x08[11] = 1 restore MAC clock */
2967f1d2b4d3SLarry Finger /* b. SPS_CTRL 0x11[7:0] = 0x2b */
2968f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
2969f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
2970f1d2b4d3SLarry Finger /* c. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function */
2971f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
2972f1d2b4d3SLarry Finger /* RF_ON_EXCEP(d~g): */
2973f1d2b4d3SLarry Finger /* d. APSD_CTRL 0x600[7:0] = 0x00 */
2974f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
2975f1d2b4d3SLarry Finger /* e. SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function again */
2976f1d2b4d3SLarry Finger /* f. SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function*/
2977f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
2978f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
2979f1d2b4d3SLarry Finger /* g. txpause 0x522[7:0] = 0x00 enable mac tx queue */
2980f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2981f1d2b4d3SLarry Finger }
2982f1d2b4d3SLarry Finger
_rtl92d_phy_set_rfsleep(struct ieee80211_hw * hw)2983f1d2b4d3SLarry Finger static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
2984f1d2b4d3SLarry Finger {
2985f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
2986f1d2b4d3SLarry Finger u32 u4btmp;
2987f1d2b4d3SLarry Finger u8 delay = 5;
2988f1d2b4d3SLarry Finger
2989f1d2b4d3SLarry Finger /* a. TXPAUSE 0x522[7:0] = 0xFF Pause MAC TX queue */
2990f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2991f1d2b4d3SLarry Finger /* b. RF path 0 offset 0x00 = 0x00 disable RF */
2992f1d2b4d3SLarry Finger rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
2993f1d2b4d3SLarry Finger /* c. APSD_CTRL 0x600[7:0] = 0x40 */
2994f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
2995f1d2b4d3SLarry Finger /* d. APSD_CTRL 0x600[7:0] = 0x00
2996f1d2b4d3SLarry Finger * APSD_CTRL 0x600[7:0] = 0x00
2997f1d2b4d3SLarry Finger * RF path 0 offset 0x00 = 0x00
2998f1d2b4d3SLarry Finger * APSD_CTRL 0x600[7:0] = 0x40
2999f1d2b4d3SLarry Finger * */
3000f1d2b4d3SLarry Finger u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3001f1d2b4d3SLarry Finger while (u4btmp != 0 && delay > 0) {
3002f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
3003f1d2b4d3SLarry Finger rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3004f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3005f1d2b4d3SLarry Finger u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3006f1d2b4d3SLarry Finger delay--;
3007f1d2b4d3SLarry Finger }
3008f1d2b4d3SLarry Finger if (delay == 0) {
3009f1d2b4d3SLarry Finger /* Jump out the LPS turn off sequence to RF_ON_EXCEP */
3010f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3011f1d2b4d3SLarry Finger
3012f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3013f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3014f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
30156bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
3016f1d2b4d3SLarry Finger "Fail !!! Switch RF timeout\n");
3017f1d2b4d3SLarry Finger return;
3018f1d2b4d3SLarry Finger }
3019f1d2b4d3SLarry Finger /* e. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */
3020f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3021f1d2b4d3SLarry Finger /* f. SPS_CTRL 0x11[7:0] = 0x22 */
3022f1d2b4d3SLarry Finger if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3023f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3024f1d2b4d3SLarry Finger /* g. SYS_CLKR 0x08[11] = 0 gated MAC clock */
3025f1d2b4d3SLarry Finger }
3026f1d2b4d3SLarry Finger
rtl92d_phy_set_rf_power_state(struct ieee80211_hw * hw,enum rf_pwrstate rfpwr_state)3027f1d2b4d3SLarry Finger bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3028f1d2b4d3SLarry Finger enum rf_pwrstate rfpwr_state)
3029f1d2b4d3SLarry Finger {
3030f1d2b4d3SLarry Finger
3031f1d2b4d3SLarry Finger bool bresult = true;
3032f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
3033f1d2b4d3SLarry Finger struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3034f1d2b4d3SLarry Finger struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3035f1d2b4d3SLarry Finger struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3036f1d2b4d3SLarry Finger struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3037f1d2b4d3SLarry Finger u8 i, queue_id;
3038f1d2b4d3SLarry Finger struct rtl8192_tx_ring *ring = NULL;
3039f1d2b4d3SLarry Finger
3040f1d2b4d3SLarry Finger if (rfpwr_state == ppsc->rfpwr_state)
3041f1d2b4d3SLarry Finger return false;
3042f1d2b4d3SLarry Finger switch (rfpwr_state) {
3043f1d2b4d3SLarry Finger case ERFON:
3044f1d2b4d3SLarry Finger if ((ppsc->rfpwr_state == ERFOFF) &&
3045f1d2b4d3SLarry Finger RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3046f1d2b4d3SLarry Finger bool rtstatus;
3047b83faedaSLarry Finger u32 initializecount = 0;
3048f1d2b4d3SLarry Finger do {
3049b83faedaSLarry Finger initializecount++;
30506bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3051f1d2b4d3SLarry Finger "IPS Set eRf nic enable\n");
3052f1d2b4d3SLarry Finger rtstatus = rtl_ps_enable_nic(hw);
3053b83faedaSLarry Finger } while (!rtstatus && (initializecount < 10));
3054f1d2b4d3SLarry Finger
3055f1d2b4d3SLarry Finger RT_CLEAR_PS_LEVEL(ppsc,
3056f1d2b4d3SLarry Finger RT_RF_OFF_LEVL_HALT_NIC);
3057f1d2b4d3SLarry Finger } else {
30586bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
30596bf8bc19SLarry Finger "awake, slept:%d ms state_inap:%x\n",
3060f1d2b4d3SLarry Finger jiffies_to_msecs(jiffies -
3061f1d2b4d3SLarry Finger ppsc->last_sleep_jiffies),
3062f1d2b4d3SLarry Finger rtlpriv->psc.state_inap);
3063f1d2b4d3SLarry Finger ppsc->last_awake_jiffies = jiffies;
3064f1d2b4d3SLarry Finger _rtl92d_phy_set_rfon(hw);
3065f1d2b4d3SLarry Finger }
3066f1d2b4d3SLarry Finger
3067f1d2b4d3SLarry Finger if (mac->link_state == MAC80211_LINKED)
3068f1d2b4d3SLarry Finger rtlpriv->cfg->ops->led_control(hw,
3069f1d2b4d3SLarry Finger LED_CTL_LINK);
3070f1d2b4d3SLarry Finger else
3071f1d2b4d3SLarry Finger rtlpriv->cfg->ops->led_control(hw,
3072f1d2b4d3SLarry Finger LED_CTL_NO_LINK);
3073f1d2b4d3SLarry Finger break;
3074f1d2b4d3SLarry Finger case ERFOFF:
3075f1d2b4d3SLarry Finger if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
30766bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3077f1d2b4d3SLarry Finger "IPS Set eRf nic disable\n");
3078f1d2b4d3SLarry Finger rtl_ps_disable_nic(hw);
3079f1d2b4d3SLarry Finger RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3080f1d2b4d3SLarry Finger } else {
3081f1d2b4d3SLarry Finger if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
3082f1d2b4d3SLarry Finger rtlpriv->cfg->ops->led_control(hw,
3083f1d2b4d3SLarry Finger LED_CTL_NO_LINK);
3084f1d2b4d3SLarry Finger else
3085f1d2b4d3SLarry Finger rtlpriv->cfg->ops->led_control(hw,
3086f1d2b4d3SLarry Finger LED_CTL_POWER_OFF);
3087f1d2b4d3SLarry Finger }
3088f1d2b4d3SLarry Finger break;
3089f1d2b4d3SLarry Finger case ERFSLEEP:
3090f1d2b4d3SLarry Finger if (ppsc->rfpwr_state == ERFOFF)
3091f1d2b4d3SLarry Finger return false;
3092f1d2b4d3SLarry Finger
3093f1d2b4d3SLarry Finger for (queue_id = 0, i = 0;
3094f1d2b4d3SLarry Finger queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3095f1d2b4d3SLarry Finger ring = &pcipriv->dev.tx_ring[queue_id];
3096f1d2b4d3SLarry Finger if (skb_queue_len(&ring->queue) == 0 ||
3097f1d2b4d3SLarry Finger queue_id == BEACON_QUEUE) {
3098f1d2b4d3SLarry Finger queue_id++;
3099f1d2b4d3SLarry Finger continue;
3100f1d2b4d3SLarry Finger } else if (rtlpci->pdev->current_state != PCI_D0) {
31016bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
3102f1d2b4d3SLarry Finger "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n",
3103f1d2b4d3SLarry Finger i + 1, queue_id);
3104f1d2b4d3SLarry Finger break;
3105f1d2b4d3SLarry Finger } else {
31066bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3107f1d2b4d3SLarry Finger "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3108f1d2b4d3SLarry Finger i + 1, queue_id,
3109f1d2b4d3SLarry Finger skb_queue_len(&ring->queue));
3110f1d2b4d3SLarry Finger udelay(10);
3111f1d2b4d3SLarry Finger i++;
3112f1d2b4d3SLarry Finger }
3113f1d2b4d3SLarry Finger
3114f1d2b4d3SLarry Finger if (i >= MAX_DOZE_WAITING_TIMES_9x) {
31156bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3116f1d2b4d3SLarry Finger "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
3117f1d2b4d3SLarry Finger MAX_DOZE_WAITING_TIMES_9x, queue_id,
3118f1d2b4d3SLarry Finger skb_queue_len(&ring->queue));
3119f1d2b4d3SLarry Finger break;
3120f1d2b4d3SLarry Finger }
3121f1d2b4d3SLarry Finger }
31226bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
31236bf8bc19SLarry Finger "Set rfsleep awakened:%d ms\n",
3124f1d2b4d3SLarry Finger jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
31256bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
31266bf8bc19SLarry Finger "sleep awakened:%d ms state_inap:%x\n",
3127f1d2b4d3SLarry Finger jiffies_to_msecs(jiffies -
3128f1d2b4d3SLarry Finger ppsc->last_awake_jiffies),
3129f1d2b4d3SLarry Finger rtlpriv->psc.state_inap);
3130f1d2b4d3SLarry Finger ppsc->last_sleep_jiffies = jiffies;
3131f1d2b4d3SLarry Finger _rtl92d_phy_set_rfsleep(hw);
3132f1d2b4d3SLarry Finger break;
3133f1d2b4d3SLarry Finger default:
3134b8c79f45SLarry Finger pr_err("switch case %#x not processed\n",
3135b8c79f45SLarry Finger rfpwr_state);
3136f1d2b4d3SLarry Finger bresult = false;
3137f1d2b4d3SLarry Finger break;
3138f1d2b4d3SLarry Finger }
3139f1d2b4d3SLarry Finger if (bresult)
3140f1d2b4d3SLarry Finger ppsc->rfpwr_state = rfpwr_state;
3141f1d2b4d3SLarry Finger return bresult;
3142f1d2b4d3SLarry Finger }
3143f1d2b4d3SLarry Finger
rtl92d_phy_config_macphymode(struct ieee80211_hw * hw)3144f1d2b4d3SLarry Finger void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
3145f1d2b4d3SLarry Finger {
3146f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
3147f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3148f1d2b4d3SLarry Finger u8 offset = REG_MAC_PHY_CTRL_NORMAL;
3149f1d2b4d3SLarry Finger
3150f1d2b4d3SLarry Finger switch (rtlhal->macphymode) {
3151f1d2b4d3SLarry Finger case DUALMAC_DUALPHY:
31526bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3153f1d2b4d3SLarry Finger "MacPhyMode: DUALMAC_DUALPHY\n");
3154f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, offset, 0xF3);
3155f1d2b4d3SLarry Finger break;
3156f1d2b4d3SLarry Finger case SINGLEMAC_SINGLEPHY:
31576bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3158f1d2b4d3SLarry Finger "MacPhyMode: SINGLEMAC_SINGLEPHY\n");
3159f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, offset, 0xF4);
3160f1d2b4d3SLarry Finger break;
3161f1d2b4d3SLarry Finger case DUALMAC_SINGLEPHY:
31626bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3163f1d2b4d3SLarry Finger "MacPhyMode: DUALMAC_SINGLEPHY\n");
3164f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, offset, 0xF1);
3165f1d2b4d3SLarry Finger break;
3166f1d2b4d3SLarry Finger }
3167f1d2b4d3SLarry Finger }
3168f1d2b4d3SLarry Finger
rtl92d_phy_config_macphymode_info(struct ieee80211_hw * hw)3169f1d2b4d3SLarry Finger void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
3170f1d2b4d3SLarry Finger {
3171f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
3172f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3173f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
3174f1d2b4d3SLarry Finger
3175f1d2b4d3SLarry Finger switch (rtlhal->macphymode) {
3176f1d2b4d3SLarry Finger case DUALMAC_SINGLEPHY:
3177f1d2b4d3SLarry Finger rtlphy->rf_type = RF_2T2R;
3178f1d2b4d3SLarry Finger rtlhal->version |= RF_TYPE_2T2R;
3179f1d2b4d3SLarry Finger rtlhal->bandset = BAND_ON_BOTH;
3180f1d2b4d3SLarry Finger rtlhal->current_bandtype = BAND_ON_2_4G;
3181f1d2b4d3SLarry Finger break;
3182f1d2b4d3SLarry Finger
3183f1d2b4d3SLarry Finger case SINGLEMAC_SINGLEPHY:
3184f1d2b4d3SLarry Finger rtlphy->rf_type = RF_2T2R;
3185f1d2b4d3SLarry Finger rtlhal->version |= RF_TYPE_2T2R;
3186f1d2b4d3SLarry Finger rtlhal->bandset = BAND_ON_BOTH;
3187f1d2b4d3SLarry Finger rtlhal->current_bandtype = BAND_ON_2_4G;
3188f1d2b4d3SLarry Finger break;
3189f1d2b4d3SLarry Finger
3190f1d2b4d3SLarry Finger case DUALMAC_DUALPHY:
3191f1d2b4d3SLarry Finger rtlphy->rf_type = RF_1T1R;
3192f1d2b4d3SLarry Finger rtlhal->version &= RF_TYPE_1T1R;
3193f1d2b4d3SLarry Finger /* Now we let MAC0 run on 5G band. */
3194f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
3195f1d2b4d3SLarry Finger rtlhal->bandset = BAND_ON_5G;
3196f1d2b4d3SLarry Finger rtlhal->current_bandtype = BAND_ON_5G;
3197f1d2b4d3SLarry Finger } else {
3198f1d2b4d3SLarry Finger rtlhal->bandset = BAND_ON_2_4G;
3199f1d2b4d3SLarry Finger rtlhal->current_bandtype = BAND_ON_2_4G;
3200f1d2b4d3SLarry Finger }
3201f1d2b4d3SLarry Finger break;
3202f1d2b4d3SLarry Finger default:
3203f1d2b4d3SLarry Finger break;
3204f1d2b4d3SLarry Finger }
3205f1d2b4d3SLarry Finger }
3206f1d2b4d3SLarry Finger
rtl92d_get_chnlgroup_fromarray(u8 chnl)3207f1d2b4d3SLarry Finger u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
3208f1d2b4d3SLarry Finger {
3209f1d2b4d3SLarry Finger u8 group;
3210f1d2b4d3SLarry Finger
3211b05897caSColin Ian King if (channel_all[chnl] <= 3)
3212f1d2b4d3SLarry Finger group = 0;
3213b05897caSColin Ian King else if (channel_all[chnl] <= 9)
3214f1d2b4d3SLarry Finger group = 1;
3215b05897caSColin Ian King else if (channel_all[chnl] <= 14)
3216f1d2b4d3SLarry Finger group = 2;
3217b05897caSColin Ian King else if (channel_all[chnl] <= 44)
3218f1d2b4d3SLarry Finger group = 3;
3219b05897caSColin Ian King else if (channel_all[chnl] <= 54)
3220f1d2b4d3SLarry Finger group = 4;
3221b05897caSColin Ian King else if (channel_all[chnl] <= 64)
3222f1d2b4d3SLarry Finger group = 5;
3223b05897caSColin Ian King else if (channel_all[chnl] <= 112)
3224f1d2b4d3SLarry Finger group = 6;
3225b05897caSColin Ian King else if (channel_all[chnl] <= 126)
3226f1d2b4d3SLarry Finger group = 7;
3227b05897caSColin Ian King else if (channel_all[chnl] <= 140)
3228f1d2b4d3SLarry Finger group = 8;
3229b05897caSColin Ian King else if (channel_all[chnl] <= 153)
3230f1d2b4d3SLarry Finger group = 9;
3231b05897caSColin Ian King else if (channel_all[chnl] <= 159)
3232f1d2b4d3SLarry Finger group = 10;
3233f1d2b4d3SLarry Finger else
3234f1d2b4d3SLarry Finger group = 11;
3235f1d2b4d3SLarry Finger return group;
3236f1d2b4d3SLarry Finger }
3237f1d2b4d3SLarry Finger
rtl92d_phy_set_poweron(struct ieee80211_hw * hw)3238f1d2b4d3SLarry Finger void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
3239f1d2b4d3SLarry Finger {
3240f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
3241f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3242f1d2b4d3SLarry Finger unsigned long flags;
3243f1d2b4d3SLarry Finger u8 value8;
3244f1d2b4d3SLarry Finger u16 i;
3245f1d2b4d3SLarry Finger u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1);
3246f1d2b4d3SLarry Finger
3247f1d2b4d3SLarry Finger /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */
3248f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3249f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, mac_reg);
3250f1d2b4d3SLarry Finger value8 |= BIT(1);
3251f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, mac_reg, value8);
3252f1d2b4d3SLarry Finger } else {
3253f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, mac_reg);
3254f1d2b4d3SLarry Finger value8 &= (~BIT(1));
3255f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, mac_reg, value8);
3256f1d2b4d3SLarry Finger }
3257f1d2b4d3SLarry Finger
3258f1d2b4d3SLarry Finger if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3259f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3260f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3261f1d2b4d3SLarry Finger } else {
3262f1d2b4d3SLarry Finger spin_lock_irqsave(&globalmutex_power, flags);
3263f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
3264f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3265f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3266f1d2b4d3SLarry Finger } else {
3267f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, REG_MAC1);
3268f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON);
3269f1d2b4d3SLarry Finger }
3270f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3271f1d2b4d3SLarry Finger spin_unlock_irqrestore(&globalmutex_power, flags);
3272f1d2b4d3SLarry Finger for (i = 0; i < 200; i++) {
3273f1d2b4d3SLarry Finger if ((value8 & BIT(7)) == 0) {
3274f1d2b4d3SLarry Finger break;
3275f1d2b4d3SLarry Finger } else {
3276f1d2b4d3SLarry Finger udelay(500);
3277f1d2b4d3SLarry Finger spin_lock_irqsave(&globalmutex_power, flags);
3278f1d2b4d3SLarry Finger value8 = rtl_read_byte(rtlpriv,
3279f1d2b4d3SLarry Finger REG_POWER_OFF_IN_PROCESS);
3280f1d2b4d3SLarry Finger spin_unlock_irqrestore(&globalmutex_power,
3281f1d2b4d3SLarry Finger flags);
3282f1d2b4d3SLarry Finger }
3283f1d2b4d3SLarry Finger }
3284f1d2b4d3SLarry Finger if (i == 200)
3285531940f9SLarry Finger WARN_ONCE(true, "rtl8192de: Another mac power off over time\n");
3286f1d2b4d3SLarry Finger }
3287f1d2b4d3SLarry Finger }
3288f1d2b4d3SLarry Finger
rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw * hw)3289f1d2b4d3SLarry Finger void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
3290f1d2b4d3SLarry Finger {
3291f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
3292f1d2b4d3SLarry Finger
3293f1d2b4d3SLarry Finger switch (rtlpriv->rtlhal.macphymode) {
3294f1d2b4d3SLarry Finger case DUALMAC_DUALPHY:
3295f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3296f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3297f1d2b4d3SLarry Finger rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3298f1d2b4d3SLarry Finger break;
3299f1d2b4d3SLarry Finger case DUALMAC_SINGLEPHY:
3300f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
3301f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3302f1d2b4d3SLarry Finger rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3303f1d2b4d3SLarry Finger break;
3304f1d2b4d3SLarry Finger case SINGLEMAC_SINGLEPHY:
3305f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3306f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
3307f1d2b4d3SLarry Finger rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
3308f1d2b4d3SLarry Finger break;
3309f1d2b4d3SLarry Finger default:
3310f1d2b4d3SLarry Finger break;
3311f1d2b4d3SLarry Finger }
3312f1d2b4d3SLarry Finger }
3313f1d2b4d3SLarry Finger
rtl92d_update_bbrf_configuration(struct ieee80211_hw * hw)3314f1d2b4d3SLarry Finger void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
3315f1d2b4d3SLarry Finger {
3316f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
3317f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3318f1d2b4d3SLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy);
3319f1d2b4d3SLarry Finger struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3320f1d2b4d3SLarry Finger u8 rfpath, i;
3321f1d2b4d3SLarry Finger
33226bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
3323f1d2b4d3SLarry Finger /* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */
3324f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3325f1d2b4d3SLarry Finger /* r_select_5G for path_A/B,0x878 */
3326f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0);
3327f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0);
3328f1d2b4d3SLarry Finger if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3329f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0);
3330f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0);
3331f1d2b4d3SLarry Finger }
3332f1d2b4d3SLarry Finger /* rssi_table_select:index 0 for 2.4G.1~3 for 5G,0xc78 */
3333f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0);
3334f1d2b4d3SLarry Finger /* fc_area 0xd2c */
3335f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0);
3336f1d2b4d3SLarry Finger /* 5G LAN ON */
3337f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa);
3338f1d2b4d3SLarry Finger /* TX BB gain shift*1,Just for testchip,0xc80,0xc88 */
3339b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD,
3340f1d2b4d3SLarry Finger 0x40000100);
3341b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
3342f1d2b4d3SLarry Finger 0x40000100);
3343f1d2b4d3SLarry Finger if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3344f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3345f1d2b4d3SLarry Finger BIT(10) | BIT(6) | BIT(5),
3346f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3347f1d2b4d3SLarry Finger (rtlefuse->eeprom_c9 & BIT(1)) |
3348f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(1)) << 4));
3349f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3350f1d2b4d3SLarry Finger BIT(10) | BIT(6) | BIT(5),
3351f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3352f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3353f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3354f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0);
3355f1d2b4d3SLarry Finger } else {
3356f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3357f1d2b4d3SLarry Finger BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3358f1d2b4d3SLarry Finger BIT(6) | BIT(5),
3359f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3360f1d2b4d3SLarry Finger (rtlefuse->eeprom_c9 & BIT(1)) |
3361f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(1)) << 4) |
3362f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(7)) << 9) |
3363f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(5)) << 12) |
3364f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(3)) << 18));
3365f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3366f1d2b4d3SLarry Finger BIT(10) | BIT(6) | BIT(5),
3367f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3368f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3369f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3370f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
3371f1d2b4d3SLarry Finger BIT(10) | BIT(6) | BIT(5),
3372f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) |
3373f1d2b4d3SLarry Finger ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) |
3374f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(2)) << 3));
3375f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3376f1d2b4d3SLarry Finger BIT(31) | BIT(15), 0);
3377f1d2b4d3SLarry Finger }
3378f1d2b4d3SLarry Finger /* 1.5V_LDO */
3379f1d2b4d3SLarry Finger } else {
3380f1d2b4d3SLarry Finger /* r_select_5G for path_A/B */
3381f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1);
3382f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1);
3383f1d2b4d3SLarry Finger if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3384f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1);
3385f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1);
3386f1d2b4d3SLarry Finger }
3387f1d2b4d3SLarry Finger /* rssi_table_select:index 0 for 2.4G.1~3 for 5G */
3388f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1);
3389f1d2b4d3SLarry Finger /* fc_area */
3390f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1);
3391f1d2b4d3SLarry Finger /* 5G LAN ON */
3392f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0);
3393f1d2b4d3SLarry Finger /* TX BB gain shift,Just for testchip,0xc80,0xc88 */
3394f1d2b4d3SLarry Finger if (rtlefuse->internal_pa_5g[0])
3395b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD,
3396f1d2b4d3SLarry Finger 0x2d4000b5);
3397f1d2b4d3SLarry Finger else
3398b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD,
3399f1d2b4d3SLarry Finger 0x20000080);
3400f1d2b4d3SLarry Finger if (rtlefuse->internal_pa_5g[1])
3401b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
3402f1d2b4d3SLarry Finger 0x2d4000b5);
3403f1d2b4d3SLarry Finger else
3404b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
3405f1d2b4d3SLarry Finger 0x20000080);
3406f1d2b4d3SLarry Finger if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3407f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3408f1d2b4d3SLarry Finger BIT(10) | BIT(6) | BIT(5),
3409f1d2b4d3SLarry Finger (rtlefuse->eeprom_cc & BIT(5)));
3410f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3411f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3412f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15),
3413f1d2b4d3SLarry Finger (rtlefuse->eeprom_cc & BIT(4)) >> 4);
3414f1d2b4d3SLarry Finger } else {
3415f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3416f1d2b4d3SLarry Finger BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3417f1d2b4d3SLarry Finger BIT(6) | BIT(5),
3418f1d2b4d3SLarry Finger (rtlefuse->eeprom_cc & BIT(5)) |
3419f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(7)) << 14));
3420f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3421f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3422f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10),
3423f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(6)) >> 6));
3424f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3425f1d2b4d3SLarry Finger BIT(31) | BIT(15),
3426f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(4)) >> 4) |
3427f1d2b4d3SLarry Finger ((rtlefuse->eeprom_cc & BIT(6)) << 10));
3428f1d2b4d3SLarry Finger }
3429f1d2b4d3SLarry Finger }
3430f1d2b4d3SLarry Finger /* update IQK related settings */
3431f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100);
3432f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100);
3433b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000, 0x00);
3434f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) |
3435f1d2b4d3SLarry Finger BIT(26) | BIT(24), 0x00);
3436b83faedaSLarry Finger rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000, 0x00);
3437f1d2b4d3SLarry Finger rtl_set_bbreg(hw, 0xca0, 0xF0000000, 0x00);
3438f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00);
3439f1d2b4d3SLarry Finger
3440f1d2b4d3SLarry Finger /* Update RF */
3441f1d2b4d3SLarry Finger for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3442f1d2b4d3SLarry Finger rfpath++) {
3443f1d2b4d3SLarry Finger if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3444f1d2b4d3SLarry Finger /* MOD_AG for RF path_A 0x18 BIT8,BIT16 */
3445f1d2b4d3SLarry Finger rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) |
3446f1d2b4d3SLarry Finger BIT(18), 0);
3447f1d2b4d3SLarry Finger /* RF0x0b[16:14] =3b'111 */
3448f1d2b4d3SLarry Finger rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
3449f1d2b4d3SLarry Finger 0x1c000, 0x07);
3450f1d2b4d3SLarry Finger } else {
3451f1d2b4d3SLarry Finger /* MOD_AG for RF path_A 0x18 BIT8,BIT16 */
3452f1d2b4d3SLarry Finger rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) |
3453f1d2b4d3SLarry Finger BIT(16) | BIT(18),
3454f1d2b4d3SLarry Finger (BIT(16) | BIT(8)) >> 8);
3455f1d2b4d3SLarry Finger }
3456f1d2b4d3SLarry Finger }
3457f1d2b4d3SLarry Finger /* Update for all band. */
3458f1d2b4d3SLarry Finger /* DMDP */
3459f1d2b4d3SLarry Finger if (rtlphy->rf_type == RF_1T1R) {
3460f1d2b4d3SLarry Finger /* Use antenna 0,0xc04,0xd04 */
3461f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x11);
3462f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1);
3463f1d2b4d3SLarry Finger
3464f1d2b4d3SLarry Finger /* enable ad/da clock1 for dual-phy reg0x888 */
3465f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
3466f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) |
3467f1d2b4d3SLarry Finger BIT(13), 0x3);
3468f1d2b4d3SLarry Finger } else {
3469f1d2b4d3SLarry Finger rtl92d_phy_enable_anotherphy(hw, false);
34706bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3471f1d2b4d3SLarry Finger "MAC1 use DBI to update 0x888\n");
3472f1d2b4d3SLarry Finger /* 0x888 */
3473f1d2b4d3SLarry Finger rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
3474f1d2b4d3SLarry Finger rtl92de_read_dword_dbi(hw,
3475f1d2b4d3SLarry Finger RFPGA0_ADDALLOCKEN,
3476f1d2b4d3SLarry Finger BIT(3)) | BIT(12) | BIT(13),
3477f1d2b4d3SLarry Finger BIT(3));
3478f1d2b4d3SLarry Finger rtl92d_phy_powerdown_anotherphy(hw, false);
3479f1d2b4d3SLarry Finger }
3480f1d2b4d3SLarry Finger } else {
3481f1d2b4d3SLarry Finger /* Single PHY */
3482f1d2b4d3SLarry Finger /* Use antenna 0 & 1,0xc04,0xd04 */
3483f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x33);
3484f1d2b4d3SLarry Finger rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3);
3485f1d2b4d3SLarry Finger /* disable ad/da clock1,0x888 */
3486f1d2b4d3SLarry Finger rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0);
3487f1d2b4d3SLarry Finger }
3488f1d2b4d3SLarry Finger for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3489f1d2b4d3SLarry Finger rfpath++) {
3490f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath,
3491f1d2b4d3SLarry Finger RF_CHNLBW, RFREG_OFFSET_MASK);
3492f1d2b4d3SLarry Finger rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C,
3493f1d2b4d3SLarry Finger RFREG_OFFSET_MASK);
3494f1d2b4d3SLarry Finger }
3495f1d2b4d3SLarry Finger for (i = 0; i < 2; i++)
34966bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n",
3497f1d2b4d3SLarry Finger rtlphy->rfreg_chnlval[i]);
34986bf8bc19SLarry Finger rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n");
3499f1d2b4d3SLarry Finger
3500f1d2b4d3SLarry Finger }
3501f1d2b4d3SLarry Finger
rtl92d_phy_check_poweroff(struct ieee80211_hw * hw)3502f1d2b4d3SLarry Finger bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw)
3503f1d2b4d3SLarry Finger {
3504f1d2b4d3SLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw);
3505f1d2b4d3SLarry Finger struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3506f1d2b4d3SLarry Finger u8 u1btmp;
3507f1d2b4d3SLarry Finger unsigned long flags;
3508f1d2b4d3SLarry Finger
3509f1d2b4d3SLarry Finger if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3510f1d2b4d3SLarry Finger u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3511f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3512f1d2b4d3SLarry Finger return true;
3513f1d2b4d3SLarry Finger }
3514f1d2b4d3SLarry Finger spin_lock_irqsave(&globalmutex_power, flags);
3515f1d2b4d3SLarry Finger if (rtlhal->interfaceindex == 0) {
3516f1d2b4d3SLarry Finger u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3517f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3518f1d2b4d3SLarry Finger u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3519f1d2b4d3SLarry Finger u1btmp &= MAC1_ON;
3520f1d2b4d3SLarry Finger } else {
3521f1d2b4d3SLarry Finger u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3522f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & (~MAC1_ON));
3523f1d2b4d3SLarry Finger u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3524f1d2b4d3SLarry Finger u1btmp &= MAC0_ON;
3525f1d2b4d3SLarry Finger }
3526f1d2b4d3SLarry Finger if (u1btmp) {
3527f1d2b4d3SLarry Finger spin_unlock_irqrestore(&globalmutex_power, flags);
3528f1d2b4d3SLarry Finger return false;
3529f1d2b4d3SLarry Finger }
3530f1d2b4d3SLarry Finger u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3531f1d2b4d3SLarry Finger u1btmp |= BIT(7);
3532f1d2b4d3SLarry Finger rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp);
3533f1d2b4d3SLarry Finger spin_unlock_irqrestore(&globalmutex_power, flags);
3534f1d2b4d3SLarry Finger return true;
3535f1d2b4d3SLarry Finger }
3536