Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / staging / rtl8723bs / hal / hal_phy.c
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 #define _HAL_PHY_C_
8
9 #include <drv_types.h>
10
11 /*  */
12 /*  ==> RF shadow Operation API Code Section!!! */
13 /*  */
14 /*-----------------------------------------------------------------------------
15  * Function:    PHY_RFShadowRead
16  *                      PHY_RFShadowWrite
17  *                      PHY_RFShadowCompare
18  *                      PHY_RFShadowRecorver
19  *                      PHY_RFShadowCompareAll
20  *                      PHY_RFShadowRecorverAll
21  *                      PHY_RFShadowCompareFlagSet
22  *                      PHY_RFShadowRecorverFlagSet
23  *
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.
27  *
28  * Input:       NONE
29  *
30  * Output:      NONE
31  *
32  * Return:      NONE
33  *
34  * Revised History:
35  * When                 Who             Remark
36  * 11/20/2008   MHC             Create Version 0.
37  *
38  *---------------------------------------------------------------------------*/
39 u32 PHY_RFShadowRead(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
40 {
41         return  RF_Shadow[eRFPath][Offset].Value;
42
43 }       /* PHY_RFShadowRead */
44
45
46 void PHY_RFShadowWrite(
47         IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u32 Data
48 )
49 {
50         RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);
51         RF_Shadow[eRFPath][Offset].Driver_Write = true;
52
53 }       /* PHY_RFShadowWrite */
54
55
56 bool PHY_RFShadowCompare(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
57 {
58         u32 reg;
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)); */
69                 }
70                 return RF_Shadow[eRFPath][Offset].ErrorOrNot;
71         }
72         return false;
73 }       /* PHY_RFShadowCompare */
74
75
76 void PHY_RFShadowRecorver(IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset)
77 {
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)); */
87                 }
88         }
89
90 }       /* PHY_RFShadowRecorver */
91
92
93 void PHY_RFShadowCompareAll(IN PADAPTER Adapter)
94 {
95         u8 eRFPath = 0;
96         u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
97
98         for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
99                 for (Offset = 0; Offset < maxReg; Offset++) {
100                         PHY_RFShadowCompare(Adapter, eRFPath, Offset);
101                 }
102         }
103
104 }       /* PHY_RFShadowCompareAll */
105
106
107 void PHY_RFShadowRecorverAll(IN PADAPTER Adapter)
108 {
109         u8 eRFPath = 0;
110         u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
111
112         for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
113                 for (Offset = 0; Offset < maxReg; Offset++) {
114                         PHY_RFShadowRecorver(Adapter, eRFPath, Offset);
115                 }
116         }
117
118 }       /* PHY_RFShadowRecorverAll */
119
120
121 void
122 PHY_RFShadowCompareFlagSet(
123         IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u8 Type
124 )
125 {
126         /*  Set True or False!!! */
127         RF_Shadow[eRFPath][Offset].Compare = Type;
128
129 }       /* PHY_RFShadowCompareFlagSet */
130
131
132 void PHY_RFShadowRecorverFlagSet(
133         IN PADAPTER Adapter, IN u8 eRFPath, IN u32 Offset, IN u8 Type
134 )
135 {
136         /*  Set True or False!!! */
137         RF_Shadow[eRFPath][Offset].Recorver = Type;
138
139 }       /* PHY_RFShadowRecorverFlagSet */
140
141
142 void PHY_RFShadowCompareFlagSetAll(IN PADAPTER Adapter)
143 {
144         u8 eRFPath = 0;
145         u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
146
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);
152                         else
153                                 PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, true);
154                 }
155         }
156
157 }       /* PHY_RFShadowCompareFlagSetAll */