linux/drivers/net/wireless/realtek/rtw88/rtw8822c.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
   2/* Copyright(c) 2018-2019  Realtek Corporation
   3 */
   4
   5#include <linux/module.h>
   6#include "main.h"
   7#include "coex.h"
   8#include "fw.h"
   9#include "tx.h"
  10#include "rx.h"
  11#include "phy.h"
  12#include "rtw8822c.h"
  13#include "rtw8822c_table.h"
  14#include "mac.h"
  15#include "reg.h"
  16#include "debug.h"
  17#include "util.h"
  18#include "bf.h"
  19#include "efuse.h"
  20
  21#define IQK_DONE_8822C 0xaa
  22
  23static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
  24                                     u8 rx_path, bool is_tx2_path);
  25
  26static void rtw8822ce_efuse_parsing(struct rtw_efuse *efuse,
  27                                    struct rtw8822c_efuse *map)
  28{
  29        ether_addr_copy(efuse->addr, map->e.mac_addr);
  30}
  31
  32static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
  33{
  34        struct rtw_efuse *efuse = &rtwdev->efuse;
  35        struct rtw8822c_efuse *map;
  36        int i;
  37
  38        map = (struct rtw8822c_efuse *)log_map;
  39
  40        efuse->rfe_option = map->rfe_option;
  41        efuse->rf_board_option = map->rf_board_option;
  42        efuse->crystal_cap = map->xtal_k & XCAP_MASK;
  43        efuse->channel_plan = map->channel_plan;
  44        efuse->country_code[0] = map->country_code[0];
  45        efuse->country_code[1] = map->country_code[1];
  46        efuse->bt_setting = map->rf_bt_setting;
  47        efuse->regd = map->rf_board_option & 0x7;
  48        efuse->thermal_meter[RF_PATH_A] = map->path_a_thermal;
  49        efuse->thermal_meter[RF_PATH_B] = map->path_b_thermal;
  50        efuse->thermal_meter_k =
  51                        (map->path_a_thermal + map->path_b_thermal) >> 1;
  52        efuse->power_track_type = (map->tx_pwr_calibrate_rate >> 4) & 0xf;
  53
  54        for (i = 0; i < 4; i++)
  55                efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
  56
  57        switch (rtw_hci_type(rtwdev)) {
  58        case RTW_HCI_TYPE_PCIE:
  59                rtw8822ce_efuse_parsing(efuse, map);
  60                break;
  61        default:
  62                /* unsupported now */
  63                return -ENOTSUPP;
  64        }
  65
  66        return 0;
  67}
  68
  69static void rtw8822c_header_file_init(struct rtw_dev *rtwdev, bool pre)
  70{
  71        rtw_write32_set(rtwdev, REG_3WIRE, BIT_3WIRE_TX_EN | BIT_3WIRE_RX_EN);
  72        rtw_write32_set(rtwdev, REG_3WIRE, BIT_3WIRE_PI_ON);
  73        rtw_write32_set(rtwdev, REG_3WIRE2, BIT_3WIRE_TX_EN | BIT_3WIRE_RX_EN);
  74        rtw_write32_set(rtwdev, REG_3WIRE2, BIT_3WIRE_PI_ON);
  75
  76        if (pre)
  77                rtw_write32_clr(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN);
  78        else
  79                rtw_write32_set(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN);
  80}
  81
  82static void rtw8822c_bb_reset(struct rtw_dev *rtwdev)
  83{
  84        rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
  85        rtw_write16_clr(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
  86        rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
  87}
  88
  89static void rtw8822c_dac_backup_reg(struct rtw_dev *rtwdev,
  90                                    struct rtw_backup_info *backup,
  91                                    struct rtw_backup_info *backup_rf)
  92{
  93        u32 path, i;
  94        u32 val;
  95        u32 reg;
  96        u32 rf_addr[DACK_RF_8822C] = {0x8f};
  97        u32 addrs[DACK_REG_8822C] = {0x180c, 0x1810, 0x410c, 0x4110,
  98                                     0x1c3c, 0x1c24, 0x1d70, 0x9b4,
  99                                     0x1a00, 0x1a14, 0x1d58, 0x1c38,
 100                                     0x1e24, 0x1e28, 0x1860, 0x4160};
 101
 102        for (i = 0; i < DACK_REG_8822C; i++) {
 103                backup[i].len = 4;
 104                backup[i].reg = addrs[i];
 105                backup[i].val = rtw_read32(rtwdev, addrs[i]);
 106        }
 107
 108        for (path = 0; path < DACK_PATH_8822C; path++) {
 109                for (i = 0; i < DACK_RF_8822C; i++) {
 110                        reg = rf_addr[i];
 111                        val = rtw_read_rf(rtwdev, path, reg, RFREG_MASK);
 112                        backup_rf[path * i + i].reg = reg;
 113                        backup_rf[path * i + i].val = val;
 114                }
 115        }
 116}
 117
 118static void rtw8822c_dac_restore_reg(struct rtw_dev *rtwdev,
 119                                     struct rtw_backup_info *backup,
 120                                     struct rtw_backup_info *backup_rf)
 121{
 122        u32 path, i;
 123        u32 val;
 124        u32 reg;
 125
 126        rtw_restore_reg(rtwdev, backup, DACK_REG_8822C);
 127
 128        for (path = 0; path < DACK_PATH_8822C; path++) {
 129                for (i = 0; i < DACK_RF_8822C; i++) {
 130                        val = backup_rf[path * i + i].val;
 131                        reg = backup_rf[path * i + i].reg;
 132                        rtw_write_rf(rtwdev, path, reg, RFREG_MASK, val);
 133                }
 134        }
 135}
 136
 137static void rtw8822c_rf_minmax_cmp(struct rtw_dev *rtwdev, u32 value,
 138                                   u32 *min, u32 *max)
 139{
 140        if (value >= 0x200) {
 141                if (*min >= 0x200) {
 142                        if (*min > value)
 143                                *min = value;
 144                } else {
 145                        *min = value;
 146                }
 147                if (*max >= 0x200) {
 148                        if (*max < value)
 149                                *max = value;
 150                }
 151        } else {
 152                if (*min < 0x200) {
 153                        if (*min > value)
 154                                *min = value;
 155                }
 156
 157                if (*max  >= 0x200) {
 158                        *max = value;
 159                } else {
 160                        if (*max < value)
 161                                *max = value;
 162                }
 163        }
 164}
 165
 166static void __rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *v1, u32 *v2)
 167{
 168        if (*v1 >= 0x200 && *v2 >= 0x200) {
 169                if (*v1 > *v2)
 170                        swap(*v1, *v2);
 171        } else if (*v1 < 0x200 && *v2 < 0x200) {
 172                if (*v1 > *v2)
 173                        swap(*v1, *v2);
 174        } else if (*v1 < 0x200 && *v2 >= 0x200) {
 175                swap(*v1, *v2);
 176        }
 177}
 178
 179static void rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
 180{
 181        u32 i, j;
 182
 183        for (i = 0; i < DACK_SN_8822C - 1; i++) {
 184                for (j = 0; j < (DACK_SN_8822C - 1 - i) ; j++) {
 185                        __rtw8822c_dac_iq_sort(rtwdev, &iv[j], &iv[j + 1]);
 186                        __rtw8822c_dac_iq_sort(rtwdev, &qv[j], &qv[j + 1]);
 187                }
 188        }
 189}
 190
 191static void rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, u32 *vec, u32 *val)
 192{
 193        u32 p, m, t, i;
 194
 195        m = 0;
 196        p = 0;
 197        for (i = 10; i < DACK_SN_8822C - 10; i++) {
 198                if (vec[i] > 0x200)
 199                        m = (0x400 - vec[i]) + m;
 200                else
 201                        p = vec[i] + p;
 202        }
 203
 204        if (p > m) {
 205                t = p - m;
 206                t = t / (DACK_SN_8822C - 20);
 207        } else {
 208                t = m - p;
 209                t = t / (DACK_SN_8822C - 20);
 210                if (t != 0x0)
 211                        t = 0x400 - t;
 212        }
 213
 214        *val = t;
 215}
 216
 217static u32 rtw8822c_get_path_write_addr(u8 path)
 218{
 219        u32 base_addr;
 220
 221        switch (path) {
 222        case RF_PATH_A:
 223                base_addr = 0x1800;
 224                break;
 225        case RF_PATH_B:
 226                base_addr = 0x4100;
 227                break;
 228        default:
 229                WARN_ON(1);
 230                return -1;
 231        }
 232
 233        return base_addr;
 234}
 235
 236static u32 rtw8822c_get_path_read_addr(u8 path)
 237{
 238        u32 base_addr;
 239
 240        switch (path) {
 241        case RF_PATH_A:
 242                base_addr = 0x2800;
 243                break;
 244        case RF_PATH_B:
 245                base_addr = 0x4500;
 246                break;
 247        default:
 248                WARN_ON(1);
 249                return -1;
 250        }
 251
 252        return base_addr;
 253}
 254
 255static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, u32 value)
 256{
 257        bool ret = true;
 258
 259        if ((value >= 0x200 && (0x400 - value) > 0x64) ||
 260            (value < 0x200 && value > 0x64)) {
 261                ret = false;
 262                rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] Error overflow\n");
 263        }
 264
 265        return ret;
 266}
 267
 268static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
 269{
 270        u32 temp;
 271        int i = 0, cnt = 0;
 272
 273        while (i < DACK_SN_8822C && cnt < 10000) {
 274                cnt++;
 275                temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
 276                iv[i] = (temp & 0x3ff000) >> 12;
 277                qv[i] = temp & 0x3ff;
 278
 279                if (rtw8822c_dac_iq_check(rtwdev, iv[i]) &&
 280                    rtw8822c_dac_iq_check(rtwdev, qv[i]))
 281                        i++;
 282        }
 283}
 284
 285static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
 286                                       u32 *iv, u32 *qv,
 287                                       u32 *i_value, u32 *q_value)
 288{
 289        u32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;
 290        u32 i_delta, q_delta;
 291        u32 temp;
 292        int i, cnt = 0;
 293
 294        do {
 295                i_min = iv[0];
 296                i_max = iv[0];
 297                q_min = qv[0];
 298                q_max = qv[0];
 299                for (i = 0; i < DACK_SN_8822C; i++) {
 300                        rtw8822c_rf_minmax_cmp(rtwdev, iv[i], &i_min, &i_max);
 301                        rtw8822c_rf_minmax_cmp(rtwdev, qv[i], &q_min, &q_max);
 302                }
 303
 304                if (i_max < 0x200 && i_min < 0x200)
 305                        i_delta = i_max - i_min;
 306                else if (i_max >= 0x200 && i_min >= 0x200)
 307                        i_delta = i_max - i_min;
 308                else
 309                        i_delta = i_max + (0x400 - i_min);
 310
 311                if (q_max < 0x200 && q_min < 0x200)
 312                        q_delta = q_max - q_min;
 313                else if (q_max >= 0x200 && q_min >= 0x200)
 314                        q_delta = q_max - q_min;
 315                else
 316                        q_delta = q_max + (0x400 - q_min);
 317
 318                rtw_dbg(rtwdev, RTW_DBG_RFK,
 319                        "[DACK] i: min=0x%08x, max=0x%08x, delta=0x%08x\n",
 320                        i_min, i_max, i_delta);
 321                rtw_dbg(rtwdev, RTW_DBG_RFK,
 322                        "[DACK] q: min=0x%08x, max=0x%08x, delta=0x%08x\n",
 323                        q_min, q_max, q_delta);
 324
 325                rtw8822c_dac_iq_sort(rtwdev, iv, qv);
 326
 327                if (i_delta > 5 || q_delta > 5) {
 328                        temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
 329                        iv[0] = (temp & 0x3ff000) >> 12;
 330                        qv[0] = temp & 0x3ff;
 331                        temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
 332                        iv[DACK_SN_8822C - 1] = (temp & 0x3ff000) >> 12;
 333                        qv[DACK_SN_8822C - 1] = temp & 0x3ff;
 334                } else {
 335                        break;
 336                }
 337        } while (cnt++ < 100);
 338
 339        rtw8822c_dac_iq_offset(rtwdev, iv, i_value);
 340        rtw8822c_dac_iq_offset(rtwdev, qv, q_value);
 341}
 342
 343static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,
 344                                     u32 *i_value, u32 *q_value)
 345{
 346        u32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];
 347        u32 rf_a, rf_b;
 348
 349        rf_a = rtw_read_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK);
 350        rf_b = rtw_read_rf(rtwdev, RF_PATH_B, 0x0, RFREG_MASK);
 351
 352        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] RF path-A=0x%05x\n", rf_a);
 353        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] RF path-B=0x%05x\n", rf_b);
 354
 355        rtw8822c_dac_cal_iq_sample(rtwdev, iv, qv);
 356        rtw8822c_dac_cal_iq_search(rtwdev, iv, qv, i_value, q_value);
 357}
 358
 359static void rtw8822c_dac_bb_setting(struct rtw_dev *rtwdev)
 360{
 361        rtw_write32_mask(rtwdev, 0x1d58, 0xff8, 0x1ff);
 362        rtw_write32_mask(rtwdev, 0x1a00, 0x3, 0x2);
 363        rtw_write32_mask(rtwdev, 0x1a14, 0x300, 0x3);
 364        rtw_write32(rtwdev, 0x1d70, 0x7e7e7e7e);
 365        rtw_write32_mask(rtwdev, 0x180c, 0x3, 0x0);
 366        rtw_write32_mask(rtwdev, 0x410c, 0x3, 0x0);
 367        rtw_write32(rtwdev, 0x1b00, 0x00000008);
 368        rtw_write8(rtwdev, 0x1bcc, 0x3f);
 369        rtw_write32(rtwdev, 0x1b00, 0x0000000a);
 370        rtw_write8(rtwdev, 0x1bcc, 0x3f);
 371        rtw_write32_mask(rtwdev, 0x1e24, BIT(31), 0x0);
 372        rtw_write32_mask(rtwdev, 0x1e28, 0xf, 0x3);
 373}
 374
 375static void rtw8822c_dac_cal_adc(struct rtw_dev *rtwdev,
 376                                 u8 path, u32 *adc_ic, u32 *adc_qc)
 377{
 378        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 379        u32 ic = 0, qc = 0, temp = 0;
 380        u32 base_addr;
 381        u32 path_sel;
 382        int i;
 383
 384        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK path(%d)\n", path);
 385
 386        base_addr = rtw8822c_get_path_write_addr(path);
 387        switch (path) {
 388        case RF_PATH_A:
 389                path_sel = 0xa0000;
 390                break;
 391        case RF_PATH_B:
 392                path_sel = 0x80000;
 393                break;
 394        default:
 395                WARN_ON(1);
 396                return;
 397        }
 398
 399        /* ADCK step1 */
 400        rtw_write32_mask(rtwdev, base_addr + 0x30, BIT(30), 0x0);
 401        if (path == RF_PATH_B)
 402                rtw_write32(rtwdev, base_addr + 0x30, 0x30db8041);
 403        rtw_write32(rtwdev, base_addr + 0x60, 0xf0040ff0);
 404        rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
 405        rtw_write32(rtwdev, base_addr + 0x10, 0x02dd08c4);
 406        rtw_write32(rtwdev, base_addr + 0x0c, 0x10000260);
 407        rtw_write_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK, 0x10000);
 408        rtw_write_rf(rtwdev, RF_PATH_B, 0x0, RFREG_MASK, 0x10000);
 409        for (i = 0; i < 10; i++) {
 410                rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK count=%d\n", i);
 411                rtw_write32(rtwdev, 0x1c3c, path_sel + 0x8003);
 412                rtw_write32(rtwdev, 0x1c24, 0x00010002);
 413                rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc);
 414                rtw_dbg(rtwdev, RTW_DBG_RFK,
 415                        "[DACK] before: i=0x%x, q=0x%x\n", ic, qc);
 416
 417                /* compensation value */
 418                if (ic != 0x0) {
 419                        ic = 0x400 - ic;
 420                        *adc_ic = ic;
 421                }
 422                if (qc != 0x0) {
 423                        qc = 0x400 - qc;
 424                        *adc_qc = qc;
 425                }
 426                temp = (ic & 0x3ff) | ((qc & 0x3ff) << 10);
 427                rtw_write32(rtwdev, base_addr + 0x68, temp);
 428                dm_info->dack_adck[path] = temp;
 429                rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK 0x%08x=0x08%x\n",
 430                        base_addr + 0x68, temp);
 431                /* check ADC DC offset */
 432                rtw_write32(rtwdev, 0x1c3c, path_sel + 0x8103);
 433                rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc);
 434                rtw_dbg(rtwdev, RTW_DBG_RFK,
 435                        "[DACK] after:  i=0x%08x, q=0x%08x\n", ic, qc);
 436                if (ic >= 0x200)
 437                        ic = 0x400 - ic;
 438                if (qc >= 0x200)
 439                        qc = 0x400 - qc;
 440                if (ic < 5 && qc < 5)
 441                        break;
 442        }
 443
 444        /* ADCK step2 */
 445        rtw_write32(rtwdev, 0x1c3c, 0x00000003);
 446        rtw_write32(rtwdev, base_addr + 0x0c, 0x10000260);
 447        rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c4);
 448
 449        /* release pull low switch on IQ path */
 450        rtw_write_rf(rtwdev, path, 0x8f, BIT(13), 0x1);
 451}
 452
 453static void rtw8822c_dac_cal_step1(struct rtw_dev *rtwdev, u8 path)
 454{
 455        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 456        u32 base_addr;
 457        u32 read_addr;
 458
 459        base_addr = rtw8822c_get_path_write_addr(path);
 460        read_addr = rtw8822c_get_path_read_addr(path);
 461
 462        rtw_write32(rtwdev, base_addr + 0x68, dm_info->dack_adck[path]);
 463        rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
 464        if (path == RF_PATH_A) {
 465                rtw_write32(rtwdev, base_addr + 0x60, 0xf0040ff0);
 466                rtw_write32(rtwdev, 0x1c38, 0xffffffff);
 467        }
 468        rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
 469        rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
 470        rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb88);
 471        rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff81);
 472        rtw_write32(rtwdev, base_addr + 0xc0, 0x0003d208);
 473        rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb88);
 474        rtw_write32(rtwdev, base_addr + 0xd8, 0x0008ff81);
 475        rtw_write32(rtwdev, base_addr + 0xdc, 0x0003d208);
 476        rtw_write32(rtwdev, base_addr + 0xb8, 0x60000000);
 477        mdelay(2);
 478        rtw_write32(rtwdev, base_addr + 0xbc, 0x000aff8d);
 479        mdelay(2);
 480        rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb89);
 481        rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb89);
 482        mdelay(1);
 483        rtw_write32(rtwdev, base_addr + 0xb8, 0x62000000);
 484        rtw_write32(rtwdev, base_addr + 0xd4, 0x62000000);
 485        mdelay(20);
 486        if (!check_hw_ready(rtwdev, read_addr + 0x08, 0x7fff80, 0xffff) ||
 487            !check_hw_ready(rtwdev, read_addr + 0x34, 0x7fff80, 0xffff))
 488                rtw_err(rtwdev, "failed to wait for dack ready\n");
 489        rtw_write32(rtwdev, base_addr + 0xb8, 0x02000000);
 490        mdelay(1);
 491        rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff87);
 492        rtw_write32(rtwdev, 0x9b4, 0xdb6db600);
 493        rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
 494        rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff87);
 495        rtw_write32(rtwdev, base_addr + 0x60, 0xf0000000);
 496}
 497
 498static void rtw8822c_dac_cal_step2(struct rtw_dev *rtwdev,
 499                                   u8 path, u32 *ic_out, u32 *qc_out)
 500{
 501        u32 base_addr;
 502        u32 ic, qc, ic_in, qc_in;
 503
 504        base_addr = rtw8822c_get_path_write_addr(path);
 505        rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xf0000000, 0x0);
 506        rtw_write32_mask(rtwdev, base_addr + 0xc0, 0xf, 0x8);
 507        rtw_write32_mask(rtwdev, base_addr + 0xd8, 0xf0000000, 0x0);
 508        rtw_write32_mask(rtwdev, base_addr + 0xdc, 0xf, 0x8);
 509
 510        rtw_write32(rtwdev, 0x1b00, 0x00000008);
 511        rtw_write8(rtwdev, 0x1bcc, 0x03f);
 512        rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
 513        rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
 514        rtw_write32(rtwdev, 0x1c3c, 0x00088103);
 515
 516        rtw8822c_dac_cal_rf_mode(rtwdev, &ic_in, &qc_in);
 517        ic = ic_in;
 518        qc = qc_in;
 519
 520        /* compensation value */
 521        if (ic != 0x0)
 522                ic = 0x400 - ic;
 523        if (qc != 0x0)
 524                qc = 0x400 - qc;
 525        if (ic < 0x300) {
 526                ic = ic * 2 * 6 / 5;
 527                ic = ic + 0x80;
 528        } else {
 529                ic = (0x400 - ic) * 2 * 6 / 5;
 530                ic = 0x7f - ic;
 531        }
 532        if (qc < 0x300) {
 533                qc = qc * 2 * 6 / 5;
 534                qc = qc + 0x80;
 535        } else {
 536                qc = (0x400 - qc) * 2 * 6 / 5;
 537                qc = 0x7f - qc;
 538        }
 539
 540        *ic_out = ic;
 541        *qc_out = qc;
 542
 543        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] before i=0x%x, q=0x%x\n", ic_in, qc_in);
 544        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] after  i=0x%x, q=0x%x\n", ic, qc);
 545}
 546
 547static void rtw8822c_dac_cal_step3(struct rtw_dev *rtwdev, u8 path,
 548                                   u32 adc_ic, u32 adc_qc,
 549                                   u32 *ic_in, u32 *qc_in,
 550                                   u32 *i_out, u32 *q_out)
 551{
 552        u32 base_addr;
 553        u32 read_addr;
 554        u32 ic, qc;
 555        u32 temp;
 556
 557        base_addr = rtw8822c_get_path_write_addr(path);
 558        read_addr = rtw8822c_get_path_read_addr(path);
 559        ic = *ic_in;
 560        qc = *qc_in;
 561
 562        rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
 563        rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
 564        rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
 565        rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb88);
 566        rtw_write32(rtwdev, base_addr + 0xbc, 0xc008ff81);
 567        rtw_write32(rtwdev, base_addr + 0xc0, 0x0003d208);
 568        rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xf0000000, ic & 0xf);
 569        rtw_write32_mask(rtwdev, base_addr + 0xc0, 0xf, (ic & 0xf0) >> 4);
 570        rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb88);
 571        rtw_write32(rtwdev, base_addr + 0xd8, 0xe008ff81);
 572        rtw_write32(rtwdev, base_addr + 0xdc, 0x0003d208);
 573        rtw_write32_mask(rtwdev, base_addr + 0xd8, 0xf0000000, qc & 0xf);
 574        rtw_write32_mask(rtwdev, base_addr + 0xdc, 0xf, (qc & 0xf0) >> 4);
 575        rtw_write32(rtwdev, base_addr + 0xb8, 0x60000000);
 576        mdelay(2);
 577        rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xe, 0x6);
 578        mdelay(2);
 579        rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb89);
 580        rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb89);
 581        mdelay(1);
 582        rtw_write32(rtwdev, base_addr + 0xb8, 0x62000000);
 583        rtw_write32(rtwdev, base_addr + 0xd4, 0x62000000);
 584        mdelay(20);
 585        if (!check_hw_ready(rtwdev, read_addr + 0x24, 0x07f80000, ic) ||
 586            !check_hw_ready(rtwdev, read_addr + 0x50, 0x07f80000, qc))
 587                rtw_err(rtwdev, "failed to write IQ vector to hardware\n");
 588        rtw_write32(rtwdev, base_addr + 0xb8, 0x02000000);
 589        mdelay(1);
 590        rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xe, 0x3);
 591        rtw_write32(rtwdev, 0x9b4, 0xdb6db600);
 592
 593        /* check DAC DC offset */
 594        temp = ((adc_ic + 0x10) & 0x3ff) | (((adc_qc + 0x10) & 0x3ff) << 10);
 595        rtw_write32(rtwdev, base_addr + 0x68, temp);
 596        rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
 597        rtw_write32(rtwdev, base_addr + 0x60, 0xf0000000);
 598        rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc);
 599        if (ic >= 0x10)
 600                ic = ic - 0x10;
 601        else
 602                ic = 0x400 - (0x10 - ic);
 603
 604        if (qc >= 0x10)
 605                qc = qc - 0x10;
 606        else
 607                qc = 0x400 - (0x10 - qc);
 608
 609        *i_out = ic;
 610        *q_out = qc;
 611
 612        if (ic >= 0x200)
 613                ic = 0x400 - ic;
 614        if (qc >= 0x200)
 615                qc = 0x400 - qc;
 616
 617        *ic_in = ic;
 618        *qc_in = qc;
 619
 620        rtw_dbg(rtwdev, RTW_DBG_RFK,
 621                "[DACK] after  DACK i=0x%x, q=0x%x\n", *i_out, *q_out);
 622}
 623
 624static void rtw8822c_dac_cal_step4(struct rtw_dev *rtwdev, u8 path)
 625{
 626        u32 base_addr = rtw8822c_get_path_write_addr(path);
 627
 628        rtw_write32(rtwdev, base_addr + 0x68, 0x0);
 629        rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c4);
 630        rtw_write32_mask(rtwdev, base_addr + 0xbc, 0x1, 0x0);
 631        rtw_write32_mask(rtwdev, base_addr + 0x30, BIT(30), 0x1);
 632}
 633
 634static void rtw8822c_dac_cal_backup_vec(struct rtw_dev *rtwdev,
 635                                        u8 path, u8 vec, u32 w_addr, u32 r_addr)
 636{
 637        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 638        u16 val;
 639        u32 i;
 640
 641        if (WARN_ON(vec >= 2))
 642                return;
 643
 644        for (i = 0; i < DACK_MSBK_BACKUP_NUM; i++) {
 645                rtw_write32_mask(rtwdev, w_addr, 0xf0000000, i);
 646                val = (u16)rtw_read32_mask(rtwdev, r_addr, 0x7fc0000);
 647                dm_info->dack_msbk[path][vec][i] = val;
 648        }
 649}
 650
 651static void rtw8822c_dac_cal_backup_path(struct rtw_dev *rtwdev, u8 path)
 652{
 653        u32 w_off = 0x1c;
 654        u32 r_off = 0x2c;
 655        u32 w_addr, r_addr;
 656
 657        if (WARN_ON(path >= 2))
 658                return;
 659
 660        /* backup I vector */
 661        w_addr = rtw8822c_get_path_write_addr(path) + 0xb0;
 662        r_addr = rtw8822c_get_path_read_addr(path) + 0x10;
 663        rtw8822c_dac_cal_backup_vec(rtwdev, path, 0, w_addr, r_addr);
 664
 665        /* backup Q vector */
 666        w_addr = rtw8822c_get_path_write_addr(path) + 0xb0 + w_off;
 667        r_addr = rtw8822c_get_path_read_addr(path) + 0x10 + r_off;
 668        rtw8822c_dac_cal_backup_vec(rtwdev, path, 1, w_addr, r_addr);
 669}
 670
 671static void rtw8822c_dac_cal_backup_dck(struct rtw_dev *rtwdev)
 672{
 673        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 674        u8 val;
 675
 676        val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_I_0, 0xf0000000);
 677        dm_info->dack_dck[RF_PATH_A][0][0] = val;
 678        val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_I_1, 0xf);
 679        dm_info->dack_dck[RF_PATH_A][0][1] = val;
 680        val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_Q_0, 0xf0000000);
 681        dm_info->dack_dck[RF_PATH_A][1][0] = val;
 682        val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_Q_1, 0xf);
 683        dm_info->dack_dck[RF_PATH_A][1][1] = val;
 684
 685        val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_I_0, 0xf0000000);
 686        dm_info->dack_dck[RF_PATH_B][0][0] = val;
 687        val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_I_1, 0xf);
 688        dm_info->dack_dck[RF_PATH_B][1][0] = val;
 689        val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_Q_0, 0xf0000000);
 690        dm_info->dack_dck[RF_PATH_B][0][1] = val;
 691        val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_Q_1, 0xf);
 692        dm_info->dack_dck[RF_PATH_B][1][1] = val;
 693}
 694
 695static void rtw8822c_dac_cal_backup(struct rtw_dev *rtwdev)
 696{
 697        u32 temp[3];
 698
 699        temp[0] = rtw_read32(rtwdev, 0x1860);
 700        temp[1] = rtw_read32(rtwdev, 0x4160);
 701        temp[2] = rtw_read32(rtwdev, 0x9b4);
 702
 703        /* set clock */
 704        rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
 705
 706        /* backup path-A I/Q */
 707        rtw_write32_clr(rtwdev, 0x1830, BIT(30));
 708        rtw_write32_mask(rtwdev, 0x1860, 0xfc000000, 0x3c);
 709        rtw8822c_dac_cal_backup_path(rtwdev, RF_PATH_A);
 710
 711        /* backup path-B I/Q */
 712        rtw_write32_clr(rtwdev, 0x4130, BIT(30));
 713        rtw_write32_mask(rtwdev, 0x4160, 0xfc000000, 0x3c);
 714        rtw8822c_dac_cal_backup_path(rtwdev, RF_PATH_B);
 715
 716        rtw8822c_dac_cal_backup_dck(rtwdev);
 717        rtw_write32_set(rtwdev, 0x1830, BIT(30));
 718        rtw_write32_set(rtwdev, 0x4130, BIT(30));
 719
 720        rtw_write32(rtwdev, 0x1860, temp[0]);
 721        rtw_write32(rtwdev, 0x4160, temp[1]);
 722        rtw_write32(rtwdev, 0x9b4, temp[2]);
 723}
 724
 725static void rtw8822c_dac_cal_restore_dck(struct rtw_dev *rtwdev)
 726{
 727        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 728        u8 val;
 729
 730        rtw_write32_set(rtwdev, REG_DCKA_I_0, BIT(19));
 731        val = dm_info->dack_dck[RF_PATH_A][0][0];
 732        rtw_write32_mask(rtwdev, REG_DCKA_I_0, 0xf0000000, val);
 733        val = dm_info->dack_dck[RF_PATH_A][0][1];
 734        rtw_write32_mask(rtwdev, REG_DCKA_I_1, 0xf, val);
 735
 736        rtw_write32_set(rtwdev, REG_DCKA_Q_0, BIT(19));
 737        val = dm_info->dack_dck[RF_PATH_A][1][0];
 738        rtw_write32_mask(rtwdev, REG_DCKA_Q_0, 0xf0000000, val);
 739        val = dm_info->dack_dck[RF_PATH_A][1][1];
 740        rtw_write32_mask(rtwdev, REG_DCKA_Q_1, 0xf, val);
 741
 742        rtw_write32_set(rtwdev, REG_DCKB_I_0, BIT(19));
 743        val = dm_info->dack_dck[RF_PATH_B][0][0];
 744        rtw_write32_mask(rtwdev, REG_DCKB_I_0, 0xf0000000, val);
 745        val = dm_info->dack_dck[RF_PATH_B][0][1];
 746        rtw_write32_mask(rtwdev, REG_DCKB_I_1, 0xf, val);
 747
 748        rtw_write32_set(rtwdev, REG_DCKB_Q_0, BIT(19));
 749        val = dm_info->dack_dck[RF_PATH_B][1][0];
 750        rtw_write32_mask(rtwdev, REG_DCKB_Q_0, 0xf0000000, val);
 751        val = dm_info->dack_dck[RF_PATH_B][1][1];
 752        rtw_write32_mask(rtwdev, REG_DCKB_Q_1, 0xf, val);
 753}
 754
 755static void rtw8822c_dac_cal_restore_prepare(struct rtw_dev *rtwdev)
 756{
 757        rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
 758
 759        rtw_write32_mask(rtwdev, 0x18b0, BIT(27), 0x0);
 760        rtw_write32_mask(rtwdev, 0x18cc, BIT(27), 0x0);
 761        rtw_write32_mask(rtwdev, 0x41b0, BIT(27), 0x0);
 762        rtw_write32_mask(rtwdev, 0x41cc, BIT(27), 0x0);
 763
 764        rtw_write32_mask(rtwdev, 0x1830, BIT(30), 0x0);
 765        rtw_write32_mask(rtwdev, 0x1860, 0xfc000000, 0x3c);
 766        rtw_write32_mask(rtwdev, 0x18b4, BIT(0), 0x1);
 767        rtw_write32_mask(rtwdev, 0x18d0, BIT(0), 0x1);
 768
 769        rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x0);
 770        rtw_write32_mask(rtwdev, 0x4160, 0xfc000000, 0x3c);
 771        rtw_write32_mask(rtwdev, 0x41b4, BIT(0), 0x1);
 772        rtw_write32_mask(rtwdev, 0x41d0, BIT(0), 0x1);
 773
 774        rtw_write32_mask(rtwdev, 0x18b0, 0xf00, 0x0);
 775        rtw_write32_mask(rtwdev, 0x18c0, BIT(14), 0x0);
 776        rtw_write32_mask(rtwdev, 0x18cc, 0xf00, 0x0);
 777        rtw_write32_mask(rtwdev, 0x18dc, BIT(14), 0x0);
 778
 779        rtw_write32_mask(rtwdev, 0x18b0, BIT(0), 0x0);
 780        rtw_write32_mask(rtwdev, 0x18cc, BIT(0), 0x0);
 781        rtw_write32_mask(rtwdev, 0x18b0, BIT(0), 0x1);
 782        rtw_write32_mask(rtwdev, 0x18cc, BIT(0), 0x1);
 783
 784        rtw8822c_dac_cal_restore_dck(rtwdev);
 785
 786        rtw_write32_mask(rtwdev, 0x18c0, 0x38000, 0x7);
 787        rtw_write32_mask(rtwdev, 0x18dc, 0x38000, 0x7);
 788        rtw_write32_mask(rtwdev, 0x41c0, 0x38000, 0x7);
 789        rtw_write32_mask(rtwdev, 0x41dc, 0x38000, 0x7);
 790
 791        rtw_write32_mask(rtwdev, 0x18b8, BIT(26) | BIT(25), 0x1);
 792        rtw_write32_mask(rtwdev, 0x18d4, BIT(26) | BIT(25), 0x1);
 793
 794        rtw_write32_mask(rtwdev, 0x41b0, 0xf00, 0x0);
 795        rtw_write32_mask(rtwdev, 0x41c0, BIT(14), 0x0);
 796        rtw_write32_mask(rtwdev, 0x41cc, 0xf00, 0x0);
 797        rtw_write32_mask(rtwdev, 0x41dc, BIT(14), 0x0);
 798
 799        rtw_write32_mask(rtwdev, 0x41b0, BIT(0), 0x0);
 800        rtw_write32_mask(rtwdev, 0x41cc, BIT(0), 0x0);
 801        rtw_write32_mask(rtwdev, 0x41b0, BIT(0), 0x1);
 802        rtw_write32_mask(rtwdev, 0x41cc, BIT(0), 0x1);
 803
 804        rtw_write32_mask(rtwdev, 0x41b8, BIT(26) | BIT(25), 0x1);
 805        rtw_write32_mask(rtwdev, 0x41d4, BIT(26) | BIT(25), 0x1);
 806}
 807
 808static bool rtw8822c_dac_cal_restore_wait(struct rtw_dev *rtwdev,
 809                                          u32 target_addr, u32 toggle_addr)
 810{
 811        u32 cnt = 0;
 812
 813        do {
 814                rtw_write32_mask(rtwdev, toggle_addr, BIT(26) | BIT(25), 0x0);
 815                rtw_write32_mask(rtwdev, toggle_addr, BIT(26) | BIT(25), 0x2);
 816
 817                if (rtw_read32_mask(rtwdev, target_addr, 0xf) == 0x6)
 818                        return true;
 819
 820        } while (cnt++ < 100);
 821
 822        return false;
 823}
 824
 825static bool rtw8822c_dac_cal_restore_path(struct rtw_dev *rtwdev, u8 path)
 826{
 827        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 828        u32 w_off = 0x1c;
 829        u32 r_off = 0x2c;
 830        u32 w_i, r_i, w_q, r_q;
 831        u32 value;
 832        u32 i;
 833
 834        w_i = rtw8822c_get_path_write_addr(path) + 0xb0;
 835        r_i = rtw8822c_get_path_read_addr(path) + 0x08;
 836        w_q = rtw8822c_get_path_write_addr(path) + 0xb0 + w_off;
 837        r_q = rtw8822c_get_path_read_addr(path) + 0x08 + r_off;
 838
 839        if (!rtw8822c_dac_cal_restore_wait(rtwdev, r_i, w_i + 0x8))
 840                return false;
 841
 842        for (i = 0; i < DACK_MSBK_BACKUP_NUM; i++) {
 843                rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x0);
 844                value = dm_info->dack_msbk[path][0][i];
 845                rtw_write32_mask(rtwdev, w_i + 0x4, 0xff8, value);
 846                rtw_write32_mask(rtwdev, w_i, 0xf0000000, i);
 847                rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x1);
 848        }
 849
 850        rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x0);
 851
 852        if (!rtw8822c_dac_cal_restore_wait(rtwdev, r_q, w_q + 0x8))
 853                return false;
 854
 855        for (i = 0; i < DACK_MSBK_BACKUP_NUM; i++) {
 856                rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x0);
 857                value = dm_info->dack_msbk[path][1][i];
 858                rtw_write32_mask(rtwdev, w_q + 0x4, 0xff8, value);
 859                rtw_write32_mask(rtwdev, w_q, 0xf0000000, i);
 860                rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x1);
 861        }
 862        rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x0);
 863
 864        rtw_write32_mask(rtwdev, w_i + 0x8, BIT(26) | BIT(25), 0x0);
 865        rtw_write32_mask(rtwdev, w_q + 0x8, BIT(26) | BIT(25), 0x0);
 866        rtw_write32_mask(rtwdev, w_i + 0x4, BIT(0), 0x0);
 867        rtw_write32_mask(rtwdev, w_q + 0x4, BIT(0), 0x0);
 868
 869        return true;
 870}
 871
 872static bool __rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev)
 873{
 874        if (!rtw8822c_dac_cal_restore_path(rtwdev, RF_PATH_A))
 875                return false;
 876
 877        if (!rtw8822c_dac_cal_restore_path(rtwdev, RF_PATH_B))
 878                return false;
 879
 880        return true;
 881}
 882
 883static bool rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev)
 884{
 885        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 886        u32 temp[3];
 887
 888        /* sample the first element for both path's IQ vector */
 889        if (dm_info->dack_msbk[RF_PATH_A][0][0] == 0 &&
 890            dm_info->dack_msbk[RF_PATH_A][1][0] == 0 &&
 891            dm_info->dack_msbk[RF_PATH_B][0][0] == 0 &&
 892            dm_info->dack_msbk[RF_PATH_B][1][0] == 0)
 893                return false;
 894
 895        temp[0] = rtw_read32(rtwdev, 0x1860);
 896        temp[1] = rtw_read32(rtwdev, 0x4160);
 897        temp[2] = rtw_read32(rtwdev, 0x9b4);
 898
 899        rtw8822c_dac_cal_restore_prepare(rtwdev);
 900        if (!check_hw_ready(rtwdev, 0x2808, 0x7fff80, 0xffff) ||
 901            !check_hw_ready(rtwdev, 0x2834, 0x7fff80, 0xffff) ||
 902            !check_hw_ready(rtwdev, 0x4508, 0x7fff80, 0xffff) ||
 903            !check_hw_ready(rtwdev, 0x4534, 0x7fff80, 0xffff))
 904                return false;
 905
 906        if (!__rtw8822c_dac_cal_restore(rtwdev)) {
 907                rtw_err(rtwdev, "failed to restore dack vectors\n");
 908                return false;
 909        }
 910
 911        rtw_write32_mask(rtwdev, 0x1830, BIT(30), 0x1);
 912        rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x1);
 913        rtw_write32(rtwdev, 0x1860, temp[0]);
 914        rtw_write32(rtwdev, 0x4160, temp[1]);
 915        rtw_write32_mask(rtwdev, 0x18b0, BIT(27), 0x1);
 916        rtw_write32_mask(rtwdev, 0x18cc, BIT(27), 0x1);
 917        rtw_write32_mask(rtwdev, 0x41b0, BIT(27), 0x1);
 918        rtw_write32_mask(rtwdev, 0x41cc, BIT(27), 0x1);
 919        rtw_write32(rtwdev, 0x9b4, temp[2]);
 920
 921        return true;
 922}
 923
 924static void rtw8822c_rf_dac_cal(struct rtw_dev *rtwdev)
 925{
 926        struct rtw_backup_info backup_rf[DACK_RF_8822C * DACK_PATH_8822C];
 927        struct rtw_backup_info backup[DACK_REG_8822C];
 928        u32 ic = 0, qc = 0, i;
 929        u32 i_a = 0x0, q_a = 0x0, i_b = 0x0, q_b = 0x0;
 930        u32 ic_a = 0x0, qc_a = 0x0, ic_b = 0x0, qc_b = 0x0;
 931        u32 adc_ic_a = 0x0, adc_qc_a = 0x0, adc_ic_b = 0x0, adc_qc_b = 0x0;
 932
 933        if (rtw8822c_dac_cal_restore(rtwdev))
 934                return;
 935
 936        /* not able to restore, do it */
 937
 938        rtw8822c_dac_backup_reg(rtwdev, backup, backup_rf);
 939
 940        rtw8822c_dac_bb_setting(rtwdev);
 941
 942        /* path-A */
 943        rtw8822c_dac_cal_adc(rtwdev, RF_PATH_A, &adc_ic_a, &adc_qc_a);
 944        for (i = 0; i < 10; i++) {
 945                rtw8822c_dac_cal_step1(rtwdev, RF_PATH_A);
 946                rtw8822c_dac_cal_step2(rtwdev, RF_PATH_A, &ic, &qc);
 947                ic_a = ic;
 948                qc_a = qc;
 949
 950                rtw8822c_dac_cal_step3(rtwdev, RF_PATH_A, adc_ic_a, adc_qc_a,
 951                                       &ic, &qc, &i_a, &q_a);
 952
 953                if (ic < 5 && qc < 5)
 954                        break;
 955        }
 956        rtw8822c_dac_cal_step4(rtwdev, RF_PATH_A);
 957
 958        /* path-B */
 959        rtw8822c_dac_cal_adc(rtwdev, RF_PATH_B, &adc_ic_b, &adc_qc_b);
 960        for (i = 0; i < 10; i++) {
 961                rtw8822c_dac_cal_step1(rtwdev, RF_PATH_B);
 962                rtw8822c_dac_cal_step2(rtwdev, RF_PATH_B, &ic, &qc);
 963                ic_b = ic;
 964                qc_b = qc;
 965
 966                rtw8822c_dac_cal_step3(rtwdev, RF_PATH_B, adc_ic_b, adc_qc_b,
 967                                       &ic, &qc, &i_b, &q_b);
 968
 969                if (ic < 5 && qc < 5)
 970                        break;
 971        }
 972        rtw8822c_dac_cal_step4(rtwdev, RF_PATH_B);
 973
 974        rtw_write32(rtwdev, 0x1b00, 0x00000008);
 975        rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x1);
 976        rtw_write8(rtwdev, 0x1bcc, 0x0);
 977        rtw_write32(rtwdev, 0x1b00, 0x0000000a);
 978        rtw_write8(rtwdev, 0x1bcc, 0x0);
 979
 980        rtw8822c_dac_restore_reg(rtwdev, backup, backup_rf);
 981
 982        /* backup results to restore, saving a lot of time */
 983        rtw8822c_dac_cal_backup(rtwdev);
 984
 985        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path A: ic=0x%x, qc=0x%x\n", ic_a, qc_a);
 986        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path B: ic=0x%x, qc=0x%x\n", ic_b, qc_b);
 987        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path A: i=0x%x, q=0x%x\n", i_a, q_a);
 988        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path B: i=0x%x, q=0x%x\n", i_b, q_b);
 989}
 990
 991static void rtw8822c_rf_x2_check(struct rtw_dev *rtwdev)
 992{
 993        u8 x2k_busy;
 994
 995        mdelay(1);
 996        x2k_busy = rtw_read_rf(rtwdev, RF_PATH_A, 0xb8, BIT(15));
 997        if (x2k_busy == 1) {
 998                rtw_write_rf(rtwdev, RF_PATH_A, 0xb8, RFREG_MASK, 0xC4440);
 999                rtw_write_rf(rtwdev, RF_PATH_A, 0xba, RFREG_MASK, 0x6840D);
1000                rtw_write_rf(rtwdev, RF_PATH_A, 0xb8, RFREG_MASK, 0x80440);
1001                mdelay(1);
1002        }
1003}
1004
1005static void rtw8822c_set_power_trim(struct rtw_dev *rtwdev, s8 bb_gain[2][8])
1006{
1007#define RF_SET_POWER_TRIM(_path, _seq, _idx)                                    \
1008                do {                                                            \
1009                        rtw_write_rf(rtwdev, _path, 0x33, RFREG_MASK, _seq);    \
1010                        rtw_write_rf(rtwdev, _path, 0x3f, RFREG_MASK,           \
1011                                     bb_gain[_path][_idx]);                     \
1012                } while (0)
1013        u8 path;
1014
1015        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1016                rtw_write_rf(rtwdev, path, 0xee, BIT(19), 1);
1017                RF_SET_POWER_TRIM(path, 0x0, 0);
1018                RF_SET_POWER_TRIM(path, 0x1, 1);
1019                RF_SET_POWER_TRIM(path, 0x2, 2);
1020                RF_SET_POWER_TRIM(path, 0x3, 2);
1021                RF_SET_POWER_TRIM(path, 0x4, 3);
1022                RF_SET_POWER_TRIM(path, 0x5, 4);
1023                RF_SET_POWER_TRIM(path, 0x6, 5);
1024                RF_SET_POWER_TRIM(path, 0x7, 6);
1025                RF_SET_POWER_TRIM(path, 0x8, 7);
1026                RF_SET_POWER_TRIM(path, 0x9, 3);
1027                RF_SET_POWER_TRIM(path, 0xa, 4);
1028                RF_SET_POWER_TRIM(path, 0xb, 5);
1029                RF_SET_POWER_TRIM(path, 0xc, 6);
1030                RF_SET_POWER_TRIM(path, 0xd, 7);
1031                RF_SET_POWER_TRIM(path, 0xe, 7);
1032                rtw_write_rf(rtwdev, path, 0xee, BIT(19), 0);
1033        }
1034#undef RF_SET_POWER_TRIM
1035}
1036
1037static void rtw8822c_power_trim(struct rtw_dev *rtwdev)
1038{
1039        u8 pg_pwr = 0xff, i, path, idx;
1040        s8 bb_gain[2][8] = {};
1041        u16 rf_efuse_2g[3] = {PPG_2GL_TXAB, PPG_2GM_TXAB, PPG_2GH_TXAB};
1042        u16 rf_efuse_5g[2][5] = {{PPG_5GL1_TXA, PPG_5GL2_TXA, PPG_5GM1_TXA,
1043                                  PPG_5GM2_TXA, PPG_5GH1_TXA},
1044                                 {PPG_5GL1_TXB, PPG_5GL2_TXB, PPG_5GM1_TXB,
1045                                  PPG_5GM2_TXB, PPG_5GH1_TXB} };
1046        bool set = false;
1047
1048        for (i = 0; i < ARRAY_SIZE(rf_efuse_2g); i++) {
1049                rtw_read8_physical_efuse(rtwdev, rf_efuse_2g[i], &pg_pwr);
1050                if (pg_pwr == EFUSE_READ_FAIL)
1051                        continue;
1052                set = true;
1053                bb_gain[RF_PATH_A][i] = FIELD_GET(PPG_2G_A_MASK, pg_pwr);
1054                bb_gain[RF_PATH_B][i] = FIELD_GET(PPG_2G_B_MASK, pg_pwr);
1055        }
1056
1057        for (i = 0; i < ARRAY_SIZE(rf_efuse_5g[0]); i++) {
1058                for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1059                        rtw_read8_physical_efuse(rtwdev, rf_efuse_5g[path][i],
1060                                                 &pg_pwr);
1061                        if (pg_pwr == EFUSE_READ_FAIL)
1062                                continue;
1063                        set = true;
1064                        idx = i + ARRAY_SIZE(rf_efuse_2g);
1065                        bb_gain[path][idx] = FIELD_GET(PPG_5G_MASK, pg_pwr);
1066                }
1067        }
1068        if (set)
1069                rtw8822c_set_power_trim(rtwdev, bb_gain);
1070
1071        rtw_write32_mask(rtwdev, REG_DIS_DPD, DIS_DPD_MASK, DIS_DPD_RATEALL);
1072}
1073
1074static void rtw8822c_thermal_trim(struct rtw_dev *rtwdev)
1075{
1076        u16 rf_efuse[2] = {PPG_THERMAL_A, PPG_THERMAL_B};
1077        u8 pg_therm = 0xff, thermal[2] = {0}, path;
1078
1079        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1080                rtw_read8_physical_efuse(rtwdev, rf_efuse[path], &pg_therm);
1081                if (pg_therm == EFUSE_READ_FAIL)
1082                        return;
1083                /* Efuse value of BIT(0) shall be move to BIT(3), and the value
1084                 * of BIT(1) to BIT(3) should be right shifted 1 bit.
1085                 */
1086                thermal[path] = FIELD_GET(GENMASK(3, 1), pg_therm);
1087                thermal[path] |= FIELD_PREP(BIT(3), pg_therm & BIT(0));
1088                rtw_write_rf(rtwdev, path, 0x43, RF_THEMAL_MASK, thermal[path]);
1089        }
1090}
1091
1092static void rtw8822c_pa_bias(struct rtw_dev *rtwdev)
1093{
1094        u16 rf_efuse_2g[2] = {PPG_PABIAS_2GA, PPG_PABIAS_2GB};
1095        u16 rf_efuse_5g[2] = {PPG_PABIAS_5GA, PPG_PABIAS_5GB};
1096        u8 pg_pa_bias = 0xff, path;
1097
1098        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1099                rtw_read8_physical_efuse(rtwdev, rf_efuse_2g[path],
1100                                         &pg_pa_bias);
1101                if (pg_pa_bias == EFUSE_READ_FAIL)
1102                        return;
1103                pg_pa_bias = FIELD_GET(PPG_PABIAS_MASK, pg_pa_bias);
1104                rtw_write_rf(rtwdev, path, RF_PA, RF_PABIAS_2G_MASK, pg_pa_bias);
1105        }
1106        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1107                rtw_read8_physical_efuse(rtwdev, rf_efuse_5g[path],
1108                                         &pg_pa_bias);
1109                pg_pa_bias = FIELD_GET(PPG_PABIAS_MASK, pg_pa_bias);
1110                rtw_write_rf(rtwdev, path, RF_PA, RF_PABIAS_5G_MASK, pg_pa_bias);
1111        }
1112}
1113
1114static void rtw8822c_rfk_handshake(struct rtw_dev *rtwdev, bool is_before_k)
1115{
1116        struct rtw_dm_info *dm = &rtwdev->dm_info;
1117        u8 u1b_tmp;
1118        u8 u4b_tmp;
1119        int ret;
1120
1121        if (is_before_k) {
1122                rtw_dbg(rtwdev, RTW_DBG_RFK,
1123                        "[RFK] WiFi / BT RFK handshake start!!\n");
1124
1125                if (!dm->is_bt_iqk_timeout) {
1126                        ret = read_poll_timeout(rtw_read32_mask, u4b_tmp,
1127                                                u4b_tmp == 0, 20, 600000, false,
1128                                                rtwdev, REG_PMC_DBG_CTRL1,
1129                                                BITS_PMC_BT_IQK_STS);
1130                        if (ret) {
1131                                rtw_dbg(rtwdev, RTW_DBG_RFK,
1132                                        "[RFK] Wait BT IQK finish timeout!!\n");
1133                                dm->is_bt_iqk_timeout = true;
1134                        }
1135                }
1136
1137                rtw_fw_inform_rfk_status(rtwdev, true);
1138
1139                ret = read_poll_timeout(rtw_read8_mask, u1b_tmp,
1140                                        u1b_tmp == 1, 20, 100000, false,
1141                                        rtwdev, REG_ARFR4, BIT_WL_RFK);
1142                if (ret)
1143                        rtw_dbg(rtwdev, RTW_DBG_RFK,
1144                                "[RFK] Send WiFi RFK start H2C cmd FAIL!!\n");
1145        } else {
1146                rtw_fw_inform_rfk_status(rtwdev, false);
1147                ret = read_poll_timeout(rtw_read8_mask, u1b_tmp,
1148                                        u1b_tmp == 1, 20, 100000, false,
1149                                        rtwdev, REG_ARFR4,
1150                                        BIT_WL_RFK);
1151                if (ret)
1152                        rtw_dbg(rtwdev, RTW_DBG_RFK,
1153                                "[RFK] Send WiFi RFK finish H2C cmd FAIL!!\n");
1154
1155                rtw_dbg(rtwdev, RTW_DBG_RFK,
1156                        "[RFK] WiFi / BT RFK handshake finish!!\n");
1157        }
1158}
1159
1160static void rtw8822c_rfk_power_save(struct rtw_dev *rtwdev,
1161                                    bool is_power_save)
1162{
1163        u8 path;
1164
1165        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1166                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path);
1167                rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_PS_EN,
1168                                 is_power_save ? 0 : 1);
1169        }
1170}
1171
1172static void rtw8822c_txgapk_backup_bb_reg(struct rtw_dev *rtwdev, const u32 reg[],
1173                                          u32 reg_backup[], u32 reg_num)
1174{
1175        u32 i;
1176
1177        for (i = 0; i < reg_num; i++) {
1178                reg_backup[i] = rtw_read32(rtwdev, reg[i]);
1179
1180                rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] Backup BB 0x%x = 0x%x\n",
1181                        reg[i], reg_backup[i]);
1182        }
1183}
1184
1185static void rtw8822c_txgapk_reload_bb_reg(struct rtw_dev *rtwdev,
1186                                          const u32 reg[], u32 reg_backup[],
1187                                          u32 reg_num)
1188{
1189        u32 i;
1190
1191        for (i = 0; i < reg_num; i++) {
1192                rtw_write32(rtwdev, reg[i], reg_backup[i]);
1193                rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] Reload BB 0x%x = 0x%x\n",
1194                        reg[i], reg_backup[i]);
1195        }
1196}
1197
1198static bool check_rf_status(struct rtw_dev *rtwdev, u8 status)
1199{
1200        u8 reg_rf0_a, reg_rf0_b;
1201
1202        reg_rf0_a = (u8)rtw_read_rf(rtwdev, RF_PATH_A,
1203                                    RF_MODE_TRXAGC, BIT_RF_MODE);
1204        reg_rf0_b = (u8)rtw_read_rf(rtwdev, RF_PATH_B,
1205                                    RF_MODE_TRXAGC, BIT_RF_MODE);
1206
1207        if (reg_rf0_a == status || reg_rf0_b == status)
1208                return false;
1209
1210        return true;
1211}
1212
1213static void rtw8822c_txgapk_tx_pause(struct rtw_dev *rtwdev)
1214{
1215        bool status;
1216        int ret;
1217
1218        rtw_write8(rtwdev, REG_TXPAUSE, BIT_AC_QUEUE);
1219        rtw_write32_mask(rtwdev, REG_TX_FIFO, BIT_STOP_TX, 0x2);
1220
1221        ret = read_poll_timeout_atomic(check_rf_status, status, status,
1222                                       2, 5000, false, rtwdev, 2);
1223        if (ret)
1224                rtw_warn(rtwdev, "failed to pause TX\n");
1225
1226        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] Tx pause!!\n");
1227}
1228
1229static void rtw8822c_txgapk_bb_dpk(struct rtw_dev *rtwdev, u8 path)
1230{
1231        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1232
1233        rtw_write32_mask(rtwdev, REG_ENFN, BIT_IQK_DPK_EN, 0x1);
1234        rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2,
1235                         BIT_IQK_DPK_CLOCK_SRC, 0x1);
1236        rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2,
1237                         BIT_IQK_DPK_RESET_SRC, 0x1);
1238        rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2, BIT_EN_IOQ_IQK_DPK, 0x1);
1239        rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2, BIT_TST_IQK2SET_SRC, 0x0);
1240        rtw_write32_mask(rtwdev, REG_CCA_OFF, BIT_CCA_ON_BY_PW, 0x1ff);
1241
1242        if (path == RF_PATH_A) {
1243                rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_A,
1244                                 BIT_RFTXEN_GCK_FORCE_ON, 0x1);
1245                rtw_write32_mask(rtwdev, REG_3WIRE, BIT_DIS_SHARERX_TXGAT, 0x1);
1246                rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_A,
1247                                 BIT_TX_SCALE_0DB, 0x1);
1248                rtw_write32_mask(rtwdev, REG_3WIRE, BIT_3WIRE_EN, 0x0);
1249        } else if (path == RF_PATH_B) {
1250                rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_B,
1251                                 BIT_RFTXEN_GCK_FORCE_ON, 0x1);
1252                rtw_write32_mask(rtwdev, REG_3WIRE2,
1253                                 BIT_DIS_SHARERX_TXGAT, 0x1);
1254                rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_B,
1255                                 BIT_TX_SCALE_0DB, 0x1);
1256                rtw_write32_mask(rtwdev, REG_3WIRE2, BIT_3WIRE_EN, 0x0);
1257        }
1258        rtw_write32_mask(rtwdev, REG_CCKSB, BIT_BBMODE, 0x2);
1259}
1260
1261static void rtw8822c_txgapk_afe_dpk(struct rtw_dev *rtwdev, u8 path)
1262{
1263        u32 reg;
1264
1265        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1266
1267        if (path == RF_PATH_A) {
1268                reg = REG_ANAPAR_A;
1269        } else if (path == RF_PATH_B) {
1270                reg = REG_ANAPAR_B;
1271        } else {
1272                rtw_err(rtwdev, "[TXGAPK] unknown path %d!!\n", path);
1273                return;
1274        }
1275
1276        rtw_write32_mask(rtwdev, REG_IQK_CTRL, MASKDWORD, MASKDWORD);
1277        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x700f0001);
1278        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x700f0001);
1279        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x701f0001);
1280        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x702f0001);
1281        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x703f0001);
1282        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x704f0001);
1283        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x705f0001);
1284        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x706f0001);
1285        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x707f0001);
1286        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x708f0001);
1287        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x709f0001);
1288        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70af0001);
1289        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70bf0001);
1290        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70cf0001);
1291        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70df0001);
1292        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ef0001);
1293        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ff0001);
1294        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ff0001);
1295}
1296
1297static void rtw8822c_txgapk_afe_dpk_restore(struct rtw_dev *rtwdev, u8 path)
1298{
1299        u32 reg;
1300
1301        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1302
1303        if (path == RF_PATH_A) {
1304                reg = REG_ANAPAR_A;
1305        } else if (path == RF_PATH_B) {
1306                reg = REG_ANAPAR_B;
1307        } else {
1308                rtw_err(rtwdev, "[TXGAPK] unknown path %d!!\n", path);
1309                return;
1310        }
1311        rtw_write32_mask(rtwdev, REG_IQK_CTRL, MASKDWORD, 0xffa1005e);
1312        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x700b8041);
1313        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70144041);
1314        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70244041);
1315        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70344041);
1316        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70444041);
1317        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x705b8041);
1318        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70644041);
1319        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x707b8041);
1320        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x708b8041);
1321        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x709b8041);
1322        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ab8041);
1323        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70bb8041);
1324        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70cb8041);
1325        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70db8041);
1326        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70eb8041);
1327        rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70fb8041);
1328}
1329
1330static void rtw8822c_txgapk_bb_dpk_restore(struct rtw_dev *rtwdev, u8 path)
1331{
1332        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1333
1334        rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x0);
1335        rtw_write_rf(rtwdev, path, RF_DIS_BYPASS_TXBB, BIT_TIA_BYPASS, 0x0);
1336        rtw_write_rf(rtwdev, path, RF_DIS_BYPASS_TXBB, BIT_TXBB, 0x0);
1337
1338        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, 0x0);
1339        rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
1340        rtw_write32_mask(rtwdev, REG_SINGLE_TONE_SW, BIT_IRQ_TEST_MODE, 0x0);
1341        rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, 0x00);
1342        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, 0x1);
1343        rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
1344        rtw_write32_mask(rtwdev, REG_SINGLE_TONE_SW, BIT_IRQ_TEST_MODE, 0x0);
1345        rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, 0x00);
1346        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, 0x0);
1347        rtw_write32_mask(rtwdev, REG_CCA_OFF, BIT_CCA_ON_BY_PW, 0x0);
1348
1349        if (path == RF_PATH_A) {
1350                rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_A,
1351                                 BIT_RFTXEN_GCK_FORCE_ON, 0x0);
1352                rtw_write32_mask(rtwdev, REG_3WIRE, BIT_DIS_SHARERX_TXGAT, 0x0);
1353                rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_A,
1354                                 BIT_TX_SCALE_0DB, 0x0);
1355                rtw_write32_mask(rtwdev, REG_3WIRE, BIT_3WIRE_EN, 0x3);
1356        } else if (path == RF_PATH_B) {
1357                rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_B,
1358                                 BIT_RFTXEN_GCK_FORCE_ON, 0x0);
1359                rtw_write32_mask(rtwdev, REG_3WIRE2,
1360                                 BIT_DIS_SHARERX_TXGAT, 0x0);
1361                rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_B,
1362                                 BIT_TX_SCALE_0DB, 0x0);
1363                rtw_write32_mask(rtwdev, REG_3WIRE2, BIT_3WIRE_EN, 0x3);
1364        }
1365
1366        rtw_write32_mask(rtwdev, REG_CCKSB, BIT_BBMODE, 0x0);
1367        rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_CFIR_EN, 0x5);
1368}
1369
1370static bool _rtw8822c_txgapk_gain_valid(struct rtw_dev *rtwdev, u32 gain)
1371{
1372        if ((FIELD_GET(BIT_GAIN_TX_PAD_H, gain) >= 0xc) &&
1373            (FIELD_GET(BIT_GAIN_TX_PAD_L, gain) >= 0xe))
1374                return true;
1375
1376        return false;
1377}
1378
1379static void _rtw8822c_txgapk_write_gain_bb_table(struct rtw_dev *rtwdev,
1380                                                 u8 band, u8 path)
1381{
1382        struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
1383        u32 v, tmp_3f = 0;
1384        u8 gain, check_txgain;
1385
1386        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path);
1387
1388        switch (band) {
1389        case RF_BAND_2G_OFDM:
1390                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x0);
1391                break;
1392        case RF_BAND_5G_L:
1393                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x2);
1394                break;
1395        case RF_BAND_5G_M:
1396                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x3);
1397                break;
1398        case RF_BAND_5G_H:
1399                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x4);
1400                break;
1401        default:
1402                break;
1403        }
1404
1405        rtw_write32_mask(rtwdev, REG_TX_GAIN_SET, MASKBYTE0, 0x88);
1406
1407        check_txgain = 0;
1408        for (gain = 0; gain < RF_GAIN_NUM; gain++) {
1409                v = txgapk->rf3f_bp[band][gain][path];
1410                if (_rtw8822c_txgapk_gain_valid(rtwdev, v)) {
1411                        if (!check_txgain) {
1412                                tmp_3f = txgapk->rf3f_bp[band][gain][path];
1413                                check_txgain = 1;
1414                        }
1415                        rtw_dbg(rtwdev, RTW_DBG_RFK,
1416                                "[TXGAPK] tx_gain=0x%03X >= 0xCEX\n",
1417                                txgapk->rf3f_bp[band][gain][path]);
1418                } else {
1419                        tmp_3f = txgapk->rf3f_bp[band][gain][path];
1420                }
1421
1422                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN, tmp_3f);
1423                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_I_GAIN, gain);
1424                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_GAIN_RST, 0x1);
1425                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_GAIN_RST, 0x0);
1426
1427                rtw_dbg(rtwdev, RTW_DBG_RFK,
1428                        "[TXGAPK] Band=%d 0x1b98[11:0]=0x%03X path=%d\n",
1429                        band, tmp_3f, path);
1430        }
1431}
1432
1433static void rtw8822c_txgapk_write_gain_bb_table(struct rtw_dev *rtwdev)
1434{
1435        u8 path, band;
1436
1437        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s channel=%d\n",
1438                __func__, rtwdev->dm_info.gapk.channel);
1439
1440        for (band = 0; band < RF_BAND_MAX; band++) {
1441                for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1442                        _rtw8822c_txgapk_write_gain_bb_table(rtwdev,
1443                                                             band, path);
1444                }
1445        }
1446}
1447
1448static void rtw8822c_txgapk_read_offset(struct rtw_dev *rtwdev, u8 path)
1449{
1450        static const u32 cfg1_1b00[2] = {0x00000d18, 0x00000d2a};
1451        static const u32 cfg2_1b00[2] = {0x00000d19, 0x00000d2b};
1452        static const u32 set_pi[2] = {REG_RSV_CTRL, REG_WLRF1};
1453        static const u32 path_setting[2] = {REG_ORITXCODE, REG_ORITXCODE2};
1454        struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
1455        u8 channel = txgapk->channel;
1456        u32 val;
1457        int i;
1458
1459        if (path >= ARRAY_SIZE(cfg1_1b00) ||
1460            path >= ARRAY_SIZE(cfg2_1b00) ||
1461            path >= ARRAY_SIZE(set_pi) ||
1462            path >= ARRAY_SIZE(path_setting)) {
1463                rtw_warn(rtwdev, "[TXGAPK] wrong path %d\n", path);
1464                return;
1465        }
1466
1467        rtw_write32_mask(rtwdev, REG_ANTMAP0, BIT_ANT_PATH, path + 1);
1468        rtw_write32_mask(rtwdev, REG_TXLGMAP, MASKDWORD, 0xe4e40000);
1469        rtw_write32_mask(rtwdev, REG_TXANTSEG, BIT_ANTSEG, 0x3);
1470        rtw_write32_mask(rtwdev, path_setting[path], MASK20BITS, 0x33312);
1471        rtw_write32_mask(rtwdev, path_setting[path], BIT_PATH_EN, 0x1);
1472        rtw_write32_mask(rtwdev, set_pi[path], BITS_RFC_DIRECT, 0x0);
1473        rtw_write_rf(rtwdev, path, RF_LUTDBG, BIT_TXA_TANK, 0x1);
1474        rtw_write_rf(rtwdev, path, RF_IDAC, BIT_TX_MODE, 0x820);
1475        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path);
1476        rtw_write32_mask(rtwdev, REG_IQKSTAT, MASKBYTE0, 0x0);
1477
1478        rtw_write32_mask(rtwdev, REG_TX_TONE_IDX, MASKBYTE0, 0x018);
1479        fsleep(1000);
1480        if (channel >= 1 && channel <= 14)
1481                rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, BIT_2G_SWING);
1482        else
1483                rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, BIT_5G_SWING);
1484        fsleep(1000);
1485
1486        rtw_write32_mask(rtwdev, REG_NCTL0, MASKDWORD, cfg1_1b00[path]);
1487        rtw_write32_mask(rtwdev, REG_NCTL0, MASKDWORD, cfg2_1b00[path]);
1488
1489        read_poll_timeout(rtw_read32_mask, val,
1490                          val == 0x55, 1000, 100000, false,
1491                          rtwdev, REG_RPT_CIP, BIT_RPT_CIP_STATUS);
1492
1493        rtw_write32_mask(rtwdev, set_pi[path], BITS_RFC_DIRECT, 0x2);
1494        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path);
1495        rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_EN, 0x1);
1496        rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x12);
1497        rtw_write32_mask(rtwdev, REG_TX_GAIN_SET, BIT_GAPK_RPT_IDX, 0x3);
1498        val = rtw_read32(rtwdev, REG_STAT_RPT);
1499
1500        txgapk->offset[0][path] = (s8)FIELD_GET(BIT_GAPK_RPT0, val);
1501        txgapk->offset[1][path] = (s8)FIELD_GET(BIT_GAPK_RPT1, val);
1502        txgapk->offset[2][path] = (s8)FIELD_GET(BIT_GAPK_RPT2, val);
1503        txgapk->offset[3][path] = (s8)FIELD_GET(BIT_GAPK_RPT3, val);
1504        txgapk->offset[4][path] = (s8)FIELD_GET(BIT_GAPK_RPT4, val);
1505        txgapk->offset[5][path] = (s8)FIELD_GET(BIT_GAPK_RPT5, val);
1506        txgapk->offset[6][path] = (s8)FIELD_GET(BIT_GAPK_RPT6, val);
1507        txgapk->offset[7][path] = (s8)FIELD_GET(BIT_GAPK_RPT7, val);
1508
1509        rtw_write32_mask(rtwdev, REG_TX_GAIN_SET, BIT_GAPK_RPT_IDX, 0x4);
1510        val = rtw_read32(rtwdev, REG_STAT_RPT);
1511
1512        txgapk->offset[8][path] = (s8)FIELD_GET(BIT_GAPK_RPT0, val);
1513        txgapk->offset[9][path] = (s8)FIELD_GET(BIT_GAPK_RPT1, val);
1514
1515        for (i = 0; i < RF_HW_OFFSET_NUM; i++)
1516                if (txgapk->offset[i][path] & BIT(3))
1517                        txgapk->offset[i][path] = txgapk->offset[i][path] |
1518                                                  0xf0;
1519        for (i = 0; i < RF_HW_OFFSET_NUM; i++)
1520                rtw_dbg(rtwdev, RTW_DBG_RFK,
1521                        "[TXGAPK] offset %d %d path=%d\n",
1522                        txgapk->offset[i][path], i, path);
1523}
1524
1525static void rtw8822c_txgapk_calculate_offset(struct rtw_dev *rtwdev, u8 path)
1526{
1527        static const u32 bb_reg[] = {REG_ANTMAP0, REG_TXLGMAP, REG_TXANTSEG,
1528                                     REG_ORITXCODE, REG_ORITXCODE2};
1529        struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
1530        u8 channel = txgapk->channel;
1531        u32 reg_backup[ARRAY_SIZE(bb_reg)] = {0};
1532
1533        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s channel=%d\n",
1534                __func__, channel);
1535
1536        rtw8822c_txgapk_backup_bb_reg(rtwdev, bb_reg,
1537                                      reg_backup, ARRAY_SIZE(bb_reg));
1538
1539        if (channel >= 1 && channel <= 14) {
1540                rtw_write32_mask(rtwdev,
1541                                 REG_SINGLE_TONE_SW, BIT_IRQ_TEST_MODE, 0x0);
1542                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path);
1543                rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x3f);
1544                rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
1545                rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x1);
1546                rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x5000f);
1547                rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_RF_GAIN, 0x0);
1548                rtw_write_rf(rtwdev, path, RF_RXG_GAIN, BIT_RXG_GAIN, 0x1);
1549                rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RXAGC, 0x0f);
1550                rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x1);
1551                rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x1);
1552                rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_RXBB, 0x0);
1553                rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT_PW_EXT_TIA, 0x1);
1554
1555                rtw_write32_mask(rtwdev, REG_IQKSTAT, MASKBYTE0, 0x00);
1556                rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x0);
1557
1558                rtw8822c_txgapk_read_offset(rtwdev, path);
1559                rtw_dbg(rtwdev, RTW_DBG_RFK, "=============================\n");
1560
1561        } else {
1562                rtw_write32_mask(rtwdev,
1563                                 REG_SINGLE_TONE_SW, BIT_IRQ_TEST_MODE, 0x0);
1564                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path);
1565                rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x3f);
1566                rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
1567                rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x1);
1568                rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x50011);
1569                rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_TXA_LB_ATT, 0x3);
1570                rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_ATT, 0x3);
1571                rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_SW, 0x1);
1572                rtw_write_rf(rtwdev, path,
1573                             RF_RXA_MIX_GAIN, BIT_RXA_MIX_GAIN, 0x2);
1574                rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RXAGC, 0x12);
1575                rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x1);
1576                rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_RXBB, 0x0);
1577                rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT_PW_EXT_TIA, 0x1);
1578                rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RF_MODE, 0x5);
1579
1580                rtw_write32_mask(rtwdev, REG_IQKSTAT, MASKBYTE0, 0x0);
1581
1582                if (channel >= 36 && channel <= 64)
1583                        rtw_write32_mask(rtwdev,
1584                                         REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x2);
1585                else if (channel >= 100 && channel <= 144)
1586                        rtw_write32_mask(rtwdev,
1587                                         REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x3);
1588                else if (channel >= 149 && channel <= 177)
1589                        rtw_write32_mask(rtwdev,
1590                                         REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x4);
1591
1592                rtw8822c_txgapk_read_offset(rtwdev, path);
1593                rtw_dbg(rtwdev, RTW_DBG_RFK, "=============================\n");
1594        }
1595        rtw8822c_txgapk_reload_bb_reg(rtwdev, bb_reg,
1596                                      reg_backup, ARRAY_SIZE(bb_reg));
1597}
1598
1599static void rtw8822c_txgapk_rf_restore(struct rtw_dev *rtwdev, u8 path)
1600{
1601        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1602
1603        if (path >= rtwdev->hal.rf_path_num)
1604                return;
1605
1606        rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RF_MODE, 0x3);
1607        rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x0);
1608        rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT_PW_EXT_TIA, 0x0);
1609}
1610
1611static u32 rtw8822c_txgapk_cal_gain(struct rtw_dev *rtwdev, u32 gain, s8 offset)
1612{
1613        u32 gain_x2, new_gain;
1614
1615        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1616
1617        if (_rtw8822c_txgapk_gain_valid(rtwdev, gain)) {
1618                new_gain = gain;
1619                rtw_dbg(rtwdev, RTW_DBG_RFK,
1620                        "[TXGAPK] gain=0x%03X(>=0xCEX) offset=%d new_gain=0x%03X\n",
1621                        gain, offset, new_gain);
1622                return new_gain;
1623        }
1624
1625        gain_x2 = (gain << 1) + offset;
1626        new_gain = (gain_x2 >> 1) | (gain_x2 & BIT(0) ? BIT_GAIN_EXT : 0);
1627
1628        rtw_dbg(rtwdev, RTW_DBG_RFK,
1629                "[TXGAPK] gain=0x%X offset=%d new_gain=0x%X\n",
1630                gain, offset, new_gain);
1631
1632        return new_gain;
1633}
1634
1635static void rtw8822c_txgapk_write_tx_gain(struct rtw_dev *rtwdev)
1636{
1637        struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
1638        u32 i, j, tmp = 0x20, tmp_3f, v;
1639        s8 offset_tmp[RF_GAIN_NUM] = {0};
1640        u8 path, band = RF_BAND_2G_OFDM, channel = txgapk->channel;
1641
1642        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1643
1644        if (channel >= 1 && channel <= 14) {
1645                tmp = 0x20;
1646                band = RF_BAND_2G_OFDM;
1647        } else if (channel >= 36 && channel <= 64) {
1648                tmp = 0x200;
1649                band = RF_BAND_5G_L;
1650        } else if (channel >= 100 && channel <= 144) {
1651                tmp = 0x280;
1652                band = RF_BAND_5G_M;
1653        } else if (channel >= 149 && channel <= 177) {
1654                tmp = 0x300;
1655                band = RF_BAND_5G_H;
1656        } else {
1657                rtw_err(rtwdev, "[TXGAPK] unknown channel %d!!\n", channel);
1658                return;
1659        }
1660
1661        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1662                for (i = 0; i < RF_GAIN_NUM; i++) {
1663                        offset_tmp[i] = 0;
1664                        for (j = i; j < RF_GAIN_NUM; j++) {
1665                                v = txgapk->rf3f_bp[band][j][path];
1666                                if (_rtw8822c_txgapk_gain_valid(rtwdev, v))
1667                                        continue;
1668
1669                                offset_tmp[i] += txgapk->offset[j][path];
1670                                txgapk->fianl_offset[i][path] = offset_tmp[i];
1671                        }
1672
1673                        v = txgapk->rf3f_bp[band][i][path];
1674                        if (_rtw8822c_txgapk_gain_valid(rtwdev, v)) {
1675                                rtw_dbg(rtwdev, RTW_DBG_RFK,
1676                                        "[TXGAPK] tx_gain=0x%03X >= 0xCEX\n",
1677                                        txgapk->rf3f_bp[band][i][path]);
1678                        } else {
1679                                txgapk->rf3f_fs[path][i] = offset_tmp[i];
1680                                rtw_dbg(rtwdev, RTW_DBG_RFK,
1681                                        "[TXGAPK] offset %d %d\n",
1682                                        offset_tmp[i], i);
1683                        }
1684                }
1685
1686                rtw_write_rf(rtwdev, path, RF_LUTWE2, RFREG_MASK, 0x10000);
1687                for (i = 0; i < RF_GAIN_NUM; i++) {
1688                        rtw_write_rf(rtwdev, path,
1689                                     RF_LUTWA, RFREG_MASK, tmp + i);
1690
1691                        tmp_3f = rtw8822c_txgapk_cal_gain(rtwdev,
1692                                                          txgapk->rf3f_bp[band][i][path],
1693                                                          offset_tmp[i]);
1694                        rtw_write_rf(rtwdev, path, RF_LUTWD0,
1695                                     BIT_GAIN_EXT | BIT_DATA_L, tmp_3f);
1696
1697                        rtw_dbg(rtwdev, RTW_DBG_RFK,
1698                                "[TXGAPK] 0x33=0x%05X 0x3f=0x%04X\n",
1699                                tmp + i, tmp_3f);
1700                }
1701                rtw_write_rf(rtwdev, path, RF_LUTWE2, RFREG_MASK, 0x0);
1702        }
1703}
1704
1705static void rtw8822c_txgapk_save_all_tx_gain_table(struct rtw_dev *rtwdev)
1706{
1707        struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
1708        static const u32 three_wire[2] = {REG_3WIRE, REG_3WIRE2};
1709        static const u8 ch_num[RF_BAND_MAX] = {1, 1, 36, 100, 149};
1710        static const u8 band_num[RF_BAND_MAX] = {0x0, 0x0, 0x1, 0x3, 0x5};
1711        static const u8 cck[RF_BAND_MAX] = {0x1, 0x0, 0x0, 0x0, 0x0};
1712        u8 path, band, gain, rf0_idx;
1713        u32 rf18, v;
1714
1715        if (rtwdev->dm_info.dm_flags & BIT(RTW_DM_CAP_TXGAPK))
1716                return;
1717
1718        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1719
1720        if (txgapk->read_txgain == 1) {
1721                rtw_dbg(rtwdev, RTW_DBG_RFK,
1722                        "[TXGAPK] Already Read txgapk->read_txgain return!!!\n");
1723                rtw8822c_txgapk_write_gain_bb_table(rtwdev);
1724                return;
1725        }
1726
1727        for (band = 0; band < RF_BAND_MAX; band++) {
1728                for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1729                        rf18 = rtw_read_rf(rtwdev, path, RF_CFGCH, RFREG_MASK);
1730
1731                        rtw_write32_mask(rtwdev,
1732                                         three_wire[path], BIT_3WIRE_EN, 0x0);
1733                        rtw_write_rf(rtwdev, path,
1734                                     RF_CFGCH, MASKBYTE0, ch_num[band]);
1735                        rtw_write_rf(rtwdev, path,
1736                                     RF_CFGCH, BIT_BAND, band_num[band]);
1737                        rtw_write_rf(rtwdev, path,
1738                                     RF_BW_TRXBB, BIT_DBG_CCK_CCA, cck[band]);
1739                        rtw_write_rf(rtwdev, path,
1740                                     RF_BW_TRXBB, BIT_TX_CCK_IND, cck[band]);
1741                        gain = 0;
1742                        for (rf0_idx = 1; rf0_idx < 32; rf0_idx += 3) {
1743                                rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC,
1744                                             MASKBYTE0, rf0_idx);
1745                                v = rtw_read_rf(rtwdev, path,
1746                                                RF_TX_RESULT, RFREG_MASK);
1747                                txgapk->rf3f_bp[band][gain][path] = v & BIT_DATA_L;
1748
1749                                rtw_dbg(rtwdev, RTW_DBG_RFK,
1750                                        "[TXGAPK] 0x5f=0x%03X band=%d path=%d\n",
1751                                        txgapk->rf3f_bp[band][gain][path],
1752                                        band, path);
1753                                gain++;
1754                        }
1755                        rtw_write_rf(rtwdev, path, RF_CFGCH, RFREG_MASK, rf18);
1756                        rtw_write32_mask(rtwdev,
1757                                         three_wire[path], BIT_3WIRE_EN, 0x3);
1758                }
1759        }
1760        rtw8822c_txgapk_write_gain_bb_table(rtwdev);
1761        txgapk->read_txgain = 1;
1762}
1763
1764static void rtw8822c_txgapk(struct rtw_dev *rtwdev)
1765{
1766        static const u32 bb_reg[2] = {REG_TX_PTCL_CTRL, REG_TX_FIFO};
1767        struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
1768        u32 bb_reg_backup[2];
1769        u8 path;
1770
1771        rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__);
1772
1773        rtw8822c_txgapk_save_all_tx_gain_table(rtwdev);
1774
1775        if (txgapk->read_txgain == 0) {
1776                rtw_dbg(rtwdev, RTW_DBG_RFK,
1777                        "[TXGAPK] txgapk->read_txgain == 0 return!!!\n");
1778                return;
1779        }
1780
1781        if (rtwdev->efuse.power_track_type >= 4 &&
1782            rtwdev->efuse.power_track_type <= 7) {
1783                rtw_dbg(rtwdev, RTW_DBG_RFK,
1784                        "[TXGAPK] Normal Mode in TSSI mode. return!!!\n");
1785                return;
1786        }
1787
1788        rtw8822c_txgapk_backup_bb_reg(rtwdev, bb_reg,
1789                                      bb_reg_backup, ARRAY_SIZE(bb_reg));
1790        rtw8822c_txgapk_tx_pause(rtwdev);
1791        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1792                txgapk->channel = rtw_read_rf(rtwdev, path,
1793                                              RF_CFGCH, RFREG_MASK) & MASKBYTE0;
1794                rtw8822c_txgapk_bb_dpk(rtwdev, path);
1795                rtw8822c_txgapk_afe_dpk(rtwdev, path);
1796                rtw8822c_txgapk_calculate_offset(rtwdev, path);
1797                rtw8822c_txgapk_rf_restore(rtwdev, path);
1798                rtw8822c_txgapk_afe_dpk_restore(rtwdev, path);
1799                rtw8822c_txgapk_bb_dpk_restore(rtwdev, path);
1800        }
1801        rtw8822c_txgapk_write_tx_gain(rtwdev);
1802        rtw8822c_txgapk_reload_bb_reg(rtwdev, bb_reg,
1803                                      bb_reg_backup, ARRAY_SIZE(bb_reg));
1804}
1805
1806static void rtw8822c_do_gapk(struct rtw_dev *rtwdev)
1807{
1808        struct rtw_dm_info *dm = &rtwdev->dm_info;
1809
1810        if (dm->dm_flags & BIT(RTW_DM_CAP_TXGAPK)) {
1811                rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] feature disable!!!\n");
1812                return;
1813        }
1814        rtw8822c_rfk_handshake(rtwdev, true);
1815        rtw8822c_txgapk(rtwdev);
1816        rtw8822c_rfk_handshake(rtwdev, false);
1817}
1818
1819static void rtw8822c_rf_init(struct rtw_dev *rtwdev)
1820{
1821        rtw8822c_rf_dac_cal(rtwdev);
1822        rtw8822c_rf_x2_check(rtwdev);
1823        rtw8822c_thermal_trim(rtwdev);
1824        rtw8822c_power_trim(rtwdev);
1825        rtw8822c_pa_bias(rtwdev);
1826}
1827
1828static void rtw8822c_pwrtrack_init(struct rtw_dev *rtwdev)
1829{
1830        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1831        u8 path;
1832
1833        for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++) {
1834                dm_info->delta_power_index[path] = 0;
1835                ewma_thermal_init(&dm_info->avg_thermal[path]);
1836                dm_info->thermal_avg[path] = 0xff;
1837        }
1838
1839        dm_info->pwr_trk_triggered = false;
1840        dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
1841        dm_info->thermal_meter_lck = rtwdev->efuse.thermal_meter_k;
1842}
1843
1844static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev)
1845{
1846        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1847        struct rtw_hal *hal = &rtwdev->hal;
1848        u8 crystal_cap;
1849        u8 cck_gi_u_bnd_msb = 0;
1850        u8 cck_gi_u_bnd_lsb = 0;
1851        u8 cck_gi_l_bnd_msb = 0;
1852        u8 cck_gi_l_bnd_lsb = 0;
1853        bool is_tx2_path;
1854
1855        /* power on BB/RF domain */
1856        rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
1857                       BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
1858        rtw_write8_set(rtwdev, REG_RF_CTRL,
1859                       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
1860        rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN);
1861
1862        /* disable low rate DPD */
1863        rtw_write32_mask(rtwdev, REG_DIS_DPD, DIS_DPD_MASK, DIS_DPD_RATEALL);
1864
1865        /* pre init before header files config */
1866        rtw8822c_header_file_init(rtwdev, true);
1867
1868        rtw_phy_load_tables(rtwdev);
1869
1870        crystal_cap = rtwdev->efuse.crystal_cap & 0x7f;
1871        rtw_write32_mask(rtwdev, REG_ANAPAR_XTAL_0, 0xfffc00,
1872                         crystal_cap | (crystal_cap << 7));
1873
1874        /* post init after header files config */
1875        rtw8822c_header_file_init(rtwdev, false);
1876
1877        is_tx2_path = false;
1878        rtw8822c_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx,
1879                                 is_tx2_path);
1880        rtw_phy_init(rtwdev);
1881
1882        cck_gi_u_bnd_msb = (u8)rtw_read32_mask(rtwdev, 0x1a98, 0xc000);
1883        cck_gi_u_bnd_lsb = (u8)rtw_read32_mask(rtwdev, 0x1aa8, 0xf0000);
1884        cck_gi_l_bnd_msb = (u8)rtw_read32_mask(rtwdev, 0x1a98, 0xc0);
1885        cck_gi_l_bnd_lsb = (u8)rtw_read32_mask(rtwdev, 0x1a70, 0x0f000000);
1886
1887        dm_info->cck_gi_u_bnd = ((cck_gi_u_bnd_msb << 4) | (cck_gi_u_bnd_lsb));
1888        dm_info->cck_gi_l_bnd = ((cck_gi_l_bnd_msb << 4) | (cck_gi_l_bnd_lsb));
1889
1890        rtw8822c_rf_init(rtwdev);
1891        rtw8822c_pwrtrack_init(rtwdev);
1892
1893        rtw_bf_phy_init(rtwdev);
1894}
1895
1896#define WLAN_TXQ_RPT_EN         0x1F
1897#define WLAN_SLOT_TIME          0x09
1898#define WLAN_PIFS_TIME          0x1C
1899#define WLAN_SIFS_CCK_CONT_TX   0x0A
1900#define WLAN_SIFS_OFDM_CONT_TX  0x0E
1901#define WLAN_SIFS_CCK_TRX       0x0A
1902#define WLAN_SIFS_OFDM_TRX      0x10
1903#define WLAN_NAV_MAX            0xC8
1904#define WLAN_RDG_NAV            0x05
1905#define WLAN_TXOP_NAV           0x1B
1906#define WLAN_CCK_RX_TSF         0x30
1907#define WLAN_OFDM_RX_TSF        0x30
1908#define WLAN_TBTT_PROHIBIT      0x04 /* unit : 32us */
1909#define WLAN_TBTT_HOLD_TIME     0x064 /* unit : 32us */
1910#define WLAN_DRV_EARLY_INT      0x04
1911#define WLAN_BCN_CTRL_CLT0      0x10
1912#define WLAN_BCN_DMA_TIME       0x02
1913#define WLAN_BCN_MAX_ERR        0xFF
1914#define WLAN_SIFS_CCK_DUR_TUNE  0x0A
1915#define WLAN_SIFS_OFDM_DUR_TUNE 0x10
1916#define WLAN_SIFS_CCK_CTX       0x0A
1917#define WLAN_SIFS_CCK_IRX       0x0A
1918#define WLAN_SIFS_OFDM_CTX      0x0E
1919#define WLAN_SIFS_OFDM_IRX      0x0E
1920#define WLAN_EIFS_DUR_TUNE      0x40
1921#define WLAN_EDCA_VO_PARAM      0x002FA226
1922#define WLAN_EDCA_VI_PARAM      0x005EA328
1923#define WLAN_EDCA_BE_PARAM      0x005EA42B
1924#define WLAN_EDCA_BK_PARAM      0x0000A44F
1925
1926#define WLAN_RX_FILTER0         0xFFFFFFFF
1927#define WLAN_RX_FILTER2         0xFFFF
1928#define WLAN_RCR_CFG            0xE400220E
1929#define WLAN_RXPKT_MAX_SZ       12288
1930#define WLAN_RXPKT_MAX_SZ_512   (WLAN_RXPKT_MAX_SZ >> 9)
1931
1932#define WLAN_AMPDU_MAX_TIME             0x70
1933#define WLAN_RTS_LEN_TH                 0xFF
1934#define WLAN_RTS_TX_TIME_TH             0x08
1935#define WLAN_MAX_AGG_PKT_LIMIT          0x3f
1936#define WLAN_RTS_MAX_AGG_PKT_LIMIT      0x3f
1937#define WLAN_PRE_TXCNT_TIME_TH          0x1E0
1938#define FAST_EDCA_VO_TH         0x06
1939#define FAST_EDCA_VI_TH         0x06
1940#define FAST_EDCA_BE_TH         0x06
1941#define FAST_EDCA_BK_TH         0x06
1942#define WLAN_BAR_RETRY_LIMIT            0x01
1943#define WLAN_BAR_ACK_TYPE               0x05
1944#define WLAN_RA_TRY_RATE_AGG_LIMIT      0x08
1945#define WLAN_RESP_TXRATE                0x84
1946#define WLAN_ACK_TO                     0x21
1947#define WLAN_ACK_TO_CCK                 0x6A
1948#define WLAN_DATA_RATE_FB_CNT_1_4       0x01000000
1949#define WLAN_DATA_RATE_FB_CNT_5_8       0x08070504
1950#define WLAN_RTS_RATE_FB_CNT_5_8        0x08070504
1951#define WLAN_DATA_RATE_FB_RATE0         0xFE01F010
1952#define WLAN_DATA_RATE_FB_RATE0_H       0x40000000
1953#define WLAN_RTS_RATE_FB_RATE1          0x003FF010
1954#define WLAN_RTS_RATE_FB_RATE1_H        0x40000000
1955#define WLAN_RTS_RATE_FB_RATE4          0x0600F010
1956#define WLAN_RTS_RATE_FB_RATE4_H        0x400003E0
1957#define WLAN_RTS_RATE_FB_RATE5          0x0600F015
1958#define WLAN_RTS_RATE_FB_RATE5_H        0x000000E0
1959#define WLAN_MULTI_ADDR                 0xFFFFFFFF
1960
1961#define WLAN_TX_FUNC_CFG1               0x30
1962#define WLAN_TX_FUNC_CFG2               0x30
1963#define WLAN_MAC_OPT_NORM_FUNC1         0x98
1964#define WLAN_MAC_OPT_LB_FUNC1           0x80
1965#define WLAN_MAC_OPT_FUNC2              0x30810041
1966#define WLAN_MAC_INT_MIG_CFG            0x33330000
1967
1968#define WLAN_SIFS_CFG   (WLAN_SIFS_CCK_CONT_TX | \
1969                        (WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \
1970                        (WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \
1971                        (WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX))
1972
1973#define WLAN_SIFS_DUR_TUNE      (WLAN_SIFS_CCK_DUR_TUNE | \
1974                                (WLAN_SIFS_OFDM_DUR_TUNE << 8))
1975
1976#define WLAN_TBTT_TIME  (WLAN_TBTT_PROHIBIT |\
1977                        (WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
1978
1979#define WLAN_NAV_CFG            (WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16))
1980#define WLAN_RX_TSF_CFG         (WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8)
1981
1982#define MAC_CLK_SPEED   80 /* 80M */
1983#define EFUSE_PCB_INFO_OFFSET   0xCA
1984
1985static int rtw8822c_mac_init(struct rtw_dev *rtwdev)
1986{
1987        u8 value8;
1988        u16 value16;
1989        u32 value32;
1990        u16 pre_txcnt;
1991
1992        /* txq control */
1993        value8 = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL);
1994        value8 |= (BIT(7) & ~BIT(1) & ~BIT(2));
1995        rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL, value8);
1996        rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
1997        /* sifs control */
1998        rtw_write16(rtwdev, REG_SPEC_SIFS, WLAN_SIFS_DUR_TUNE);
1999        rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG);
2000        rtw_write16(rtwdev, REG_RESP_SIFS_CCK,
2001                    WLAN_SIFS_CCK_CTX | WLAN_SIFS_CCK_IRX << 8);
2002        rtw_write16(rtwdev, REG_RESP_SIFS_OFDM,
2003                    WLAN_SIFS_OFDM_CTX | WLAN_SIFS_OFDM_IRX << 8);
2004        /* rate fallback control */
2005        rtw_write32(rtwdev, REG_DARFRC, WLAN_DATA_RATE_FB_CNT_1_4);
2006        rtw_write32(rtwdev, REG_DARFRCH, WLAN_DATA_RATE_FB_CNT_5_8);
2007        rtw_write32(rtwdev, REG_RARFRCH, WLAN_RTS_RATE_FB_CNT_5_8);
2008        rtw_write32(rtwdev, REG_ARFR0, WLAN_DATA_RATE_FB_RATE0);
2009        rtw_write32(rtwdev, REG_ARFRH0, WLAN_DATA_RATE_FB_RATE0_H);
2010        rtw_write32(rtwdev, REG_ARFR1_V1, WLAN_RTS_RATE_FB_RATE1);
2011        rtw_write32(rtwdev, REG_ARFRH1_V1, WLAN_RTS_RATE_FB_RATE1_H);
2012        rtw_write32(rtwdev, REG_ARFR4, WLAN_RTS_RATE_FB_RATE4);
2013        rtw_write32(rtwdev, REG_ARFRH4, WLAN_RTS_RATE_FB_RATE4_H);
2014        rtw_write32(rtwdev, REG_ARFR5, WLAN_RTS_RATE_FB_RATE5);
2015        rtw_write32(rtwdev, REG_ARFRH5, WLAN_RTS_RATE_FB_RATE5_H);
2016        /* protocol configuration */
2017        rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
2018        rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
2019        pre_txcnt = WLAN_PRE_TXCNT_TIME_TH | BIT_EN_PRECNT;
2020        rtw_write8(rtwdev, REG_PRECNT_CTRL, (u8)(pre_txcnt & 0xFF));
2021        rtw_write8(rtwdev, REG_PRECNT_CTRL + 1, (u8)(pre_txcnt >> 8));
2022        value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
2023                  (WLAN_MAX_AGG_PKT_LIMIT << 16) |
2024                  (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24);
2025        rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32);
2026        rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2,
2027                    WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
2028        rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH);
2029        rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH);
2030        rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH);
2031        rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH);
2032        /* close BA parser */
2033        rtw_write8_clr(rtwdev, REG_LIFETIME_EN, BIT_BA_PARSER_EN);
2034        rtw_write32_clr(rtwdev, REG_RRSR, BITS_RRSR_RSC);
2035
2036        /* EDCA configuration */
2037        rtw_write32(rtwdev, REG_EDCA_VO_PARAM, WLAN_EDCA_VO_PARAM);
2038        rtw_write32(rtwdev, REG_EDCA_VI_PARAM, WLAN_EDCA_VI_PARAM);
2039        rtw_write32(rtwdev, REG_EDCA_BE_PARAM, WLAN_EDCA_BE_PARAM);
2040        rtw_write32(rtwdev, REG_EDCA_BK_PARAM, WLAN_EDCA_BK_PARAM);
2041        rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME);
2042        rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
2043        rtw_write8_set(rtwdev, REG_RD_CTRL + 1,
2044                       (BIT_DIS_TXOP_CFE | BIT_DIS_LSIG_CFE |
2045                        BIT_DIS_STBC_CFE) >> 8);
2046
2047        /* MAC clock configuration */
2048        rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BIT_MAC_CLK_SEL);
2049        rtw_write8(rtwdev, REG_USTIME_TSF, MAC_CLK_SPEED);
2050        rtw_write8(rtwdev, REG_USTIME_EDCA, MAC_CLK_SPEED);
2051
2052        rtw_write8_set(rtwdev, REG_MISC_CTRL,
2053                       BIT_EN_FREE_CNT | BIT_DIS_SECOND_CCA);
2054        rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0);
2055        rtw_write16(rtwdev, REG_TXPAUSE, 0x0000);
2056        rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
2057        rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG);
2058        rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
2059        /* Set beacon cotnrol - enable TSF and other related functions */
2060        rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
2061        /* Set send beacon related registers */
2062        rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
2063        rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
2064        rtw_write8(rtwdev, REG_BCN_CTRL_CLINT0, WLAN_BCN_CTRL_CLT0);
2065        rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
2066        rtw_write8(rtwdev, REG_BCN_MAX_ERR, WLAN_BCN_MAX_ERR);
2067
2068        /* WMAC configuration */
2069        rtw_write32(rtwdev, REG_MAR, WLAN_MULTI_ADDR);
2070        rtw_write32(rtwdev, REG_MAR + 4, WLAN_MULTI_ADDR);
2071        rtw_write8(rtwdev, REG_BBPSF_CTRL + 2, WLAN_RESP_TXRATE);
2072        rtw_write8(rtwdev, REG_ACKTO, WLAN_ACK_TO);
2073        rtw_write8(rtwdev, REG_ACKTO_CCK, WLAN_ACK_TO_CCK);
2074        rtw_write16(rtwdev, REG_EIFS, WLAN_EIFS_DUR_TUNE);
2075        rtw_write8(rtwdev, REG_NAV_CTRL + 2, WLAN_NAV_MAX);
2076        rtw_write8(rtwdev, REG_WMAC_TRXPTCL_CTL_H  + 2, WLAN_BAR_ACK_TYPE);
2077        rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
2078        rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
2079        rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
2080        rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
2081        rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2);
2082        rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
2083        rtw_write32_set(rtwdev, REG_GENERAL_OPTION, BIT_DUMMY_FCS_READY_MASK_EN);
2084        rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
2085        rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION_1, WLAN_MAC_OPT_NORM_FUNC1);
2086
2087        /* init low power */
2088        value16 = rtw_read16(rtwdev, REG_RXPSF_CTRL + 2) & 0xF00F;
2089        value16 |= (BIT_RXGCK_VHT_FIFOTHR(1) | BIT_RXGCK_HT_FIFOTHR(1) |
2090                    BIT_RXGCK_OFDM_FIFOTHR(1) | BIT_RXGCK_CCK_FIFOTHR(1)) >> 16;
2091        rtw_write16(rtwdev, REG_RXPSF_CTRL + 2, value16);
2092        value16 = 0;
2093        value16 = BIT_SET_RXPSF_PKTLENTHR(value16, 1);
2094        value16 |= BIT_RXPSF_CTRLEN | BIT_RXPSF_VHTCHKEN | BIT_RXPSF_HTCHKEN
2095                | BIT_RXPSF_OFDMCHKEN | BIT_RXPSF_CCKCHKEN
2096                | BIT_RXPSF_OFDMRST;
2097        rtw_write16(rtwdev, REG_RXPSF_CTRL, value16);
2098        rtw_write32(rtwdev, REG_RXPSF_TYPE_CTRL, 0xFFFFFFFF);
2099        /* rx ignore configuration */
2100        value16 = rtw_read16(rtwdev, REG_RXPSF_CTRL);
2101        value16 &= ~(BIT_RXPSF_MHCHKEN | BIT_RXPSF_CCKRST |
2102                     BIT_RXPSF_CONT_ERRCHKEN);
2103        value16 = BIT_SET_RXPSF_ERRTHR(value16, 0x07);
2104        rtw_write16(rtwdev, REG_RXPSF_CTRL, value16);
2105
2106        /* Interrupt migration configuration */
2107        rtw_write32(rtwdev, REG_INT_MIG, WLAN_MAC_INT_MIG_CFG);
2108
2109        return 0;
2110}
2111
2112#define FWCD_SIZE_REG_8822C 0x2000
2113#define FWCD_SIZE_DMEM_8822C 0x10000
2114#define FWCD_SIZE_IMEM_8822C 0x10000
2115#define FWCD_SIZE_EMEM_8822C 0x20000
2116#define FWCD_SIZE_ROM_8822C 0x10000
2117
2118static const u32 __fwcd_segs_8822c[] = {
2119        FWCD_SIZE_REG_8822C,
2120        FWCD_SIZE_DMEM_8822C,
2121        FWCD_SIZE_IMEM_8822C,
2122        FWCD_SIZE_EMEM_8822C,
2123        FWCD_SIZE_ROM_8822C,
2124};
2125
2126static const struct rtw_fwcd_segs rtw8822c_fwcd_segs = {
2127        .segs = __fwcd_segs_8822c,
2128        .num = ARRAY_SIZE(__fwcd_segs_8822c),
2129};
2130
2131static int rtw8822c_dump_fw_crash(struct rtw_dev *rtwdev)
2132{
2133#define __dump_fw_8822c(_dev, _mem) \
2134        rtw_dump_fw(_dev, OCPBASE_ ## _mem ## _88XX, \
2135                    FWCD_SIZE_ ## _mem ## _8822C, RTW_FWCD_ ## _mem)
2136        int ret;
2137
2138        ret = rtw_dump_reg(rtwdev, 0x0, FWCD_SIZE_REG_8822C);
2139        if (ret)
2140                return ret;
2141        ret = __dump_fw_8822c(rtwdev, DMEM);
2142        if (ret)
2143                return ret;
2144        ret = __dump_fw_8822c(rtwdev, IMEM);
2145        if (ret)
2146                return ret;
2147        ret = __dump_fw_8822c(rtwdev, EMEM);
2148        if (ret)
2149                return ret;
2150        ret = __dump_fw_8822c(rtwdev, ROM);
2151        if (ret)
2152                return ret;
2153
2154        return 0;
2155
2156#undef __dump_fw_8822c
2157}
2158
2159static void rtw8822c_rstb_3wire(struct rtw_dev *rtwdev, bool enable)
2160{
2161        if (enable) {
2162                rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x1);
2163                rtw_write32_mask(rtwdev, REG_ANAPAR_A, BIT_ANAPAR_UPDATE, 0x1);
2164                rtw_write32_mask(rtwdev, REG_ANAPAR_B, BIT_ANAPAR_UPDATE, 0x1);
2165        } else {
2166                rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x0);
2167        }
2168}
2169
2170static void rtw8822c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
2171{
2172#define RF18_BAND_MASK          (BIT(16) | BIT(9) | BIT(8))
2173#define RF18_BAND_2G            (0)
2174#define RF18_BAND_5G            (BIT(16) | BIT(8))
2175#define RF18_CHANNEL_MASK       (MASKBYTE0)
2176#define RF18_RFSI_MASK          (BIT(18) | BIT(17))
2177#define RF18_RFSI_GE_CH80       (BIT(17))
2178#define RF18_RFSI_GT_CH140      (BIT(18))
2179#define RF18_BW_MASK            (BIT(13) | BIT(12))
2180#define RF18_BW_20M             (BIT(13) | BIT(12))
2181#define RF18_BW_40M             (BIT(13))
2182#define RF18_BW_80M             (BIT(12))
2183
2184        u32 rf_reg18 = 0;
2185        u32 rf_rxbb = 0;
2186
2187        rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
2188
2189        rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK |
2190                      RF18_BW_MASK);
2191
2192        rf_reg18 |= (IS_CH_2G_BAND(channel) ? RF18_BAND_2G : RF18_BAND_5G);
2193        rf_reg18 |= (channel & RF18_CHANNEL_MASK);
2194        if (IS_CH_5G_BAND_4(channel))
2195                rf_reg18 |= RF18_RFSI_GT_CH140;
2196        else if (IS_CH_5G_BAND_3(channel))
2197                rf_reg18 |= RF18_RFSI_GE_CH80;
2198
2199        switch (bw) {
2200        case RTW_CHANNEL_WIDTH_5:
2201        case RTW_CHANNEL_WIDTH_10:
2202        case RTW_CHANNEL_WIDTH_20:
2203        default:
2204                rf_reg18 |= RF18_BW_20M;
2205                rf_rxbb = 0x18;
2206                break;
2207        case RTW_CHANNEL_WIDTH_40:
2208                /* RF bandwidth */
2209                rf_reg18 |= RF18_BW_40M;
2210                rf_rxbb = 0x10;
2211                break;
2212        case RTW_CHANNEL_WIDTH_80:
2213                rf_reg18 |= RF18_BW_80M;
2214                rf_rxbb = 0x8;
2215                break;
2216        }
2217
2218        rtw8822c_rstb_3wire(rtwdev, false);
2219
2220        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, 0x04, 0x01);
2221        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, 0x1f, 0x12);
2222        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, 0xfffff, rf_rxbb);
2223        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, 0x04, 0x00);
2224
2225        rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE2, 0x04, 0x01);
2226        rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWA, 0x1f, 0x12);
2227        rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWD0, 0xfffff, rf_rxbb);
2228        rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE2, 0x04, 0x00);
2229
2230        rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_reg18);
2231        rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_reg18);
2232
2233        rtw8822c_rstb_3wire(rtwdev, true);
2234}
2235
2236static void rtw8822c_toggle_igi(struct rtw_dev *rtwdev)
2237{
2238        u32 igi;
2239
2240        igi = rtw_read32_mask(rtwdev, REG_RXIGI, 0x7f);
2241        rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f, igi - 2);
2242        rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f00, igi - 2);
2243        rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f, igi);
2244        rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f00, igi);
2245}
2246
2247static void rtw8822c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
2248                                    u8 primary_ch_idx)
2249{
2250        if (IS_CH_2G_BAND(channel)) {
2251                rtw_write32_clr(rtwdev, REG_BGCTRL, BITS_RX_IQ_WEIGHT);
2252                rtw_write32_set(rtwdev, REG_TXF4, BIT(20));
2253                rtw_write32_clr(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN);
2254                rtw_write32_clr(rtwdev, REG_CCKTXONLY, BIT_BB_CCK_CHECK_EN);
2255                rtw_write32_mask(rtwdev, REG_CCAMSK, 0x3F000000, 0xF);
2256
2257                switch (bw) {
2258                case RTW_CHANNEL_WIDTH_20:
2259                        rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_CCK,
2260                                         0x5);
2261                        rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_CCK,
2262                                         0x5);
2263                        rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
2264                                         0x6);
2265                        rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
2266                                         0x6);
2267                        break;
2268                case RTW_CHANNEL_WIDTH_40:
2269                        rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_CCK,
2270                                         0x4);
2271                        rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_CCK,
2272                                         0x4);
2273                        rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
2274                                         0x0);
2275                        rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
2276                                         0x0);
2277                        break;
2278                }
2279                if (channel == 13 || channel == 14)
2280                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x969);
2281                else if (channel == 11 || channel == 12)
2282                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x96a);
2283                else
2284                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x9aa);
2285                if (channel == 14) {
2286                        rtw_write32_mask(rtwdev, REG_TXF0, MASKHWORD, 0x3da0);
2287                        rtw_write32_mask(rtwdev, REG_TXF1, MASKDWORD,
2288                                         0x4962c931);
2289                        rtw_write32_mask(rtwdev, REG_TXF2, MASKLWORD, 0x6aa3);
2290                        rtw_write32_mask(rtwdev, REG_TXF3, MASKHWORD, 0xaa7b);
2291                        rtw_write32_mask(rtwdev, REG_TXF4, MASKLWORD, 0xf3d7);
2292                        rtw_write32_mask(rtwdev, REG_TXF5, MASKDWORD, 0x0);
2293                        rtw_write32_mask(rtwdev, REG_TXF6, MASKDWORD,
2294                                         0xff012455);
2295                        rtw_write32_mask(rtwdev, REG_TXF7, MASKDWORD, 0xffff);
2296                } else {
2297                        rtw_write32_mask(rtwdev, REG_TXF0, MASKHWORD, 0x5284);
2298                        rtw_write32_mask(rtwdev, REG_TXF1, MASKDWORD,
2299                                         0x3e18fec8);
2300                        rtw_write32_mask(rtwdev, REG_TXF2, MASKLWORD, 0x0a88);
2301                        rtw_write32_mask(rtwdev, REG_TXF3, MASKHWORD, 0xacc4);
2302                        rtw_write32_mask(rtwdev, REG_TXF4, MASKLWORD, 0xc8b2);
2303                        rtw_write32_mask(rtwdev, REG_TXF5, MASKDWORD,
2304                                         0x00faf0de);
2305                        rtw_write32_mask(rtwdev, REG_TXF6, MASKDWORD,
2306                                         0x00122344);
2307                        rtw_write32_mask(rtwdev, REG_TXF7, MASKDWORD,
2308                                         0x0fffffff);
2309                }
2310                if (channel == 13)
2311                        rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x3);
2312                else
2313                        rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x1);
2314        } else if (IS_CH_5G_BAND(channel)) {
2315                rtw_write32_set(rtwdev, REG_CCKTXONLY, BIT_BB_CCK_CHECK_EN);
2316                rtw_write32_set(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN);
2317                rtw_write32_set(rtwdev, REG_BGCTRL, BITS_RX_IQ_WEIGHT);
2318                rtw_write32_clr(rtwdev, REG_TXF4, BIT(20));
2319                rtw_write32_mask(rtwdev, REG_CCAMSK, 0x3F000000, 0x22);
2320                rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x3);
2321                if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel)) {
2322                        rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
2323                                         0x1);
2324                        rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
2325                                         0x1);
2326                } else if (IS_CH_5G_BAND_3(channel)) {
2327                        rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
2328                                         0x2);
2329                        rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
2330                                         0x2);
2331                } else if (IS_CH_5G_BAND_4(channel)) {
2332                        rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
2333                                         0x3);
2334                        rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
2335                                         0x3);
2336                }
2337
2338                if (channel >= 36 && channel <= 51)
2339                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x494);
2340                else if (channel >= 52 && channel <= 55)
2341                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x493);
2342                else if (channel >= 56 && channel <= 111)
2343                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x453);
2344                else if (channel >= 112 && channel <= 119)
2345                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x452);
2346                else if (channel >= 120 && channel <= 172)
2347                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x412);
2348                else if (channel >= 173 && channel <= 177)
2349                        rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x411);
2350        }
2351
2352        switch (bw) {
2353        case RTW_CHANNEL_WIDTH_20:
2354                rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x19B);
2355                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0);
2356                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x0);
2357                rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x7);
2358                rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x6);
2359                rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0);
2360                rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
2361                rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0);
2362                break;
2363        case RTW_CHANNEL_WIDTH_40:
2364                rtw_write32_mask(rtwdev, REG_CCKSB, BIT(4),
2365                                 (primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0));
2366                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x5);
2367                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xc0, 0x0);
2368                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xff00,
2369                                 (primary_ch_idx | (primary_ch_idx << 4)));
2370                rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x1);
2371                rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
2372                rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x1);
2373                break;
2374        case RTW_CHANNEL_WIDTH_80:
2375                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0xa);
2376                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xc0, 0x0);
2377                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xff00,
2378                                 (primary_ch_idx | (primary_ch_idx << 4)));
2379                rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x6);
2380                rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x1);
2381                break;
2382        case RTW_CHANNEL_WIDTH_5:
2383                rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x2AB);
2384                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0);
2385                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x1);
2386                rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x4);
2387                rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x4);
2388                rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0);
2389                rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
2390                rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0);
2391                break;
2392        case RTW_CHANNEL_WIDTH_10:
2393                rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x2AB);
2394                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0);
2395                rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x2);
2396                rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x6);
2397                rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x5);
2398                rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0);
2399                rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
2400                rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0);
2401                break;
2402        }
2403}
2404
2405static void rtw8822c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
2406                                 u8 primary_chan_idx)
2407{
2408        rtw8822c_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
2409        rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
2410        rtw8822c_set_channel_rf(rtwdev, channel, bw);
2411        rtw8822c_toggle_igi(rtwdev);
2412}
2413
2414static void rtw8822c_config_cck_rx_path(struct rtw_dev *rtwdev, u8 rx_path)
2415{
2416        if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
2417                rtw_write32_mask(rtwdev, REG_CCANRX, 0x00060000, 0x0);
2418                rtw_write32_mask(rtwdev, REG_CCANRX, 0x00600000, 0x0);
2419        } else if (rx_path == BB_PATH_AB) {
2420                rtw_write32_mask(rtwdev, REG_CCANRX, 0x00600000, 0x1);
2421                rtw_write32_mask(rtwdev, REG_CCANRX, 0x00060000, 0x1);
2422        }
2423
2424        if (rx_path == BB_PATH_A)
2425                rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x0);
2426        else if (rx_path == BB_PATH_B)
2427                rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x5);
2428        else if (rx_path == BB_PATH_AB)
2429                rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x1);
2430}
2431
2432static void rtw8822c_config_ofdm_rx_path(struct rtw_dev *rtwdev, u8 rx_path)
2433{
2434        if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
2435                rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x300, 0x0);
2436                rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x600000, 0x0);
2437                rtw_write32_mask(rtwdev, REG_AGCSWSH, BIT(17), 0x0);
2438                rtw_write32_mask(rtwdev, REG_ANTWTPD, BIT(20), 0x0);
2439                rtw_write32_mask(rtwdev, REG_MRCM, BIT(24), 0x0);
2440        } else if (rx_path == BB_PATH_AB) {
2441                rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x300, 0x1);
2442                rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x600000, 0x1);
2443                rtw_write32_mask(rtwdev, REG_AGCSWSH, BIT(17), 0x1);
2444                rtw_write32_mask(rtwdev, REG_ANTWTPD, BIT(20), 0x1);
2445                rtw_write32_mask(rtwdev, REG_MRCM, BIT(24), 0x1);
2446        }
2447
2448        rtw_write32_mask(rtwdev, 0x824, 0x0f000000, rx_path);
2449        rtw_write32_mask(rtwdev, 0x824, 0x000f0000, rx_path);
2450}
2451
2452static void rtw8822c_config_rx_path(struct rtw_dev *rtwdev, u8 rx_path)
2453{
2454        rtw8822c_config_cck_rx_path(rtwdev, rx_path);
2455        rtw8822c_config_ofdm_rx_path(rtwdev, rx_path);
2456}
2457
2458static void rtw8822c_config_cck_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
2459                                        bool is_tx2_path)
2460{
2461        if (tx_path == BB_PATH_A) {
2462                rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8);
2463        } else if (tx_path == BB_PATH_B) {
2464                rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x4);
2465        } else {
2466                if (is_tx2_path)
2467                        rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0xc);
2468                else
2469                        rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8);
2470        }
2471        rtw8822c_bb_reset(rtwdev);
2472}
2473
2474static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
2475                                         enum rtw_bb_path tx_path_sel_1ss)
2476{
2477        if (tx_path == BB_PATH_A) {
2478                rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x11);
2479                rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0);
2480        } else if (tx_path == BB_PATH_B) {
2481                rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x12);
2482                rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0);
2483        } else {
2484                if (tx_path_sel_1ss == BB_PATH_AB) {
2485                        rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x33);
2486                        rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0404);
2487                } else if (tx_path_sel_1ss == BB_PATH_B) {
2488                        rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x32);
2489                        rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400);
2490                } else if (tx_path_sel_1ss == BB_PATH_A) {
2491                        rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x31);
2492                        rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400);
2493                }
2494        }
2495        rtw8822c_bb_reset(rtwdev);
2496}
2497
2498static void rtw8822c_config_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
2499                                    enum rtw_bb_path tx_path_sel_1ss,
2500                                    enum rtw_bb_path tx_path_cck,
2501                                    bool is_tx2_path)
2502{
2503        rtw8822c_config_cck_tx_path(rtwdev, tx_path_cck, is_tx2_path);
2504        rtw8822c_config_ofdm_tx_path(rtwdev, tx_path, tx_path_sel_1ss);
2505        rtw8822c_bb_reset(rtwdev);
2506}
2507
2508static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
2509                                     u8 rx_path, bool is_tx2_path)
2510{
2511        if ((tx_path | rx_path) & BB_PATH_A)
2512                rtw_write32_mask(rtwdev, REG_ORITXCODE, MASK20BITS, 0x33312);
2513        else
2514                rtw_write32_mask(rtwdev, REG_ORITXCODE, MASK20BITS, 0x11111);
2515        if ((tx_path | rx_path) & BB_PATH_B)
2516                rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x33312);
2517        else
2518                rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x11111);
2519
2520        rtw8822c_config_rx_path(rtwdev, rx_path);
2521        rtw8822c_config_tx_path(rtwdev, tx_path, BB_PATH_A, BB_PATH_A,
2522                                is_tx2_path);
2523
2524        rtw8822c_toggle_igi(rtwdev);
2525}
2526
2527static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
2528                                   struct rtw_rx_pkt_stat *pkt_stat)
2529{
2530        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
2531        u8 l_bnd, u_bnd;
2532        u8 gain_a, gain_b;
2533        s8 rx_power[RTW_RF_PATH_MAX];
2534        s8 min_rx_power = -120;
2535        u8 rssi;
2536        int path;
2537
2538        rx_power[RF_PATH_A] = GET_PHY_STAT_P0_PWDB_A(phy_status);
2539        rx_power[RF_PATH_B] = GET_PHY_STAT_P0_PWDB_B(phy_status);
2540        l_bnd = dm_info->cck_gi_l_bnd;
2541        u_bnd = dm_info->cck_gi_u_bnd;
2542        gain_a = GET_PHY_STAT_P0_GAIN_A(phy_status);
2543        gain_b = GET_PHY_STAT_P0_GAIN_B(phy_status);
2544        if (gain_a < l_bnd)
2545                rx_power[RF_PATH_A] += (l_bnd - gain_a) << 1;
2546        else if (gain_a > u_bnd)
2547                rx_power[RF_PATH_A] -= (gain_a - u_bnd) << 1;
2548        if (gain_b < l_bnd)
2549                rx_power[RF_PATH_B] += (l_bnd - gain_b) << 1;
2550        else if (gain_b > u_bnd)
2551                rx_power[RF_PATH_B] -= (gain_b - u_bnd) << 1;
2552
2553        rx_power[RF_PATH_A] -= 110;
2554        rx_power[RF_PATH_B] -= 110;
2555
2556        pkt_stat->rx_power[RF_PATH_A] = rx_power[RF_PATH_A];
2557        pkt_stat->rx_power[RF_PATH_B] = rx_power[RF_PATH_B];
2558
2559        for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
2560                rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
2561                dm_info->rssi[path] = rssi;
2562        }
2563
2564        pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
2565        pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
2566        pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
2567                                     min_rx_power);
2568}
2569
2570static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
2571                                   struct rtw_rx_pkt_stat *pkt_stat)
2572{
2573        struct rtw_path_div *p_div = &rtwdev->dm_path_div;
2574        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
2575        u8 rxsc, bw;
2576        s8 min_rx_power = -120;
2577        s8 rx_evm;
2578        u8 evm_dbm = 0;
2579        u8 rssi;
2580        int path;
2581
2582        if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
2583                rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
2584        else
2585                rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
2586
2587        if (rxsc >= 9 && rxsc <= 12)
2588                bw = RTW_CHANNEL_WIDTH_40;
2589        else if (rxsc >= 13)
2590                bw = RTW_CHANNEL_WIDTH_80;
2591        else
2592                bw = RTW_CHANNEL_WIDTH_20;
2593
2594        pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
2595        pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110;
2596        pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 2);
2597        pkt_stat->bw = bw;
2598        pkt_stat->signal_power = max3(pkt_stat->rx_power[RF_PATH_A],
2599                                      pkt_stat->rx_power[RF_PATH_B],
2600                                      min_rx_power);
2601
2602        dm_info->curr_rx_rate = pkt_stat->rate;
2603
2604        pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
2605        pkt_stat->rx_evm[RF_PATH_B] = GET_PHY_STAT_P1_RXEVM_B(phy_status);
2606
2607        pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
2608        pkt_stat->rx_snr[RF_PATH_B] = GET_PHY_STAT_P1_RXSNR_B(phy_status);
2609
2610        pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
2611        pkt_stat->cfo_tail[RF_PATH_B] = GET_PHY_STAT_P1_CFO_TAIL_B(phy_status);
2612
2613        for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
2614                rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
2615                dm_info->rssi[path] = rssi;
2616                if (path == RF_PATH_A) {
2617                        p_div->path_a_sum += rssi;
2618                        p_div->path_a_cnt++;
2619                } else if (path == RF_PATH_B) {
2620                        p_div->path_b_sum += rssi;
2621                        p_div->path_b_cnt++;
2622                }
2623                dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1;
2624                dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1;
2625
2626                rx_evm = pkt_stat->rx_evm[path];
2627
2628                if (rx_evm < 0) {
2629                        if (rx_evm == S8_MIN)
2630                                evm_dbm = 0;
2631                        else
2632                                evm_dbm = ((u8)-rx_evm >> 1);
2633                }
2634                dm_info->rx_evm_dbm[path] = evm_dbm;
2635        }
2636        rtw_phy_parsing_cfo(rtwdev, pkt_stat);
2637}
2638
2639static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
2640                             struct rtw_rx_pkt_stat *pkt_stat)
2641{
2642        u8 page;
2643
2644        page = *phy_status & 0xf;
2645
2646        switch (page) {
2647        case 0:
2648                query_phy_status_page0(rtwdev, phy_status, pkt_stat);
2649                break;
2650        case 1:
2651                query_phy_status_page1(rtwdev, phy_status, pkt_stat);
2652                break;
2653        default:
2654                rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
2655                return;
2656        }
2657}
2658
2659static void rtw8822c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
2660                                   struct rtw_rx_pkt_stat *pkt_stat,
2661                                   struct ieee80211_rx_status *rx_status)
2662{
2663        struct ieee80211_hdr *hdr;
2664        u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
2665        u8 *phy_status = NULL;
2666
2667        memset(pkt_stat, 0, sizeof(*pkt_stat));
2668
2669        pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
2670        pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
2671        pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
2672        pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
2673                              GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
2674        pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
2675        pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
2676        pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
2677        pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
2678        pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
2679        pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
2680        pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
2681        pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
2682
2683        /* drv_info_sz is in unit of 8-bytes */
2684        pkt_stat->drv_info_sz *= 8;
2685
2686        /* c2h cmd pkt's rx/phy status is not interested */
2687        if (pkt_stat->is_c2h)
2688                return;
2689
2690        hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
2691                                       pkt_stat->drv_info_sz);
2692        pkt_stat->hdr = hdr;
2693        if (pkt_stat->phy_status) {
2694                phy_status = rx_desc + desc_sz + pkt_stat->shift;
2695                query_phy_status(rtwdev, phy_status, pkt_stat);
2696        }
2697
2698        rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
2699}
2700
2701static void
2702rtw8822c_set_write_tx_power_ref(struct rtw_dev *rtwdev, u8 *tx_pwr_ref_cck,
2703                                u8 *tx_pwr_ref_ofdm)
2704{
2705        struct rtw_hal *hal = &rtwdev->hal;
2706        u32 txref_cck[2] = {0x18a0, 0x41a0};
2707        u32 txref_ofdm[2] = {0x18e8, 0x41e8};
2708        u8 path;
2709
2710        for (path = 0; path < hal->rf_path_num; path++) {
2711                rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0);
2712                rtw_write32_mask(rtwdev, txref_cck[path], 0x7f0000,
2713                                 tx_pwr_ref_cck[path]);
2714        }
2715        for (path = 0; path < hal->rf_path_num; path++) {
2716                rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0);
2717                rtw_write32_mask(rtwdev, txref_ofdm[path], 0x1fc00,
2718                                 tx_pwr_ref_ofdm[path]);
2719        }
2720}
2721
2722static void rtw8822c_set_tx_power_diff(struct rtw_dev *rtwdev, u8 rate,
2723                                       s8 *diff_idx)
2724{
2725        u32 offset_txagc = 0x3a00;
2726        u8 rate_idx = rate & 0xfc;
2727        u8 pwr_idx[4];
2728        u32 phy_pwr_idx;
2729        int i;
2730
2731        for (i = 0; i < 4; i++)
2732                pwr_idx[i] = diff_idx[i] & 0x7f;
2733
2734        phy_pwr_idx = pwr_idx[0] |
2735                      (pwr_idx[1] << 8) |
2736                      (pwr_idx[2] << 16) |
2737                      (pwr_idx[3] << 24);
2738
2739        rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0x0);
2740        rtw_write32_mask(rtwdev, offset_txagc + rate_idx, MASKDWORD,
2741                         phy_pwr_idx);
2742}
2743
2744static void rtw8822c_set_tx_power_index(struct rtw_dev *rtwdev)
2745{
2746        struct rtw_hal *hal = &rtwdev->hal;
2747        u8 rs, rate, j;
2748        u8 pwr_ref_cck[2] = {hal->tx_pwr_tbl[RF_PATH_A][DESC_RATE11M],
2749                             hal->tx_pwr_tbl[RF_PATH_B][DESC_RATE11M]};
2750        u8 pwr_ref_ofdm[2] = {hal->tx_pwr_tbl[RF_PATH_A][DESC_RATEMCS7],
2751                              hal->tx_pwr_tbl[RF_PATH_B][DESC_RATEMCS7]};
2752        s8 diff_a, diff_b;
2753        u8 pwr_a, pwr_b;
2754        s8 diff_idx[4];
2755
2756        rtw8822c_set_write_tx_power_ref(rtwdev, pwr_ref_cck, pwr_ref_ofdm);
2757        for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) {
2758                for (j = 0; j < rtw_rate_size[rs]; j++) {
2759                        rate = rtw_rate_section[rs][j];
2760                        pwr_a = hal->tx_pwr_tbl[RF_PATH_A][rate];
2761                        pwr_b = hal->tx_pwr_tbl[RF_PATH_B][rate];
2762                        if (rs == 0) {
2763                                diff_a = (s8)pwr_a - (s8)pwr_ref_cck[0];
2764                                diff_b = (s8)pwr_b - (s8)pwr_ref_cck[1];
2765                        } else {
2766                                diff_a = (s8)pwr_a - (s8)pwr_ref_ofdm[0];
2767                                diff_b = (s8)pwr_b - (s8)pwr_ref_ofdm[1];
2768                        }
2769                        diff_idx[rate % 4] = min(diff_a, diff_b);
2770                        if (rate % 4 == 3)
2771                                rtw8822c_set_tx_power_diff(rtwdev, rate - 3,
2772                                                           diff_idx);
2773                }
2774        }
2775}
2776
2777static int rtw8822c_set_antenna(struct rtw_dev *rtwdev,
2778                                u32 antenna_tx,
2779                                u32 antenna_rx)
2780{
2781        struct rtw_hal *hal = &rtwdev->hal;
2782
2783        switch (antenna_tx) {
2784        case BB_PATH_A:
2785        case BB_PATH_B:
2786        case BB_PATH_AB:
2787                break;
2788        default:
2789                rtw_info(rtwdev, "unsupported tx path 0x%x\n", antenna_tx);
2790                return -EINVAL;
2791        }
2792
2793        /* path B only is not available for RX */
2794        switch (antenna_rx) {
2795        case BB_PATH_A:
2796        case BB_PATH_AB:
2797                break;
2798        default:
2799                rtw_info(rtwdev, "unsupported rx path 0x%x\n", antenna_rx);
2800                return -EINVAL;
2801        }
2802
2803        hal->antenna_tx = antenna_tx;
2804        hal->antenna_rx = antenna_rx;
2805
2806        rtw8822c_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false);
2807
2808        return 0;
2809}
2810
2811static void rtw8822c_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
2812{
2813        u8 ldo_pwr;
2814
2815        ldo_pwr = rtw_read8(rtwdev, REG_ANAPARLDO_POW_MAC);
2816        ldo_pwr = enable ? ldo_pwr | BIT_LDOE25_PON : ldo_pwr & ~BIT_LDOE25_PON;
2817        rtw_write8(rtwdev, REG_ANAPARLDO_POW_MAC, ldo_pwr);
2818}
2819
2820static void rtw8822c_false_alarm_statistics(struct rtw_dev *rtwdev)
2821{
2822        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
2823        u32 cck_enable;
2824        u32 cck_fa_cnt;
2825        u32 crc32_cnt;
2826        u32 cca32_cnt;
2827        u32 ofdm_fa_cnt;
2828        u32 ofdm_fa_cnt1, ofdm_fa_cnt2, ofdm_fa_cnt3, ofdm_fa_cnt4, ofdm_fa_cnt5;
2829        u16 parity_fail, rate_illegal, crc8_fail, mcs_fail, sb_search_fail,
2830            fast_fsync, crc8_fail_vhta, mcs_fail_vht;
2831
2832        cck_enable = rtw_read32(rtwdev, REG_ENCCK) & BIT_CCK_BLK_EN;
2833        cck_fa_cnt = rtw_read16(rtwdev, REG_CCK_FACNT);
2834
2835        ofdm_fa_cnt1 = rtw_read32(rtwdev, REG_OFDM_FACNT1);
2836        ofdm_fa_cnt2 = rtw_read32(rtwdev, REG_OFDM_FACNT2);
2837        ofdm_fa_cnt3 = rtw_read32(rtwdev, REG_OFDM_FACNT3);
2838        ofdm_fa_cnt4 = rtw_read32(rtwdev, REG_OFDM_FACNT4);
2839        ofdm_fa_cnt5 = rtw_read32(rtwdev, REG_OFDM_FACNT5);
2840
2841        parity_fail     = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt1);
2842        rate_illegal    = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt2);
2843        crc8_fail       = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt2);
2844        crc8_fail_vhta  = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt3);
2845        mcs_fail        = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt4);
2846        mcs_fail_vht    = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt4);
2847        fast_fsync      = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt5);
2848        sb_search_fail  = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt5);
2849
2850        ofdm_fa_cnt = parity_fail + rate_illegal + crc8_fail + crc8_fail_vhta +
2851                      mcs_fail + mcs_fail_vht + fast_fsync + sb_search_fail;
2852
2853        dm_info->cck_fa_cnt = cck_fa_cnt;
2854        dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
2855        dm_info->total_fa_cnt = ofdm_fa_cnt;
2856        dm_info->total_fa_cnt += cck_enable ? cck_fa_cnt : 0;
2857
2858        crc32_cnt = rtw_read32(rtwdev, 0x2c04);
2859        dm_info->cck_ok_cnt = crc32_cnt & 0xffff;
2860        dm_info->cck_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2861        crc32_cnt = rtw_read32(rtwdev, 0x2c14);
2862        dm_info->ofdm_ok_cnt = crc32_cnt & 0xffff;
2863        dm_info->ofdm_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2864        crc32_cnt = rtw_read32(rtwdev, 0x2c10);
2865        dm_info->ht_ok_cnt = crc32_cnt & 0xffff;
2866        dm_info->ht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2867        crc32_cnt = rtw_read32(rtwdev, 0x2c0c);
2868        dm_info->vht_ok_cnt = crc32_cnt & 0xffff;
2869        dm_info->vht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2870
2871        cca32_cnt = rtw_read32(rtwdev, 0x2c08);
2872        dm_info->ofdm_cca_cnt = ((cca32_cnt & 0xffff0000) >> 16);
2873        dm_info->cck_cca_cnt = cca32_cnt & 0xffff;
2874        dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
2875        if (cck_enable)
2876                dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
2877
2878        rtw_write32_mask(rtwdev, REG_CCANRX, BIT_CCK_FA_RST, 0);
2879        rtw_write32_mask(rtwdev, REG_CCANRX, BIT_CCK_FA_RST, 2);
2880        rtw_write32_mask(rtwdev, REG_CCANRX, BIT_OFDM_FA_RST, 0);
2881        rtw_write32_mask(rtwdev, REG_CCANRX, BIT_OFDM_FA_RST, 2);
2882
2883        /* disable rx clk gating to reset counters */
2884        rtw_write32_clr(rtwdev, REG_RX_BREAK, BIT_COM_RX_GCK_EN);
2885        rtw_write32_set(rtwdev, REG_CNT_CTRL, BIT_ALL_CNT_RST);
2886        rtw_write32_clr(rtwdev, REG_CNT_CTRL, BIT_ALL_CNT_RST);
2887        rtw_write32_set(rtwdev, REG_RX_BREAK, BIT_COM_RX_GCK_EN);
2888}
2889
2890static void rtw8822c_do_lck(struct rtw_dev *rtwdev)
2891{
2892        u32 val;
2893
2894        rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_CTRL, RFREG_MASK, 0x80010);
2895        rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_PFD, RFREG_MASK, 0x1F0FA);
2896        fsleep(1);
2897        rtw_write_rf(rtwdev, RF_PATH_A, RF_AAC_CTRL, RFREG_MASK, 0x80000);
2898        rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_AAC, RFREG_MASK, 0x80001);
2899        read_poll_timeout(rtw_read_rf, val, val != 0x1, 1000, 100000,
2900                          true, rtwdev, RF_PATH_A, RF_AAC_CTRL, 0x1000);
2901        rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_PFD, RFREG_MASK, 0x1F0F8);
2902        rtw_write_rf(rtwdev, RF_PATH_B, RF_SYN_CTRL, RFREG_MASK, 0x80010);
2903
2904        rtw_write_rf(rtwdev, RF_PATH_A, RF_FAST_LCK, RFREG_MASK, 0x0f000);
2905        rtw_write_rf(rtwdev, RF_PATH_A, RF_FAST_LCK, RFREG_MASK, 0x4f000);
2906        fsleep(1);
2907        rtw_write_rf(rtwdev, RF_PATH_A, RF_FAST_LCK, RFREG_MASK, 0x0f000);
2908}
2909
2910static void rtw8822c_do_iqk(struct rtw_dev *rtwdev)
2911{
2912        struct rtw_iqk_para para = {0};
2913        u8 iqk_chk;
2914        int ret;
2915
2916        para.clear = 1;
2917        rtw_fw_do_iqk(rtwdev, &para);
2918
2919        ret = read_poll_timeout(rtw_read8, iqk_chk, iqk_chk == IQK_DONE_8822C,
2920                                20000, 300000, false, rtwdev, REG_RPT_CIP);
2921        if (ret)
2922                rtw_warn(rtwdev, "failed to poll iqk status bit\n");
2923
2924        rtw_write8(rtwdev, REG_IQKSTAT, 0x0);
2925}
2926
2927/* for coex */
2928static void rtw8822c_coex_cfg_init(struct rtw_dev *rtwdev)
2929{
2930        /* enable TBTT nterrupt */
2931        rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
2932
2933        /* BT report packet sample rate */
2934        /* 0x790[5:0]=0x5 */
2935        rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
2936
2937        /* enable BT counter statistics */
2938        rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
2939
2940        /* enable PTA (3-wire function form BT side) */
2941        rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
2942        rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
2943
2944        /* enable PTA (tx/rx signal form WiFi side) */
2945        rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
2946        /* wl tx signal to PTA not case EDCCA */
2947        rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
2948        /* GNT_BT=1 while select both */
2949        rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY);
2950        /* BT_CCA = ~GNT_WL_BB, not or GNT_BT_BB, LTE_Rx */
2951        rtw_write8_clr(rtwdev, REG_DUMMY_PAGE4_V1, BIT_BTCCA_CTRL);
2952
2953        /* to avoid RF parameter error */
2954        rtw_write_rf(rtwdev, RF_PATH_B, RF_MODOPT, 0xfffff, 0x40000);
2955}
2956
2957static void rtw8822c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
2958{
2959        struct rtw_coex *coex = &rtwdev->coex;
2960        struct rtw_coex_stat *coex_stat = &coex->stat;
2961        struct rtw_efuse *efuse = &rtwdev->efuse;
2962        u32 rf_0x1;
2963
2964        if (coex_stat->gnt_workaround_state == coex_stat->wl_coex_mode)
2965                return;
2966
2967        coex_stat->gnt_workaround_state = coex_stat->wl_coex_mode;
2968
2969        if ((coex_stat->kt_ver == 0 && coex->under_5g) || coex->freerun)
2970                rf_0x1 = 0x40021;
2971        else
2972                rf_0x1 = 0x40000;
2973
2974        /* BT at S1 for Shared-Ant */
2975        if (efuse->share_ant)
2976                rf_0x1 |= BIT(13);
2977
2978        rtw_write_rf(rtwdev, RF_PATH_B, 0x1, 0xfffff, rf_0x1);
2979
2980        /* WL-S0 2G RF TRX cannot be masked by GNT_BT
2981         * enable "WLS0 BB chage RF mode if GNT_BT = 1" for shared-antenna type
2982         * disable:0x1860[3] = 1, enable:0x1860[3] = 0
2983         *
2984         * enable "DAC off if GNT_WL = 0" for non-shared-antenna
2985         * disable 0x1c30[22] = 0,
2986         * enable: 0x1c30[22] = 1, 0x1c38[12] = 0, 0x1c38[28] = 1
2987         *
2988         * disable WL-S1 BB chage RF mode if GNT_BT
2989         * since RF TRx mask can do it
2990         */
2991        rtw_write8_mask(rtwdev, REG_ANAPAR + 2, BIT_ANAPAR_BTPS >> 16, 1);
2992        rtw_write8_mask(rtwdev, REG_RSTB_SEL + 1, BIT_DAC_OFF_ENABLE, 0);
2993        rtw_write8_mask(rtwdev, REG_RSTB_SEL + 3, BIT_DAC_OFF_ENABLE, 1);
2994        rtw_write8_mask(rtwdev, REG_IGN_GNTBT4, BIT_PI_IGNORE_GNT_BT, 1);
2995
2996        /* disable WL-S0 BB chage RF mode if wifi is at 5G,
2997         * or antenna path is separated
2998         */
2999        if (coex_stat->wl_coex_mode == COEX_WLINK_5G ||
3000            coex->under_5g || !efuse->share_ant) {
3001                if (coex_stat->kt_ver >= 3) {
3002                        rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1,
3003                                        BIT_PI_IGNORE_GNT_BT, 0);
3004                        rtw_write8_mask(rtwdev, REG_NOMASK_TXBT,
3005                                        BIT_NOMASK_TXBT_ENABLE, 1);
3006                } else {
3007                        rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1,
3008                                        BIT_PI_IGNORE_GNT_BT, 1);
3009                }
3010        } else {
3011                /* shared-antenna */
3012                rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1,
3013                                BIT_PI_IGNORE_GNT_BT, 0);
3014                if (coex_stat->kt_ver >= 3) {
3015                        rtw_write8_mask(rtwdev, REG_NOMASK_TXBT,
3016                                        BIT_NOMASK_TXBT_ENABLE, 0);
3017                }
3018        }
3019}
3020
3021static void rtw8822c_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
3022{
3023        rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT_BTGP_SPI_EN >> 16, 0);
3024        rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT_BTGP_JTAG_EN >> 24, 0);
3025        rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT_FSPI_EN >> 16, 0);
3026        rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 1, BIT_LED1DIS >> 8, 0);
3027        rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT_DBG_GNT_WL_BT >> 24, 0);
3028}
3029
3030static void rtw8822c_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
3031{
3032        struct rtw_coex *coex = &rtwdev->coex;
3033        struct rtw_coex_rfe *coex_rfe = &coex->rfe;
3034        struct rtw_efuse *efuse = &rtwdev->efuse;
3035
3036        coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
3037        coex_rfe->ant_switch_polarity = 0;
3038        coex_rfe->ant_switch_exist = false;
3039        coex_rfe->ant_switch_with_bt = false;
3040        coex_rfe->ant_switch_diversity = false;
3041
3042        if (efuse->share_ant)
3043                coex_rfe->wlg_at_btg = true;
3044        else
3045                coex_rfe->wlg_at_btg = false;
3046
3047        /* disable LTE coex in wifi side */
3048        rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0);
3049        rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
3050        rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
3051}
3052
3053static void rtw8822c_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
3054{
3055        struct rtw_coex *coex = &rtwdev->coex;
3056        struct rtw_coex_dm *coex_dm = &coex->dm;
3057
3058        if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
3059                return;
3060
3061        coex_dm->cur_wl_pwr_lvl = wl_pwr;
3062}
3063
3064static void rtw8822c_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
3065{
3066        struct rtw_coex *coex = &rtwdev->coex;
3067        struct rtw_coex_dm *coex_dm = &coex->dm;
3068
3069        if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
3070                return;
3071
3072        coex_dm->cur_wl_rx_low_gain_en = low_gain;
3073
3074        if (coex_dm->cur_wl_rx_low_gain_en) {
3075                rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table On!\n");
3076
3077                /* set Rx filter corner RCK offset */
3078                rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, RFREG_MASK, 0x22);
3079                rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, RFREG_MASK, 0x36);
3080                rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, RFREG_MASK, 0x22);
3081                rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, RFREG_MASK, 0x36);
3082
3083        } else {
3084                rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table Off!\n");
3085
3086                /* set Rx filter corner RCK offset */
3087                rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, RFREG_MASK, 0x20);
3088                rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, RFREG_MASK, 0x0);
3089                rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, RFREG_MASK, 0x20);
3090                rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, RFREG_MASK, 0x0);
3091        }
3092}
3093
3094static void rtw8822c_bf_enable_bfee_su(struct rtw_dev *rtwdev,
3095                                       struct rtw_vif *vif,
3096                                       struct rtw_bfee *bfee)
3097{
3098        u8 csi_rsc = 0;
3099        u32 tmp6dc;
3100
3101        rtw_bf_enable_bfee_su(rtwdev, vif, bfee);
3102
3103        tmp6dc = rtw_read32(rtwdev, REG_BBPSF_CTRL) |
3104                            BIT_WMAC_USE_NDPARATE |
3105                            (csi_rsc << 13);
3106        if (vif->net_type == RTW_NET_AP_MODE)
3107                rtw_write32(rtwdev, REG_BBPSF_CTRL, tmp6dc | BIT(12));
3108        else
3109                rtw_write32(rtwdev, REG_BBPSF_CTRL, tmp6dc & ~BIT(12));
3110
3111        rtw_write32(rtwdev, REG_CSI_RRSR, 0x550);
3112}
3113
3114static void rtw8822c_bf_config_bfee_su(struct rtw_dev *rtwdev,
3115                                       struct rtw_vif *vif,
3116                                       struct rtw_bfee *bfee, bool enable)
3117{
3118        if (enable)
3119                rtw8822c_bf_enable_bfee_su(rtwdev, vif, bfee);
3120        else
3121                rtw_bf_remove_bfee_su(rtwdev, bfee);
3122}
3123
3124static void rtw8822c_bf_config_bfee_mu(struct rtw_dev *rtwdev,
3125                                       struct rtw_vif *vif,
3126                                       struct rtw_bfee *bfee, bool enable)
3127{
3128        if (enable)
3129                rtw_bf_enable_bfee_mu(rtwdev, vif, bfee);
3130        else
3131                rtw_bf_remove_bfee_mu(rtwdev, bfee);
3132}
3133
3134static void rtw8822c_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
3135                                    struct rtw_bfee *bfee, bool enable)
3136{
3137        if (bfee->role == RTW_BFEE_SU)
3138                rtw8822c_bf_config_bfee_su(rtwdev, vif, bfee, enable);
3139        else if (bfee->role == RTW_BFEE_MU)
3140                rtw8822c_bf_config_bfee_mu(rtwdev, vif, bfee, enable);
3141        else
3142                rtw_warn(rtwdev, "wrong bfee role\n");
3143}
3144
3145struct dpk_cfg_pair {
3146        u32 addr;
3147        u32 bitmask;
3148        u32 data;
3149};
3150
3151void rtw8822c_parse_tbl_dpk(struct rtw_dev *rtwdev,
3152                            const struct rtw_table *tbl)
3153{
3154        const struct dpk_cfg_pair *p = tbl->data;
3155        const struct dpk_cfg_pair *end = p + tbl->size / 3;
3156
3157        BUILD_BUG_ON(sizeof(struct dpk_cfg_pair) != sizeof(u32) * 3);
3158
3159        for (; p < end; p++)
3160                rtw_write32_mask(rtwdev, p->addr, p->bitmask, p->data);
3161}
3162
3163static void rtw8822c_dpk_set_gnt_wl(struct rtw_dev *rtwdev, bool is_before_k)
3164{
3165        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3166
3167        if (is_before_k) {
3168                dpk_info->gnt_control = rtw_read32(rtwdev, 0x70);
3169                dpk_info->gnt_value = rtw_coex_read_indirect_reg(rtwdev, 0x38);
3170                rtw_write32_mask(rtwdev, 0x70, BIT(26), 0x1);
3171                rtw_coex_write_indirect_reg(rtwdev, 0x38, MASKBYTE1, 0x77);
3172        } else {
3173                rtw_coex_write_indirect_reg(rtwdev, 0x38, MASKDWORD,
3174                                            dpk_info->gnt_value);
3175                rtw_write32(rtwdev, 0x70, dpk_info->gnt_control);
3176        }
3177}
3178
3179static void
3180rtw8822c_dpk_restore_registers(struct rtw_dev *rtwdev, u32 reg_num,
3181                               struct rtw_backup_info *bckp)
3182{
3183        rtw_restore_reg(rtwdev, bckp, reg_num);
3184        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3185        rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_DPD_CLK, 0x4);
3186}
3187
3188static void
3189rtw8822c_dpk_backup_registers(struct rtw_dev *rtwdev, u32 *reg,
3190                              u32 reg_num, struct rtw_backup_info *bckp)
3191{
3192        u32 i;
3193
3194        for (i = 0; i < reg_num; i++) {
3195                bckp[i].len = 4;
3196                bckp[i].reg = reg[i];
3197                bckp[i].val = rtw_read32(rtwdev, reg[i]);
3198        }
3199}
3200
3201static void rtw8822c_dpk_backup_rf_registers(struct rtw_dev *rtwdev,
3202                                             u32 *rf_reg,
3203                                             u32 rf_reg_bak[][2])
3204{
3205        u32 i;
3206
3207        for (i = 0; i < DPK_RF_REG_NUM; i++) {
3208                rf_reg_bak[i][RF_PATH_A] = rtw_read_rf(rtwdev, RF_PATH_A,
3209                                                       rf_reg[i], RFREG_MASK);
3210                rf_reg_bak[i][RF_PATH_B] = rtw_read_rf(rtwdev, RF_PATH_B,
3211                                                       rf_reg[i], RFREG_MASK);
3212        }
3213}
3214
3215static void rtw8822c_dpk_reload_rf_registers(struct rtw_dev *rtwdev,
3216                                             u32 *rf_reg,
3217                                             u32 rf_reg_bak[][2])
3218{
3219        u32 i;
3220
3221        for (i = 0; i < DPK_RF_REG_NUM; i++) {
3222                rtw_write_rf(rtwdev, RF_PATH_A, rf_reg[i], RFREG_MASK,
3223                             rf_reg_bak[i][RF_PATH_A]);
3224                rtw_write_rf(rtwdev, RF_PATH_B, rf_reg[i], RFREG_MASK,
3225                             rf_reg_bak[i][RF_PATH_B]);
3226        }
3227}
3228
3229static void rtw8822c_dpk_information(struct rtw_dev *rtwdev)
3230{
3231        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3232        u32  reg;
3233        u8 band_shift;
3234
3235        reg = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
3236
3237        band_shift = FIELD_GET(BIT(16), reg);
3238        dpk_info->dpk_band = 1 << band_shift;
3239        dpk_info->dpk_ch = FIELD_GET(0xff, reg);
3240        dpk_info->dpk_bw = FIELD_GET(0x3000, reg);
3241}
3242
3243static void rtw8822c_dpk_rxbb_dc_cal(struct rtw_dev *rtwdev, u8 path)
3244{
3245        rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84800);
3246        udelay(5);
3247        rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84801);
3248        usleep_range(600, 610);
3249        rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84800);
3250}
3251
3252static u8 rtw8822c_dpk_dc_corr_check(struct rtw_dev *rtwdev, u8 path)
3253{
3254        u16 dc_i, dc_q;
3255        u8 corr_idx;
3256
3257        rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000900f0);
3258        dc_i = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(27, 16));
3259        dc_q = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(11, 0));
3260
3261        if (dc_i & BIT(11))
3262                dc_i = 0x1000 - dc_i;
3263        if (dc_q & BIT(11))
3264                dc_q = 0x1000 - dc_q;
3265
3266        rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0);
3267        corr_idx = (u8)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(7, 0));
3268        rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(15, 8));
3269
3270        if (dc_i > 200 || dc_q > 200 || corr_idx < 40 || corr_idx > 65)
3271                return 1;
3272        else
3273                return 0;
3274
3275}
3276
3277static void rtw8822c_dpk_tx_pause(struct rtw_dev *rtwdev)
3278{
3279        u8 reg_a, reg_b;
3280        u16 count = 0;
3281
3282        rtw_write8(rtwdev, 0x522, 0xff);
3283        rtw_write32_mask(rtwdev, 0x1e70, 0xf, 0x2);
3284
3285        do {
3286                reg_a = (u8)rtw_read_rf(rtwdev, RF_PATH_A, 0x00, 0xf0000);
3287                reg_b = (u8)rtw_read_rf(rtwdev, RF_PATH_B, 0x00, 0xf0000);
3288                udelay(2);
3289                count++;
3290        } while ((reg_a == 2 || reg_b == 2) && count < 2500);
3291}
3292
3293static void rtw8822c_dpk_mac_bb_setting(struct rtw_dev *rtwdev)
3294{
3295        rtw8822c_dpk_tx_pause(rtwdev);
3296        rtw_load_table(rtwdev, &rtw8822c_dpk_mac_bb_tbl);
3297}
3298
3299static void rtw8822c_dpk_afe_setting(struct rtw_dev *rtwdev, bool is_do_dpk)
3300{
3301        if (is_do_dpk)
3302                rtw_load_table(rtwdev, &rtw8822c_dpk_afe_is_dpk_tbl);
3303        else
3304                rtw_load_table(rtwdev, &rtw8822c_dpk_afe_no_dpk_tbl);
3305}
3306
3307static void rtw8822c_dpk_pre_setting(struct rtw_dev *rtwdev)
3308{
3309        u8 path;
3310
3311        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
3312                rtw_write_rf(rtwdev, path, RF_RXAGC_OFFSET, RFREG_MASK, 0x0);
3313                rtw_write32(rtwdev, REG_NCTL0, 0x8 | (path << 1));
3314                if (rtwdev->dm_info.dpk_info.dpk_band == RTW_BAND_2G)
3315                        rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f100000);
3316                else
3317                        rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f0d0000);
3318                rtw_write32_mask(rtwdev, REG_DPD_LUT0, BIT_GLOSS_DB, 0x4);
3319                rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x3);
3320        }
3321        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3322        rtw_write32(rtwdev, REG_DPD_CTL11, 0x3b23170b);
3323        rtw_write32(rtwdev, REG_DPD_CTL12, 0x775f5347);
3324}
3325
3326static u32 rtw8822c_dpk_rf_setting(struct rtw_dev *rtwdev, u8 path)
3327{
3328        u32 ori_txbb;
3329
3330        rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x50017);
3331        ori_txbb = rtw_read_rf(rtwdev, path, RF_TX_GAIN, RFREG_MASK);
3332
3333        rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x1);
3334        rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_PWR_TRIM, 0x1);
3335        rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_BB_GAIN, 0x0);
3336        rtw_write_rf(rtwdev, path, RF_TX_GAIN, RFREG_MASK, ori_txbb);
3337
3338        if (rtwdev->dm_info.dpk_info.dpk_band == RTW_BAND_2G) {
3339                rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_RF_GAIN, 0x1);
3340                rtw_write_rf(rtwdev, path, RF_RXG_GAIN, BIT_RXG_GAIN, 0x0);
3341        } else {
3342                rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_TXA_LB_ATT, 0x0);
3343                rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_ATT, 0x6);
3344                rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_SW, 0x1);
3345                rtw_write_rf(rtwdev, path, RF_RXA_MIX_GAIN, BIT_RXA_MIX_GAIN, 0);
3346        }
3347
3348        rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RXAGC, 0xf);
3349        rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x1);
3350        rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_RXBB, 0x0);
3351
3352        if (rtwdev->dm_info.dpk_info.dpk_bw == DPK_CHANNEL_WIDTH_80)
3353                rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x2);
3354        else
3355                rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x1);
3356
3357        rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT(1), 0x1);
3358
3359        usleep_range(100, 110);
3360
3361        return ori_txbb & 0x1f;
3362}
3363
3364static u16 rtw8822c_dpk_get_cmd(struct rtw_dev *rtwdev, u8 action, u8 path)
3365{
3366        u16 cmd;
3367        u8 bw = rtwdev->dm_info.dpk_info.dpk_bw == DPK_CHANNEL_WIDTH_80 ? 2 : 0;
3368
3369        switch (action) {
3370        case RTW_DPK_GAIN_LOSS:
3371                cmd = 0x14 + path;
3372                break;
3373        case RTW_DPK_DO_DPK:
3374                cmd = 0x16 + path + bw;
3375                break;
3376        case RTW_DPK_DPK_ON:
3377                cmd = 0x1a + path;
3378                break;
3379        case RTW_DPK_DAGC:
3380                cmd = 0x1c + path + bw;
3381                break;
3382        default:
3383                return 0;
3384        }
3385
3386        return (cmd << 8) | 0x48;
3387}
3388
3389static u8 rtw8822c_dpk_one_shot(struct rtw_dev *rtwdev, u8 path, u8 action)
3390{
3391        u16 dpk_cmd;
3392        u8 result = 0;
3393
3394        rtw8822c_dpk_set_gnt_wl(rtwdev, true);
3395
3396        if (action == RTW_DPK_CAL_PWR) {
3397                rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(12), 0x1);
3398                rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(12), 0x0);
3399                rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x0);
3400                msleep(10);
3401                if (!check_hw_ready(rtwdev, REG_STAT_RPT, BIT(31), 0x1)) {
3402                        result = 1;
3403                        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] one-shot over 20ms\n");
3404                }
3405        } else {
3406                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
3407                                 0x8 | (path << 1));
3408                rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x9);
3409
3410                dpk_cmd = rtw8822c_dpk_get_cmd(rtwdev, action, path);
3411                rtw_write32(rtwdev, REG_NCTL0, dpk_cmd);
3412                rtw_write32(rtwdev, REG_NCTL0, dpk_cmd + 1);
3413                msleep(10);
3414                if (!check_hw_ready(rtwdev, 0x2d9c, 0xff, 0x55)) {
3415                        result = 1;
3416                        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] one-shot over 20ms\n");
3417                }
3418                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
3419                                 0x8 | (path << 1));
3420                rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x0);
3421        }
3422
3423        rtw8822c_dpk_set_gnt_wl(rtwdev, false);
3424
3425        rtw_write8(rtwdev, 0x1b10, 0x0);
3426
3427        return result;
3428}
3429
3430static u16 rtw8822c_dpk_dgain_read(struct rtw_dev *rtwdev, u8 path)
3431{
3432        u16 dgain;
3433
3434        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3435        rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, 0x00ff0000, 0x0);
3436
3437        dgain = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(27, 16));
3438
3439        return dgain;
3440}
3441
3442static u8 rtw8822c_dpk_thermal_read(struct rtw_dev *rtwdev, u8 path)
3443{
3444        rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x1);
3445        rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x0);
3446        rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x1);
3447        udelay(15);
3448
3449        return (u8)rtw_read_rf(rtwdev, path, RF_T_METER, 0x0007e);
3450}
3451
3452static u32 rtw8822c_dpk_pas_read(struct rtw_dev *rtwdev, u8 path)
3453{
3454        u32 i_val, q_val;
3455
3456        rtw_write32(rtwdev, REG_NCTL0, 0x8 | (path << 1));
3457        rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x0);
3458        rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x00060001);
3459        rtw_write32(rtwdev, 0x1b4c, 0x00000000);
3460        rtw_write32(rtwdev, 0x1b4c, 0x00080000);
3461
3462        q_val = rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKHWORD);
3463        i_val = rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKLWORD);
3464
3465        if (i_val & BIT(15))
3466                i_val = 0x10000 - i_val;
3467        if (q_val & BIT(15))
3468                q_val = 0x10000 - q_val;
3469
3470        rtw_write32(rtwdev, 0x1b4c, 0x00000000);
3471
3472        return i_val * i_val + q_val * q_val;
3473}
3474
3475static u32 rtw8822c_psd_log2base(u32 val)
3476{
3477        u32 tmp, val_integerd_b, tindex;
3478        u32 result, val_fractiond_b;
3479        u32 table_fraction[21] = {0, 432, 332, 274, 232, 200, 174,
3480                                  151, 132, 115, 100, 86, 74, 62, 51,
3481                                  42, 32, 23, 15, 7, 0};
3482
3483        if (val == 0)
3484                return 0;
3485
3486        val_integerd_b = __fls(val) + 1;
3487
3488        tmp = (val * 100) / (1 << val_integerd_b);
3489        tindex = tmp / 5;
3490
3491        if (tindex >= ARRAY_SIZE(table_fraction))
3492                tindex = ARRAY_SIZE(table_fraction) - 1;
3493
3494        val_fractiond_b = table_fraction[tindex];
3495
3496        result = val_integerd_b * 100 - val_fractiond_b;
3497
3498        return result;
3499}
3500
3501static u8 rtw8822c_dpk_gainloss_result(struct rtw_dev *rtwdev, u8 path)
3502{
3503        u8 result;
3504
3505        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3506        rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x1);
3507        rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x00060000);
3508
3509        result = (u8)rtw_read32_mask(rtwdev, REG_STAT_RPT, 0x000000f0);
3510
3511        rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x0);
3512
3513        return result;
3514}
3515
3516static u8 rtw8822c_dpk_agc_gain_chk(struct rtw_dev *rtwdev, u8 path,
3517                                    u8 limited_pga)
3518{
3519        u8 result = 0;
3520        u16 dgain;
3521
3522        rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC);
3523        dgain = rtw8822c_dpk_dgain_read(rtwdev, path);
3524
3525        if (dgain > 1535 && !limited_pga)
3526                return RTW_DPK_GAIN_LESS;
3527        else if (dgain < 768 && !limited_pga)
3528                return RTW_DPK_GAIN_LARGE;
3529        else
3530                return result;
3531}
3532
3533static u8 rtw8822c_dpk_agc_loss_chk(struct rtw_dev *rtwdev, u8 path)
3534{
3535        u32 loss, loss_db;
3536
3537        loss = rtw8822c_dpk_pas_read(rtwdev, path);
3538        if (loss < 0x4000000)
3539                return RTW_DPK_GL_LESS;
3540        loss_db = 3 * rtw8822c_psd_log2base(loss >> 13) - 3870;
3541
3542        if (loss_db > 1000)
3543                return RTW_DPK_GL_LARGE;
3544        else if (loss_db < 250)
3545                return RTW_DPK_GL_LESS;
3546        else
3547                return RTW_DPK_AGC_OUT;
3548}
3549
3550struct rtw8822c_dpk_data {
3551        u8 txbb;
3552        u8 pga;
3553        u8 limited_pga;
3554        u8 agc_cnt;
3555        bool loss_only;
3556        bool gain_only;
3557        u8 path;
3558};
3559
3560static u8 rtw8822c_gain_check_state(struct rtw_dev *rtwdev,
3561                                    struct rtw8822c_dpk_data *data)
3562{
3563        u8 state;
3564
3565        data->txbb = (u8)rtw_read_rf(rtwdev, data->path, RF_TX_GAIN,
3566                                     BIT_GAIN_TXBB);
3567        data->pga = (u8)rtw_read_rf(rtwdev, data->path, RF_MODE_TRXAGC,
3568                                    BIT_RXAGC);
3569
3570        if (data->loss_only) {
3571                state = RTW_DPK_LOSS_CHECK;
3572                goto check_end;
3573        }
3574
3575        state = rtw8822c_dpk_agc_gain_chk(rtwdev, data->path,
3576                                          data->limited_pga);
3577        if (state == RTW_DPK_GAIN_CHECK && data->gain_only)
3578                state = RTW_DPK_AGC_OUT;
3579        else if (state == RTW_DPK_GAIN_CHECK)
3580                state = RTW_DPK_LOSS_CHECK;
3581
3582check_end:
3583        data->agc_cnt++;
3584        if (data->agc_cnt >= 6)
3585                state = RTW_DPK_AGC_OUT;
3586
3587        return state;
3588}
3589
3590static u8 rtw8822c_gain_large_state(struct rtw_dev *rtwdev,
3591                                    struct rtw8822c_dpk_data *data)
3592{
3593        u8 pga = data->pga;
3594
3595        if (pga > 0xe)
3596                rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xc);
3597        else if (pga > 0xb && pga < 0xf)
3598                rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0x0);
3599        else if (pga < 0xc)
3600                data->limited_pga = 1;
3601
3602        return RTW_DPK_GAIN_CHECK;
3603}
3604
3605static u8 rtw8822c_gain_less_state(struct rtw_dev *rtwdev,
3606                                   struct rtw8822c_dpk_data *data)
3607{
3608        u8 pga = data->pga;
3609
3610        if (pga < 0xc)
3611                rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xc);
3612        else if (pga > 0xb && pga < 0xf)
3613                rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xf);
3614        else if (pga > 0xe)
3615                data->limited_pga = 1;
3616
3617        return RTW_DPK_GAIN_CHECK;
3618}
3619
3620static u8 rtw8822c_gl_state(struct rtw_dev *rtwdev,
3621                            struct rtw8822c_dpk_data *data, u8 is_large)
3622{
3623        u8 txbb_bound[] = {0x1f, 0};
3624
3625        if (data->txbb == txbb_bound[is_large])
3626                return RTW_DPK_AGC_OUT;
3627
3628        if (is_large == 1)
3629                data->txbb -= 2;
3630        else
3631                data->txbb += 3;
3632
3633        rtw_write_rf(rtwdev, data->path, RF_TX_GAIN, BIT_GAIN_TXBB, data->txbb);
3634        data->limited_pga = 0;
3635
3636        return RTW_DPK_GAIN_CHECK;
3637}
3638
3639static u8 rtw8822c_gl_large_state(struct rtw_dev *rtwdev,
3640                                  struct rtw8822c_dpk_data *data)
3641{
3642        return rtw8822c_gl_state(rtwdev, data, 1);
3643}
3644
3645static u8 rtw8822c_gl_less_state(struct rtw_dev *rtwdev,
3646                                 struct rtw8822c_dpk_data *data)
3647{
3648        return rtw8822c_gl_state(rtwdev, data, 0);
3649}
3650
3651static u8 rtw8822c_loss_check_state(struct rtw_dev *rtwdev,
3652                                    struct rtw8822c_dpk_data *data)
3653{
3654        u8 path = data->path;
3655        u8 state;
3656
3657        rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_GAIN_LOSS);
3658        state = rtw8822c_dpk_agc_loss_chk(rtwdev, path);
3659
3660        return state;
3661}
3662
3663static u8 (*dpk_state[])(struct rtw_dev *rtwdev,
3664                          struct rtw8822c_dpk_data *data) = {
3665        rtw8822c_gain_check_state, rtw8822c_gain_large_state,
3666        rtw8822c_gain_less_state, rtw8822c_gl_large_state,
3667        rtw8822c_gl_less_state, rtw8822c_loss_check_state };
3668
3669static u8 rtw8822c_dpk_pas_agc(struct rtw_dev *rtwdev, u8 path,
3670                               bool gain_only, bool loss_only)
3671{
3672        struct rtw8822c_dpk_data data = {0};
3673        u8 (*func)(struct rtw_dev *rtwdev, struct rtw8822c_dpk_data *data);
3674        u8 state = RTW_DPK_GAIN_CHECK;
3675
3676        data.loss_only = loss_only;
3677        data.gain_only = gain_only;
3678        data.path = path;
3679
3680        for (;;) {
3681                func = dpk_state[state];
3682                state = func(rtwdev, &data);
3683                if (state == RTW_DPK_AGC_OUT)
3684                        break;
3685        }
3686
3687        return data.txbb;
3688}
3689
3690static bool rtw8822c_dpk_coef_iq_check(struct rtw_dev *rtwdev,
3691                                       u16 coef_i, u16 coef_q)
3692{
3693        if (coef_i == 0x1000 || coef_i == 0x0fff ||
3694            coef_q == 0x1000 || coef_q == 0x0fff)
3695                return true;
3696
3697        return false;
3698}
3699
3700static u32 rtw8822c_dpk_coef_transfer(struct rtw_dev *rtwdev)
3701{
3702        u32 reg = 0;
3703        u16 coef_i = 0, coef_q = 0;
3704
3705        reg = rtw_read32(rtwdev, REG_STAT_RPT);
3706
3707        coef_i = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKHWORD) & 0x1fff;
3708        coef_q = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKLWORD) & 0x1fff;
3709
3710        coef_q = ((0x2000 - coef_q) & 0x1fff) - 1;
3711
3712        reg = (coef_i << 16) | coef_q;
3713
3714        return reg;
3715}
3716
3717static const u32 rtw8822c_dpk_get_coef_tbl[] = {
3718        0x000400f0, 0x040400f0, 0x080400f0, 0x010400f0, 0x050400f0,
3719        0x090400f0, 0x020400f0, 0x060400f0, 0x0a0400f0, 0x030400f0,
3720        0x070400f0, 0x0b0400f0, 0x0c0400f0, 0x100400f0, 0x0d0400f0,
3721        0x110400f0, 0x0e0400f0, 0x120400f0, 0x0f0400f0, 0x130400f0,
3722};
3723
3724static void rtw8822c_dpk_coef_tbl_apply(struct rtw_dev *rtwdev, u8 path)
3725{
3726        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3727        int i;
3728
3729        for (i = 0; i < 20; i++) {
3730                rtw_write32(rtwdev, REG_RXSRAM_CTL,
3731                            rtw8822c_dpk_get_coef_tbl[i]);
3732                dpk_info->coef[path][i] = rtw8822c_dpk_coef_transfer(rtwdev);
3733        }
3734}
3735
3736static void rtw8822c_dpk_get_coef(struct rtw_dev *rtwdev, u8 path)
3737{
3738        rtw_write32(rtwdev, REG_NCTL0, 0x0000000c);
3739
3740        if (path == RF_PATH_A) {
3741                rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(24), 0x0);
3742                rtw_write32(rtwdev, REG_DPD_CTL0_S0, 0x30000080);
3743        } else if (path == RF_PATH_B) {
3744                rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(24), 0x1);
3745                rtw_write32(rtwdev, REG_DPD_CTL0_S1, 0x30000080);
3746        }
3747
3748        rtw8822c_dpk_coef_tbl_apply(rtwdev, path);
3749}
3750
3751static u8 rtw8822c_dpk_coef_read(struct rtw_dev *rtwdev, u8 path)
3752{
3753        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3754        u8 addr, result = 1;
3755        u16 coef_i, coef_q;
3756
3757        for (addr = 0; addr < 20; addr++) {
3758                coef_i = FIELD_GET(0x1fff0000, dpk_info->coef[path][addr]);
3759                coef_q = FIELD_GET(0x1fff, dpk_info->coef[path][addr]);
3760
3761                if (rtw8822c_dpk_coef_iq_check(rtwdev, coef_i, coef_q)) {
3762                        result = 0;
3763                        break;
3764                }
3765        }
3766        return result;
3767}
3768
3769static void rtw8822c_dpk_coef_write(struct rtw_dev *rtwdev, u8 path, u8 result)
3770{
3771        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3772        u16 reg[DPK_RF_PATH_NUM] = {0x1b0c, 0x1b64};
3773        u32 coef;
3774        u8 addr;
3775
3776        rtw_write32(rtwdev, REG_NCTL0, 0x0000000c);
3777        rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0);
3778
3779        for (addr = 0; addr < 20; addr++) {
3780                if (result == 0) {
3781                        if (addr == 3)
3782                                coef = 0x04001fff;
3783                        else
3784                                coef = 0x00001fff;
3785                } else {
3786                        coef = dpk_info->coef[path][addr];
3787                }
3788                rtw_write32(rtwdev, reg[path] + addr * 4, coef);
3789        }
3790}
3791
3792static void rtw8822c_dpk_fill_result(struct rtw_dev *rtwdev, u32 dpk_txagc,
3793                                     u8 path, u8 result)
3794{
3795        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3796
3797        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3798
3799        if (result)
3800                rtw_write8(rtwdev, REG_DPD_AGC, (u8)(dpk_txagc - 6));
3801        else
3802                rtw_write8(rtwdev, REG_DPD_AGC, 0x00);
3803
3804        dpk_info->result[path] = result;
3805        dpk_info->dpk_txagc[path] = rtw_read8(rtwdev, REG_DPD_AGC);
3806
3807        rtw8822c_dpk_coef_write(rtwdev, path, result);
3808}
3809
3810static u32 rtw8822c_dpk_gainloss(struct rtw_dev *rtwdev, u8 path)
3811{
3812        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3813        u8 tx_agc, tx_bb, ori_txbb, ori_txagc, tx_agc_search, t1, t2;
3814
3815        ori_txbb = rtw8822c_dpk_rf_setting(rtwdev, path);
3816        ori_txagc = (u8)rtw_read_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_TXAGC);
3817
3818        rtw8822c_dpk_rxbb_dc_cal(rtwdev, path);
3819        rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC);
3820        rtw8822c_dpk_dgain_read(rtwdev, path);
3821
3822        if (rtw8822c_dpk_dc_corr_check(rtwdev, path)) {
3823                rtw8822c_dpk_rxbb_dc_cal(rtwdev, path);
3824                rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC);
3825                rtw8822c_dpk_dc_corr_check(rtwdev, path);
3826        }
3827
3828        t1 = rtw8822c_dpk_thermal_read(rtwdev, path);
3829        tx_bb = rtw8822c_dpk_pas_agc(rtwdev, path, false, true);
3830        tx_agc_search = rtw8822c_dpk_gainloss_result(rtwdev, path);
3831
3832        if (tx_bb < tx_agc_search)
3833                tx_bb = 0;
3834        else
3835                tx_bb = tx_bb - tx_agc_search;
3836
3837        rtw_write_rf(rtwdev, path, RF_TX_GAIN, BIT_GAIN_TXBB, tx_bb);
3838
3839        tx_agc = ori_txagc - (ori_txbb - tx_bb);
3840
3841        t2 = rtw8822c_dpk_thermal_read(rtwdev, path);
3842
3843        dpk_info->thermal_dpk_delta[path] = abs(t2 - t1);
3844
3845        return tx_agc;
3846}
3847
3848static u8 rtw8822c_dpk_by_path(struct rtw_dev *rtwdev, u32 tx_agc, u8 path)
3849{
3850        u8 result;
3851
3852        result = rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DO_DPK);
3853
3854        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3855
3856        result = result | (u8)rtw_read32_mask(rtwdev, REG_DPD_CTL1_S0, BIT(26));
3857
3858        rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x33e14);
3859
3860        rtw8822c_dpk_get_coef(rtwdev, path);
3861
3862        return result;
3863}
3864
3865static void rtw8822c_dpk_cal_gs(struct rtw_dev *rtwdev, u8 path)
3866{
3867        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3868        u32 tmp_gs = 0;
3869
3870        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3871        rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_BYPASS_DPD, 0x0);
3872        rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
3873        rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x9);
3874        rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_INNER_LB, 0x1);
3875        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3876        rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_DPD_CLK, 0xf);
3877
3878        if (path == RF_PATH_A) {
3879                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF,
3880                                 0x1066680);
3881                rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_DPD_EN, 0x1);
3882        } else {
3883                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF,
3884                                 0x1066680);
3885                rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, BIT_DPD_EN, 0x1);
3886        }
3887
3888        if (dpk_info->dpk_bw == DPK_CHANNEL_WIDTH_80) {
3889                rtw_write32(rtwdev, REG_DPD_CTL16, 0x80001310);
3890                rtw_write32(rtwdev, REG_DPD_CTL16, 0x00001310);
3891                rtw_write32(rtwdev, REG_DPD_CTL16, 0x810000db);
3892                rtw_write32(rtwdev, REG_DPD_CTL16, 0x010000db);
3893                rtw_write32(rtwdev, REG_DPD_CTL16, 0x0000b428);
3894                rtw_write32(rtwdev, REG_DPD_CTL15,
3895                            0x05020000 | (BIT(path) << 28));
3896        } else {
3897                rtw_write32(rtwdev, REG_DPD_CTL16, 0x8200190c);
3898                rtw_write32(rtwdev, REG_DPD_CTL16, 0x0200190c);
3899                rtw_write32(rtwdev, REG_DPD_CTL16, 0x8301ee14);
3900                rtw_write32(rtwdev, REG_DPD_CTL16, 0x0301ee14);
3901                rtw_write32(rtwdev, REG_DPD_CTL16, 0x0000b428);
3902                rtw_write32(rtwdev, REG_DPD_CTL15,
3903                            0x05020008 | (BIT(path) << 28));
3904        }
3905
3906        rtw_write32_mask(rtwdev, REG_DPD_CTL0, MASKBYTE3, 0x8 | path);
3907
3908        rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_CAL_PWR);
3909
3910        rtw_write32_mask(rtwdev, REG_DPD_CTL15, MASKBYTE3, 0x0);
3911        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3912        rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x0);
3913        rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_INNER_LB, 0x0);
3914        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3915
3916        if (path == RF_PATH_A)
3917                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, 0x5b);
3918        else
3919                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, 0x5b);
3920
3921        rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x0);
3922
3923        tmp_gs = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, BIT_RPT_DGAIN);
3924        tmp_gs = (tmp_gs * 910) >> 10;
3925        tmp_gs = DIV_ROUND_CLOSEST(tmp_gs, 10);
3926
3927        if (path == RF_PATH_A)
3928                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, tmp_gs);
3929        else
3930                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, tmp_gs);
3931
3932        dpk_info->dpk_gs[path] = tmp_gs;
3933}
3934
3935static void rtw8822c_dpk_cal_coef1(struct rtw_dev *rtwdev)
3936{
3937        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3938        u32 offset[DPK_RF_PATH_NUM] = {0, 0x58};
3939        u32 i_scaling;
3940        u8 path;
3941
3942        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c);
3943        rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0);
3944        rtw_write32(rtwdev, REG_NCTL0, 0x00001148);
3945        rtw_write32(rtwdev, REG_NCTL0, 0x00001149);
3946
3947        check_hw_ready(rtwdev, 0x2d9c, MASKBYTE0, 0x55);
3948
3949        rtw_write8(rtwdev, 0x1b10, 0x0);
3950        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c);
3951
3952        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
3953                i_scaling = 0x16c00 / dpk_info->dpk_gs[path];
3954
3955                rtw_write32_mask(rtwdev, 0x1b18 + offset[path], MASKHWORD,
3956                                 i_scaling);
3957                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path],
3958                                 GENMASK(31, 28), 0x9);
3959                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path],
3960                                 GENMASK(31, 28), 0x1);
3961                rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path],
3962                                 GENMASK(31, 28), 0x0);
3963                rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0 + offset[path],
3964                                 BIT(14), 0x0);
3965        }
3966}
3967
3968static void rtw8822c_dpk_on(struct rtw_dev *rtwdev, u8 path)
3969{
3970        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3971
3972        rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DPK_ON);
3973
3974        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3975        rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
3976
3977        if (test_bit(path, dpk_info->dpk_path_ok))
3978                rtw8822c_dpk_cal_gs(rtwdev, path);
3979}
3980
3981static bool rtw8822c_dpk_check_pass(struct rtw_dev *rtwdev, bool is_fail,
3982                                    u32 dpk_txagc, u8 path)
3983{
3984        bool result;
3985
3986        if (!is_fail) {
3987                if (rtw8822c_dpk_coef_read(rtwdev, path))
3988                        result = true;
3989                else
3990                        result = false;
3991        } else {
3992                result = false;
3993        }
3994
3995        rtw8822c_dpk_fill_result(rtwdev, dpk_txagc, path, result);
3996
3997        return result;
3998}
3999
4000static void rtw8822c_dpk_result_reset(struct rtw_dev *rtwdev)
4001{
4002        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
4003        u8 path;
4004
4005        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
4006                clear_bit(path, dpk_info->dpk_path_ok);
4007                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
4008                                 0x8 | (path << 1));
4009                rtw_write32_mask(rtwdev, 0x1b58, 0x0000007f, 0x0);
4010
4011                dpk_info->dpk_txagc[path] = 0;
4012                dpk_info->result[path] = 0;
4013                dpk_info->dpk_gs[path] = 0x5b;
4014                dpk_info->pre_pwsf[path] = 0;
4015                dpk_info->thermal_dpk[path] = rtw8822c_dpk_thermal_read(rtwdev,
4016                                                                        path);
4017        }
4018}
4019
4020static void rtw8822c_dpk_calibrate(struct rtw_dev *rtwdev, u8 path)
4021{
4022        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
4023        u32 dpk_txagc;
4024        u8 dpk_fail;
4025
4026        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] s%d dpk start\n", path);
4027
4028        dpk_txagc = rtw8822c_dpk_gainloss(rtwdev, path);
4029
4030        dpk_fail = rtw8822c_dpk_by_path(rtwdev, dpk_txagc, path);
4031
4032        if (!rtw8822c_dpk_check_pass(rtwdev, dpk_fail, dpk_txagc, path))
4033                rtw_err(rtwdev, "failed to do dpk calibration\n");
4034
4035        rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] s%d dpk finish\n", path);
4036
4037        if (dpk_info->result[path])
4038                set_bit(path, dpk_info->dpk_path_ok);
4039}
4040
4041static void rtw8822c_dpk_path_select(struct rtw_dev *rtwdev)
4042{
4043        rtw8822c_dpk_calibrate(rtwdev, RF_PATH_A);
4044        rtw8822c_dpk_calibrate(rtwdev, RF_PATH_B);
4045        rtw8822c_dpk_on(rtwdev, RF_PATH_A);
4046        rtw8822c_dpk_on(rtwdev, RF_PATH_B);
4047        rtw8822c_dpk_cal_coef1(rtwdev);
4048}
4049
4050static void rtw8822c_dpk_enable_disable(struct rtw_dev *rtwdev)
4051{
4052        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
4053        u32 mask = BIT(15) | BIT(14);
4054
4055        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
4056
4057        rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_DPD_EN,
4058                         dpk_info->is_dpk_pwr_on);
4059        rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, BIT_DPD_EN,
4060                         dpk_info->is_dpk_pwr_on);
4061
4062        if (test_bit(RF_PATH_A, dpk_info->dpk_path_ok)) {
4063                rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, mask, 0x0);
4064                rtw_write8(rtwdev, REG_DPD_CTL0_S0, dpk_info->dpk_gs[RF_PATH_A]);
4065        }
4066        if (test_bit(RF_PATH_B, dpk_info->dpk_path_ok)) {
4067                rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, mask, 0x0);
4068                rtw_write8(rtwdev, REG_DPD_CTL0_S1, dpk_info->dpk_gs[RF_PATH_B]);
4069        }
4070}
4071
4072static void rtw8822c_dpk_reload_data(struct rtw_dev *rtwdev)
4073{
4074        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
4075        u8 path;
4076
4077        if (!test_bit(RF_PATH_A, dpk_info->dpk_path_ok) &&
4078            !test_bit(RF_PATH_B, dpk_info->dpk_path_ok) &&
4079            dpk_info->dpk_ch == 0)
4080                return;
4081
4082        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
4083                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
4084                                 0x8 | (path << 1));
4085                if (dpk_info->dpk_band == RTW_BAND_2G)
4086                        rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f100000);
4087                else
4088                        rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f0d0000);
4089
4090                rtw_write8(rtwdev, REG_DPD_AGC, dpk_info->dpk_txagc[path]);
4091
4092                rtw8822c_dpk_coef_write(rtwdev, path,
4093                                        test_bit(path, dpk_info->dpk_path_ok));
4094
4095                rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DPK_ON);
4096
4097                rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
4098
4099                if (path == RF_PATH_A)
4100                        rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF,
4101                                         dpk_info->dpk_gs[path]);
4102                else
4103                        rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF,
4104                                         dpk_info->dpk_gs[path]);
4105        }
4106        rtw8822c_dpk_cal_coef1(rtwdev);
4107}
4108
4109static bool rtw8822c_dpk_reload(struct rtw_dev *rtwdev)
4110{
4111        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
4112        u8 channel;
4113
4114        dpk_info->is_reload = false;
4115
4116        channel = (u8)(rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK) & 0xff);
4117
4118        if (channel == dpk_info->dpk_ch) {
4119                rtw_dbg(rtwdev, RTW_DBG_RFK,
4120                        "[DPK] DPK reload for CH%d!!\n", dpk_info->dpk_ch);
4121                rtw8822c_dpk_reload_data(rtwdev);
4122                dpk_info->is_reload = true;
4123        }
4124
4125        return dpk_info->is_reload;
4126}
4127
4128static void rtw8822c_do_dpk(struct rtw_dev *rtwdev)
4129{
4130        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
4131        struct rtw_backup_info bckp[DPK_BB_REG_NUM];
4132        u32 rf_reg_backup[DPK_RF_REG_NUM][DPK_RF_PATH_NUM];
4133        u32 bb_reg[DPK_BB_REG_NUM] = {
4134                0x520, 0x820, 0x824, 0x1c3c, 0x1d58, 0x1864,
4135                0x4164, 0x180c, 0x410c, 0x186c, 0x416c,
4136                0x1a14, 0x1e70, 0x80c, 0x1d70, 0x1e7c, 0x18a4, 0x41a4};
4137        u32 rf_reg[DPK_RF_REG_NUM] = {
4138                0x0, 0x1a, 0x55, 0x63, 0x87, 0x8f, 0xde};
4139        u8 path;
4140
4141        if (!dpk_info->is_dpk_pwr_on) {
4142                rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] Skip DPK due to DPD PWR off\n");
4143                return;
4144        } else if (rtw8822c_dpk_reload(rtwdev)) {
4145                return;
4146        }
4147
4148        for (path = RF_PATH_A; path < DPK_RF_PATH_NUM; path++)
4149                ewma_thermal_init(&dpk_info->avg_thermal[path]);
4150
4151        rtw8822c_dpk_information(rtwdev);
4152
4153        rtw8822c_dpk_backup_registers(rtwdev, bb_reg, DPK_BB_REG_NUM, bckp);
4154        rtw8822c_dpk_backup_rf_registers(rtwdev, rf_reg, rf_reg_backup);
4155
4156        rtw8822c_dpk_mac_bb_setting(rtwdev);
4157        rtw8822c_dpk_afe_setting(rtwdev, true);
4158        rtw8822c_dpk_pre_setting(rtwdev);
4159        rtw8822c_dpk_result_reset(rtwdev);
4160        rtw8822c_dpk_path_select(rtwdev);
4161        rtw8822c_dpk_afe_setting(rtwdev, false);
4162        rtw8822c_dpk_enable_disable(rtwdev);
4163
4164        rtw8822c_dpk_reload_rf_registers(rtwdev, rf_reg, rf_reg_backup);
4165        for (path = 0; path < rtwdev->hal.rf_path_num; path++)
4166                rtw8822c_dpk_rxbb_dc_cal(rtwdev, path);
4167        rtw8822c_dpk_restore_registers(rtwdev, DPK_BB_REG_NUM, bckp);
4168}
4169
4170static void rtw8822c_phy_calibration(struct rtw_dev *rtwdev)
4171{
4172        rtw8822c_rfk_power_save(rtwdev, false);
4173        rtw8822c_do_gapk(rtwdev);
4174        rtw8822c_do_iqk(rtwdev);
4175        rtw8822c_do_dpk(rtwdev);
4176        rtw8822c_rfk_power_save(rtwdev, true);
4177}
4178
4179static void rtw8822c_dpk_track(struct rtw_dev *rtwdev)
4180{
4181        struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
4182        u8 path;
4183        u8 thermal_value[DPK_RF_PATH_NUM] = {0};
4184        s8 offset[DPK_RF_PATH_NUM], delta_dpk[DPK_RF_PATH_NUM];
4185
4186        if (dpk_info->thermal_dpk[0] == 0 && dpk_info->thermal_dpk[1] == 0)
4187                return;
4188
4189        for (path = 0; path < DPK_RF_PATH_NUM; path++) {
4190                thermal_value[path] = rtw8822c_dpk_thermal_read(rtwdev, path);
4191                ewma_thermal_add(&dpk_info->avg_thermal[path],
4192                                 thermal_value[path]);
4193                thermal_value[path] =
4194                        ewma_thermal_read(&dpk_info->avg_thermal[path]);
4195                delta_dpk[path] = dpk_info->thermal_dpk[path] -
4196                                  thermal_value[path];
4197                offset[path] = delta_dpk[path] -
4198                               dpk_info->thermal_dpk_delta[path];
4199                offset[path] &= 0x7f;
4200
4201                if (offset[path] != dpk_info->pre_pwsf[path]) {
4202                        rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
4203                                         0x8 | (path << 1));
4204                        rtw_write32_mask(rtwdev, 0x1b58, GENMASK(6, 0),
4205                                         offset[path]);
4206                        dpk_info->pre_pwsf[path] = offset[path];
4207                }
4208        }
4209}
4210
4211#define XCAP_EXTEND(val) ({typeof(val) _v = (val); _v | _v << 7; })
4212static void rtw8822c_set_crystal_cap_reg(struct rtw_dev *rtwdev, u8 crystal_cap)
4213{
4214        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4215        struct rtw_cfo_track *cfo = &dm_info->cfo_track;
4216        u32 val = 0;
4217
4218        val = XCAP_EXTEND(crystal_cap);
4219        cfo->crystal_cap = crystal_cap;
4220        rtw_write32_mask(rtwdev, REG_ANAPAR_XTAL_0, BIT_XCAP_0, val);
4221}
4222
4223static void rtw8822c_set_crystal_cap(struct rtw_dev *rtwdev, u8 crystal_cap)
4224{
4225        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4226        struct rtw_cfo_track *cfo = &dm_info->cfo_track;
4227
4228        if (cfo->crystal_cap == crystal_cap)
4229                return;
4230
4231        rtw8822c_set_crystal_cap_reg(rtwdev, crystal_cap);
4232}
4233
4234static void rtw8822c_cfo_tracking_reset(struct rtw_dev *rtwdev)
4235{
4236        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4237        struct rtw_cfo_track *cfo = &dm_info->cfo_track;
4238
4239        cfo->is_adjust = true;
4240
4241        if (cfo->crystal_cap > rtwdev->efuse.crystal_cap)
4242                rtw8822c_set_crystal_cap(rtwdev, cfo->crystal_cap - 1);
4243        else if (cfo->crystal_cap < rtwdev->efuse.crystal_cap)
4244                rtw8822c_set_crystal_cap(rtwdev, cfo->crystal_cap + 1);
4245}
4246
4247static void rtw8822c_cfo_init(struct rtw_dev *rtwdev)
4248{
4249        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4250        struct rtw_cfo_track *cfo = &dm_info->cfo_track;
4251
4252        cfo->crystal_cap = rtwdev->efuse.crystal_cap;
4253        cfo->is_adjust = true;
4254}
4255
4256#define REPORT_TO_KHZ(val) ({typeof(val) _v = (val); (_v << 1) + (_v >> 1); })
4257static s32 rtw8822c_cfo_calc_avg(struct rtw_dev *rtwdev, u8 path_num)
4258{
4259        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4260        struct rtw_cfo_track *cfo = &dm_info->cfo_track;
4261        s32 cfo_avg, cfo_path_sum = 0, cfo_rpt_sum;
4262        u8 i;
4263
4264        for (i = 0; i < path_num; i++) {
4265                cfo_rpt_sum = REPORT_TO_KHZ(cfo->cfo_tail[i]);
4266
4267                if (cfo->cfo_cnt[i])
4268                        cfo_avg = cfo_rpt_sum / cfo->cfo_cnt[i];
4269                else
4270                        cfo_avg = 0;
4271
4272                cfo_path_sum += cfo_avg;
4273        }
4274
4275        for (i = 0; i < path_num; i++) {
4276                cfo->cfo_tail[i] = 0;
4277                cfo->cfo_cnt[i] = 0;
4278        }
4279
4280        return cfo_path_sum / path_num;
4281}
4282
4283static void rtw8822c_cfo_need_adjust(struct rtw_dev *rtwdev, s32 cfo_avg)
4284{
4285        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4286        struct rtw_cfo_track *cfo = &dm_info->cfo_track;
4287
4288        if (!cfo->is_adjust) {
4289                if (abs(cfo_avg) > CFO_TRK_ENABLE_TH)
4290                        cfo->is_adjust = true;
4291        } else {
4292                if (abs(cfo_avg) <= CFO_TRK_STOP_TH)
4293                        cfo->is_adjust = false;
4294        }
4295
4296        if (!rtw_coex_disabled(rtwdev)) {
4297                cfo->is_adjust = false;
4298                rtw8822c_set_crystal_cap(rtwdev, rtwdev->efuse.crystal_cap);
4299        }
4300}
4301
4302static void rtw8822c_cfo_track(struct rtw_dev *rtwdev)
4303{
4304        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4305        struct rtw_cfo_track *cfo = &dm_info->cfo_track;
4306        u8 path_num = rtwdev->hal.rf_path_num;
4307        s8 crystal_cap = cfo->crystal_cap;
4308        s32 cfo_avg = 0;
4309
4310        if (rtwdev->sta_cnt != 1) {
4311                rtw8822c_cfo_tracking_reset(rtwdev);
4312                return;
4313        }
4314
4315        if (cfo->packet_count == cfo->packet_count_pre)
4316                return;
4317
4318        cfo->packet_count_pre = cfo->packet_count;
4319        cfo_avg = rtw8822c_cfo_calc_avg(rtwdev, path_num);
4320        rtw8822c_cfo_need_adjust(rtwdev, cfo_avg);
4321
4322        if (cfo->is_adjust) {
4323                if (cfo_avg > CFO_TRK_ADJ_TH)
4324                        crystal_cap++;
4325                else if (cfo_avg < -CFO_TRK_ADJ_TH)
4326                        crystal_cap--;
4327
4328                crystal_cap = clamp_t(s8, crystal_cap, 0, XCAP_MASK);
4329                rtw8822c_set_crystal_cap(rtwdev, (u8)crystal_cap);
4330        }
4331}
4332
4333static const struct rtw_phy_cck_pd_reg
4334rtw8822c_cck_pd_reg[RTW_CHANNEL_WIDTH_40 + 1][RTW_RF_PATH_MAX] = {
4335        {
4336                {0x1ac8, 0x00ff, 0x1ad0, 0x01f},
4337                {0x1ac8, 0xff00, 0x1ad0, 0x3e0}
4338        },
4339        {
4340                {0x1acc, 0x00ff, 0x1ad0, 0x01F00000},
4341                {0x1acc, 0xff00, 0x1ad0, 0x3E000000}
4342        },
4343};
4344
4345#define RTW_CCK_PD_MAX 255
4346#define RTW_CCK_CS_MAX 31
4347#define RTW_CCK_CS_ERR1 27
4348#define RTW_CCK_CS_ERR2 29
4349static void
4350rtw8822c_phy_cck_pd_set_reg(struct rtw_dev *rtwdev,
4351                            s8 pd_diff, s8 cs_diff, u8 bw, u8 nrx)
4352{
4353        u32 pd, cs;
4354
4355        if (WARN_ON(bw > RTW_CHANNEL_WIDTH_40 || nrx >= RTW_RF_PATH_MAX))
4356                return;
4357
4358        pd = rtw_read32_mask(rtwdev,
4359                             rtw8822c_cck_pd_reg[bw][nrx].reg_pd,
4360                             rtw8822c_cck_pd_reg[bw][nrx].mask_pd);
4361        cs = rtw_read32_mask(rtwdev,
4362                             rtw8822c_cck_pd_reg[bw][nrx].reg_cs,
4363                             rtw8822c_cck_pd_reg[bw][nrx].mask_cs);
4364        pd += pd_diff;
4365        cs += cs_diff;
4366        if (pd > RTW_CCK_PD_MAX)
4367                pd = RTW_CCK_PD_MAX;
4368        if (cs == RTW_CCK_CS_ERR1 || cs == RTW_CCK_CS_ERR2)
4369                cs++;
4370        else if (cs > RTW_CCK_CS_MAX)
4371                cs = RTW_CCK_CS_MAX;
4372        rtw_write32_mask(rtwdev,
4373                         rtw8822c_cck_pd_reg[bw][nrx].reg_pd,
4374                         rtw8822c_cck_pd_reg[bw][nrx].mask_pd,
4375                         pd);
4376        rtw_write32_mask(rtwdev,
4377                         rtw8822c_cck_pd_reg[bw][nrx].reg_cs,
4378                         rtw8822c_cck_pd_reg[bw][nrx].mask_cs,
4379                         cs);
4380
4381        rtw_dbg(rtwdev, RTW_DBG_PHY,
4382                "is_linked=%d, bw=%d, nrx=%d, cs_ratio=0x%x, pd_th=0x%x\n",
4383                rtw_is_assoc(rtwdev), bw, nrx, cs, pd);
4384}
4385
4386static void rtw8822c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
4387{
4388        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4389        s8 pd_lvl[CCK_PD_LV_MAX] = {0, 2, 4, 6, 8};
4390        s8 cs_lvl[CCK_PD_LV_MAX] = {0, 2, 2, 2, 4};
4391        u8 cur_lvl;
4392        u8 nrx, bw;
4393
4394        nrx = (u8)rtw_read32_mask(rtwdev, 0x1a2c, 0x60000);
4395        bw = (u8)rtw_read32_mask(rtwdev, 0x9b0, 0xc);
4396
4397        rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d) bw=%d nr=%d cck_fa_avg=%d\n",
4398                dm_info->cck_pd_lv[bw][nrx], new_lvl, bw, nrx,
4399                dm_info->cck_fa_avg);
4400
4401        if (dm_info->cck_pd_lv[bw][nrx] == new_lvl)
4402                return;
4403
4404        cur_lvl = dm_info->cck_pd_lv[bw][nrx];
4405
4406        /* update cck pd info */
4407        dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
4408
4409        rtw8822c_phy_cck_pd_set_reg(rtwdev,
4410                                    pd_lvl[new_lvl] - pd_lvl[cur_lvl],
4411                                    cs_lvl[new_lvl] - cs_lvl[cur_lvl],
4412                                    bw, nrx);
4413        dm_info->cck_pd_lv[bw][nrx] = new_lvl;
4414}
4415
4416#define PWR_TRACK_MASK 0x7f
4417static void rtw8822c_pwrtrack_set(struct rtw_dev *rtwdev, u8 rf_path)
4418{
4419        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4420
4421        switch (rf_path) {
4422        case RF_PATH_A:
4423                rtw_write32_mask(rtwdev, 0x18a0, PWR_TRACK_MASK,
4424                                 dm_info->delta_power_index[rf_path]);
4425                break;
4426        case RF_PATH_B:
4427                rtw_write32_mask(rtwdev, 0x41a0, PWR_TRACK_MASK,
4428                                 dm_info->delta_power_index[rf_path]);
4429                break;
4430        default:
4431                break;
4432        }
4433}
4434
4435static void rtw8822c_pwr_track_stats(struct rtw_dev *rtwdev, u8 path)
4436{
4437        u8 thermal_value;
4438
4439        if (rtwdev->efuse.thermal_meter[path] == 0xff)
4440                return;
4441
4442        thermal_value = rtw_read_rf(rtwdev, path, RF_T_METER, 0x7e);
4443        rtw_phy_pwrtrack_avg(rtwdev, thermal_value, path);
4444}
4445
4446static void rtw8822c_pwr_track_path(struct rtw_dev *rtwdev,
4447                                    struct rtw_swing_table *swing_table,
4448                                    u8 path)
4449{
4450        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4451        u8 delta;
4452
4453        delta = rtw_phy_pwrtrack_get_delta(rtwdev, path);
4454        dm_info->delta_power_index[path] =
4455                rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table, path, path,
4456                                            delta);
4457        rtw8822c_pwrtrack_set(rtwdev, path);
4458}
4459
4460static void __rtw8822c_pwr_track(struct rtw_dev *rtwdev)
4461{
4462        struct rtw_swing_table swing_table;
4463        u8 i;
4464
4465        rtw_phy_config_swing_table(rtwdev, &swing_table);
4466
4467        for (i = 0; i < rtwdev->hal.rf_path_num; i++)
4468                rtw8822c_pwr_track_stats(rtwdev, i);
4469        if (rtw_phy_pwrtrack_need_lck(rtwdev))
4470                rtw8822c_do_lck(rtwdev);
4471        for (i = 0; i < rtwdev->hal.rf_path_num; i++)
4472                rtw8822c_pwr_track_path(rtwdev, &swing_table, i);
4473}
4474
4475static void rtw8822c_pwr_track(struct rtw_dev *rtwdev)
4476{
4477        struct rtw_efuse *efuse = &rtwdev->efuse;
4478        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
4479
4480        if (efuse->power_track_type != 0)
4481                return;
4482
4483        if (!dm_info->pwr_trk_triggered) {
4484                rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x01);
4485                rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x00);
4486                rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x01);
4487
4488                rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x01);
4489                rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x00);
4490                rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x01);
4491
4492                dm_info->pwr_trk_triggered = true;
4493                return;
4494        }
4495
4496        __rtw8822c_pwr_track(rtwdev);
4497        dm_info->pwr_trk_triggered = false;
4498}
4499
4500static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822c[] = {
4501        {0x0086,
4502         RTW_PWR_CUT_ALL_MSK,
4503         RTW_PWR_INTF_SDIO_MSK,
4504         RTW_PWR_ADDR_SDIO,
4505         RTW_PWR_CMD_WRITE, BIT(0), 0},
4506        {0x0086,
4507         RTW_PWR_CUT_ALL_MSK,
4508         RTW_PWR_INTF_SDIO_MSK,
4509         RTW_PWR_ADDR_SDIO,
4510         RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
4511        {0x002E,
4512         RTW_PWR_CUT_ALL_MSK,
4513         RTW_PWR_INTF_ALL_MSK,
4514         RTW_PWR_ADDR_MAC,
4515         RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
4516        {0x002D,
4517         RTW_PWR_CUT_ALL_MSK,
4518         RTW_PWR_INTF_ALL_MSK,
4519         RTW_PWR_ADDR_MAC,
4520         RTW_PWR_CMD_WRITE, BIT(0), 0},
4521        {0x007F,
4522         RTW_PWR_CUT_ALL_MSK,
4523         RTW_PWR_INTF_ALL_MSK,
4524         RTW_PWR_ADDR_MAC,
4525         RTW_PWR_CMD_WRITE, BIT(7), 0},
4526        {0x004A,
4527         RTW_PWR_CUT_ALL_MSK,
4528         RTW_PWR_INTF_USB_MSK,
4529         RTW_PWR_ADDR_MAC,
4530         RTW_PWR_CMD_WRITE, BIT(0), 0},
4531        {0x0005,
4532         RTW_PWR_CUT_ALL_MSK,
4533         RTW_PWR_INTF_ALL_MSK,
4534         RTW_PWR_ADDR_MAC,
4535         RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0},
4536        {0xFFFF,
4537         RTW_PWR_CUT_ALL_MSK,
4538         RTW_PWR_INTF_ALL_MSK,
4539         0,
4540         RTW_PWR_CMD_END, 0, 0},
4541};
4542
4543static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822c[] = {
4544        {0x0000,
4545         RTW_PWR_CUT_ALL_MSK,
4546         RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
4547         RTW_PWR_ADDR_MAC,
4548         RTW_PWR_CMD_WRITE, BIT(5), 0},
4549        {0x0005,
4550         RTW_PWR_CUT_ALL_MSK,
4551         RTW_PWR_INTF_ALL_MSK,
4552         RTW_PWR_ADDR_MAC,
4553         RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
4554        {0x0075,
4555         RTW_PWR_CUT_ALL_MSK,
4556         RTW_PWR_INTF_PCI_MSK,
4557         RTW_PWR_ADDR_MAC,
4558         RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
4559        {0x0006,
4560         RTW_PWR_CUT_ALL_MSK,
4561         RTW_PWR_INTF_ALL_MSK,
4562         RTW_PWR_ADDR_MAC,
4563         RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
4564        {0x0075,
4565         RTW_PWR_CUT_ALL_MSK,
4566         RTW_PWR_INTF_PCI_MSK,
4567         RTW_PWR_ADDR_MAC,
4568         RTW_PWR_CMD_WRITE, BIT(0), 0},
4569        {0xFF1A,
4570         RTW_PWR_CUT_ALL_MSK,
4571         RTW_PWR_INTF_USB_MSK,
4572         RTW_PWR_ADDR_MAC,
4573         RTW_PWR_CMD_WRITE, 0xFF, 0},
4574        {0x002E,
4575         RTW_PWR_CUT_ALL_MSK,
4576         RTW_PWR_INTF_ALL_MSK,
4577         RTW_PWR_ADDR_MAC,
4578         RTW_PWR_CMD_WRITE, BIT(3), 0},
4579        {0x0006,
4580         RTW_PWR_CUT_ALL_MSK,
4581         RTW_PWR_INTF_ALL_MSK,
4582         RTW_PWR_ADDR_MAC,
4583         RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
4584        {0x0005,
4585         RTW_PWR_CUT_ALL_MSK,
4586         RTW_PWR_INTF_ALL_MSK,
4587         RTW_PWR_ADDR_MAC,
4588         RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
4589        {0x1018,
4590         RTW_PWR_CUT_ALL_MSK,
4591         RTW_PWR_INTF_ALL_MSK,
4592         RTW_PWR_ADDR_MAC,
4593         RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
4594        {0x0005,
4595         RTW_PWR_CUT_ALL_MSK,
4596         RTW_PWR_INTF_ALL_MSK,
4597         RTW_PWR_ADDR_MAC,
4598         RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
4599        {0x0005,
4600         RTW_PWR_CUT_ALL_MSK,
4601         RTW_PWR_INTF_ALL_MSK,
4602         RTW_PWR_ADDR_MAC,
4603         RTW_PWR_CMD_POLLING, BIT(0), 0},
4604        {0x0074,
4605         RTW_PWR_CUT_ALL_MSK,
4606         RTW_PWR_INTF_PCI_MSK,
4607         RTW_PWR_ADDR_MAC,
4608         RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
4609        {0x0071,
4610         RTW_PWR_CUT_ALL_MSK,
4611         RTW_PWR_INTF_PCI_MSK,
4612         RTW_PWR_ADDR_MAC,
4613         RTW_PWR_CMD_WRITE, BIT(4), 0},
4614        {0x0062,
4615         RTW_PWR_CUT_ALL_MSK,
4616         RTW_PWR_INTF_PCI_MSK,
4617         RTW_PWR_ADDR_MAC,
4618         RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)),
4619         (BIT(7) | BIT(6) | BIT(5))},
4620        {0x0061,
4621         RTW_PWR_CUT_ALL_MSK,
4622         RTW_PWR_INTF_PCI_MSK,
4623         RTW_PWR_ADDR_MAC,
4624         RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)), 0},
4625        {0x001F,
4626         RTW_PWR_CUT_ALL_MSK,
4627         RTW_PWR_INTF_ALL_MSK,
4628         RTW_PWR_ADDR_MAC,
4629         RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6)), BIT(7)},
4630        {0x00EF,
4631         RTW_PWR_CUT_ALL_MSK,
4632         RTW_PWR_INTF_ALL_MSK,
4633         RTW_PWR_ADDR_MAC,
4634         RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6)), BIT(7)},
4635        {0x1045,
4636         RTW_PWR_CUT_ALL_MSK,
4637         RTW_PWR_INTF_ALL_MSK,
4638         RTW_PWR_ADDR_MAC,
4639         RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
4640        {0x0010,
4641         RTW_PWR_CUT_ALL_MSK,
4642         RTW_PWR_INTF_ALL_MSK,
4643         RTW_PWR_ADDR_MAC,
4644         RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
4645        {0x1064,
4646         RTW_PWR_CUT_ALL_MSK,
4647         RTW_PWR_INTF_ALL_MSK,
4648         RTW_PWR_ADDR_MAC,
4649         RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
4650        {0xFFFF,
4651         RTW_PWR_CUT_ALL_MSK,
4652         RTW_PWR_INTF_ALL_MSK,
4653         0,
4654         RTW_PWR_CMD_END, 0, 0},
4655};
4656
4657static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822c[] = {
4658        {0x0093,
4659         RTW_PWR_CUT_ALL_MSK,
4660         RTW_PWR_INTF_ALL_MSK,
4661         RTW_PWR_ADDR_MAC,
4662         RTW_PWR_CMD_WRITE, BIT(3), 0},
4663        {0x001F,
4664         RTW_PWR_CUT_ALL_MSK,
4665         RTW_PWR_INTF_ALL_MSK,
4666         RTW_PWR_ADDR_MAC,
4667         RTW_PWR_CMD_WRITE, 0xFF, 0},
4668        {0x00EF,
4669         RTW_PWR_CUT_ALL_MSK,
4670         RTW_PWR_INTF_ALL_MSK,
4671         RTW_PWR_ADDR_MAC,
4672         RTW_PWR_CMD_WRITE, 0xFF, 0},
4673        {0x1045,
4674         RTW_PWR_CUT_ALL_MSK,
4675         RTW_PWR_INTF_ALL_MSK,
4676         RTW_PWR_ADDR_MAC,
4677         RTW_PWR_CMD_WRITE, BIT(4), 0},
4678        {0xFF1A,
4679         RTW_PWR_CUT_ALL_MSK,
4680         RTW_PWR_INTF_USB_MSK,
4681         RTW_PWR_ADDR_MAC,
4682         RTW_PWR_CMD_WRITE, 0xFF, 0x30},
4683        {0x0049,
4684         RTW_PWR_CUT_ALL_MSK,
4685         RTW_PWR_INTF_ALL_MSK,
4686         RTW_PWR_ADDR_MAC,
4687         RTW_PWR_CMD_WRITE, BIT(1), 0},
4688        {0x0006,
4689         RTW_PWR_CUT_ALL_MSK,
4690         RTW_PWR_INTF_ALL_MSK,
4691         RTW_PWR_ADDR_MAC,
4692         RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
4693        {0x0002,
4694         RTW_PWR_CUT_ALL_MSK,
4695         RTW_PWR_INTF_ALL_MSK,
4696         RTW_PWR_ADDR_MAC,
4697         RTW_PWR_CMD_WRITE, BIT(1), 0},
4698        {0x0005,
4699         RTW_PWR_CUT_ALL_MSK,
4700         RTW_PWR_INTF_ALL_MSK,
4701         RTW_PWR_ADDR_MAC,
4702         RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
4703        {0x0005,
4704         RTW_PWR_CUT_ALL_MSK,
4705         RTW_PWR_INTF_ALL_MSK,
4706         RTW_PWR_ADDR_MAC,
4707         RTW_PWR_CMD_POLLING, BIT(1), 0},
4708        {0x0000,
4709         RTW_PWR_CUT_ALL_MSK,
4710         RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
4711         RTW_PWR_ADDR_MAC,
4712         RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
4713        {0xFFFF,
4714         RTW_PWR_CUT_ALL_MSK,
4715         RTW_PWR_INTF_ALL_MSK,
4716         0,
4717         RTW_PWR_CMD_END, 0, 0},
4718};
4719
4720static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822c[] = {
4721        {0x0005,
4722         RTW_PWR_CUT_ALL_MSK,
4723         RTW_PWR_INTF_SDIO_MSK,
4724         RTW_PWR_ADDR_MAC,
4725         RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
4726        {0x0007,
4727         RTW_PWR_CUT_ALL_MSK,
4728         RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
4729         RTW_PWR_ADDR_MAC,
4730         RTW_PWR_CMD_WRITE, 0xFF, 0x00},
4731        {0x0067,
4732         RTW_PWR_CUT_ALL_MSK,
4733         RTW_PWR_INTF_ALL_MSK,
4734         RTW_PWR_ADDR_MAC,
4735         RTW_PWR_CMD_WRITE, BIT(5), 0},
4736        {0x004A,
4737         RTW_PWR_CUT_ALL_MSK,
4738         RTW_PWR_INTF_USB_MSK,
4739         RTW_PWR_ADDR_MAC,
4740         RTW_PWR_CMD_WRITE, BIT(0), 0},
4741        {0x0081,
4742         RTW_PWR_CUT_ALL_MSK,
4743         RTW_PWR_INTF_ALL_MSK,
4744         RTW_PWR_ADDR_MAC,
4745         RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0},
4746        {0x0090,
4747         RTW_PWR_CUT_ALL_MSK,
4748         RTW_PWR_INTF_ALL_MSK,
4749         RTW_PWR_ADDR_MAC,
4750         RTW_PWR_CMD_WRITE, BIT(1), 0},
4751        {0x0092,
4752         RTW_PWR_CUT_ALL_MSK,
4753         RTW_PWR_INTF_PCI_MSK,
4754         RTW_PWR_ADDR_MAC,
4755         RTW_PWR_CMD_WRITE, 0xFF, 0x20},
4756        {0x0093,
4757         RTW_PWR_CUT_ALL_MSK,
4758         RTW_PWR_INTF_PCI_MSK,
4759         RTW_PWR_ADDR_MAC,
4760         RTW_PWR_CMD_WRITE, 0xFF, 0x04},
4761        {0x0005,
4762         RTW_PWR_CUT_ALL_MSK,
4763         RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
4764         RTW_PWR_ADDR_MAC,
4765         RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
4766        {0x0005,
4767         RTW_PWR_CUT_ALL_MSK,
4768         RTW_PWR_INTF_PCI_MSK,
4769         RTW_PWR_ADDR_MAC,
4770         RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
4771        {0x0086,
4772         RTW_PWR_CUT_ALL_MSK,
4773         RTW_PWR_INTF_SDIO_MSK,
4774         RTW_PWR_ADDR_SDIO,
4775         RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
4776        {0xFFFF,
4777         RTW_PWR_CUT_ALL_MSK,
4778         RTW_PWR_INTF_ALL_MSK,
4779         0,
4780         RTW_PWR_CMD_END, 0, 0},
4781};
4782
4783static const struct rtw_pwr_seq_cmd *card_enable_flow_8822c[] = {
4784        trans_carddis_to_cardemu_8822c,
4785        trans_cardemu_to_act_8822c,
4786        NULL
4787};
4788
4789static const struct rtw_pwr_seq_cmd *card_disable_flow_8822c[] = {
4790        trans_act_to_cardemu_8822c,
4791        trans_cardemu_to_carddis_8822c,
4792        NULL
4793};
4794
4795static const struct rtw_intf_phy_para usb2_param_8822c[] = {
4796        {0xFFFF, 0x00,
4797         RTW_IP_SEL_PHY,
4798         RTW_INTF_PHY_CUT_ALL,
4799         RTW_INTF_PHY_PLATFORM_ALL},
4800};
4801
4802static const struct rtw_intf_phy_para usb3_param_8822c[] = {
4803        {0xFFFF, 0x0000,
4804         RTW_IP_SEL_PHY,
4805         RTW_INTF_PHY_CUT_ALL,
4806         RTW_INTF_PHY_PLATFORM_ALL},
4807};
4808
4809static const struct rtw_intf_phy_para pcie_gen1_param_8822c[] = {
4810        {0xFFFF, 0x0000,
4811         RTW_IP_SEL_PHY,
4812         RTW_INTF_PHY_CUT_ALL,
4813         RTW_INTF_PHY_PLATFORM_ALL},
4814};
4815
4816static const struct rtw_intf_phy_para pcie_gen2_param_8822c[] = {
4817        {0xFFFF, 0x0000,
4818         RTW_IP_SEL_PHY,
4819         RTW_INTF_PHY_CUT_ALL,
4820         RTW_INTF_PHY_PLATFORM_ALL},
4821};
4822
4823static const struct rtw_intf_phy_para_table phy_para_table_8822c = {
4824        .usb2_para      = usb2_param_8822c,
4825        .usb3_para      = usb3_param_8822c,
4826        .gen1_para      = pcie_gen1_param_8822c,
4827        .gen2_para      = pcie_gen2_param_8822c,
4828        .n_usb2_para    = ARRAY_SIZE(usb2_param_8822c),
4829        .n_usb3_para    = ARRAY_SIZE(usb2_param_8822c),
4830        .n_gen1_para    = ARRAY_SIZE(pcie_gen1_param_8822c),
4831        .n_gen2_para    = ARRAY_SIZE(pcie_gen2_param_8822c),
4832};
4833
4834static const struct rtw_rfe_def rtw8822c_rfe_defs[] = {
4835        [0] = RTW_DEF_RFE(8822c, 0, 0),
4836        [1] = RTW_DEF_RFE(8822c, 0, 0),
4837        [2] = RTW_DEF_RFE(8822c, 0, 0),
4838        [5] = RTW_DEF_RFE(8822c, 0, 5),
4839        [6] = RTW_DEF_RFE(8822c, 0, 0),
4840};
4841
4842static const struct rtw_hw_reg rtw8822c_dig[] = {
4843        [0] = { .addr = 0x1d70, .mask = 0x7f },
4844        [1] = { .addr = 0x1d70, .mask = 0x7f00 },
4845};
4846
4847static const struct rtw_ltecoex_addr rtw8822c_ltecoex_addr = {
4848        .ctrl = LTECOEX_ACCESS_CTRL,
4849        .wdata = LTECOEX_WRITE_DATA,
4850        .rdata = LTECOEX_READ_DATA,
4851};
4852
4853static const struct rtw_page_table page_table_8822c[] = {
4854        {64, 64, 64, 64, 1},
4855        {64, 64, 64, 64, 1},
4856        {64, 64, 0, 0, 1},
4857        {64, 64, 64, 0, 1},
4858        {64, 64, 64, 64, 1},
4859};
4860
4861static const struct rtw_rqpn rqpn_table_8822c[] = {
4862        {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
4863         RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
4864         RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
4865        {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
4866         RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
4867         RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
4868        {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
4869         RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
4870         RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
4871        {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
4872         RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
4873         RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
4874        {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
4875         RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
4876         RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
4877};
4878
4879static struct rtw_prioq_addrs prioq_addrs_8822c = {
4880        .prio[RTW_DMA_MAPPING_EXTRA] = {
4881                .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
4882        },
4883        .prio[RTW_DMA_MAPPING_LOW] = {
4884                .rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2,
4885        },
4886        .prio[RTW_DMA_MAPPING_NORMAL] = {
4887                .rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2,
4888        },
4889        .prio[RTW_DMA_MAPPING_HIGH] = {
4890                .rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2,
4891        },
4892        .wsize = true,
4893};
4894
4895static struct rtw_chip_ops rtw8822c_ops = {
4896        .phy_set_param          = rtw8822c_phy_set_param,
4897        .read_efuse             = rtw8822c_read_efuse,
4898        .query_rx_desc          = rtw8822c_query_rx_desc,
4899        .set_channel            = rtw8822c_set_channel,
4900        .mac_init               = rtw8822c_mac_init,
4901        .dump_fw_crash          = rtw8822c_dump_fw_crash,
4902        .read_rf                = rtw_phy_read_rf,
4903        .write_rf               = rtw_phy_write_rf_reg_mix,
4904        .set_tx_power_index     = rtw8822c_set_tx_power_index,
4905        .set_antenna            = rtw8822c_set_antenna,
4906        .cfg_ldo25              = rtw8822c_cfg_ldo25,
4907        .false_alarm_statistics = rtw8822c_false_alarm_statistics,
4908        .dpk_track              = rtw8822c_dpk_track,
4909        .phy_calibration        = rtw8822c_phy_calibration,
4910        .cck_pd_set             = rtw8822c_phy_cck_pd_set,
4911        .pwr_track              = rtw8822c_pwr_track,
4912        .config_bfee            = rtw8822c_bf_config_bfee,
4913        .set_gid_table          = rtw_bf_set_gid_table,
4914        .cfg_csi_rate           = rtw_bf_cfg_csi_rate,
4915        .cfo_init               = rtw8822c_cfo_init,
4916        .cfo_track              = rtw8822c_cfo_track,
4917        .config_tx_path         = rtw8822c_config_tx_path,
4918
4919        .coex_set_init          = rtw8822c_coex_cfg_init,
4920        .coex_set_ant_switch    = NULL,
4921        .coex_set_gnt_fix       = rtw8822c_coex_cfg_gnt_fix,
4922        .coex_set_gnt_debug     = rtw8822c_coex_cfg_gnt_debug,
4923        .coex_set_rfe_type      = rtw8822c_coex_cfg_rfe_type,
4924        .coex_set_wl_tx_power   = rtw8822c_coex_cfg_wl_tx_power,
4925        .coex_set_wl_rx_gain    = rtw8822c_coex_cfg_wl_rx_gain,
4926};
4927
4928/* Shared-Antenna Coex Table */
4929static const struct coex_table_para table_sant_8822c[] = {
4930        {0xffffffff, 0xffffffff}, /* case-0 */
4931        {0x55555555, 0x55555555},
4932        {0x66555555, 0x66555555},
4933        {0xaaaaaaaa, 0xaaaaaaaa},
4934        {0x5a5a5a5a, 0x5a5a5a5a},
4935        {0xfafafafa, 0xfafafafa}, /* case-5 */
4936        {0x6a5a5555, 0xaaaaaaaa},
4937        {0x6a5a56aa, 0x6a5a56aa},
4938        {0x6a5a5a5a, 0x6a5a5a5a},
4939        {0x66555555, 0x5a5a5a5a},
4940        {0x66555555, 0x6a5a5a5a}, /* case-10 */
4941        {0x66555555, 0x6a5a5aaa},
4942        {0x66555555, 0x5a5a5aaa},
4943        {0x66555555, 0x6aaa5aaa},
4944        {0x66555555, 0xaaaa5aaa},
4945        {0x66555555, 0xaaaaaaaa}, /* case-15 */
4946        {0xffff55ff, 0xfafafafa},
4947        {0xffff55ff, 0x6afa5afa},
4948        {0xaaffffaa, 0xfafafafa},
4949        {0xaa5555aa, 0x5a5a5a5a},
4950        {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
4951        {0xaa5555aa, 0xaaaaaaaa},
4952        {0xffffffff, 0x5a5a5a5a},
4953        {0xffffffff, 0x5a5a5a5a},
4954        {0xffffffff, 0x55555555},
4955        {0xffffffff, 0x5a5a5aaa}, /* case-25 */
4956        {0x55555555, 0x5a5a5a5a},
4957        {0x55555555, 0xaaaaaaaa},
4958        {0x55555555, 0x6a5a6a5a},
4959        {0x66556655, 0x66556655},
4960        {0x66556aaa, 0x6a5a6aaa}, /*case-30*/
4961        {0xffffffff, 0x5aaa5aaa},
4962        {0x56555555, 0x5a5a5aaa},
4963};
4964
4965/* Non-Shared-Antenna Coex Table */
4966static const struct coex_table_para table_nsant_8822c[] = {
4967        {0xffffffff, 0xffffffff}, /* case-100 */
4968        {0x55555555, 0x55555555},
4969        {0x66555555, 0x66555555},
4970        {0xaaaaaaaa, 0xaaaaaaaa},
4971        {0x5a5a5a5a, 0x5a5a5a5a},
4972        {0xfafafafa, 0xfafafafa}, /* case-105 */
4973        {0x5afa5afa, 0x5afa5afa},
4974        {0x55555555, 0xfafafafa},
4975        {0x66555555, 0xfafafafa},
4976        {0x66555555, 0x5a5a5a5a},
4977        {0x66555555, 0x6a5a5a5a}, /* case-110 */
4978        {0x66555555, 0xaaaaaaaa},
4979        {0xffff55ff, 0xfafafafa},
4980        {0xffff55ff, 0x5afa5afa},
4981        {0xffff55ff, 0xaaaaaaaa},
4982        {0xffff55ff, 0xffff55ff}, /* case-115 */
4983        {0xaaffffaa, 0x5afa5afa},
4984        {0xaaffffaa, 0xaaaaaaaa},
4985        {0xffffffff, 0xfafafafa},
4986        {0xffffffff, 0x5afa5afa},
4987        {0xffffffff, 0xaaaaaaaa}, /* case-120 */
4988        {0x55ff55ff, 0x5afa5afa},
4989        {0x55ff55ff, 0xaaaaaaaa},
4990        {0x55ff55ff, 0x55ff55ff}
4991};
4992
4993/* Shared-Antenna TDMA */
4994static const struct coex_tdma_para tdma_sant_8822c[] = {
4995        { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
4996        { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
4997        { {0x61, 0x3a, 0x03, 0x11, 0x11} },
4998        { {0x61, 0x30, 0x03, 0x11, 0x11} },
4999        { {0x61, 0x20, 0x03, 0x11, 0x11} },
5000        { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
5001        { {0x61, 0x45, 0x03, 0x11, 0x10} },
5002        { {0x61, 0x3a, 0x03, 0x11, 0x10} },
5003        { {0x61, 0x30, 0x03, 0x11, 0x10} },
5004        { {0x61, 0x20, 0x03, 0x11, 0x10} },
5005        { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
5006        { {0x61, 0x08, 0x03, 0x11, 0x14} },
5007        { {0x61, 0x08, 0x03, 0x10, 0x14} },
5008        { {0x51, 0x08, 0x03, 0x10, 0x54} },
5009        { {0x51, 0x08, 0x03, 0x10, 0x55} },
5010        { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
5011        { {0x51, 0x45, 0x03, 0x10, 0x50} },
5012        { {0x51, 0x3a, 0x03, 0x10, 0x50} },
5013        { {0x51, 0x30, 0x03, 0x10, 0x50} },
5014        { {0x51, 0x20, 0x03, 0x10, 0x50} },
5015        { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
5016        { {0x51, 0x4a, 0x03, 0x10, 0x50} },
5017        { {0x51, 0x0c, 0x03, 0x10, 0x54} },
5018        { {0x55, 0x08, 0x03, 0x10, 0x54} },
5019        { {0x65, 0x10, 0x03, 0x11, 0x10} },
5020        { {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
5021        { {0x51, 0x08, 0x03, 0x10, 0x50} },
5022        { {0x61, 0x08, 0x03, 0x11, 0x11} }
5023};
5024
5025/* Non-Shared-Antenna TDMA */
5026static const struct coex_tdma_para tdma_nsant_8822c[] = {
5027        { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-100 */
5028        { {0x61, 0x45, 0x03, 0x11, 0x11} },
5029        { {0x61, 0x3a, 0x03, 0x11, 0x11} },
5030        { {0x61, 0x30, 0x03, 0x11, 0x11} },
5031        { {0x61, 0x20, 0x03, 0x11, 0x11} },
5032        { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
5033        { {0x61, 0x45, 0x03, 0x11, 0x10} },
5034        { {0x61, 0x3a, 0x03, 0x11, 0x10} },
5035        { {0x61, 0x30, 0x03, 0x11, 0x10} },
5036        { {0x61, 0x20, 0x03, 0x11, 0x10} },
5037        { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
5038        { {0x61, 0x08, 0x03, 0x11, 0x14} },
5039        { {0x61, 0x08, 0x03, 0x10, 0x14} },
5040        { {0x51, 0x08, 0x03, 0x10, 0x54} },
5041        { {0x51, 0x08, 0x03, 0x10, 0x55} },
5042        { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
5043        { {0x51, 0x45, 0x03, 0x10, 0x50} },
5044        { {0x51, 0x3a, 0x03, 0x10, 0x50} },
5045        { {0x51, 0x30, 0x03, 0x10, 0x50} },
5046        { {0x51, 0x20, 0x03, 0x10, 0x50} },
5047        { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */
5048        { {0x51, 0x08, 0x03, 0x10, 0x50} }
5049};
5050
5051/* rssi in percentage % (dbm = % - 100) */
5052static const u8 wl_rssi_step_8822c[] = {60, 50, 44, 30};
5053static const u8 bt_rssi_step_8822c[] = {8, 15, 20, 25};
5054static const struct coex_5g_afh_map afh_5g_8822c[] = { {0, 0, 0} };
5055
5056/* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
5057static const struct coex_rf_para rf_para_tx_8822c[] = {
5058        {0, 0, false, 7},  /* for normal */
5059        {0, 16, false, 7}, /* for WL-CPT */
5060        {8, 17, true, 4},
5061        {7, 18, true, 4},
5062        {6, 19, true, 4},
5063        {5, 20, true, 4}
5064};
5065
5066static const struct coex_rf_para rf_para_rx_8822c[] = {
5067        {0, 0, false, 7},  /* for normal */
5068        {0, 16, false, 7}, /* for WL-CPT */
5069        {3, 24, true, 5},
5070        {2, 26, true, 5},
5071        {1, 27, true, 5},
5072        {0, 28, true, 5}
5073};
5074
5075static_assert(ARRAY_SIZE(rf_para_tx_8822c) == ARRAY_SIZE(rf_para_rx_8822c));
5076
5077static const u8
5078rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
5079        { 0,  1,  2,  3,  5,  6,  7,  8,  9, 10,
5080         11, 12, 13, 14, 15, 16, 18, 19, 20, 21,
5081         22, 23, 24, 25, 26, 27, 28, 29, 30, 32 },
5082        { 0,  1,  2,  3,  5,  6,  7,  8,  9, 10,
5083         11, 12, 13, 14, 15, 16, 18, 19, 20, 21,
5084         22, 23, 24, 25, 26, 27, 28, 29, 30, 32 },
5085        { 0,  1,  2,  3,  5,  6,  7,  8,  9, 10,
5086         11, 12, 13, 14, 15, 16, 18, 19, 20, 21,
5087         22, 23, 24, 25, 26, 27, 28, 29, 30, 32 },
5088};
5089
5090static const u8
5091rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
5092        { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5093         10, 10, 11, 12, 13, 14, 15, 16, 17, 18,
5094         19, 20, 21, 22, 22, 23, 24, 25, 26, 27 },
5095        { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5096         10, 10, 11, 12, 13, 14, 15, 16, 17, 18,
5097         19, 20, 21, 22, 22, 23, 24, 25, 26, 27 },
5098        { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5099         10, 10, 11, 12, 13, 14, 15, 16, 17, 18,
5100         19, 20, 21, 22, 22, 23, 24, 25, 26, 27 },
5101};
5102
5103static const u8
5104rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
5105        { 0,  1,  2,  4,  5,  6,  7,  8,  9, 10,
5106         11, 13, 14, 15, 16, 17, 18, 19, 20, 21,
5107         23, 24, 25, 26, 27, 28, 29, 30, 31, 33 },
5108        { 0,  1,  2,  4,  5,  6,  7,  8,  9, 10,
5109         11, 13, 14, 15, 16, 17, 18, 19, 20, 21,
5110         23, 24, 25, 26, 27, 28, 29, 30, 31, 33 },
5111        { 0,  1,  2,  4,  5,  6,  7,  8,  9, 10,
5112         11, 13, 14, 15, 16, 17, 18, 19, 20, 21,
5113         23, 24, 25, 26, 27, 28, 29, 30, 31, 33 },
5114};
5115
5116static const u8
5117rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
5118        { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5119         10, 11, 12, 13, 14, 15, 16, 17, 18, 20,
5120         21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
5121        { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5122         10, 11, 12, 13, 14, 15, 16, 17, 18, 20,
5123         21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
5124        { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5125         10, 11, 12, 13, 14, 15, 16, 17, 18, 20,
5126         21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
5127};
5128
5129static const u8 rtw8822c_pwrtrk_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
5130         0,  1,  2,  3,  4,  4,  5,  6,  7,  8,
5131         9,  9, 10, 11, 12, 13, 14, 15, 15, 16,
5132        17, 18, 19, 20, 20, 21, 22, 23, 24, 25
5133};
5134
5135static const u8 rtw8822c_pwrtrk_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
5136         0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5137        10, 11, 12, 13, 14, 14, 15, 16, 17, 18,
5138        19, 20, 21, 22, 23, 24, 25, 26, 27, 28
5139};
5140
5141static const u8 rtw8822c_pwrtrk_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
5142         0,  1,  2,  2,  3,  4,  4,  5,  6,  6,
5143         7,  8,  8,  9,  9, 10, 11, 11, 12, 13,
5144        13, 14, 15, 15, 16, 17, 17, 18, 19, 19
5145};
5146
5147static const u8 rtw8822c_pwrtrk_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
5148         0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5149        10, 11, 11, 12, 13, 14, 15, 16, 17, 18,
5150        19, 20, 21, 22, 23, 24, 25, 25, 26, 27
5151};
5152
5153static const u8 rtw8822c_pwrtrk_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
5154         0,  1,  2,  3,  4,  5,  5,  6,  7,  8,
5155         9, 10, 11, 11, 12, 13, 14, 15, 16, 17,
5156        17, 18, 19, 20, 21, 22, 23, 23, 24, 25
5157};
5158
5159static const u8 rtw8822c_pwrtrk_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
5160         0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5161        10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
5162        20, 21, 22, 23, 24, 25, 26, 27, 28, 29
5163};
5164
5165static const u8 rtw8822c_pwrtrk_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
5166         0,  1,  2,  3,  3,  4,  5,  6,  6,  7,
5167         8,  9,  9, 10, 11, 12, 12, 13, 14, 15,
5168        15, 16, 17, 18, 18, 19, 20, 21, 21, 22
5169};
5170
5171static const u8 rtw8822c_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
5172         0,  1,  2,  3,  4,  5,  5,  6,  7,  8,
5173         9, 10, 11, 11, 12, 13, 14, 15, 16, 17,
5174        18, 18, 19, 20, 21, 22, 23, 24, 24, 25
5175};
5176
5177static const struct rtw_pwr_track_tbl rtw8822c_rtw_pwr_track_tbl = {
5178        .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
5179        .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
5180        .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
5181        .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_1],
5182        .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_2],
5183        .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_3],
5184        .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_1],
5185        .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_2],
5186        .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_3],
5187        .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_1],
5188        .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_2],
5189        .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_3],
5190        .pwrtrk_2gb_n = rtw8822c_pwrtrk_2gb_n,
5191        .pwrtrk_2gb_p = rtw8822c_pwrtrk_2gb_p,
5192        .pwrtrk_2ga_n = rtw8822c_pwrtrk_2ga_n,
5193        .pwrtrk_2ga_p = rtw8822c_pwrtrk_2ga_p,
5194        .pwrtrk_2g_cckb_n = rtw8822c_pwrtrk_2g_cck_b_n,
5195        .pwrtrk_2g_cckb_p = rtw8822c_pwrtrk_2g_cck_b_p,
5196        .pwrtrk_2g_ccka_n = rtw8822c_pwrtrk_2g_cck_a_n,
5197        .pwrtrk_2g_ccka_p = rtw8822c_pwrtrk_2g_cck_a_p,
5198};
5199
5200#ifdef CONFIG_PM
5201static const struct wiphy_wowlan_support rtw_wowlan_stub_8822c = {
5202        .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_GTK_REKEY_FAILURE |
5203                 WIPHY_WOWLAN_DISCONNECT | WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
5204                 WIPHY_WOWLAN_NET_DETECT,
5205        .n_patterns = RTW_MAX_PATTERN_NUM,
5206        .pattern_max_len = RTW_MAX_PATTERN_SIZE,
5207        .pattern_min_len = 1,
5208        .max_nd_match_sets = 4,
5209};
5210#endif
5211
5212static const struct rtw_reg_domain coex_info_hw_regs_8822c[] = {
5213        {0x1860, BIT(3), RTW_REG_DOMAIN_MAC8},
5214        {0x4160, BIT(3), RTW_REG_DOMAIN_MAC8},
5215        {0x1c32, BIT(6), RTW_REG_DOMAIN_MAC8},
5216        {0x1c38, BIT(28), RTW_REG_DOMAIN_MAC32},
5217        {0, 0, RTW_REG_DOMAIN_NL},
5218        {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
5219        {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
5220        {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
5221        {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
5222        {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
5223        {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
5224        {0, 0, RTW_REG_DOMAIN_NL},
5225        {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
5226        {0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
5227        {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
5228        {0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
5229        {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B},
5230        {0, 0, RTW_REG_DOMAIN_NL},
5231        {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
5232        {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
5233        {0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
5234        {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
5235};
5236
5237struct rtw_chip_info rtw8822c_hw_spec = {
5238        .ops = &rtw8822c_ops,
5239        .id = RTW_CHIP_TYPE_8822C,
5240        .fw_name = "rtw88/rtw8822c_fw.bin",
5241        .wlan_cpu = RTW_WCPU_11AC,
5242        .tx_pkt_desc_sz = 48,
5243        .tx_buf_desc_sz = 16,
5244        .rx_pkt_desc_sz = 24,
5245        .rx_buf_desc_sz = 8,
5246        .phy_efuse_size = 512,
5247        .log_efuse_size = 768,
5248        .ptct_efuse_size = 124,
5249        .txff_size = 262144,
5250        .rxff_size = 24576,
5251        .fw_rxff_size = 12288,
5252        .txgi_factor = 2,
5253        .is_pwr_by_rate_dec = false,
5254        .max_power_index = 0x7f,
5255        .csi_buf_pg_num = 50,
5256        .band = RTW_BAND_2G | RTW_BAND_5G,
5257        .page_size = 128,
5258        .dig_min = 0x20,
5259        .default_1ss_tx_path = BB_PATH_A,
5260        .path_div_supported = true,
5261        .ht_supported = true,
5262        .vht_supported = true,
5263        .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK) | BIT(LPS_DEEP_MODE_PG),
5264        .sys_func_en = 0xD8,
5265        .pwr_on_seq = card_enable_flow_8822c,
5266        .pwr_off_seq = card_disable_flow_8822c,
5267        .page_table = page_table_8822c,
5268        .rqpn_table = rqpn_table_8822c,
5269        .prioq_addrs = &prioq_addrs_8822c,
5270        .intf_table = &phy_para_table_8822c,
5271        .dig = rtw8822c_dig,
5272        .dig_cck = NULL,
5273        .rf_base_addr = {0x3c00, 0x4c00},
5274        .rf_sipi_addr = {0x1808, 0x4108},
5275        .ltecoex_addr = &rtw8822c_ltecoex_addr,
5276        .mac_tbl = &rtw8822c_mac_tbl,
5277        .agc_tbl = &rtw8822c_agc_tbl,
5278        .bb_tbl = &rtw8822c_bb_tbl,
5279        .rfk_init_tbl = &rtw8822c_array_mp_cal_init_tbl,
5280        .rf_tbl = {&rtw8822c_rf_b_tbl, &rtw8822c_rf_a_tbl},
5281        .rfe_defs = rtw8822c_rfe_defs,
5282        .rfe_defs_size = ARRAY_SIZE(rtw8822c_rfe_defs),
5283        .en_dis_dpd = true,
5284        .dpd_ratemask = DIS_DPD_RATEALL,
5285        .pwr_track_tbl = &rtw8822c_rtw_pwr_track_tbl,
5286        .iqk_threshold = 8,
5287        .lck_threshold = 8,
5288        .bfer_su_max_num = 2,
5289        .bfer_mu_max_num = 1,
5290        .rx_ldpc = true,
5291        .tx_stbc = true,
5292
5293#ifdef CONFIG_PM
5294        .wow_fw_name = "rtw88/rtw8822c_wow_fw.bin",
5295        .wowlan_stub = &rtw_wowlan_stub_8822c,
5296        .max_sched_scan_ssids = 4,
5297#endif
5298        .coex_para_ver = 0x2103181c,
5299        .bt_desired_ver = 0x1c,
5300        .scbd_support = true,
5301        .new_scbd10_def = true,
5302        .ble_hid_profile_support = true,
5303        .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
5304        .bt_rssi_type = COEX_BTRSSI_DBM,
5305        .ant_isolation = 15,
5306        .rssi_tolerance = 2,
5307        .wl_rssi_step = wl_rssi_step_8822c,
5308        .bt_rssi_step = bt_rssi_step_8822c,
5309        .table_sant_num = ARRAY_SIZE(table_sant_8822c),
5310        .table_sant = table_sant_8822c,
5311        .table_nsant_num = ARRAY_SIZE(table_nsant_8822c),
5312        .table_nsant = table_nsant_8822c,
5313        .tdma_sant_num = ARRAY_SIZE(tdma_sant_8822c),
5314        .tdma_sant = tdma_sant_8822c,
5315        .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8822c),
5316        .tdma_nsant = tdma_nsant_8822c,
5317        .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8822c),
5318        .wl_rf_para_tx = rf_para_tx_8822c,
5319        .wl_rf_para_rx = rf_para_rx_8822c,
5320        .bt_afh_span_bw20 = 0x24,
5321        .bt_afh_span_bw40 = 0x36,
5322        .afh_5g_num = ARRAY_SIZE(afh_5g_8822c),
5323        .afh_5g = afh_5g_8822c,
5324
5325        .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822c),
5326        .coex_info_hw_regs = coex_info_hw_regs_8822c,
5327
5328        .fw_fifo_addr = {0x780, 0x700, 0x780, 0x660, 0x650, 0x680},
5329        .fwcd_segs = &rtw8822c_fwcd_segs,
5330};
5331EXPORT_SYMBOL(rtw8822c_hw_spec);
5332
5333MODULE_FIRMWARE("rtw88/rtw8822c_fw.bin");
5334MODULE_FIRMWARE("rtw88/rtw8822c_wow_fw.bin");
5335
5336MODULE_AUTHOR("Realtek Corporation");
5337MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822c driver");
5338MODULE_LICENSE("Dual BSD/GPL");
5339