xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8188fu/hal/rtl8188f/rtl8188f_rf6052.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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