1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2017 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 *****************************************************************************/
15 /******************************************************************************
16 *
17 *
18 * Module: rtl8192c_rf6052.c ( Source C File)
19 *
20 * Note: Provide RF 6052 series relative API.
21 *
22 * Function:
23 *
24 * Export:
25 *
26 * Abbrev:
27 *
28 * History:
29 * Data Who Remark
30 *
31 * 09/25/2008 MHC Create initial version.
32 * 11/05/2008 MHC Add API for tw power setting.
33 *
34 *
35 ******************************************************************************/
36
37 #include <rtl8188f_hal.h>
38
39 /*---------------------------Define Local Constant---------------------------*/
40 /*---------------------------Define Local Constant---------------------------*/
41
42
43 /*------------------------Define global variable-----------------------------*/
44 /*------------------------Define global variable-----------------------------*/
45
46
47 /*------------------------Define local variable------------------------------*/
48 #ifdef CONFIG_RF_SHADOW_RW
49 /* 2008/11/20 MH For Debug only, RF */
50 /*static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG] = {0}; */
51 static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];
52 #endif /*CONFIG_RF_SHADOW_RW*/
53 /*------------------------Define local variable------------------------------*/
54
55 /*-----------------------------------------------------------------------------
56 * Function: PHY_RF6052SetBandwidth()
57 *
58 * Overview: This function is called by SetBWModeCallback8190Pci() only
59 *
60 * Input: PADAPTER Adapter
61 * WIRELESS_BANDWIDTH_E Bandwidth 20M or 40M
62 *
63 * Output: NONE
64 *
65 * Return: NONE
66 *
67 * Note: For RF type 0222D
68 *---------------------------------------------------------------------------*/
69 void
PHY_RF6052SetBandwidth8188F(PADAPTER Adapter,enum channel_width Bandwidth)70 PHY_RF6052SetBandwidth8188F(
71 PADAPTER Adapter,
72 enum channel_width Bandwidth) /*20M or 40M */
73 {
74 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
75
76 switch (Bandwidth) {
77 case CHANNEL_WIDTH_20:
78 /*
79 RF_A_reg 0x18[11:10]=2'b11
80 RF_A_reg 0x87=0x00065
81 RF_A_reg 0x1c=0x00000
82 RF_A_reg 0xDF=0x00140
83 RF_A_reg 0x1b=0x00c6c (for SDIO)
84 RF_A_reg 0x1b=0x01c6c (for USB)
85 */
86 pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT10 | BIT11);
87 phy_set_rf_reg(Adapter, RF_PATH_A, 0x18, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); /* RF TRX_BW */
88
89 phy_set_rf_reg(Adapter, RF_PATH_A, 0x87, bRFRegOffsetMask, 0x00065); /* FILTER BW&RC Corner (ACPR) */
90 phy_set_rf_reg(Adapter, RF_PATH_A, 0x1C, bRFRegOffsetMask, 0x00000); /* FILTER BW&RC Corner (ACPR) */
91
92 phy_set_rf_reg(Adapter, RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* RC Corner */
93 #ifdef CONFIG_SDIO_HCI
94 phy_set_rf_reg(Adapter, RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x00C6C); /* RC Corner */
95 #endif /* CONFIG_SDIO_HCI */
96 #ifdef CONFIG_USB_HCI
97 phy_set_rf_reg(Adapter, RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x01C6C); /* RC Corner */
98 #endif
99 break;
100
101 case CHANNEL_WIDTH_40:
102 /*
103 RF_A_reg 0x18[11:10]=2'b01
104 RF_A_reg 0x87=0x00025
105 RF_A_reg 0x1c=0x00800 (for SDIO)
106 RF_A_reg 0x1c=0x01000 (for USB)
107 RF_A_reg 0xDF=0x00140
108 RF_A_reg 0x1b=0x00c6c (for SDIO)
109 RF_A_reg 0x1b=0x01c6c (for USB)
110 */
111 pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT10);
112 phy_set_rf_reg(Adapter, RF_PATH_A, 0x18, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); /* RF TRX_BW */
113
114 phy_set_rf_reg(Adapter, RF_PATH_A, 0x87, bRFRegOffsetMask, 0x00025); /* FILTER BW&RC Corner (ACPR) */
115 #ifdef CONFIG_SDIO_HCI
116 phy_set_rf_reg(Adapter, RF_PATH_A, 0x1C, bRFRegOffsetMask, 0x00800); /* FILTER BW&RC Corner (ACPR) */
117 phy_set_rf_reg(Adapter, RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* RC Corner */
118 phy_set_rf_reg(Adapter, RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x00C6C); /* RC Corner */
119 #endif /* CONFIG_SDIO_HCI */
120 #ifdef CONFIG_USB_HCI
121 phy_set_rf_reg(Adapter, RF_PATH_A, 0x1C, bRFRegOffsetMask, 0x01000); /* FILTER BW&RC Corner (ACPR) */
122 phy_set_rf_reg(Adapter, RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* RC Corner */
123 phy_set_rf_reg(Adapter, RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x01C6C); /* RC Corner */
124 #endif
125 break;
126
127 default:
128 break;
129 }
130
131 }
132
133 static int
phy_RF6052_Config_ParaFile(PADAPTER Adapter)134 phy_RF6052_Config_ParaFile(
135 PADAPTER Adapter
136 )
137 {
138 u32 u4RegValue = 0;
139 enum rf_path eRFPath;
140 BB_REGISTER_DEFINITION_T *pPhyReg;
141
142 int rtStatus = _SUCCESS;
143 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
144 struct hal_spec_t *hal_spec = GET_HAL_SPEC(Adapter);
145
146 /*3//----------------------------------------------------------------- */
147 /*3// <2> Initialize RF */
148 /*3//----------------------------------------------------------------- */
149 for (eRFPath = RF_PATH_A; eRFPath < hal_spec->rf_reg_path_num; eRFPath++) {
150
151 pPhyReg = &pHalData->PHYRegDef[eRFPath];
152
153 /*----Store original RFENV control type----*/
154 switch (eRFPath) {
155 case RF_PATH_A:
156 case RF_PATH_C:
157 u4RegValue = phy_query_bb_reg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV);
158 break;
159 case RF_PATH_B:
160 case RF_PATH_D:
161 u4RegValue = phy_query_bb_reg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV << 16);
162 break;
163 default:
164 RTW_ERR("Invalid rf_path:%d\n", eRFPath);
165 break;
166 }
167
168 /*----Set RF_ENV enable----*/
169 phy_set_bb_reg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV << 16, 0x1);
170 rtw_udelay_os(1);/*PlatformStallExecution(1); */
171
172 /*----Set RF_ENV output high----*/
173 phy_set_bb_reg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
174 rtw_udelay_os(1);/*PlatformStallExecution(1); */
175
176 /* Set bit number of Address and Data for RF register */
177 phy_set_bb_reg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); /* Set 1 to 4 bits for 8255 */
178 rtw_udelay_os(1);/*PlatformStallExecution(1); */
179
180 phy_set_bb_reg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); /* Set 0 to 12 bits for 8255 */
181 rtw_udelay_os(1);/*PlatformStallExecution(1); */
182
183 /*----Initialize RF fom connfiguration file----*/
184 switch (eRFPath) {
185 case RF_PATH_A:
186 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
187 if (PHY_ConfigRFWithParaFile(Adapter, PHY_FILE_RADIO_A, eRFPath) == _FAIL)
188 #endif
189 {
190 #ifdef CONFIG_EMBEDDED_FWIMG
191 if (odm_config_rf_with_header_file(&pHalData->odmpriv, CONFIG_RF_RADIO, eRFPath) == HAL_STATUS_FAILURE)
192 rtStatus = _FAIL;
193 #endif
194 }
195 break;
196 case RF_PATH_B:
197 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
198 if (PHY_ConfigRFWithParaFile(Adapter, PHY_FILE_RADIO_B, eRFPath) == _FAIL)
199 #endif
200 {
201 #ifdef CONFIG_EMBEDDED_FWIMG
202 if (odm_config_rf_with_header_file(&pHalData->odmpriv, CONFIG_RF_RADIO, eRFPath) == HAL_STATUS_FAILURE)
203 rtStatus = _FAIL;
204 #endif
205 }
206 break;
207 case RF_PATH_C:
208 break;
209 case RF_PATH_D:
210 break;
211 default:
212 RTW_ERR("Invalid rf_path:%d\n", eRFPath);
213 break;
214 }
215
216 /*----Restore RFENV control type----*/;
217 switch (eRFPath) {
218 case RF_PATH_A:
219 case RF_PATH_C:
220 phy_set_bb_reg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
221 break;
222 case RF_PATH_B:
223 case RF_PATH_D:
224 phy_set_bb_reg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV << 16, u4RegValue);
225 break;
226 default:
227 RTW_ERR("Invalid rf_path:%d\n", eRFPath);
228 break;
229 }
230
231 if (rtStatus != _SUCCESS) {
232 goto phy_RF6052_Config_ParaFile_Fail;
233 }
234
235 }
236
237 /*3 ----------------------------------------------------------------- */
238 /*3 Configuration of Tx Power Tracking */
239 /*3 ----------------------------------------------------------------- */
240
241 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
242 if (PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, PHY_FILE_TXPWR_TRACK) == _FAIL)
243 #endif
244 {
245 #ifdef CONFIG_EMBEDDED_FWIMG
246 odm_config_rf_with_tx_pwr_track_header_file(&pHalData->odmpriv);
247 #endif
248 }
249
250 return rtStatus;
251
252 phy_RF6052_Config_ParaFile_Fail:
253 return rtStatus;
254 }
255
256
257 int
PHY_RF6052_Config8188F(PADAPTER Adapter)258 PHY_RF6052_Config8188F(
259 PADAPTER Adapter)
260 {
261 int rtStatus = _SUCCESS;
262
263 /* */
264 /* Config BB and RF */
265 /* */
266 rtStatus = phy_RF6052_Config_ParaFile(Adapter);
267 return rtStatus;
268 }
269
270 /* End of HalRf6052.c */
271