1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 /******************************************************************************
8  *
9  *
10  * Module:	rtl8192c_rf6052.c	(Source C File)
11  *
12  * Note:	Provide RF 6052 series relative API.
13  *
14  * Function:
15  *
16  * Export:
17  *
18  * Abbrev:
19  *
20  * History:
21  * Data			Who		Remark
22  *
23  * 09/25/2008	MHC		Create initial version.
24  * 11/05/2008	MHC		Add API for tw power setting.
25  *
26  *
27 ******************************************************************************/
28 
29 #include <rtl8723b_hal.h>
30 
31 /*---------------------------Define Local Constant---------------------------*/
32 /*---------------------------Define Local Constant---------------------------*/
33 
34 
35 /*------------------------Define global variable-----------------------------*/
36 /*------------------------Define global variable-----------------------------*/
37 
38 
39 /*------------------------Define local variable------------------------------*/
40 /*  2008/11/20 MH For Debug only, RF */
41 /*------------------------Define local variable------------------------------*/
42 
43 /*-----------------------------------------------------------------------------
44  * Function:    PHY_RF6052SetBandwidth()
45  *
46  * Overview:    This function is called by SetBWModeCallback8190Pci() only
47  *
48  * Input:       struct adapter *			Adapter
49  *		WIRELESS_BANDWIDTH_E	Bandwidth	20M or 40M
50  *
51  * Output:      NONE
52  *
53  * Return:      NONE
54  *
55  * Note:		For RF type 0222D
56  *---------------------------------------------------------------------------*/
57 void PHY_RF6052SetBandwidth8723B(
58 	struct adapter *Adapter, enum CHANNEL_WIDTH Bandwidth
59 ) /* 20M or 40M */
60 {
61 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
62 
63 	switch (Bandwidth) {
64 	case CHANNEL_WIDTH_20:
65 		pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT10 | BIT11);
66 		PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]);
67 		PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]);
68 		break;
69 
70 	case CHANNEL_WIDTH_40:
71 		pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT10);
72 		PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]);
73 		PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]);
74 		break;
75 
76 	default:
77 		/* RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n", Bandwidth)); */
78 		break;
79 	}
80 
81 }
82 
83 static int phy_RF6052_Config_ParaFile(struct adapter *Adapter)
84 {
85 	u32 u4RegValue = 0;
86 	u8 eRFPath;
87 	struct bb_register_def *pPhyReg;
88 
89 	int rtStatus = _SUCCESS;
90 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
91 
92 	static char sz8723RadioAFile[] = RTL8723B_PHY_RADIO_A;
93 	static char sz8723RadioBFile[] = RTL8723B_PHY_RADIO_B;
94 	static s8 sz8723BTxPwrTrackFile[] = RTL8723B_TXPWR_TRACK;
95 	char *pszRadioAFile, *pszRadioBFile, *pszTxPwrTrackFile;
96 
97 	pszRadioAFile = sz8723RadioAFile;
98 	pszRadioBFile = sz8723RadioBFile;
99 	pszTxPwrTrackFile = sz8723BTxPwrTrackFile;
100 
101 	/* 3----------------------------------------------------------------- */
102 	/* 3 <2> Initialize RF */
103 	/* 3----------------------------------------------------------------- */
104 	/* for (eRFPath = RF_PATH_A; eRFPath <pHalData->NumTotalRFPath; eRFPath++) */
105 	for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) {
106 
107 		pPhyReg = &pHalData->PHYRegDef[eRFPath];
108 
109 		/*----Store original RFENV control type----*/
110 		switch (eRFPath) {
111 		case RF_PATH_A:
112 		case RF_PATH_C:
113 			u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV);
114 			break;
115 		case RF_PATH_B:
116 		case RF_PATH_D:
117 			u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16);
118 			break;
119 		}
120 
121 		/*----Set RF_ENV enable----*/
122 		PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
123 		udelay(1);/* PlatformStallExecution(1); */
124 
125 		/*----Set RF_ENV output high----*/
126 		PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
127 		udelay(1);/* PlatformStallExecution(1); */
128 
129 		/* Set bit number of Address and Data for RF register */
130 		PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0);	/*  Set 1 to 4 bits for 8255 */
131 		udelay(1);/* PlatformStallExecution(1); */
132 
133 		PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0);	/*  Set 0 to 12  bits for 8255 */
134 		udelay(1);/* PlatformStallExecution(1); */
135 
136 		/*----Initialize RF fom connfiguration file----*/
137 		switch (eRFPath) {
138 		case RF_PATH_A:
139 			if (PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile,
140 						     eRFPath) == _FAIL) {
141 				if (HAL_STATUS_FAILURE == ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath))
142 					rtStatus = _FAIL;
143 			}
144 			break;
145 		case RF_PATH_B:
146 			if (PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile,
147 						     eRFPath) == _FAIL) {
148 				if (HAL_STATUS_FAILURE == ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath))
149 					rtStatus = _FAIL;
150 			}
151 			break;
152 		case RF_PATH_C:
153 			break;
154 		case RF_PATH_D:
155 			break;
156 		}
157 
158 		/*----Restore RFENV control type----*/
159 		switch (eRFPath) {
160 		case RF_PATH_A:
161 		case RF_PATH_C:
162 			PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
163 			break;
164 		case RF_PATH_B:
165 		case RF_PATH_D:
166 			PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
167 			break;
168 		}
169 
170 		if (rtStatus != _SUCCESS) {
171 			/* RT_TRACE(COMP_FPGA, DBG_LOUD, ("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath)); */
172 			goto phy_RF6052_Config_ParaFile_Fail;
173 		}
174 
175 	}
176 
177 	/* 3 ----------------------------------------------------------------- */
178 	/* 3 Configuration of Tx Power Tracking */
179 	/* 3 ----------------------------------------------------------------- */
180 
181 	if (PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, pszTxPwrTrackFile) ==
182 		_FAIL) {
183 		ODM_ConfigRFWithTxPwrTrackHeaderFile(&pHalData->odmpriv);
184 	}
185 
186 	/* RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile()\n")); */
187 	return rtStatus;
188 
189 phy_RF6052_Config_ParaFile_Fail:
190 	return rtStatus;
191 }
192 
193 
194 int PHY_RF6052_Config8723B(struct adapter *Adapter)
195 {
196 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
197 	int rtStatus = _SUCCESS;
198 
199 	/*  */
200 	/*  Initialize general global value */
201 	/*  */
202 	/*  TODO: Extend RF_PATH_C and RF_PATH_D in the future */
203 	if (pHalData->rf_type == RF_1T1R)
204 		pHalData->NumTotalRFPath = 1;
205 	else
206 		pHalData->NumTotalRFPath = 2;
207 
208 	/*  */
209 	/*  Config BB and RF */
210 	/*  */
211 	rtStatus = phy_RF6052_Config_ParaFile(Adapter);
212 	return rtStatus;
213 
214 }
215 
216 /* End of HalRf6052.c */
217