Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c
1308 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/1415#include "mp_precomp.h"16#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)17#if RT_PLATFORM == PLATFORM_MACOSX18#include "phydm_precomp.h"19#else20#include "../phydm_precomp.h"21#endif22#else23#include "../../phydm_precomp.h"24#endif2526#if (RTL8814A_SUPPORT == 1)2728/*---------------------------Define Local Constant---------------------------*/2930/*---------------------------Define Local Constant---------------------------*/3132#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)33void do_iqk_8814a(void *dm_void, u8 delta_thermal_index, u8 thermal_value,34u8 threshold)35{36struct dm_struct *dm = (struct dm_struct *)dm_void;3738odm_reset_iqk_result(dm);39dm->rf_calibrate_info.thermal_value_iqk = thermal_value;40halrf_iqk_trigger(dm, false);41}42#else43/*Originally config->do_iqk is hooked phy_iq_calibrate_8814a, but do_iqk_8814a and phy_iq_calibrate_8814a have different arguments*/44void do_iqk_8814a(void *dm_void, u8 delta_thermal_index, u8 thermal_value,45u8 threshold)46{47struct dm_struct *dm = (struct dm_struct *)dm_void;48boolean is_recovery = (boolean)delta_thermal_index;4950halrf_iqk_trigger(dm, is_recovery);51}52#endif53/* 1 7. IQK */5455void _iqk_iqk_fail_report_8814a(struct dm_struct *dm)56{57struct dm_iqk_info *iqk_info = &dm->IQK_info;58u8 i, j;5960for (i = 0; i < 2; i++) {61for (j = 0; j < 4; j++) {62if (iqk_info->iqk_fail[i][j])63#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)64RF_DBG(dm, DBG_RF_IQK,65"[IQK]please check S%d %s\n", j,66(i == 0) ? "TXIQK" : "RXIQK");67#else68panic_printk("[IQK]please check S%d %s\n", j, (i == 0) ? "TXIQK" : "RXIQK");69#endif70}71}72}7374void _iqk_backup_mac_bb_8814a(struct dm_struct *dm, u32 *MAC_backup,75u32 *BB_backup, u32 *backup_mac_reg,76u32 *backup_bb_reg)77{78u32 i;79/* save MACBB default value */80for (i = 0; i < MAC_REG_NUM_8814; i++)81MAC_backup[i] = odm_read_4byte(dm, backup_mac_reg[i]);82for (i = 0; i < BB_REG_NUM_8814; i++)83BB_backup[i] = odm_read_4byte(dm, backup_bb_reg[i]);8485RF_DBG(dm, DBG_RF_IQK, "BackupMacBB Success!!!!\n");86}8788void _iqk_backup_rf_8814a(struct dm_struct *dm, u32 RF_backup[][4],89u32 *backup_rf_reg)90{91u32 i;92/* Save RF Parameters */93for (i = 0; i < RF_REG_NUM_8814; i++) {94RF_backup[i][RF_PATH_A] = odm_get_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], RFREGOFFSETMASK);95RF_backup[i][RF_PATH_B] = odm_get_rf_reg(dm, RF_PATH_B, backup_rf_reg[i], RFREGOFFSETMASK);96RF_backup[i][RF_PATH_C] = odm_get_rf_reg(dm, RF_PATH_C, backup_rf_reg[i], RFREGOFFSETMASK);97RF_backup[i][RF_PATH_D] = odm_get_rf_reg(dm, RF_PATH_D, backup_rf_reg[i], RFREGOFFSETMASK);98}99100RF_DBG(dm, DBG_RF_IQK, "BackupRF Success!!!!\n");101}102103void _iqk_afe_setting_8814a(struct dm_struct *dm, boolean do_iqk)104{105if (do_iqk) {106/* IQK AFE setting RX_WAIT_CCA mode */107odm_write_4byte(dm, 0xc60, 0x0e808003);108odm_write_4byte(dm, 0xe60, 0x0e808003);109odm_write_4byte(dm, 0x1860, 0x0e808003);110odm_write_4byte(dm, 0x1a60, 0x0e808003);111odm_set_bb_reg(dm, R_0x90c, BIT(13), 0x1);112113odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x3);114odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x0);115116odm_set_bb_reg(dm, R_0x804, BIT(2), 0x1);117odm_set_bb_reg(dm, R_0x804, BIT(2), 0x0);118119RF_DBG(dm, DBG_RF_IQK, "AFE IQK mode Success!!!!\n");120} else {121odm_write_4byte(dm, 0xc60, 0x07808003);122odm_write_4byte(dm, 0xe60, 0x07808003);123odm_write_4byte(dm, 0x1860, 0x07808003);124odm_write_4byte(dm, 0x1a60, 0x07808003);125odm_set_bb_reg(dm, R_0x90c, BIT(13), 0x1);126127odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x3);128odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x0);129130odm_set_bb_reg(dm, R_0x804, BIT(2), 0x1);131odm_set_bb_reg(dm, R_0x804, BIT(2), 0x0);132133RF_DBG(dm, DBG_RF_IQK, "AFE Normal mode Success!!!!\n");134}135}136137void _iqk_restore_mac_bb_8814a(struct dm_struct *dm, u32 *MAC_backup,138u32 *BB_backup, u32 *backup_mac_reg,139u32 *backup_bb_reg)140{141u32 i;142/* Reload MacBB Parameters */143for (i = 0; i < MAC_REG_NUM_8814; i++)144odm_write_4byte(dm, backup_mac_reg[i], MAC_backup[i]);145for (i = 0; i < BB_REG_NUM_8814; i++)146odm_write_4byte(dm, backup_bb_reg[i], BB_backup[i]);147RF_DBG(dm, DBG_RF_IQK, "RestoreMacBB Success!!!!\n");148}149150void _iqk_restore_rf_8814a(struct dm_struct *dm, u32 *backup_rf_reg,151u32 RF_backup[][4])152{153u32 i;154155odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x0);156odm_set_rf_reg(dm, RF_PATH_B, RF_0xef, RFREGOFFSETMASK, 0x0);157odm_set_rf_reg(dm, RF_PATH_C, RF_0xef, RFREGOFFSETMASK, 0x0);158odm_set_rf_reg(dm, RF_PATH_D, RF_0xef, RFREGOFFSETMASK, 0x0);159160odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0x88001);161odm_set_rf_reg(dm, RF_PATH_B, RF_0x8f, RFREGOFFSETMASK, 0x88001);162odm_set_rf_reg(dm, RF_PATH_C, RF_0x8f, RFREGOFFSETMASK, 0x88001);163odm_set_rf_reg(dm, RF_PATH_D, RF_0x8f, RFREGOFFSETMASK, 0x88001);164165for (i = 0; i < RF_REG_NUM_8814; i++) {166odm_set_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_A]);167odm_set_rf_reg(dm, RF_PATH_B, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_B]);168odm_set_rf_reg(dm, RF_PATH_C, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_C]);169odm_set_rf_reg(dm, RF_PATH_D, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_D]);170}171172RF_DBG(dm, DBG_RF_IQK, "RestoreRF Success!!!!\n");173}174175void phy_reset_iqk_result_8814a(struct dm_struct *dm)176{177odm_write_4byte(dm, 0x1b00, 0xf8000000);178odm_write_4byte(dm, 0x1b38, 0x20000000);179odm_write_4byte(dm, 0x1b00, 0xf8000002);180odm_write_4byte(dm, 0x1b38, 0x20000000);181odm_write_4byte(dm, 0x1b00, 0xf8000004);182odm_write_4byte(dm, 0x1b38, 0x20000000);183odm_write_4byte(dm, 0x1b00, 0xf8000006);184odm_write_4byte(dm, 0x1b38, 0x20000000);185odm_write_4byte(dm, 0xc10, 0x100);186odm_write_4byte(dm, 0xe10, 0x100);187odm_write_4byte(dm, 0x1810, 0x100);188odm_write_4byte(dm, 0x1a10, 0x100);189}190191void _iqk_reset_nctl_8814a(struct dm_struct *dm)192{193odm_write_4byte(dm, 0x1b00, 0xf8000000);194odm_write_4byte(dm, 0x1b80, 0x00000006);195odm_write_4byte(dm, 0x1b00, 0xf8000000);196odm_write_4byte(dm, 0x1b80, 0x00000002);197RF_DBG(dm, DBG_RF_IQK, "ResetNCTL Success!!!!\n");198}199200void _iqk_configure_mac_8814a(struct dm_struct *dm)201{202/* ========MAC register setting======== */203odm_write_1byte(dm, 0x522, 0x3f);204odm_set_bb_reg(dm, R_0x550, BIT(11) | BIT(3), 0x0);205odm_write_1byte(dm, 0x808, 0x00); /* RX ante off */206odm_set_bb_reg(dm, R_0x838, 0xf, 0xe); /* CCA off */207odm_set_bb_reg(dm, R_0xa14, BIT(9) | BIT(8), 0x3); /* CCK RX path off */208odm_write_4byte(dm, 0xcb0, 0x77777777);209odm_write_4byte(dm, 0xeb0, 0x77777777);210odm_write_4byte(dm, 0x18b4, 0x77777777);211odm_write_4byte(dm, 0x1ab4, 0x77777777);212odm_set_bb_reg(dm, R_0x1abc, 0x0ff00000, 0x77);213odm_set_bb_reg(dm, R_0x910, BIT(23) | BIT(22), 0x0);214/*by YN*/215odm_set_bb_reg(dm, R_0xcbc, 0xf, 0x0);216}217218void _lok_one_shot(void *dm_void)219{220struct dm_struct *dm = (struct dm_struct *)dm_void;221struct dm_iqk_info *iqk_info = &dm->IQK_info;222u8 path = 0, delay_count = 0, ii;223boolean LOK_notready = false;224u32 LOK_temp1 = 0, LOK_temp2 = 0;225226RF_DBG(dm, DBG_RF_IQK, "============ LOK ============\n");227for (path = 0; path <= 3; path++) {228RF_DBG(dm, DBG_RF_IQK, "==========S%d LOK ==========\n", path);229230odm_set_bb_reg(dm, R_0x9a4, BIT(21) | BIT(20), path); /* ADC Clock source */231odm_write_4byte(dm, 0x1b00, (0xf8000001 | (1 << (4 + path)))); /* LOK: CMD ID = 0 {0xf8000011, 0xf8000021, 0xf8000041, 0xf8000081} */232ODM_delay_ms(LOK_delay);233delay_count = 0;234LOK_notready = true;235236while (LOK_notready) {237LOK_notready = (boolean)odm_get_bb_reg(dm, R_0x1b00, BIT(0));238ODM_delay_ms(1);239delay_count++;240if (delay_count >= 10) {241RF_DBG(dm, DBG_RF_IQK, "S%d LOK timeout!!!\n",242path);243244_iqk_reset_nctl_8814a(dm);245break;246}247}248RF_DBG(dm, DBG_RF_IQK, "S%d ==> delay_count = 0x%x\n", path,249delay_count);250251if (!LOK_notready) {252odm_write_4byte(dm, 0x1b00, 0xf8000000 | (path << 1));253odm_write_4byte(dm, 0x1bd4, 0x003f0001);254LOK_temp2 = (odm_get_bb_reg(dm, R_0x1bfc, 0x003e0000) + 0x10) & 0x1f;255LOK_temp1 = (odm_get_bb_reg(dm, R_0x1bfc, 0x0000003e) + 0x10) & 0x1f;256257for (ii = 1; ii < 5; ii++) {258LOK_temp1 = LOK_temp1 + ((LOK_temp1 & BIT(4 - ii)) << (ii * 2));259LOK_temp2 = LOK_temp2 + ((LOK_temp2 & BIT(4 - ii)) << (ii * 2));260}261RF_DBG(dm, DBG_RF_IQK,262"LOK_temp1 = 0x%x, LOK_temp2 = 0x%x\n",263LOK_temp1 >> 4, LOK_temp2 >> 4);264265odm_set_rf_reg(dm, (enum rf_path)path, RF_0x8, 0x07c00, LOK_temp1 >> 4);266odm_set_rf_reg(dm, (enum rf_path)path, RF_0x8, 0xf8000, LOK_temp2 >> 4);267268RF_DBG(dm, DBG_RF_IQK, "==>S%d fill LOK\n", path);269270} else {271RF_DBG(dm, DBG_RF_IQK, "==>S%d LOK Fail!!!\n", path);272odm_set_rf_reg(dm, (enum rf_path)path, RF_0x8, RFREGOFFSETMASK, 0x08400);273}274iqk_info->lok_fail[path] = LOK_notready;275}276RF_DBG(dm, DBG_RF_IQK,277"LOK0_notready = %d, LOK1_notready = %d, LOK2_notready = %d, LOK3_notready = %d\n",278iqk_info->lok_fail[0], iqk_info->lok_fail[1],279iqk_info->lok_fail[2], iqk_info->lok_fail[3]);280}281282void _iqk_one_shot(void *dm_void)283{284struct dm_struct *dm = (struct dm_struct *)dm_void;285struct dm_iqk_info *iqk_info = &dm->IQK_info;286u8 path = 0, delay_count = 0, cal_retry = 0, idx;287boolean notready = true, fail = true;288u32 IQK_CMD = 0x0;289u16 iqk_apply[4] = {0xc94, 0xe94, 0x1894, 0x1a94};290291for (idx = 0; idx <= 1; idx++) { /* ii = 0:TXK, 1: RXK */292293if (idx == TX_IQK) {294RF_DBG(dm, DBG_RF_IQK,295"============ WBTXIQK ============\n");296} else if (idx == RX_IQK) {297RF_DBG(dm, DBG_RF_IQK,298"============ WBRXIQK ============\n");299}300301for (path = 0; path <= 3; path++) {302RF_DBG(dm, DBG_RF_IQK, "==========S%d IQK ==========\n",303path);304cal_retry = 0;305fail = true;306while (fail) {307odm_set_bb_reg(dm, R_0x9a4, BIT(21) | BIT(20), path);308if (idx == TX_IQK) {309IQK_CMD = (0xf8000001 | (*dm->band_width + 3) << 8 | (1 << (4 + path)));310311RF_DBG(dm, DBG_RF_IQK, "TXK_Trigger = 0x%x\n", IQK_CMD);312/*{0xf8000311, 0xf8000321, 0xf8000341, 0xf8000381} ==> 20 WBTXK (CMD = 3)*/313/*{0xf8000411, 0xf8000421, 0xf8000441, 0xf8000481} ==> 40 WBTXK (CMD = 4)*/314/*{0xf8000511, 0xf8000521, 0xf8000541, 0xf8000581} ==> 80 WBTXK (CMD = 5)*/315} else if (idx == RX_IQK) {316if (*dm->band_type == ODM_BAND_2_4G) {317odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, BIT(11), 0x1);318odm_set_rf_reg(dm, (enum rf_path)path, RF_0x56, 0xfffff, 0x51ce1);319switch (path) {320case 0:321case 1:322odm_write_4byte(dm, 0xeb0, 0x54775477);323break;324case 2:325odm_write_4byte(dm, 0x18b4, 0x54775477);326break;327case 3:328odm_write_4byte(dm, 0x1abc, 0x75400000);329odm_write_4byte(dm, 0x1ab4, 0x77777777);330break;331}332}333IQK_CMD = (0xf8000001 | (9 - *dm->band_width) << 8 | (1 << (4 + path)));334RF_DBG(dm, DBG_RF_IQK, "TXK_Trigger = 0x%x\n", IQK_CMD);335/*{0xf8000911, 0xf8000921, 0xf8000941, 0xf8000981} ==> 20 WBRXK (CMD = 9)*/336/*{0xf8000811, 0xf8000821, 0xf8000841, 0xf8000881} ==> 40 WBRXK (CMD = 8)*/337/*{0xf8000711, 0xf8000721, 0xf8000741, 0xf8000781} ==> 80 WBRXK (CMD = 7)*/338}339340odm_write_4byte(dm, 0x1b00, IQK_CMD);341ODM_delay_ms(WBIQK_delay);342343delay_count = 0;344notready = true;345while (notready) {346notready = (boolean)odm_get_bb_reg(dm, R_0x1b00, BIT(0));347if (!notready) {348fail = (boolean)odm_get_bb_reg(dm, R_0x1b08, BIT(26));349break;350}351ODM_delay_ms(1);352delay_count++;353if (delay_count >= 20) {354RF_DBG(dm, DBG_RF_IQK, "S%d IQK timeout!!!\n", path);355_iqk_reset_nctl_8814a(dm);356break;357}358}359if (fail)360cal_retry++;361if (cal_retry > 3)362break;363}364RF_DBG(dm, DBG_RF_IQK, "S%d ==> 0x1b00 = 0x%x\n", path,365odm_read_4byte(dm, 0x1b00));366RF_DBG(dm, DBG_RF_IQK, "S%d ==> 0x1b08 = 0x%x\n", path,367odm_read_4byte(dm, 0x1b08));368RF_DBG(dm, DBG_RF_IQK,369"S%d ==> delay_count = 0x%x, cal_retry = %x\n",370path, delay_count, cal_retry);371372odm_write_4byte(dm, 0x1b00, 0xf8000000 | (path << 1));373if (!fail) {374if (idx == TX_IQK)375iqk_info->iqc_matrix[idx][path] = odm_read_4byte(dm, 0x1b38);376else if (idx == RX_IQK) {377odm_write_4byte(dm, 0x1b3c, 0x20000000);378iqk_info->iqc_matrix[idx][path] = odm_read_4byte(dm, 0x1b3c);379}380RF_DBG(dm, DBG_RF_IQK, "S%d_IQC = 0x%x\n", path,381iqk_info->iqc_matrix[idx][path]);382}383384if (idx == RX_IQK) {385if (iqk_info->iqk_fail[TX_IQK][path] == false) /* TXIQK success in RXIQK */386odm_write_4byte(dm, 0x1b38, iqk_info->iqc_matrix[TX_IQK][path]);387else388odm_set_bb_reg(dm, iqk_apply[path], BIT(0), 0x0);389390if (fail)391odm_set_bb_reg(dm, iqk_apply[path], (BIT(11) | BIT(10)), 0x0);392393if (*dm->band_type == ODM_BAND_2_4G)394odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, BIT(11), 0x0);395}396397iqk_info->iqk_fail[idx][path] = fail;398}399RF_DBG(dm, DBG_RF_IQK,400"IQK0_fail = %d, IQK1_fail = %d, IQK2_fail = %d, IQK3_fail = %d\n",401iqk_info->iqk_fail[idx][0], iqk_info->iqk_fail[idx][1],402iqk_info->iqk_fail[idx][2], iqk_info->iqk_fail[idx][3]);403}404}405406void _iqk_tx_8814a(struct dm_struct *dm, u8 chnl_idx)407{408RF_DBG(dm, DBG_RF_IQK, "band_width = %d, ExtPA2G = %d\n",409*dm->band_width, dm->ext_pa);410RF_DBG(dm, DBG_RF_IQK, "Interface = %d, band_type = %d\n",411dm->support_interface, *dm->band_type);412RF_DBG(dm, DBG_RF_IQK, "cut_version = %x\n", dm->cut_version);413414odm_set_rf_reg(dm, RF_PATH_A, RF_0x58, BIT(19), 0x1);415odm_set_rf_reg(dm, RF_PATH_B, RF_0x58, BIT(19), 0x1);416odm_set_rf_reg(dm, RF_PATH_C, RF_0x58, BIT(19), 0x1);417odm_set_rf_reg(dm, RF_PATH_D, RF_0x58, BIT(19), 0x1);418419odm_set_bb_reg(dm, R_0xc94, (BIT(11) | BIT(10) | BIT(0)), 0x401);420odm_set_bb_reg(dm, R_0xe94, (BIT(11) | BIT(10) | BIT(0)), 0x401);421odm_set_bb_reg(dm, R_0x1894, (BIT(11) | BIT(10) | BIT(0)), 0x401);422odm_set_bb_reg(dm, R_0x1a94, (BIT(11) | BIT(10) | BIT(0)), 0x401);423424if (*dm->band_type == ODM_BAND_5G)425odm_write_4byte(dm, 0x1b00, 0xf8000ff1);426else427odm_write_4byte(dm, 0x1b00, 0xf8000ef1);428429ODM_delay_ms(1);430431odm_write_4byte(dm, 0x810, 0x20101063);432odm_write_4byte(dm, 0x90c, 0x0B00C000);433434_lok_one_shot(dm);435_iqk_one_shot(dm);436}437438void phy_iq_calibrate_8814a_init(void *dm_void)439{440struct dm_struct *dm = (struct dm_struct *)dm_void;441struct dm_iqk_info *iqk_info = &dm->IQK_info;442u8 ii, jj;443static boolean firstrun = true;444if (firstrun) {445firstrun = false;446RF_DBG(dm, DBG_RF_IQK, "=====>%s\n", __func__);447for (jj = 0; jj < 2; jj++) {448for (ii = 0; ii < NUM; ii++) {449iqk_info->lok_fail[ii] = true;450iqk_info->iqk_fail[jj][ii] = true;451iqk_info->iqc_matrix[jj][ii] = 0x20000000;452}453}454}455}456457void _phy_iq_calibrate_8814a(struct dm_struct *dm, u8 channel)458{459struct dm_iqk_info *iqk_info = &dm->IQK_info;460u32 MAC_backup[MAC_REG_NUM_8814], BB_backup[BB_REG_NUM_8814], RF_backup[RF_REG_NUM_8814][4];461u32 backup_mac_reg[MAC_REG_NUM_8814] = {0x520, 0x550};462u32 backup_bb_reg[BB_REG_NUM_8814] = {0xa14, 0x808, 0x838, 0x90c, 0x810, 0xcb0, 0xeb0,4630x18b4, 0x1ab4, 0x1abc, 0x9a4, 0x764, 0xcbc, 0x910};464u32 backup_rf_reg[RF_REG_NUM_8814] = {0x0};465u8 chnl_idx = odm_get_right_chnl_place_for_iqk(channel);466467iqk_info->iqk_times++;468469_iqk_backup_mac_bb_8814a(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg);470_iqk_afe_setting_8814a(dm, true);471_iqk_backup_rf_8814a(dm, RF_backup, backup_rf_reg);472_iqk_configure_mac_8814a(dm);473_iqk_tx_8814a(dm, chnl_idx);474_iqk_reset_nctl_8814a(dm); /* for 3-wire to BB use */475_iqk_afe_setting_8814a(dm, false);476_iqk_restore_mac_bb_8814a(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg);477_iqk_restore_rf_8814a(dm, backup_rf_reg, RF_backup);478}479480/*IQK version:0xf*/481/*do not bypass path A IQK result*/482void phy_iq_calibrate_8814a(void *dm_void, boolean is_recovery)483{484struct dm_struct *dm = (struct dm_struct *)dm_void;485struct _hal_rf_ *rf = &(dm->rf_table);486487phy_iq_calibrate_8814a_init(dm);488_phy_iq_calibrate_8814a(dm, *dm->channel);489#if (DM_ODM_SUPPORT_TYPE & ODM_AP)490_iqk_iqk_fail_report_8814a(dm);491#endif492}493494#endif495496497