linux/drivers/staging/rtl8723bs/hal/HalHWImg8723B_BB.c
<<
>>
Prefs
   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
  11static bool CheckPositive(
  12        struct dm_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
  37        /*  Value Defined Check =============== */
  38        /* QFN Type [15:12] and Cut Version [27:24] need to do value check */
  39
  40        if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
  41                return false;
  42        if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
  43                return false;
  44
  45        /*  Bit Defined Check ================ */
  46        /*  We don't care [31:28] and [23:20] */
  47        /*  */
  48        cond1   &= 0x000F0FFF;
  49        driver1 &= 0x000F0FFF;
  50
  51        if ((cond1 & driver1) == cond1) {
  52                u32 bitMask = 0;
  53
  54                if ((cond1 & 0x0F) == 0) /*  BoardType is DONTCARE */
  55                        return true;
  56
  57                if ((cond1 & BIT0) != 0) /* GLNA */
  58                        bitMask |= 0x000000FF;
  59                if ((cond1 & BIT1) != 0) /* GPA */
  60                        bitMask |= 0x0000FF00;
  61                if ((cond1 & BIT2) != 0) /* ALNA */
  62                        bitMask |= 0x00FF0000;
  63                if ((cond1 & BIT3) != 0) /* APA */
  64                        bitMask |= 0xFF000000;
  65
  66                /*  BoardType of each RF path is matched */
  67                if ((cond2 & bitMask) == (driver2 & bitMask))
  68                        return true;
  69        }
  70        return false;
  71}
  72
  73static bool CheckNegative(
  74        struct dm_odm_t *pDM_Odm, const u32  Condition1, const u32 Condition2
  75)
  76{
  77        return true;
  78}
  79
  80/******************************************************************************
  81*                           AGC_TAB.TXT
  82******************************************************************************/
  83
  84static u32 Array_MP_8723B_AGC_TAB[] = {
  85                0xC78, 0xFD000001,
  86                0xC78, 0xFC010001,
  87                0xC78, 0xFB020001,
  88                0xC78, 0xFA030001,
  89                0xC78, 0xF9040001,
  90                0xC78, 0xF8050001,
  91                0xC78, 0xF7060001,
  92                0xC78, 0xF6070001,
  93                0xC78, 0xF5080001,
  94                0xC78, 0xF4090001,
  95                0xC78, 0xF30A0001,
  96                0xC78, 0xF20B0001,
  97                0xC78, 0xF10C0001,
  98                0xC78, 0xF00D0001,
  99                0xC78, 0xEF0E0001,
 100                0xC78, 0xEE0F0001,
 101                0xC78, 0xED100001,
 102                0xC78, 0xEC110001,
 103                0xC78, 0xEB120001,
 104                0xC78, 0xEA130001,
 105                0xC78, 0xE9140001,
 106                0xC78, 0xE8150001,
 107                0xC78, 0xE7160001,
 108                0xC78, 0xE6170001,
 109                0xC78, 0xE5180001,
 110                0xC78, 0xE4190001,
 111                0xC78, 0xE31A0001,
 112                0xC78, 0xA51B0001,
 113                0xC78, 0xA41C0001,
 114                0xC78, 0xA31D0001,
 115                0xC78, 0x671E0001,
 116                0xC78, 0x661F0001,
 117                0xC78, 0x65200001,
 118                0xC78, 0x64210001,
 119                0xC78, 0x63220001,
 120                0xC78, 0x4A230001,
 121                0xC78, 0x49240001,
 122                0xC78, 0x48250001,
 123                0xC78, 0x47260001,
 124                0xC78, 0x46270001,
 125                0xC78, 0x45280001,
 126                0xC78, 0x44290001,
 127                0xC78, 0x432A0001,
 128                0xC78, 0x422B0001,
 129                0xC78, 0x292C0001,
 130                0xC78, 0x282D0001,
 131                0xC78, 0x272E0001,
 132                0xC78, 0x262F0001,
 133                0xC78, 0x0A300001,
 134                0xC78, 0x09310001,
 135                0xC78, 0x08320001,
 136                0xC78, 0x07330001,
 137                0xC78, 0x06340001,
 138                0xC78, 0x05350001,
 139                0xC78, 0x04360001,
 140                0xC78, 0x03370001,
 141                0xC78, 0x02380001,
 142                0xC78, 0x01390001,
 143                0xC78, 0x013A0001,
 144                0xC78, 0x013B0001,
 145                0xC78, 0x013C0001,
 146                0xC78, 0x013D0001,
 147                0xC78, 0x013E0001,
 148                0xC78, 0x013F0001,
 149                0xC78, 0xFC400001,
 150                0xC78, 0xFB410001,
 151                0xC78, 0xFA420001,
 152                0xC78, 0xF9430001,
 153                0xC78, 0xF8440001,
 154                0xC78, 0xF7450001,
 155                0xC78, 0xF6460001,
 156                0xC78, 0xF5470001,
 157                0xC78, 0xF4480001,
 158                0xC78, 0xF3490001,
 159                0xC78, 0xF24A0001,
 160                0xC78, 0xF14B0001,
 161                0xC78, 0xF04C0001,
 162                0xC78, 0xEF4D0001,
 163                0xC78, 0xEE4E0001,
 164                0xC78, 0xED4F0001,
 165                0xC78, 0xEC500001,
 166                0xC78, 0xEB510001,
 167                0xC78, 0xEA520001,
 168                0xC78, 0xE9530001,
 169                0xC78, 0xE8540001,
 170                0xC78, 0xE7550001,
 171                0xC78, 0xE6560001,
 172                0xC78, 0xE5570001,
 173                0xC78, 0xE4580001,
 174                0xC78, 0xE3590001,
 175                0xC78, 0xA65A0001,
 176                0xC78, 0xA55B0001,
 177                0xC78, 0xA45C0001,
 178                0xC78, 0xA35D0001,
 179                0xC78, 0x675E0001,
 180                0xC78, 0x665F0001,
 181                0xC78, 0x65600001,
 182                0xC78, 0x64610001,
 183                0xC78, 0x63620001,
 184                0xC78, 0x62630001,
 185                0xC78, 0x61640001,
 186                0xC78, 0x48650001,
 187                0xC78, 0x47660001,
 188                0xC78, 0x46670001,
 189                0xC78, 0x45680001,
 190                0xC78, 0x44690001,
 191                0xC78, 0x436A0001,
 192                0xC78, 0x426B0001,
 193                0xC78, 0x286C0001,
 194                0xC78, 0x276D0001,
 195                0xC78, 0x266E0001,
 196                0xC78, 0x256F0001,
 197                0xC78, 0x24700001,
 198                0xC78, 0x09710001,
 199                0xC78, 0x08720001,
 200                0xC78, 0x07730001,
 201                0xC78, 0x06740001,
 202                0xC78, 0x05750001,
 203                0xC78, 0x04760001,
 204                0xC78, 0x03770001,
 205                0xC78, 0x02780001,
 206                0xC78, 0x01790001,
 207                0xC78, 0x017A0001,
 208                0xC78, 0x017B0001,
 209                0xC78, 0x017C0001,
 210                0xC78, 0x017D0001,
 211                0xC78, 0x017E0001,
 212                0xC78, 0x017F0001,
 213                0xC50, 0x69553422,
 214                0xC50, 0x69553420,
 215                0x824, 0x00390204,
 216
 217};
 218
 219void ODM_ReadAndConfig_MP_8723B_AGC_TAB(struct dm_odm_t *pDM_Odm)
 220{
 221        u32 i = 0;
 222        u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_AGC_TAB);
 223        u32 *Array = Array_MP_8723B_AGC_TAB;
 224
 225        for (i = 0; i < ArrayLen; i += 2) {
 226                u32 v1 = Array[i];
 227                u32 v2 = Array[i+1];
 228
 229                /*  This (offset, data) pair doesn't care the condition. */
 230                if (v1 < 0x40000000) {
 231                        odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
 232                        continue;
 233                } else {
 234                        /*  This line is the beginning of branch. */
 235                        bool bMatched = true;
 236                        u8  cCond  = (u8)((v1 & (BIT29|BIT28)) >> 28);
 237
 238                        if (cCond == COND_ELSE) { /*  ELSE, ENDIF */
 239                                bMatched = true;
 240                                READ_NEXT_PAIR(v1, v2, i);
 241                        } else if (!CheckPositive(pDM_Odm, v1, v2)) {
 242                                bMatched = false;
 243                                READ_NEXT_PAIR(v1, v2, i);
 244                                READ_NEXT_PAIR(v1, v2, i);
 245                        } else {
 246                                READ_NEXT_PAIR(v1, v2, i);
 247                                if (!CheckNegative(pDM_Odm, v1, v2))
 248                                        bMatched = false;
 249                                else
 250                                        bMatched = true;
 251                                READ_NEXT_PAIR(v1, v2, i);
 252                        }
 253
 254                        if (!bMatched) {
 255                                /*  Condition isn't matched.
 256                                *   Discard the following (offset, data) pairs.
 257                                */
 258                                while (v1 < 0x40000000 && i < ArrayLen-2)
 259                                        READ_NEXT_PAIR(v1, v2, i);
 260
 261                                i -= 2; /*  prevent from for-loop += 2 */
 262                        } else {
 263                                /*  Configure matched pairs and skip to end of if-else. */
 264                                while (v1 < 0x40000000 && i < ArrayLen-2) {
 265                                        odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
 266                                        READ_NEXT_PAIR(v1, v2, i);
 267                                }
 268
 269                                /*  Keeps reading until ENDIF. */
 270                                cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
 271                                while (cCond != COND_ENDIF && i < ArrayLen-2) {
 272                                        READ_NEXT_PAIR(v1, v2, i);
 273                                        cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
 274                                }
 275                        }
 276                }
 277        }
 278}
 279
 280/******************************************************************************
 281*                           PHY_REG.TXT
 282******************************************************************************/
 283
 284static u32 Array_MP_8723B_PHY_REG[] = {
 285                0x800, 0x80040000,
 286                0x804, 0x00000003,
 287                0x808, 0x0000FC00,
 288                0x80C, 0x0000000A,
 289                0x810, 0x10001331,
 290                0x814, 0x020C3D10,
 291                0x818, 0x02200385,
 292                0x81C, 0x00000000,
 293                0x820, 0x01000100,
 294                0x824, 0x00190204,
 295                0x828, 0x00000000,
 296                0x82C, 0x00000000,
 297                0x830, 0x00000000,
 298                0x834, 0x00000000,
 299                0x838, 0x00000000,
 300                0x83C, 0x00000000,
 301                0x840, 0x00010000,
 302                0x844, 0x00000000,
 303                0x848, 0x00000000,
 304                0x84C, 0x00000000,
 305                0x850, 0x00000000,
 306                0x854, 0x00000000,
 307                0x858, 0x569A11A9,
 308                0x85C, 0x01000014,
 309                0x860, 0x66F60110,
 310                0x864, 0x061F0649,
 311                0x868, 0x00000000,
 312                0x86C, 0x27272700,
 313                0x870, 0x07000760,
 314                0x874, 0x25004000,
 315                0x878, 0x00000808,
 316                0x87C, 0x00000000,
 317                0x880, 0xB0000C1C,
 318                0x884, 0x00000001,
 319                0x888, 0x00000000,
 320                0x88C, 0xCCC000C0,
 321                0x890, 0x00000800,
 322                0x894, 0xFFFFFFFE,
 323                0x898, 0x40302010,
 324                0x89C, 0x00706050,
 325                0x900, 0x00000000,
 326                0x904, 0x00000023,
 327                0x908, 0x00000000,
 328                0x90C, 0x81121111,
 329                0x910, 0x00000002,
 330                0x914, 0x00000201,
 331                0xA00, 0x00D047C8,
 332                0xA04, 0x80FF800C,
 333                0xA08, 0x8C838300,
 334                0xA0C, 0x2E7F120F,
 335                0xA10, 0x9500BB78,
 336                0xA14, 0x1114D028,
 337                0xA18, 0x00881117,
 338                0xA1C, 0x89140F00,
 339                0xA20, 0x1A1B0000,
 340                0xA24, 0x090E1317,
 341                0xA28, 0x00000204,
 342                0xA2C, 0x00D30000,
 343                0xA70, 0x101FBF00,
 344                0xA74, 0x00000007,
 345                0xA78, 0x00000900,
 346                0xA7C, 0x225B0606,
 347                0xA80, 0x21806490,
 348                0xB2C, 0x00000000,
 349                0xC00, 0x48071D40,
 350                0xC04, 0x03A05611,
 351                0xC08, 0x000000E4,
 352                0xC0C, 0x6C6C6C6C,
 353                0xC10, 0x08800000,
 354                0xC14, 0x40000100,
 355                0xC18, 0x08800000,
 356                0xC1C, 0x40000100,
 357                0xC20, 0x00000000,
 358                0xC24, 0x00000000,
 359                0xC28, 0x00000000,
 360                0xC2C, 0x00000000,
 361                0xC30, 0x69E9AC44,
 362                0xC34, 0x469652AF,
 363                0xC38, 0x49795994,
 364                0xC3C, 0x0A97971C,
 365                0xC40, 0x1F7C403F,
 366                0xC44, 0x000100B7,
 367                0xC48, 0xEC020107,
 368                0xC4C, 0x007F037F,
 369                0xC50, 0x69553420,
 370                0xC54, 0x43BC0094,
 371                0xC58, 0x00013149,
 372                0xC5C, 0x00250492,
 373                0xC60, 0x00000000,
 374                0xC64, 0x7112848B,
 375                0xC68, 0x47C00BFF,
 376                0xC6C, 0x00000036,
 377                0xC70, 0x2C7F000D,
 378                0xC74, 0x020610DB,
 379                0xC78, 0x0000001F,
 380                0xC7C, 0x00B91612,
 381                0xC80, 0x390000E4,
 382                0xC84, 0x20F60000,
 383                0xC88, 0x40000100,
 384                0xC8C, 0x20200000,
 385                0xC90, 0x00020E1A,
 386                0xC94, 0x00000000,
 387                0xC98, 0x00020E1A,
 388                0xC9C, 0x00007F7F,
 389                0xCA0, 0x00000000,
 390                0xCA4, 0x000300A0,
 391                0xCA8, 0x00000000,
 392                0xCAC, 0x00000000,
 393                0xCB0, 0x00000000,
 394                0xCB4, 0x00000000,
 395                0xCB8, 0x00000000,
 396                0xCBC, 0x28000000,
 397                0xCC0, 0x00000000,
 398                0xCC4, 0x00000000,
 399                0xCC8, 0x00000000,
 400                0xCCC, 0x00000000,
 401                0xCD0, 0x00000000,
 402                0xCD4, 0x00000000,
 403                0xCD8, 0x64B22427,
 404                0xCDC, 0x00766932,
 405                0xCE0, 0x00222222,
 406                0xCE4, 0x00000000,
 407                0xCE8, 0x37644302,
 408                0xCEC, 0x2F97D40C,
 409                0xD00, 0x00000740,
 410                0xD04, 0x40020401,
 411                0xD08, 0x0000907F,
 412                0xD0C, 0x20010201,
 413                0xD10, 0xA0633333,
 414                0xD14, 0x3333BC53,
 415                0xD18, 0x7A8F5B6F,
 416                0xD2C, 0xCC979975,
 417                0xD30, 0x00000000,
 418                0xD34, 0x80608000,
 419                0xD38, 0x00000000,
 420                0xD3C, 0x00127353,
 421                0xD40, 0x00000000,
 422                0xD44, 0x00000000,
 423                0xD48, 0x00000000,
 424                0xD4C, 0x00000000,
 425                0xD50, 0x6437140A,
 426                0xD54, 0x00000000,
 427                0xD58, 0x00000282,
 428                0xD5C, 0x30032064,
 429                0xD60, 0x4653DE68,
 430                0xD64, 0x04518A3C,
 431                0xD68, 0x00002101,
 432                0xD6C, 0x2A201C16,
 433                0xD70, 0x1812362E,
 434                0xD74, 0x322C2220,
 435                0xD78, 0x000E3C24,
 436                0xE00, 0x2D2D2D2D,
 437                0xE04, 0x2D2D2D2D,
 438                0xE08, 0x0390272D,
 439                0xE10, 0x2D2D2D2D,
 440                0xE14, 0x2D2D2D2D,
 441                0xE18, 0x2D2D2D2D,
 442                0xE1C, 0x2D2D2D2D,
 443                0xE28, 0x00000000,
 444                0xE30, 0x1000DC1F,
 445                0xE34, 0x10008C1F,
 446                0xE38, 0x02140102,
 447                0xE3C, 0x681604C2,
 448                0xE40, 0x01007C00,
 449                0xE44, 0x01004800,
 450                0xE48, 0xFB000000,
 451                0xE4C, 0x000028D1,
 452                0xE50, 0x1000DC1F,
 453                0xE54, 0x10008C1F,
 454                0xE58, 0x02140102,
 455                0xE5C, 0x28160D05,
 456                0xE60, 0x00000008,
 457                0xE68, 0x001B2556,
 458                0xE6C, 0x00C00096,
 459                0xE70, 0x00C00096,
 460                0xE74, 0x01000056,
 461                0xE78, 0x01000014,
 462                0xE7C, 0x01000056,
 463                0xE80, 0x01000014,
 464                0xE84, 0x00C00096,
 465                0xE88, 0x01000056,
 466                0xE8C, 0x00C00096,
 467                0xED0, 0x00C00096,
 468                0xED4, 0x00C00096,
 469                0xED8, 0x00C00096,
 470                0xEDC, 0x000000D6,
 471                0xEE0, 0x000000D6,
 472                0xEEC, 0x01C00016,
 473                0xF14, 0x00000003,
 474                0xF4C, 0x00000000,
 475                0xF00, 0x00000300,
 476                0x820, 0x01000100,
 477                0x800, 0x83040000,
 478
 479};
 480
 481void ODM_ReadAndConfig_MP_8723B_PHY_REG(struct dm_odm_t *pDM_Odm)
 482{
 483        u32 i = 0;
 484        u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_PHY_REG);
 485        u32 *Array = Array_MP_8723B_PHY_REG;
 486
 487        for (i = 0; i < ArrayLen; i += 2) {
 488                u32 v1 = Array[i];
 489                u32 v2 = Array[i+1];
 490
 491                /*  This (offset, data) pair doesn't care the condition. */
 492                if (v1 < 0x40000000) {
 493                        odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
 494                        continue;
 495                } else {
 496                        /*  This line is the beginning of branch. */
 497                        bool bMatched = true;
 498                        u8  cCond  = (u8)((v1 & (BIT29|BIT28)) >> 28);
 499
 500                        if (cCond == COND_ELSE) { /*  ELSE, ENDIF */
 501                                bMatched = true;
 502                                READ_NEXT_PAIR(v1, v2, i);
 503                        } else if (!CheckPositive(pDM_Odm, v1, v2)) {
 504                                bMatched = false;
 505                                READ_NEXT_PAIR(v1, v2, i);
 506                                READ_NEXT_PAIR(v1, v2, i);
 507                        } else {
 508                                READ_NEXT_PAIR(v1, v2, i);
 509                                if (!CheckNegative(pDM_Odm, v1, v2))
 510                                        bMatched = false;
 511                                else
 512                                        bMatched = true;
 513                                READ_NEXT_PAIR(v1, v2, i);
 514                        }
 515
 516                        if (!bMatched) {
 517                                /*  Condition isn't matched.
 518                                *   Discard the following (offset, data) pairs.
 519                                */
 520                                while (v1 < 0x40000000 && i < ArrayLen-2)
 521                                        READ_NEXT_PAIR(v1, v2, i);
 522
 523                                i -= 2; /*  prevent from for-loop += 2 */
 524                        } else { /*  Configure matched pairs and skip to end of if-else. */
 525                                while (v1 < 0x40000000 && i < ArrayLen-2) {
 526                                        odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
 527                                        READ_NEXT_PAIR(v1, v2, i);
 528                                }
 529
 530                                /*  Keeps reading until ENDIF. */
 531                                cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
 532                                while (cCond != COND_ENDIF && i < ArrayLen-2) {
 533                                        READ_NEXT_PAIR(v1, v2, i);
 534                                        cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
 535                                }
 536                        }
 537                }
 538        }
 539}
 540
 541/******************************************************************************
 542*                           PHY_REG_PG.TXT
 543******************************************************************************/
 544
 545static u32 Array_MP_8723B_PHY_REG_PG[] = {
 546        0, 0x00000e08, 0x0000ff00, 0x00003800,
 547        0, 0x0000086c, 0xffffff00, 0x32343600,
 548        0, 0x00000e00, 0xffffffff, 0x40424444,
 549        0, 0x00000e04, 0xffffffff, 0x28323638,
 550        0, 0x00000e10, 0xffffffff, 0x38404244,
 551        0, 0x00000e14, 0xffffffff, 0x26303436
 552};
 553
 554void ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(struct dm_odm_t *pDM_Odm)
 555{
 556        u32 i = 0;
 557        u32 *Array = Array_MP_8723B_PHY_REG_PG;
 558
 559        pDM_Odm->PhyRegPgVersion = 1;
 560        pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;
 561
 562        for (i = 0; i < ARRAY_SIZE(Array_MP_8723B_PHY_REG_PG); i += 4) {
 563                u32 v1 = Array[i];
 564                u32 v2 = Array[i+1];
 565                u32 v3 = Array[i+2];
 566                u32 v4 = Array[i+3];
 567
 568                odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4);
 569        }
 570}
 571