1 // SPDX-License-Identifier: GPL-2.0 2 /****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 5 * 6 ******************************************************************************/ 7 8 #include <linux/kernel.h> 9 #include "odm_precomp.h" 10 11 static bool CheckPositive( 12 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2 13 ) 14 { 15 u8 _BoardType = 16 ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | /* _GLNA */ 17 ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | /* _GPA */ 18 ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | /* _ALNA */ 19 ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | /* _APA */ 20 ((pDM_Odm->BoardType & BIT2) >> 2) << 4; /* _BT */ 21 22 u32 cond1 = Condition1, cond2 = Condition2; 23 u32 driver1 = 24 pDM_Odm->CutVersion << 24 | 25 pDM_Odm->SupportPlatform << 16 | 26 pDM_Odm->PackageType << 12 | 27 pDM_Odm->SupportInterface << 8 | 28 _BoardType; 29 30 u32 driver2 = 31 pDM_Odm->TypeGLNA << 0 | 32 pDM_Odm->TypeGPA << 8 | 33 pDM_Odm->TypeALNA << 16 | 34 pDM_Odm->TypeAPA << 24; 35 36 ODM_RT_TRACE( 37 pDM_Odm, 38 ODM_COMP_INIT, 39 ODM_DBG_TRACE, 40 ( 41 "===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", 42 cond1, 43 cond2 44 ) 45 ); 46 ODM_RT_TRACE( 47 pDM_Odm, 48 ODM_COMP_INIT, 49 ODM_DBG_TRACE, 50 ( 51 "===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", 52 driver1, 53 driver2 54 ) 55 ); 56 57 ODM_RT_TRACE( 58 pDM_Odm, 59 ODM_COMP_INIT, 60 ODM_DBG_TRACE, 61 ( 62 " (Platform, Interface) = (0x%X, 0x%X)\n", 63 pDM_Odm->SupportPlatform, 64 pDM_Odm->SupportInterface 65 ) 66 ); 67 ODM_RT_TRACE( 68 pDM_Odm, 69 ODM_COMP_INIT, 70 ODM_DBG_TRACE, 71 ( 72 " (Board, Package) = (0x%X, 0x%X)\n", 73 pDM_Odm->BoardType, 74 pDM_Odm->PackageType 75 ) 76 ); 77 78 79 /* Value Defined Check =============== */ 80 /* QFN Type [15:12] and Cut Version [27:24] need to do value check */ 81 82 if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) 83 return false; 84 if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) 85 return false; 86 87 /* Bit Defined Check ================ */ 88 /* We don't care [31:28] and [23:20] */ 89 /* */ 90 cond1 &= 0x000F0FFF; 91 driver1 &= 0x000F0FFF; 92 93 if ((cond1 & driver1) == cond1) { 94 u32 bitMask = 0; 95 if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE */ 96 return true; 97 98 if ((cond1 & BIT0) != 0) /* GLNA */ 99 bitMask |= 0x000000FF; 100 if ((cond1 & BIT1) != 0) /* GPA */ 101 bitMask |= 0x0000FF00; 102 if ((cond1 & BIT2) != 0) /* ALNA */ 103 bitMask |= 0x00FF0000; 104 if ((cond1 & BIT3) != 0) /* APA */ 105 bitMask |= 0xFF000000; 106 107 if ((cond2 & bitMask) == (driver2 & bitMask)) /* BoardType of each RF path is matched */ 108 return true; 109 } 110 return false; 111 } 112 113 static bool CheckNegative( 114 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2 115 ) 116 { 117 return true; 118 } 119 120 /****************************************************************************** 121 * MAC_REG.TXT 122 ******************************************************************************/ 123 124 static u32 Array_MP_8723B_MAC_REG[] = { 125 0x02F, 0x00000030, 126 0x035, 0x00000000, 127 0x039, 0x00000008, 128 0x04E, 0x000000E0, 129 0x064, 0x00000000, 130 0x067, 0x00000020, 131 0x428, 0x0000000A, 132 0x429, 0x00000010, 133 0x430, 0x00000000, 134 0x431, 0x00000000, 135 0x432, 0x00000000, 136 0x433, 0x00000001, 137 0x434, 0x00000004, 138 0x435, 0x00000005, 139 0x436, 0x00000007, 140 0x437, 0x00000008, 141 0x43C, 0x00000004, 142 0x43D, 0x00000005, 143 0x43E, 0x00000007, 144 0x43F, 0x00000008, 145 0x440, 0x0000005D, 146 0x441, 0x00000001, 147 0x442, 0x00000000, 148 0x444, 0x00000010, 149 0x445, 0x00000000, 150 0x446, 0x00000000, 151 0x447, 0x00000000, 152 0x448, 0x00000000, 153 0x449, 0x000000F0, 154 0x44A, 0x0000000F, 155 0x44B, 0x0000003E, 156 0x44C, 0x00000010, 157 0x44D, 0x00000000, 158 0x44E, 0x00000000, 159 0x44F, 0x00000000, 160 0x450, 0x00000000, 161 0x451, 0x000000F0, 162 0x452, 0x0000000F, 163 0x453, 0x00000000, 164 0x456, 0x0000005E, 165 0x460, 0x00000066, 166 0x461, 0x00000066, 167 0x4C8, 0x000000FF, 168 0x4C9, 0x00000008, 169 0x4CC, 0x000000FF, 170 0x4CD, 0x000000FF, 171 0x4CE, 0x00000001, 172 0x500, 0x00000026, 173 0x501, 0x000000A2, 174 0x502, 0x0000002F, 175 0x503, 0x00000000, 176 0x504, 0x00000028, 177 0x505, 0x000000A3, 178 0x506, 0x0000005E, 179 0x507, 0x00000000, 180 0x508, 0x0000002B, 181 0x509, 0x000000A4, 182 0x50A, 0x0000005E, 183 0x50B, 0x00000000, 184 0x50C, 0x0000004F, 185 0x50D, 0x000000A4, 186 0x50E, 0x00000000, 187 0x50F, 0x00000000, 188 0x512, 0x0000001C, 189 0x514, 0x0000000A, 190 0x516, 0x0000000A, 191 0x525, 0x0000004F, 192 0x550, 0x00000010, 193 0x551, 0x00000010, 194 0x559, 0x00000002, 195 0x55C, 0x00000050, 196 0x55D, 0x000000FF, 197 0x605, 0x00000030, 198 0x608, 0x0000000E, 199 0x609, 0x0000002A, 200 0x620, 0x000000FF, 201 0x621, 0x000000FF, 202 0x622, 0x000000FF, 203 0x623, 0x000000FF, 204 0x624, 0x000000FF, 205 0x625, 0x000000FF, 206 0x626, 0x000000FF, 207 0x627, 0x000000FF, 208 0x638, 0x00000050, 209 0x63C, 0x0000000A, 210 0x63D, 0x0000000A, 211 0x63E, 0x0000000E, 212 0x63F, 0x0000000E, 213 0x640, 0x00000040, 214 0x642, 0x00000040, 215 0x643, 0x00000000, 216 0x652, 0x000000C8, 217 0x66E, 0x00000005, 218 0x700, 0x00000021, 219 0x701, 0x00000043, 220 0x702, 0x00000065, 221 0x703, 0x00000087, 222 0x708, 0x00000021, 223 0x709, 0x00000043, 224 0x70A, 0x00000065, 225 0x70B, 0x00000087, 226 0x765, 0x00000018, 227 0x76E, 0x00000004, 228 229 }; 230 231 void ODM_ReadAndConfig_MP_8723B_MAC_REG(PDM_ODM_T pDM_Odm) 232 { 233 u32 i = 0; 234 u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_MAC_REG); 235 u32 *Array = Array_MP_8723B_MAC_REG; 236 237 ODM_RT_TRACE( 238 pDM_Odm, 239 ODM_COMP_INIT, 240 ODM_DBG_LOUD, 241 ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG\n") 242 ); 243 244 for (i = 0; i < ArrayLen; i += 2) { 245 u32 v1 = Array[i]; 246 u32 v2 = Array[i+1]; 247 248 /* This (offset, data) pair doesn't care the condition. */ 249 if (v1 < 0x40000000) { 250 odm_ConfigMAC_8723B(pDM_Odm, v1, (u8)v2); 251 continue; 252 } else { 253 /* This line is the beginning of branch. */ 254 bool bMatched = true; 255 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28); 256 257 if (cCond == COND_ELSE) { /* ELSE, ENDIF */ 258 bMatched = true; 259 READ_NEXT_PAIR(v1, v2, i); 260 } else if (!CheckPositive(pDM_Odm, v1, v2)) { 261 bMatched = false; 262 READ_NEXT_PAIR(v1, v2, i); 263 READ_NEXT_PAIR(v1, v2, i); 264 } else { 265 READ_NEXT_PAIR(v1, v2, i); 266 if (!CheckNegative(pDM_Odm, v1, v2)) 267 bMatched = false; 268 else 269 bMatched = true; 270 READ_NEXT_PAIR(v1, v2, i); 271 } 272 273 if (bMatched == false) { 274 /* Condition isn't matched. Discard the following (offset, data) pairs. */ 275 while (v1 < 0x40000000 && i < ArrayLen-2) 276 READ_NEXT_PAIR(v1, v2, i); 277 278 i -= 2; /* prevent from for-loop += 2 */ 279 } else { /* Configure matched pairs and skip to end of if-else. */ 280 while (v1 < 0x40000000 && i < ArrayLen-2) { 281 odm_ConfigMAC_8723B(pDM_Odm, v1, (u8)v2); 282 READ_NEXT_PAIR(v1, v2, i); 283 } 284 285 /* Keeps reading until ENDIF. */ 286 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28); 287 while (cCond != COND_ENDIF && i < ArrayLen-2) { 288 READ_NEXT_PAIR(v1, v2, i); 289 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28); 290 } 291 } 292 } 293 } 294 } 295