linux/drivers/staging/rtl8723au/hal/HalHWImg8723A_BB.c
<<
>>
Prefs
   1/******************************************************************************
   2*
   3* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
   4*
   5* This program is free software; you can redistribute it and/or modify it
   6* under the terms of version 2 of the GNU General Public License as
   7* published by the Free Software Foundation.
   8*
   9* This program is distributed in the hope that it will be useful, but WITHOUT
  10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12* more details.
  13*
  14******************************************************************************/
  15
  16#include "odm_precomp.h"
  17
  18static bool CheckCondition(const u32  Condition, const u32  Hex)
  19{
  20        u32 _board     = (Hex & 0x000000FF);
  21        u32 _interface = (Hex & 0x0000FF00) >> 8;
  22        u32 _platform  = (Hex & 0x00FF0000) >> 16;
  23        u32 cond = Condition;
  24
  25        if (Condition == 0xCDCDCDCD)
  26                return true;
  27
  28        cond = Condition & 0x000000FF;
  29        if ((_board == cond) && cond != 0x00)
  30                return false;
  31
  32        cond = Condition & 0x0000FF00;
  33        cond >>= 8;
  34        if ((_interface & cond) == 0 && cond != 0x07)
  35                return false;
  36
  37        cond = Condition & 0x00FF0000;
  38        cond >>= 16;
  39        if ((_platform & cond) == 0 && cond != 0x0F)
  40                return false;
  41        return true;
  42}
  43
  44/******************************************************************************
  45*                           AGC_TAB_1T.TXT
  46******************************************************************************/
  47
  48static u32 Array_AGC_TAB_1T_8723A[] = {
  49        0xC78, 0x7B000001,
  50        0xC78, 0x7B010001,
  51        0xC78, 0x7B020001,
  52        0xC78, 0x7B030001,
  53        0xC78, 0x7B040001,
  54        0xC78, 0x7B050001,
  55        0xC78, 0x7A060001,
  56        0xC78, 0x79070001,
  57        0xC78, 0x78080001,
  58        0xC78, 0x77090001,
  59        0xC78, 0x760A0001,
  60        0xC78, 0x750B0001,
  61        0xC78, 0x740C0001,
  62        0xC78, 0x730D0001,
  63        0xC78, 0x720E0001,
  64        0xC78, 0x710F0001,
  65        0xC78, 0x70100001,
  66        0xC78, 0x6F110001,
  67        0xC78, 0x6E120001,
  68        0xC78, 0x6D130001,
  69        0xC78, 0x6C140001,
  70        0xC78, 0x6B150001,
  71        0xC78, 0x6A160001,
  72        0xC78, 0x69170001,
  73        0xC78, 0x68180001,
  74        0xC78, 0x67190001,
  75        0xC78, 0x661A0001,
  76        0xC78, 0x651B0001,
  77        0xC78, 0x641C0001,
  78        0xC78, 0x631D0001,
  79        0xC78, 0x621E0001,
  80        0xC78, 0x611F0001,
  81        0xC78, 0x60200001,
  82        0xC78, 0x49210001,
  83        0xC78, 0x48220001,
  84        0xC78, 0x47230001,
  85        0xC78, 0x46240001,
  86        0xC78, 0x45250001,
  87        0xC78, 0x44260001,
  88        0xC78, 0x43270001,
  89        0xC78, 0x42280001,
  90        0xC78, 0x41290001,
  91        0xC78, 0x402A0001,
  92        0xC78, 0x262B0001,
  93        0xC78, 0x252C0001,
  94        0xC78, 0x242D0001,
  95        0xC78, 0x232E0001,
  96        0xC78, 0x222F0001,
  97        0xC78, 0x21300001,
  98        0xC78, 0x20310001,
  99        0xC78, 0x06320001,
 100        0xC78, 0x05330001,
 101        0xC78, 0x04340001,
 102        0xC78, 0x03350001,
 103        0xC78, 0x02360001,
 104        0xC78, 0x01370001,
 105        0xC78, 0x00380001,
 106        0xC78, 0x00390001,
 107        0xC78, 0x003A0001,
 108        0xC78, 0x003B0001,
 109        0xC78, 0x003C0001,
 110        0xC78, 0x003D0001,
 111        0xC78, 0x003E0001,
 112        0xC78, 0x003F0001,
 113        0xC78, 0x7B400001,
 114        0xC78, 0x7B410001,
 115        0xC78, 0x7B420001,
 116        0xC78, 0x7B430001,
 117        0xC78, 0x7B440001,
 118        0xC78, 0x7B450001,
 119        0xC78, 0x7A460001,
 120        0xC78, 0x79470001,
 121        0xC78, 0x78480001,
 122        0xC78, 0x77490001,
 123        0xC78, 0x764A0001,
 124        0xC78, 0x754B0001,
 125        0xC78, 0x744C0001,
 126        0xC78, 0x734D0001,
 127        0xC78, 0x724E0001,
 128        0xC78, 0x714F0001,
 129        0xC78, 0x70500001,
 130        0xC78, 0x6F510001,
 131        0xC78, 0x6E520001,
 132        0xC78, 0x6D530001,
 133        0xC78, 0x6C540001,
 134        0xC78, 0x6B550001,
 135        0xC78, 0x6A560001,
 136        0xC78, 0x69570001,
 137        0xC78, 0x68580001,
 138        0xC78, 0x67590001,
 139        0xC78, 0x665A0001,
 140        0xC78, 0x655B0001,
 141        0xC78, 0x645C0001,
 142        0xC78, 0x635D0001,
 143        0xC78, 0x625E0001,
 144        0xC78, 0x615F0001,
 145        0xC78, 0x60600001,
 146        0xC78, 0x49610001,
 147        0xC78, 0x48620001,
 148        0xC78, 0x47630001,
 149        0xC78, 0x46640001,
 150        0xC78, 0x45650001,
 151        0xC78, 0x44660001,
 152        0xC78, 0x43670001,
 153        0xC78, 0x42680001,
 154        0xC78, 0x41690001,
 155        0xC78, 0x406A0001,
 156        0xC78, 0x266B0001,
 157        0xC78, 0x256C0001,
 158        0xC78, 0x246D0001,
 159        0xC78, 0x236E0001,
 160        0xC78, 0x226F0001,
 161        0xC78, 0x21700001,
 162        0xC78, 0x20710001,
 163        0xC78, 0x06720001,
 164        0xC78, 0x05730001,
 165        0xC78, 0x04740001,
 166        0xC78, 0x03750001,
 167        0xC78, 0x02760001,
 168        0xC78, 0x01770001,
 169        0xC78, 0x00780001,
 170        0xC78, 0x00790001,
 171        0xC78, 0x007A0001,
 172        0xC78, 0x007B0001,
 173        0xC78, 0x007C0001,
 174        0xC78, 0x007D0001,
 175        0xC78, 0x007E0001,
 176        0xC78, 0x007F0001,
 177        0xC78, 0x3800001E,
 178        0xC78, 0x3801001E,
 179        0xC78, 0x3802001E,
 180        0xC78, 0x3803001E,
 181        0xC78, 0x3804001E,
 182        0xC78, 0x3805001E,
 183        0xC78, 0x3806001E,
 184        0xC78, 0x3807001E,
 185        0xC78, 0x3808001E,
 186        0xC78, 0x3C09001E,
 187        0xC78, 0x3E0A001E,
 188        0xC78, 0x400B001E,
 189        0xC78, 0x440C001E,
 190        0xC78, 0x480D001E,
 191        0xC78, 0x4C0E001E,
 192        0xC78, 0x500F001E,
 193        0xC78, 0x5210001E,
 194        0xC78, 0x5611001E,
 195        0xC78, 0x5A12001E,
 196        0xC78, 0x5E13001E,
 197        0xC78, 0x6014001E,
 198        0xC78, 0x6015001E,
 199        0xC78, 0x6016001E,
 200        0xC78, 0x6217001E,
 201        0xC78, 0x6218001E,
 202        0xC78, 0x6219001E,
 203        0xC78, 0x621A001E,
 204        0xC78, 0x621B001E,
 205        0xC78, 0x621C001E,
 206        0xC78, 0x621D001E,
 207        0xC78, 0x621E001E,
 208        0xC78, 0x621F001E,
 209};
 210
 211#define READ_NEXT_PAIR(v1, v2, i)                       \
 212        do {                                            \
 213                i += 2; v1 = Array[i]; v2 = Array[i+1]; \
 214        } while (0)
 215
 216void ODM_ReadAndConfig_AGC_TAB_1T_8723A(struct dm_odm_t *pDM_Odm)
 217{
 218        u32 hex;
 219        u32 i;
 220        u8 platform = 0x04;
 221        u8 board = pDM_Odm->BoardType;
 222        u32 ArrayLen = ARRAY_SIZE(Array_AGC_TAB_1T_8723A);
 223        u32 *Array = Array_AGC_TAB_1T_8723A;
 224
 225        hex = board;
 226        hex += ODM_ITRF_USB << 8;
 227        hex += platform << 16;
 228        hex += 0xFF000000;
 229        for (i = 0; i < ArrayLen; i += 2) {
 230                u32 v1 = Array[i];
 231                u32 v2 = Array[i+1];
 232
 233                /*  This (offset, data) pair meets the condition. */
 234                if (v1 < 0xCDCDCDCD) {
 235                        odm_ConfigBB_AGC_8723A(pDM_Odm, v1, v2);
 236                        continue;
 237                } else {
 238                        if (!CheckCondition(Array[i], hex)) {
 239                                /* Discard the following (offset, data) pairs */
 240                                READ_NEXT_PAIR(v1, v2, i);
 241                                while (v2 != 0xDEAD &&
 242                                       v2 != 0xCDEF &&
 243                                       v2 != 0xCDCD && i < ArrayLen - 2)
 244                                        READ_NEXT_PAIR(v1, v2, i);
 245                                i -= 2; /*  prevent from for-loop += 2 */
 246                        } else {
 247                                /*  Configure matched pairs and skip to
 248                                    end of if-else. */
 249                                READ_NEXT_PAIR(v1, v2, i);
 250                                while (v2 != 0xDEAD &&
 251                                       v2 != 0xCDEF &&
 252                                       v2 != 0xCDCD && i < ArrayLen - 2) {
 253                                        odm_ConfigBB_AGC_8723A(pDM_Odm, v1, v2);
 254                                        READ_NEXT_PAIR(v1, v2, i);
 255                                }
 256                                while (v2 != 0xDEAD && i < ArrayLen - 2)
 257                                        READ_NEXT_PAIR(v1, v2, i);
 258                        }
 259                }
 260        }
 261}
 262
 263/******************************************************************************
 264*                           PHY_REG_1T.TXT
 265******************************************************************************/
 266
 267static u32 Array_PHY_REG_1T_8723A[] = {
 268        0x800, 0x80040000,
 269        0x804, 0x00000003,
 270        0x808, 0x0000FC00,
 271        0x80C, 0x0000000A,
 272        0x810, 0x10001331,
 273        0x814, 0x020C3D10,
 274        0x818, 0x02200385,
 275        0x81C, 0x00000000,
 276        0x820, 0x01000100,
 277        0x824, 0x00390004,
 278        0x828, 0x00000000,
 279        0x82C, 0x00000000,
 280        0x830, 0x00000000,
 281        0x834, 0x00000000,
 282        0x838, 0x00000000,
 283        0x83C, 0x00000000,
 284        0x840, 0x00010000,
 285        0x844, 0x00000000,
 286        0x848, 0x00000000,
 287        0x84C, 0x00000000,
 288        0x850, 0x00000000,
 289        0x854, 0x00000000,
 290        0x858, 0x569A569A,
 291        0x85C, 0x001B25A4,
 292        0x860, 0x66F60110,
 293        0x864, 0x061F0130,
 294        0x868, 0x00000000,
 295        0x86C, 0x32323200,
 296        0x870, 0x07000760,
 297        0x874, 0x22004000,
 298        0x878, 0x00000808,
 299        0x87C, 0x00000000,
 300        0x880, 0xC0083070,
 301        0x884, 0x000004D5,
 302        0x888, 0x00000000,
 303        0x88C, 0xCCC000C0,
 304        0x890, 0x00000800,
 305        0x894, 0xFFFFFFFE,
 306        0x898, 0x40302010,
 307        0x89C, 0x00706050,
 308        0x900, 0x00000000,
 309        0x904, 0x00000023,
 310        0x908, 0x00000000,
 311        0x90C, 0x81121111,
 312        0xA00, 0x00D047C8,
 313        0xA04, 0x80FF000C,
 314        0xA08, 0x8C838300,
 315        0xA0C, 0x2E68120F,
 316        0xA10, 0x9500BB78,
 317        0xA14, 0x11144028,
 318        0xA18, 0x00881117,
 319        0xA1C, 0x89140F00,
 320        0xA20, 0x1A1B0000,
 321        0xA24, 0x090E1317,
 322        0xA28, 0x00000204,
 323        0xA2C, 0x00D30000,
 324        0xA70, 0x101FBF00,
 325        0xA74, 0x00000007,
 326        0xA78, 0x00000900,
 327        0xC00, 0x48071D40,
 328        0xC04, 0x03A05611,
 329        0xC08, 0x000000E4,
 330        0xC0C, 0x6C6C6C6C,
 331        0xC10, 0x08800000,
 332        0xC14, 0x40000100,
 333        0xC18, 0x08800000,
 334        0xC1C, 0x40000100,
 335        0xC20, 0x00000000,
 336        0xC24, 0x00000000,
 337        0xC28, 0x00000000,
 338        0xC2C, 0x00000000,
 339        0xC30, 0x69E9AC44,
 340        0xFF0F011F, 0xABCD,
 341        0xC34, 0x469652CF,
 342        0xCDCDCDCD, 0xCDCD,
 343        0xC34, 0x469652AF,
 344        0xFF0F011F, 0xDEAD,
 345        0xC38, 0x49795994,
 346        0xC3C, 0x0A97971C,
 347        0xC40, 0x1F7C403F,
 348        0xC44, 0x000100B7,
 349        0xC48, 0xEC020107,
 350        0xC4C, 0x007F037F,
 351        0xC50, 0x69543420,
 352        0xC54, 0x43BC0094,
 353        0xC58, 0x69543420,
 354        0xC5C, 0x433C0094,
 355        0xC60, 0x00000000,
 356        0xFF0F011F, 0xABCD,
 357        0xC64, 0x7116848B,
 358        0xCDCDCDCD, 0xCDCD,
 359        0xC64, 0x7112848B,
 360        0xFF0F011F, 0xDEAD,
 361        0xC68, 0x47C00BFF,
 362        0xC6C, 0x00000036,
 363        0xC70, 0x2C7F000D,
 364        0xC74, 0x018610DB,
 365        0xC78, 0x0000001F,
 366        0xC7C, 0x00B91612,
 367        0xC80, 0x40000100,
 368        0xC84, 0x20F60000,
 369        0xC88, 0x40000100,
 370        0xC8C, 0x20200000,
 371        0xC90, 0x00121820,
 372        0xC94, 0x00000000,
 373        0xC98, 0x00121820,
 374        0xC9C, 0x00007F7F,
 375        0xCA0, 0x00000000,
 376        0xCA4, 0x00000080,
 377        0xCA8, 0x00000000,
 378        0xCAC, 0x00000000,
 379        0xCB0, 0x00000000,
 380        0xCB4, 0x00000000,
 381        0xCB8, 0x00000000,
 382        0xCBC, 0x28000000,
 383        0xCC0, 0x00000000,
 384        0xCC4, 0x00000000,
 385        0xCC8, 0x00000000,
 386        0xCCC, 0x00000000,
 387        0xCD0, 0x00000000,
 388        0xCD4, 0x00000000,
 389        0xCD8, 0x64B22427,
 390        0xCDC, 0x00766932,
 391        0xCE0, 0x00222222,
 392        0xCE4, 0x00000000,
 393        0xCE8, 0x37644302,
 394        0xCEC, 0x2F97D40C,
 395        0xD00, 0x00080740,
 396        0xD04, 0x00020401,
 397        0xD08, 0x0000907F,
 398        0xD0C, 0x20010201,
 399        0xD10, 0xA0633333,
 400        0xD14, 0x3333BC43,
 401        0xD18, 0x7A8F5B6B,
 402        0xD2C, 0xCC979975,
 403        0xD30, 0x00000000,
 404        0xD34, 0x80608000,
 405        0xD38, 0x00000000,
 406        0xD3C, 0x00027293,
 407        0xD40, 0x00000000,
 408        0xD44, 0x00000000,
 409        0xD48, 0x00000000,
 410        0xD4C, 0x00000000,
 411        0xD50, 0x6437140A,
 412        0xD54, 0x00000000,
 413        0xD58, 0x00000000,
 414        0xD5C, 0x30032064,
 415        0xD60, 0x4653DE68,
 416        0xD64, 0x04518A3C,
 417        0xD68, 0x00002101,
 418        0xD6C, 0x2A201C16,
 419        0xD70, 0x1812362E,
 420        0xD74, 0x322C2220,
 421        0xD78, 0x000E3C24,
 422        0xE00, 0x2A2A2A2A,
 423        0xE04, 0x2A2A2A2A,
 424        0xE08, 0x03902A2A,
 425        0xE10, 0x2A2A2A2A,
 426        0xE14, 0x2A2A2A2A,
 427        0xE18, 0x2A2A2A2A,
 428        0xE1C, 0x2A2A2A2A,
 429        0xE28, 0x00000000,
 430        0xE30, 0x1000DC1F,
 431        0xE34, 0x10008C1F,
 432        0xE38, 0x02140102,
 433        0xE3C, 0x681604C2,
 434        0xE40, 0x01007C00,
 435        0xE44, 0x01004800,
 436        0xE48, 0xFB000000,
 437        0xE4C, 0x000028D1,
 438        0xE50, 0x1000DC1F,
 439        0xE54, 0x10008C1F,
 440        0xE58, 0x02140102,
 441        0xE5C, 0x28160D05,
 442        0xE60, 0x00000008,
 443        0xE68, 0x001B25A4,
 444        0xE6C, 0x631B25A0,
 445        0xE70, 0x631B25A0,
 446        0xE74, 0x081B25A0,
 447        0xE78, 0x081B25A0,
 448        0xE7C, 0x081B25A0,
 449        0xE80, 0x081B25A0,
 450        0xE84, 0x631B25A0,
 451        0xE88, 0x081B25A0,
 452        0xE8C, 0x631B25A0,
 453        0xED0, 0x631B25A0,
 454        0xED4, 0x631B25A0,
 455        0xED8, 0x631B25A0,
 456        0xEDC, 0x001B25A0,
 457        0xEE0, 0x001B25A0,
 458        0xEEC, 0x6B1B25A0,
 459        0xF14, 0x00000003,
 460        0xF4C, 0x00000000,
 461        0xF00, 0x00000300,
 462};
 463
 464void ODM_ReadAndConfig_PHY_REG_1T_8723A(struct dm_odm_t *pDM_Odm)
 465{
 466        u32 hex = 0;
 467        u32 i = 0;
 468        u8  platform = 0x04;
 469        u8  board = pDM_Odm->BoardType;
 470        u32 ArrayLen = ARRAY_SIZE(Array_PHY_REG_1T_8723A);
 471        u32 *Array = Array_PHY_REG_1T_8723A;
 472
 473        hex += board;
 474        hex += ODM_ITRF_USB << 8;
 475        hex += platform << 16;
 476        hex += 0xFF000000;
 477        for (i = 0; i < ArrayLen; i += 2) {
 478                u32 v1 = Array[i];
 479                u32 v2 = Array[i+1];
 480
 481                /*  This (offset, data) pair meets the condition. */
 482                if (v1 < 0xCDCDCDCD) {
 483                        odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
 484                        continue;
 485                } else {
 486                        if (!CheckCondition(Array[i], hex)) {
 487                                /* Discard the following (offset, data) pairs */
 488                                READ_NEXT_PAIR(v1, v2, i);
 489                                while (v2 != 0xDEAD &&
 490                                       v2 != 0xCDEF &&
 491                                       v2 != 0xCDCD && i < ArrayLen - 2)
 492                                        READ_NEXT_PAIR(v1, v2, i);
 493                                i -= 2; /*  prevent from for-loop += 2 */
 494                        } else {
 495                                /*  Configure matched pairs and skip to
 496                                    end of if-else. */
 497                                READ_NEXT_PAIR(v1, v2, i);
 498                                while (v2 != 0xDEAD &&
 499                                       v2 != 0xCDEF &&
 500                                       v2 != 0xCDCD && i < ArrayLen - 2) {
 501                                        odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
 502                                        READ_NEXT_PAIR(v1, v2, i);
 503                                }
 504                                while (v2 != 0xDEAD && i < ArrayLen - 2)
 505                                        READ_NEXT_PAIR(v1, v2, i);
 506                        }
 507                }
 508        }
 509}
 510
 511/******************************************************************************
 512*                           PHY_REG_MP.TXT
 513******************************************************************************/
 514
 515static u32 Array_PHY_REG_MP_8723A[] = {
 516        0xC30, 0x69E9AC4A,
 517        0xC3C, 0x0A979718,
 518};
 519
 520void ODM_ReadAndConfig_PHY_REG_MP_8723A(struct dm_odm_t *pDM_Odm)
 521{
 522        u32 hex = 0;
 523        u32 i;
 524        u8 platform = 0x04;
 525        u8 board = pDM_Odm->BoardType;
 526        u32 ArrayLen = ARRAY_SIZE(Array_PHY_REG_MP_8723A);
 527        u32 *Array = Array_PHY_REG_MP_8723A;
 528
 529        hex += board;
 530        hex += ODM_ITRF_USB << 8;
 531        hex += platform << 16;
 532        hex += 0xFF000000;
 533        for (i = 0; i < ArrayLen; i += 2) {
 534                u32 v1 = Array[i];
 535                u32 v2 = Array[i+1];
 536
 537                /*  This (offset, data) pair meets the condition. */
 538                if (v1 < 0xCDCDCDCD) {
 539                        odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
 540                        continue;
 541                } else {
 542                        if (!CheckCondition(Array[i], hex)) {
 543                                /* Discard the following (offset, data) pairs */
 544                                READ_NEXT_PAIR(v1, v2, i);
 545                                while (v2 != 0xDEAD &&
 546                                       v2 != 0xCDEF &&
 547                                       v2 != 0xCDCD && i < ArrayLen - 2)
 548                                        READ_NEXT_PAIR(v1, v2, i);
 549                                i -= 2; /*  prevent from for-loop += 2 */
 550                        } else {
 551                                /* Configure matched pairs and skip to
 552                                   end of if-else. */
 553                                READ_NEXT_PAIR(v1, v2, i);
 554                                while (v2 != 0xDEAD &&
 555                                       v2 != 0xCDEF &&
 556                                       v2 != 0xCDCD && i < ArrayLen - 2) {
 557                                        odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
 558                                        READ_NEXT_PAIR(v1, v2, i);
 559                                }
 560                                while (v2 != 0xDEAD && i < ArrayLen - 2)
 561                                        READ_NEXT_PAIR(v1, v2, i);
 562                        }
 563                }
 564        }
 565}
 566