1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
12 * Function: PHY_CalculateBitShift
14 * OverView: Get shifted position of the BitMask
20 * Return: u32 Return the shift bit bit position of the mask
22 u32 PHY_CalculateBitShift(u32 BitMask)
26 for (i = 0; i <= 31; i++) {
27 if (((BitMask>>i) & 0x1) == 1)
36 /* ==> RF shadow Operation API Code Section!!! */
38 /*-----------------------------------------------------------------------------
39 * Function: PHY_RFShadowRead
42 * PHY_RFShadowRecorver
43 * PHY_RFShadowCompareAll
44 * PHY_RFShadowRecorverAll
45 * PHY_RFShadowCompareFlagSet
46 * PHY_RFShadowRecorverFlagSet
48 * Overview: When we set RF register, we must write shadow at first.
49 * When we are running, we must compare shadow abd locate error addr.
50 * Decide to recorver or not.
60 * 11/20/2008 MHC Create Version 0.
62 *---------------------------------------------------------------------------*/
63 u32 PHY_RFShadowRead(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
65 return RF_Shadow[eRFPath][Offset].Value;
67 } /* PHY_RFShadowRead */
70 void PHY_RFShadowWrite(
71 IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u32 Data
74 RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);
75 RF_Shadow[eRFPath][Offset].Driver_Write = true;
77 } /* PHY_RFShadowWrite */
80 bool PHY_RFShadowCompare(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
83 /* Check if we need to check the register */
84 if (RF_Shadow[eRFPath][Offset].Compare == true) {
85 reg = rtw_hal_read_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask);
86 /* Compare shadow and real rf register for 20bits!! */
87 if (RF_Shadow[eRFPath][Offset].Value != reg) {
88 /* Locate error position. */
89 RF_Shadow[eRFPath][Offset].ErrorOrNot = true;
90 /* RT_TRACE(COMP_INIT, DBG_LOUD, */
91 /* PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n", */
92 /* eRFPath, Offset, reg)); */
94 return RF_Shadow[eRFPath][Offset].ErrorOrNot;
97 } /* PHY_RFShadowCompare */
100 void PHY_RFShadowRecorver(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
102 /* Check if the address is error */
103 if (RF_Shadow[eRFPath][Offset].ErrorOrNot == true) {
104 /* Check if we need to recorver the register. */
105 if (RF_Shadow[eRFPath][Offset].Recorver == true) {
106 rtw_hal_write_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask,
107 RF_Shadow[eRFPath][Offset].Value);
108 /* RT_TRACE(COMP_INIT, DBG_LOUD, */
109 /* PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx", */
110 /* eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value)); */
114 } /* PHY_RFShadowRecorver */
117 void PHY_RFShadowCompareAll(IN PADAPTER Adapter)
120 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
122 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
123 for (Offset = 0; Offset < maxReg; Offset++) {
124 PHY_RFShadowCompare(Adapter, eRFPath, Offset);
128 } /* PHY_RFShadowCompareAll */
131 void PHY_RFShadowRecorverAll(IN PADAPTER Adapter)
134 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
136 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
137 for (Offset = 0; Offset < maxReg; Offset++) {
138 PHY_RFShadowRecorver(Adapter, eRFPath, Offset);
142 } /* PHY_RFShadowRecorverAll */
146 PHY_RFShadowCompareFlagSet(
147 IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u8 Type
150 /* Set True or False!!! */
151 RF_Shadow[eRFPath][Offset].Compare = Type;
153 } /* PHY_RFShadowCompareFlagSet */
156 void PHY_RFShadowRecorverFlagSet(
157 IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u8 Type
160 /* Set True or False!!! */
161 RF_Shadow[eRFPath][Offset].Recorver = Type;
163 } /* PHY_RFShadowRecorverFlagSet */
166 void PHY_RFShadowCompareFlagSetAll(IN PADAPTER Adapter)
169 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
171 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
172 for (Offset = 0; Offset < maxReg; Offset++) {
173 /* 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! */
174 if (Offset != 0x26 && Offset != 0x27)
175 PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, false);
177 PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, true);
181 } /* PHY_RFShadowCompareFlagSetAll */
184 void PHY_RFShadowRecorverFlagSetAll(IN PADAPTER Adapter)
187 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
189 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
190 for (Offset = 0; Offset < maxReg; Offset++) {
191 /* 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! */
192 if (Offset != 0x26 && Offset != 0x27)
193 PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, false);
195 PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, true);
199 } /* PHY_RFShadowCompareFlagSetAll */
201 void PHY_RFShadowRefresh(IN PADAPTER Adapter)
204 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
206 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
207 for (Offset = 0; Offset < maxReg; Offset++) {
208 RF_Shadow[eRFPath][Offset].Value = 0;
209 RF_Shadow[eRFPath][Offset].Compare = false;
210 RF_Shadow[eRFPath][Offset].Recorver = false;
211 RF_Shadow[eRFPath][Offset].ErrorOrNot = false;
212 RF_Shadow[eRFPath][Offset].Driver_Write = false;
216 } /* PHY_RFShadowRead */