1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
12 /* ==> RF shadow Operation API Code Section!!! */
14 /*-----------------------------------------------------------------------------
15 * Function: PHY_RFShadowRead
18 * PHY_RFShadowRecorver
19 * PHY_RFShadowCompareAll
20 * PHY_RFShadowRecorverAll
21 * PHY_RFShadowCompareFlagSet
22 * PHY_RFShadowRecorverFlagSet
24 * Overview: When we set RF register, we must write shadow at first.
25 * When we are running, we must compare shadow abd locate error addr.
26 * Decide to recorver or not.
36 * 11/20/2008 MHC Create Version 0.
38 *---------------------------------------------------------------------------*/
39 u32 PHY_RFShadowRead(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
41 return RF_Shadow[eRFPath][Offset].Value;
43 } /* PHY_RFShadowRead */
46 void PHY_RFShadowWrite(
47 IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u32 Data
50 RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);
51 RF_Shadow[eRFPath][Offset].Driver_Write = true;
53 } /* PHY_RFShadowWrite */
56 bool PHY_RFShadowCompare(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
59 /* Check if we need to check the register */
60 if (RF_Shadow[eRFPath][Offset].Compare == true) {
61 reg = rtw_hal_read_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask);
62 /* Compare shadow and real rf register for 20bits!! */
63 if (RF_Shadow[eRFPath][Offset].Value != reg) {
64 /* Locate error position. */
65 RF_Shadow[eRFPath][Offset].ErrorOrNot = true;
66 /* RT_TRACE(COMP_INIT, DBG_LOUD, */
67 /* PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n", */
68 /* eRFPath, Offset, reg)); */
70 return RF_Shadow[eRFPath][Offset].ErrorOrNot;
73 } /* PHY_RFShadowCompare */
76 void PHY_RFShadowRecorver(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
78 /* Check if the address is error */
79 if (RF_Shadow[eRFPath][Offset].ErrorOrNot == true) {
80 /* Check if we need to recorver the register. */
81 if (RF_Shadow[eRFPath][Offset].Recorver == true) {
82 rtw_hal_write_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask,
83 RF_Shadow[eRFPath][Offset].Value);
84 /* RT_TRACE(COMP_INIT, DBG_LOUD, */
85 /* PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx", */
86 /* eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value)); */
90 } /* PHY_RFShadowRecorver */
93 void PHY_RFShadowCompareAll(IN PADAPTER Adapter)
96 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
98 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
99 for (Offset = 0; Offset < maxReg; Offset++) {
100 PHY_RFShadowCompare(Adapter, eRFPath, Offset);
104 } /* PHY_RFShadowCompareAll */
107 void PHY_RFShadowRecorverAll(IN PADAPTER Adapter)
110 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
112 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
113 for (Offset = 0; Offset < maxReg; Offset++) {
114 PHY_RFShadowRecorver(Adapter, eRFPath, Offset);
118 } /* PHY_RFShadowRecorverAll */
122 PHY_RFShadowCompareFlagSet(
123 IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u8 Type
126 /* Set True or False!!! */
127 RF_Shadow[eRFPath][Offset].Compare = Type;
129 } /* PHY_RFShadowCompareFlagSet */
132 void PHY_RFShadowRecorverFlagSet(
133 IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u8 Type
136 /* Set True or False!!! */
137 RF_Shadow[eRFPath][Offset].Recorver = Type;
139 } /* PHY_RFShadowRecorverFlagSet */
142 void PHY_RFShadowCompareFlagSetAll(IN PADAPTER Adapter)
145 u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
147 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
148 for (Offset = 0; Offset < maxReg; Offset++) {
149 /* 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! */
150 if (Offset != 0x26 && Offset != 0x27)
151 PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, false);
153 PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, true);
157 } /* PHY_RFShadowCompareFlagSetAll */