GNU Linux-libre 4.19.314-gnu1
[releases.git] / drivers / staging / rtl8723bs / hal / rtl8723b_rf6052.c
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 */