1250003Sadrian/* 2250003Sadrian * Copyright (c) 2013 Qualcomm Atheros, Inc. 3250003Sadrian * 4250003Sadrian * Permission to use, copy, modify, and/or distribute this software for any 5250003Sadrian * purpose with or without fee is hereby granted, provided that the above 6250003Sadrian * copyright notice and this permission notice appear in all copies. 7250003Sadrian * 8250003Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9250003Sadrian * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10250003Sadrian * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11250003Sadrian * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12250003Sadrian * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13250003Sadrian * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14250003Sadrian * PERFORMANCE OF THIS SOFTWARE. 15250003Sadrian */ 16250003Sadrian 17250003Sadrian 18250003Sadrian#include "opt_ah.h" 19250003Sadrian 20250003Sadrian#ifdef AH_SUPPORT_AR9300 21250003Sadrian 22250003Sadrian#include "ah.h" 23250003Sadrian#include "ah_internal.h" 24250003Sadrian 25250003Sadrian#include "ar9300/ar9300.h" 26250003Sadrian#include "ar9300/ar9300reg.h" 27250003Sadrian#include "ar9300/ar9300phy.h" 28250003Sadrian 29250003Sadrian#if ATH_SUPPORT_AIC 30250003Sadrian 31250003Sadrian#define ATH_AIC_TEST_PATTERN 1 32250003Sadrian 33250003Sadrianstruct ath_aic_sram_info { 34250003Sadrian HAL_BOOL valid; 35250003Sadrian u_int8_t rot_quad_att_db; 36250003Sadrian HAL_BOOL vga_quad_sign; 37250003Sadrian u_int8_t rot_dir_att_db; 38250003Sadrian HAL_BOOL vga_dir_sign; 39250003Sadrian u_int8_t com_att_6db; 40250003Sadrian }; 41250003Sadrian 42250003Sadrianstruct ath_aic_out_info { 43250003Sadrian int16_t dir_path_gain_lin; 44250003Sadrian int16_t quad_path_gain_lin; 45250003Sadrian struct ath_aic_sram_info sram; 46250003Sadrian }; 47250003Sadrian 48250003Sadrian#define ATH_AIC_MAX_COM_ATT_DB_TABLE 6 49250003Sadrian#define ATH_AIC_MAX_AIC_LIN_TABLE 69 50250003Sadrian#define ATH_AIC_MIN_ROT_DIR_ATT_DB 0 51250003Sadrian#define ATH_AIC_MIN_ROT_QUAD_ATT_DB 0 52250003Sadrian#define ATH_AIC_MAX_ROT_DIR_ATT_DB 37 53250003Sadrian#define ATH_AIC_MAX_ROT_QUAD_ATT_DB 37 54250003Sadrian#define ATH_AIC_SRAM_AUTO_INCREMENT 0x80000000 55250003Sadrian#define ATH_AIC_SRAM_GAIN_TABLE_OFFSET 0x280 56250003Sadrian#define ATH_AIC_SRAM_CAL_OFFSET 0x140 57250003Sadrian#define ATH_AIC_MAX_CAL_COUNT 5 58250003Sadrian#define ATH_AIC_MEAS_MAG_THRESH 20 59250003Sadrian#define ATH_AIC_BT_JUPITER_CTRL 0x66820 60250003Sadrian#define ATH_AIC_BT_AIC_ENABLE 0x02 61250003Sadrian 62250003Sadrian 63250003Sadrianstatic const u_int8_t com_att_db_table[ATH_AIC_MAX_COM_ATT_DB_TABLE] = { 64250003Sadrian 0, 3, 9, 15, 21, 27}; 65250003Sadrian 66250003Sadrianstatic const u_int16_t aic_lin_table[ATH_AIC_MAX_AIC_LIN_TABLE] = { 67250003Sadrian 8191, 7300, 6506, 5799, 5168, 4606, 4105, 3659, 68250003Sadrian 3261, 2906, 2590, 2309, 2057, 1834, 1634, 1457, 69250003Sadrian 1298, 1157, 1031, 919, 819, 730, 651, 580, 70250003Sadrian 517, 461, 411, 366, 326, 291, 259, 231, 71250003Sadrian 206, 183, 163, 146, 130, 116, 103, 92, 72250003Sadrian 82, 73, 65, 58, 52, 46, 41, 37, 73250003Sadrian 33, 29, 26, 23, 21, 18, 16, 15, 74250003Sadrian 13, 12, 10, 9, 8, 7, 7, 6, 75250003Sadrian 5, 5, 4, 4, 3}; 76250003Sadrian 77250003Sadrian#if ATH_AIC_TEST_PATTERN 78250003Sadrianstatic const u_int32_t aic_test_pattern[ATH_AIC_MAX_BT_CHANNEL] = { 79250003Sadrian0x00000, // 0 80250003Sadrian0x00000, 81250003Sadrian0x00000, 82250003Sadrian0x00000, 83250003Sadrian0x00000, 84250003Sadrian0x00000, 85250003Sadrian0x00000, 86250003Sadrian0x00000, 87250003Sadrian0x00000, 88250003Sadrian0x1918d, 89250003Sadrian0x1938d, // 10 90250003Sadrian0x00000, 91250003Sadrian0x1978d, 92250003Sadrian0x19e8d, 93250003Sadrian0x00000, 94250003Sadrian0x00000, 95250003Sadrian0x00000, 96250003Sadrian0x00000, 97250003Sadrian0x00000, 98250003Sadrian0x00000, 99250003Sadrian0x00000, // 20 100250003Sadrian0x00000, 101250003Sadrian0x00000, 102250003Sadrian0x1ce8f, 103250003Sadrian0x00000, 104250003Sadrian0x00000, 105250003Sadrian0x00000, 106250003Sadrian0x00000, 107250003Sadrian0x1ca93, 108250003Sadrian0x1c995, 109250003Sadrian0x00000, // 30 110250003Sadrian0x1c897, 111250003Sadrian0x1c899, 112250003Sadrian0x00000, 113250003Sadrian0x00000, 114250003Sadrian0x1c79f, 115250003Sadrian0x00000, 116250003Sadrian0x1c7a5, 117250003Sadrian0x1c6ab, 118250003Sadrian0x00000, 119250003Sadrian0x00000, // 40 120250003Sadrian0x00000, 121250003Sadrian0x00000, 122250003Sadrian0x1c63f, 123250003Sadrian0x00000, 124250003Sadrian0x1c52b, 125250003Sadrian0x1c525, 126250003Sadrian0x1c523, 127250003Sadrian0x00000, 128250003Sadrian0x00000, 129250003Sadrian0x00000, // 50 130250003Sadrian0x00000, 131250003Sadrian0x00000, 132250003Sadrian0x1c617, 133250003Sadrian0x00000, 134250003Sadrian0x1c615, 135250003Sadrian0x1c613, 136250003Sadrian0x00000, 137250003Sadrian0x00000, 138250003Sadrian0x00000, 139250003Sadrian0x00000, // 60 140250003Sadrian0x1c80f, 141250003Sadrian0x1c90f, 142250003Sadrian0x1c90f, 143250003Sadrian0x1ca0f, 144250003Sadrian0x1ca0d, 145250003Sadrian0x1cb0d, 146250003Sadrian0x00000, 147250003Sadrian0x00000, 148250003Sadrian0x00000, 149250003Sadrian0x00000, // 70 150250003Sadrian0x1d00d, 151250003Sadrian0x00000, 152250003Sadrian0x00000, 153250003Sadrian0x00000, 154250003Sadrian0x00000, 155250003Sadrian0x00000, 156250003Sadrian0x00000, 157250003Sadrian0x00000 158250003Sadrian}; 159250003Sadrian#endif 160250003Sadrian 161250003Sadrianstatic void 162250003Sadrianar9300_aic_gain_table(struct ath_hal *ah) 163250003Sadrian{ 164250003Sadrian u_int32_t aic_atten_word[19], i; 165250003Sadrian 166250003Sadrian /* Program gain table */ 167250003Sadrian aic_atten_word[0] = (0x1 & 0xf)<<14 | (0x1f & 0x1f)<<9 | (0x0 & 0xf)<<5 | 168250003Sadrian (0x1f & 0x1f); // -01 dB: 4'd1, 5'd31, 00 dB: 4'd0, 5'd31; 169250003Sadrian aic_atten_word[1] = (0x3 & 0xf)<<14 | (0x1f & 0x1f)<<9 | (0x2 & 0xf)<<5 | 170250003Sadrian (0x1f & 0x1f); // -03 dB: 4'd3, 5'd31, -02 dB: 4'd2, 5'd31; 171250003Sadrian aic_atten_word[2] = (0x5 & 0xf)<<14 | (0x1f & 0x1f)<<9 | (0x4 & 0xf)<<5 | 172250003Sadrian (0x1f & 0x1f); // -05 dB: 4'd5, 5'd31, -04 dB: 4'd4, 5'd31; 173250003Sadrian aic_atten_word[3] = (0x1 & 0xf)<<14 | (0x1e & 0x1f)<<9 | (0x0 & 0xf)<<5 | 174250003Sadrian (0x1e & 0x1f); // -07 dB: 4'd1, 5'd30, -06 dB: 4'd0, 5'd30; 175250003Sadrian aic_atten_word[4] = (0x3 & 0xf)<<14 | (0x1e & 0x1f)<<9 | (0x2 & 0xf)<<5 | 176250003Sadrian (0x1e & 0x1f); // -09 dB: 4'd3, 5'd30, -08 dB: 4'd2, 5'd30; 177250003Sadrian aic_atten_word[5] = (0x5 & 0xf)<<14 | (0x1e & 0x1f)<<9 | (0x4 & 0xf)<<5 | 178250003Sadrian (0x1e & 0x1f); // -11 dB: 4'd5, 5'd30, -10 dB: 4'd4, 5'd30; 179250003Sadrian aic_atten_word[6] = (0x1 & 0xf)<<14 | (0xf & 0x1f)<<9 | (0x0 & 0xf)<<5 | 180250003Sadrian (0xf & 0x1f); // -13 dB: 4'd1, 5'd15, -12 dB: 4'd0, 5'd15; 181250003Sadrian aic_atten_word[7] = (0x3 & 0xf)<<14 | (0xf & 0x1f)<<9 | (0x2 & 0xf)<<5 | 182250003Sadrian (0xf & 0x1f); // -15 dB: 4'd3, 5'd15, -14 dB: 4'd2, 5'd15; 183250003Sadrian aic_atten_word[8] = (0x5 & 0xf)<<14 | (0xf & 0x1f)<<9 | (0x4 & 0xf)<<5 | 184250003Sadrian (0xf & 0x1f); // -17 dB: 4'd5, 5'd15, -16 dB: 4'd4, 5'd15; 185250003Sadrian aic_atten_word[9] = (0x1 & 0xf)<<14 | (0x7 & 0x1f)<<9 | (0x0 & 0xf)<<5 | 186250003Sadrian (0x7 & 0x1f); // -19 dB: 4'd1, 5'd07, -18 dB: 4'd0, 5'd07; 187250003Sadrian aic_atten_word[10] =(0x3 & 0xf)<<14 | (0x7 & 0x1f)<<9 | (0x2 & 0xf)<<5 | 188250003Sadrian (0x7 & 0x1f); // -21 dB: 4'd3, 5'd07, -20 dB: 4'd2, 5'd07; 189250003Sadrian aic_atten_word[11] =(0x5 & 0xf)<<14 | (0x7 & 0x1f)<<9 | (0x4 & 0xf)<<5 | 190250003Sadrian (0x7 & 0x1f); // -23 dB: 4'd5, 5'd07, -22 dB: 4'd4, 5'd07; 191250003Sadrian aic_atten_word[12] =(0x7 & 0xf)<<14 | (0x7 & 0x1f)<<9 | (0x6 & 0xf)<<5 | 192250003Sadrian (0x7 & 0x1f); // -25 dB: 4'd7, 5'd07, -24 dB: 4'd6, 5'd07; 193250003Sadrian aic_atten_word[13] =(0x3 & 0xf)<<14 | (0x3 & 0x1f)<<9 | (0x2 & 0xf)<<5 | 194250003Sadrian (0x3 & 0x1f); // -27 dB: 4'd3, 5'd03, -26 dB: 4'd2, 5'd03; 195250003Sadrian aic_atten_word[14] =(0x5 & 0xf)<<14 | (0x3 & 0x1f)<<9 | (0x4 & 0xf)<<5 | 196250003Sadrian (0x3 & 0x1f); // -29 dB: 4'd5, 5'd03, -28 dB: 4'd4, 5'd03; 197250003Sadrian aic_atten_word[15] =(0x1 & 0xf)<<14 | (0x1 & 0x1f)<<9 | (0x0 & 0xf)<<5 | 198250003Sadrian (0x1 & 0x1f); // -31 dB: 4'd1, 5'd01, -30 dB: 4'd0, 5'd01; 199250003Sadrian aic_atten_word[16] =(0x3 & 0xf)<<14 | (0x1 & 0x1f)<<9 | (0x2 & 0xf)<<5 | 200250003Sadrian (0x1 & 0x1f); // -33 dB: 4'd3, 5'd01, -32 dB: 4'd2, 5'd01; 201250003Sadrian aic_atten_word[17] =(0x5 & 0xf)<<14 | (0x1 & 0x1f)<<9 | (0x4 & 0xf)<<5 | 202250003Sadrian (0x1 & 0x1f); // -35 dB: 4'd5, 5'd01, -34 dB: 4'd4, 5'd01; 203250003Sadrian aic_atten_word[18] =(0x7 & 0xf)<<14 | (0x1 & 0x1f)<<9 | (0x6 & 0xf)<<5 | 204250003Sadrian (0x1 & 0x1f); // -37 dB: 4'd7, 5'd01, -36 dB: 4'd6, 5'd01; 205250003Sadrian 206250003Sadrian /* Write to Gain table with auto increment enabled. */ 207250003Sadrian OS_REG_WRITE(ah, (AR_PHY_AIC_SRAM_ADDR_B0 + 0x3000), 208250003Sadrian (ATH_AIC_SRAM_AUTO_INCREMENT | 209250003Sadrian ATH_AIC_SRAM_GAIN_TABLE_OFFSET)); 210250003Sadrian 211250003Sadrian for (i = 0; i < 19; i++) { 212250003Sadrian OS_REG_WRITE(ah, (AR_PHY_AIC_SRAM_DATA_B0 + 0x3000), 213250003Sadrian aic_atten_word[i]); 214250003Sadrian } 215250003Sadrian 216250003Sadrian} 217250003Sadrian 218250003Sadrianstatic int16_t 219250003Sadrianar9300_aic_find_valid (struct ath_aic_sram_info *cal_sram, 220250003Sadrian HAL_BOOL dir, 221250003Sadrian u_int8_t index) 222250003Sadrian{ 223250003Sadrian int16_t i; 224250003Sadrian 225250003Sadrian if (dir) { 226250003Sadrian /* search forward */ 227250003Sadrian for (i = index + 1; i < ATH_AIC_MAX_BT_CHANNEL; i++) { 228250003Sadrian if (cal_sram[i].valid) { 229250003Sadrian break; 230250003Sadrian } 231250003Sadrian } 232250003Sadrian } 233250003Sadrian else { 234250003Sadrian /* search backword */ 235250003Sadrian for (i = index - 1; i >= 0; i--) { 236250003Sadrian if (cal_sram[i].valid) { 237250003Sadrian break; 238250003Sadrian } 239250003Sadrian } 240250003Sadrian } 241250003Sadrian if ((i >= ATH_AIC_MAX_BT_CHANNEL) || (i < 0)) { 242250003Sadrian i = -1; 243250003Sadrian } 244250003Sadrian 245250003Sadrian return i; 246250003Sadrian} 247250003Sadrian 248250003Sadrianstatic int16_t 249250003Sadrianar9300_aic_find_index (u_int8_t type, int16_t value) 250250003Sadrian{ 251250003Sadrian int16_t i = -1; 252250003Sadrian 253250003Sadrian /* 254250003Sadrian * type 0: aic_lin_table, 1: com_att_db_table 255250003Sadrian */ 256250003Sadrian 257250003Sadrian if (type == 0) { 258250003Sadrian /* Find in aic_lin_table */ 259250003Sadrian for (i = ATH_AIC_MAX_AIC_LIN_TABLE - 1; i >= 0; i--) { 260250003Sadrian if (aic_lin_table[i] >= value) { 261250003Sadrian break; 262250003Sadrian } 263250003Sadrian } 264250003Sadrian } 265250003Sadrian else if (type == 1) { 266250003Sadrian /* find in com_att_db_table */ 267250003Sadrian for (i = 0; i < ATH_AIC_MAX_COM_ATT_DB_TABLE; i++) { 268250003Sadrian if (com_att_db_table[i] > value) { 269250003Sadrian i--; 270250003Sadrian break; 271250003Sadrian } 272250003Sadrian } 273250003Sadrian if (i >= ATH_AIC_MAX_COM_ATT_DB_TABLE) { 274250003Sadrian i = -1; 275250003Sadrian } 276250003Sadrian } 277250003Sadrian 278250003Sadrian return i; 279250003Sadrian} 280250003Sadrian 281250003Sadrianstatic HAL_BOOL 282250003Sadrianar9300_aic_cal_post_process (struct ath_hal *ah) 283250003Sadrian{ 284250003Sadrian struct ath_hal_9300 *ahp = AH9300(ah); 285250003Sadrian struct ath_aic_sram_info cal_sram[ATH_AIC_MAX_BT_CHANNEL]; 286250003Sadrian struct ath_aic_out_info aic_sram[ATH_AIC_MAX_BT_CHANNEL]; 287250003Sadrian u_int32_t dir_path_gain_idx, quad_path_gain_idx, value; 288250003Sadrian u_int32_t fixed_com_att_db; 289250003Sadrian int8_t dir_path_sign, quad_path_sign; 290250003Sadrian int16_t i; 291250003Sadrian HAL_BOOL ret = AH_TRUE; 292250003Sadrian 293250003Sadrian /* Read CAL_SRAM and get valid values. */ 294250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) CAL_SRAM:\n"); 295250003Sadrian 296250003Sadrian for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) { 297250003Sadrian OS_REG_WRITE(ah, AR_PHY_AIC_SRAM_ADDR_B1, 298250003Sadrian (ATH_AIC_SRAM_CAL_OFFSET + i*4)); 299250003Sadrian#if ATH_AIC_TEST_PATTERN 300250003Sadrian value = aic_test_pattern[i]; 301250003Sadrian#else 302250003Sadrian value = OS_REG_READ(ah, AR_PHY_AIC_SRAM_DATA_B1); 303250003Sadrian#endif 304250003Sadrian cal_sram[i].valid = MS(value, AR_PHY_AIC_SRAM_VALID); 305250003Sadrian cal_sram[i].rot_quad_att_db = MS(value, 306250003Sadrian AR_PHY_AIC_SRAM_ROT_QUAD_ATT_DB); 307250003Sadrian cal_sram[i].vga_quad_sign = MS(value, AR_PHY_AIC_SRAM_VGA_QUAD_SIGN); 308250003Sadrian cal_sram[i].rot_dir_att_db = MS(value, AR_PHY_AIC_SRAM_ROT_DIR_ATT_DB); 309250003Sadrian cal_sram[i].vga_dir_sign = MS(value, AR_PHY_AIC_SRAM_VGA_DIR_SIGN); 310250003Sadrian cal_sram[i].com_att_6db = MS(value, AR_PHY_AIC_SRAM_COM_ATT_6DB); 311250003Sadrian 312250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 313250003Sadrian "(AIC) %2d %2d %2d %2d %2d %2d %2d 0x%05x\n", 314250003Sadrian i, cal_sram[i].vga_quad_sign, 315250003Sadrian cal_sram[i].vga_dir_sign, 316250003Sadrian cal_sram[i].rot_dir_att_db, 317250003Sadrian cal_sram[i].rot_quad_att_db, 318250003Sadrian cal_sram[i].com_att_6db, 319250003Sadrian cal_sram[i].valid, 320250003Sadrian value); 321250003Sadrian 322250003Sadrian if (cal_sram[i].valid) { 323250003Sadrian dir_path_gain_idx = cal_sram[i].rot_dir_att_db + 324250003Sadrian com_att_db_table[cal_sram[i].com_att_6db]; 325250003Sadrian quad_path_gain_idx = cal_sram[i].rot_quad_att_db + 326250003Sadrian com_att_db_table[cal_sram[i].com_att_6db]; 327250003Sadrian dir_path_sign = (cal_sram[i].vga_dir_sign) ? 1 : -1; 328250003Sadrian quad_path_sign = (cal_sram[i].vga_quad_sign) ? 1 : -1; 329250003Sadrian aic_sram[i].dir_path_gain_lin = dir_path_sign * 330250003Sadrian aic_lin_table[dir_path_gain_idx]; 331250003Sadrian aic_sram[i].quad_path_gain_lin = quad_path_sign * 332250003Sadrian aic_lin_table[quad_path_gain_idx]; 333250003Sadrian } 334250003Sadrian } 335250003Sadrian 336250003Sadrian for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) { 337250003Sadrian int16_t start_idx, end_idx; 338250003Sadrian 339250003Sadrian if (cal_sram[i].valid) { 340250003Sadrian continue; 341250003Sadrian } 342250003Sadrian 343250003Sadrian start_idx = ar9300_aic_find_valid(cal_sram, 0, i); 344250003Sadrian end_idx = ar9300_aic_find_valid(cal_sram, 1, i); 345250003Sadrian 346250003Sadrian if (start_idx < 0) 347250003Sadrian { 348250003Sadrian /* extrapolation */ 349250003Sadrian start_idx = end_idx; 350250003Sadrian end_idx = ar9300_aic_find_valid(cal_sram, 1, start_idx); 351250003Sadrian 352250003Sadrian if (end_idx < 0) { 353250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 354250003Sadrian "(AIC) Error (1): i = %d, start_idx = %d \n", 355250003Sadrian i, start_idx); 356250003Sadrian ret = AH_FALSE; 357250003Sadrian break; 358250003Sadrian } 359250003Sadrian aic_sram[i].dir_path_gain_lin = 360250003Sadrian ((aic_sram[start_idx].dir_path_gain_lin - 361250003Sadrian aic_sram[end_idx].dir_path_gain_lin) * 362250003Sadrian (start_idx - i) + ((end_idx - i) >> 1)) / 363250003Sadrian (end_idx - i) + 364250003Sadrian aic_sram[start_idx].dir_path_gain_lin; 365250003Sadrian aic_sram[i].quad_path_gain_lin = 366250003Sadrian ((aic_sram[start_idx].quad_path_gain_lin - 367250003Sadrian aic_sram[end_idx].quad_path_gain_lin) * 368250003Sadrian (start_idx - i) + ((end_idx - i) >> 1)) / 369250003Sadrian (end_idx - i) + 370250003Sadrian aic_sram[start_idx].quad_path_gain_lin; 371250003Sadrian } 372250003Sadrian if (end_idx < 0) 373250003Sadrian { 374250003Sadrian /* extrapolation */ 375250003Sadrian end_idx = ar9300_aic_find_valid(cal_sram, 0, start_idx); 376250003Sadrian 377250003Sadrian if (end_idx < 0) { 378250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 379250003Sadrian "(AIC) Error (2): i = %d, start_idx = %d\n", 380250003Sadrian i, start_idx); 381250003Sadrian ret = AH_FALSE; 382250003Sadrian break; 383250003Sadrian } 384250003Sadrian aic_sram[i].dir_path_gain_lin = 385250003Sadrian ((aic_sram[start_idx].dir_path_gain_lin - 386250003Sadrian aic_sram[end_idx].dir_path_gain_lin) * 387250003Sadrian (i - start_idx) + ((start_idx - end_idx) >> 1)) / 388250003Sadrian (start_idx - end_idx) + 389250003Sadrian aic_sram[start_idx].dir_path_gain_lin; 390250003Sadrian aic_sram[i].quad_path_gain_lin = 391250003Sadrian ((aic_sram[start_idx].quad_path_gain_lin - 392250003Sadrian aic_sram[end_idx].quad_path_gain_lin) * 393250003Sadrian (i - start_idx) + ((start_idx - end_idx) >> 1)) / 394250003Sadrian (start_idx - end_idx) + 395250003Sadrian aic_sram[start_idx].quad_path_gain_lin; 396250003Sadrian 397250003Sadrian } 398250003Sadrian else { 399250003Sadrian /* interpolation */ 400250003Sadrian aic_sram[i].dir_path_gain_lin = 401250003Sadrian (((end_idx - i) * aic_sram[start_idx].dir_path_gain_lin) + 402250003Sadrian ((i - start_idx) * aic_sram[end_idx].dir_path_gain_lin) + 403250003Sadrian ((end_idx - start_idx) >> 1)) / 404250003Sadrian (end_idx - start_idx); 405250003Sadrian aic_sram[i].quad_path_gain_lin = 406250003Sadrian (((end_idx - i) * aic_sram[start_idx].quad_path_gain_lin) + 407250003Sadrian ((i - start_idx) * aic_sram[end_idx].quad_path_gain_lin) + 408250003Sadrian ((end_idx - start_idx) >> 1))/ 409250003Sadrian (end_idx - start_idx); 410250003Sadrian } 411250003Sadrian } 412250003Sadrian 413250003Sadrian /* From dir/quad_path_gain_lin to sram. */ 414250003Sadrian i = ar9300_aic_find_valid(cal_sram, 1, 0); 415250003Sadrian if (i < 0) { 416250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 417250003Sadrian "(AIC) Error (3): can't find valid. Force it to 0.\n"); 418250003Sadrian i = 0; 419250003Sadrian ret = AH_FALSE; 420250003Sadrian } 421250003Sadrian fixed_com_att_db = com_att_db_table[cal_sram[i].com_att_6db]; 422250003Sadrian 423250003Sadrian for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) { 424250003Sadrian int16_t rot_dir_path_att_db, rot_quad_path_att_db; 425250003Sadrian 426250003Sadrian aic_sram[i].sram.vga_dir_sign = (aic_sram[i].dir_path_gain_lin >= 0) 427250003Sadrian ? 1 : 0; 428250003Sadrian aic_sram[i].sram.vga_quad_sign= (aic_sram[i].quad_path_gain_lin >= 0) 429250003Sadrian ? 1 : 0; 430250003Sadrian 431250003Sadrian rot_dir_path_att_db = 432250003Sadrian ar9300_aic_find_index(0, abs(aic_sram[i].dir_path_gain_lin)) - 433250003Sadrian fixed_com_att_db; 434250003Sadrian rot_quad_path_att_db = 435250003Sadrian ar9300_aic_find_index(0, abs(aic_sram[i].quad_path_gain_lin)) - 436250003Sadrian fixed_com_att_db; 437250003Sadrian 438250003Sadrian aic_sram[i].sram.com_att_6db = ar9300_aic_find_index(1, 439250003Sadrian fixed_com_att_db); 440250003Sadrian 441250003Sadrian aic_sram[i].sram.valid = 1; 442250003Sadrian aic_sram[i].sram.rot_dir_att_db = 443250003Sadrian MIN(MAX(rot_dir_path_att_db, ATH_AIC_MIN_ROT_DIR_ATT_DB), 444250003Sadrian ATH_AIC_MAX_ROT_DIR_ATT_DB); 445250003Sadrian aic_sram[i].sram.rot_quad_att_db = 446250003Sadrian MIN(MAX(rot_quad_path_att_db, ATH_AIC_MIN_ROT_QUAD_ATT_DB), 447250003Sadrian ATH_AIC_MAX_ROT_QUAD_ATT_DB); 448250003Sadrian } 449250003Sadrian 450250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) Post processing results:\n"); 451250003Sadrian 452250003Sadrian for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) { 453250003Sadrian ahp->ah_aic_sram[i] = (SM(aic_sram[i].sram.vga_dir_sign, 454250003Sadrian AR_PHY_AIC_SRAM_VGA_DIR_SIGN) | 455250003Sadrian SM(aic_sram[i].sram.vga_quad_sign, 456250003Sadrian AR_PHY_AIC_SRAM_VGA_QUAD_SIGN) | 457250003Sadrian SM(aic_sram[i].sram.com_att_6db, 458250003Sadrian AR_PHY_AIC_SRAM_COM_ATT_6DB) | 459250003Sadrian SM(aic_sram[i].sram.valid, 460250003Sadrian AR_PHY_AIC_SRAM_VALID) | 461250003Sadrian SM(aic_sram[i].sram.rot_dir_att_db, 462250003Sadrian AR_PHY_AIC_SRAM_ROT_DIR_ATT_DB) | 463250003Sadrian SM(aic_sram[i].sram.rot_quad_att_db, 464250003Sadrian AR_PHY_AIC_SRAM_ROT_QUAD_ATT_DB)); 465250003Sadrian 466250003Sadrian 467250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 468250003Sadrian "(AIC) ch%02d 0x%05x %2d %2d %2d %2d %2d %2d %d %d\n", 469250003Sadrian i, 470250003Sadrian ahp->ah_aic_sram[i], 471250003Sadrian aic_sram[i].sram.vga_quad_sign, 472250003Sadrian aic_sram[i].sram.vga_dir_sign, 473250003Sadrian aic_sram[i].sram.rot_dir_att_db, 474250003Sadrian aic_sram[i].sram.rot_quad_att_db, 475250003Sadrian aic_sram[i].sram.com_att_6db, 476250003Sadrian aic_sram[i].sram.valid, 477250003Sadrian aic_sram[i].dir_path_gain_lin, 478250003Sadrian aic_sram[i].quad_path_gain_lin); 479250003Sadrian } 480250003Sadrian 481250003Sadrian return ret; 482250003Sadrian} 483250003Sadrian 484250003Sadrianu_int32_t 485250003Sadrianar9300_aic_calibration(struct ath_hal *ah) 486250003Sadrian{ 487250003Sadrian u_int32_t aic_ctrl_b0[5], aic_ctrl_b1[5]; 488250003Sadrian u_int32_t aic_stat_b0[2], aic_stat_b1[2]; 489250003Sadrian u_int32_t aic_stat, value; 490250003Sadrian u_int32_t i, cal_count = ATH_AIC_MAX_CAL_COUNT; 491250003Sadrian struct ath_hal_9300 *ahp = AH9300(ah); 492250003Sadrian 493250003Sadrian if (AR_SREV_JUPITER_10(ah)) { 494250003Sadrian aic_ctrl_b0[0] = AR_PHY_AIC_CTRL_0_B0_10; 495250003Sadrian aic_ctrl_b0[1] = AR_PHY_AIC_CTRL_1_B0_10; 496250003Sadrian aic_ctrl_b0[2] = AR_PHY_AIC_CTRL_2_B0_10; 497250003Sadrian aic_ctrl_b0[3] = AR_PHY_AIC_CTRL_3_B0_10; 498250003Sadrian aic_ctrl_b1[0] = AR_PHY_AIC_CTRL_0_B1_10; 499250003Sadrian aic_ctrl_b1[1] = AR_PHY_AIC_CTRL_1_B1_10; 500250003Sadrian aic_stat_b0[0] = AR_PHY_AIC_STAT_0_B0_10; 501250003Sadrian aic_stat_b0[1] = AR_PHY_AIC_STAT_1_B0_10; 502250003Sadrian aic_stat_b1[0] = AR_PHY_AIC_STAT_0_B1_10; 503250003Sadrian aic_stat_b1[1] = AR_PHY_AIC_STAT_1_B1_10; 504250003Sadrian } 505250003Sadrian else { 506250003Sadrian aic_ctrl_b0[0] = AR_PHY_AIC_CTRL_0_B0_20; 507250003Sadrian aic_ctrl_b0[1] = AR_PHY_AIC_CTRL_1_B0_20; 508250003Sadrian aic_ctrl_b0[2] = AR_PHY_AIC_CTRL_2_B0_20; 509250003Sadrian aic_ctrl_b0[3] = AR_PHY_AIC_CTRL_3_B0_20; 510250003Sadrian aic_ctrl_b0[4] = AR_PHY_AIC_CTRL_4_B0_20; 511250003Sadrian aic_ctrl_b1[0] = AR_PHY_AIC_CTRL_0_B1_20; 512250003Sadrian aic_ctrl_b1[1] = AR_PHY_AIC_CTRL_1_B1_20; 513250003Sadrian aic_ctrl_b1[4] = AR_PHY_AIC_CTRL_4_B1_20; 514250003Sadrian aic_stat_b0[0] = AR_PHY_AIC_STAT_0_B0_20; 515250003Sadrian aic_stat_b0[1] = AR_PHY_AIC_STAT_1_B0_20; 516250003Sadrian aic_stat_b1[0] = AR_PHY_AIC_STAT_0_B1_20; 517250003Sadrian aic_stat_b1[1] = AR_PHY_AIC_STAT_1_B1_20; 518250003Sadrian } 519250003Sadrian 520250003Sadrian /* Config LNA gain difference */ 521250003Sadrian OS_REG_WRITE(ah, AR_PHY_BT_COEX_4, 0x22180600); 522250003Sadrian OS_REG_WRITE(ah, AR_PHY_BT_COEX_5, 0x52443a2e); 523250003Sadrian 524250003Sadrian OS_REG_WRITE(ah, aic_ctrl_b0[0], 525250003Sadrian (SM(0, AR_PHY_AIC_MON_ENABLE) | 526250003Sadrian SM(40, AR_PHY_AIC_CAL_MAX_HOP_COUNT) | 527250003Sadrian SM(1, AR_PHY_AIC_CAL_MIN_VALID_COUNT) | //26 528250003Sadrian SM(37, AR_PHY_AIC_F_WLAN) | 529250003Sadrian SM(1, AR_PHY_AIC_CAL_CH_VALID_RESET) | 530250003Sadrian SM(0, AR_PHY_AIC_CAL_ENABLE) | 531250003Sadrian SM(0x40, AR_PHY_AIC_BTTX_PWR_THR) | 532250003Sadrian SM(0, AR_PHY_AIC_ENABLE))); 533250003Sadrian 534250003Sadrian OS_REG_WRITE(ah, aic_ctrl_b1[0], 535250003Sadrian (SM(0, AR_PHY_AIC_MON_ENABLE) | 536250003Sadrian SM(1, AR_PHY_AIC_CAL_CH_VALID_RESET) | 537250003Sadrian SM(0, AR_PHY_AIC_CAL_ENABLE) | 538250003Sadrian SM(0x40, AR_PHY_AIC_BTTX_PWR_THR) | 539250003Sadrian SM(0, AR_PHY_AIC_ENABLE))); 540250003Sadrian 541250003Sadrian OS_REG_WRITE(ah, aic_ctrl_b0[1], 542250003Sadrian (SM(8, AR_PHY_AIC_CAL_BT_REF_DELAY) | 543250003Sadrian SM(6, AR_PHY_AIC_CAL_ROT_ATT_DB_EST_ISO) | 544250003Sadrian SM(3, AR_PHY_AIC_CAL_COM_ATT_DB_EST_ISO) | 545250003Sadrian SM(0, AR_PHY_AIC_BT_IDLE_CFG) | 546250003Sadrian SM(1, AR_PHY_AIC_STDBY_COND) | 547250003Sadrian SM(37, AR_PHY_AIC_STDBY_ROT_ATT_DB) | 548250003Sadrian SM(5, AR_PHY_AIC_STDBY_COM_ATT_DB) | 549250003Sadrian SM(15, AR_PHY_AIC_RSSI_MAX) | 550250003Sadrian SM(0, AR_PHY_AIC_RSSI_MIN))); 551250003Sadrian 552250003Sadrian OS_REG_WRITE(ah, aic_ctrl_b1[1], 553250003Sadrian (SM(6, AR_PHY_AIC_CAL_ROT_ATT_DB_EST_ISO) | 554250003Sadrian SM(3, AR_PHY_AIC_CAL_COM_ATT_DB_EST_ISO) | 555250003Sadrian SM(15, AR_PHY_AIC_RSSI_MAX) | 556250003Sadrian SM(0, AR_PHY_AIC_RSSI_MIN))); 557250003Sadrian 558250003Sadrian OS_REG_WRITE(ah, aic_ctrl_b0[2], 559250003Sadrian (SM(44, AR_PHY_AIC_RADIO_DELAY) | 560250003Sadrian SM(7, AR_PHY_AIC_CAL_STEP_SIZE_CORR) | 561250003Sadrian SM(12, AR_PHY_AIC_CAL_ROT_IDX_CORR) | 562250003Sadrian SM(2, AR_PHY_AIC_CAL_CONV_CHECK_FACTOR) | 563250003Sadrian SM(5, AR_PHY_AIC_ROT_IDX_COUNT_MAX) | 564250003Sadrian SM(1, AR_PHY_AIC_CAL_SYNTH_TOGGLE) | 565250003Sadrian SM(1, AR_PHY_AIC_CAL_SYNTH_AFTER_BTRX) | 566250003Sadrian SM(200, AR_PHY_AIC_CAL_SYNTH_SETTLING))); 567250003Sadrian 568250003Sadrian OS_REG_WRITE(ah, aic_ctrl_b0[3], 569250003Sadrian (SM(20, AR_PHY_AIC_MON_MAX_HOP_COUNT) | 570250003Sadrian SM(10, AR_PHY_AIC_MON_MIN_STALE_COUNT) | 571250003Sadrian SM(1, AR_PHY_AIC_MON_PWR_EST_LONG) | 572250003Sadrian SM(2, AR_PHY_AIC_MON_PD_TALLY_SCALING) | 573250003Sadrian SM(18, AR_PHY_AIC_MON_PERF_THR) | 574250003Sadrian SM(1, AR_PHY_AIC_CAL_COM_ATT_DB_FIXED) | 575250003Sadrian SM(2, AR_PHY_AIC_CAL_TARGET_MAG_SETTING) | 576250003Sadrian SM(3, AR_PHY_AIC_CAL_PERF_CHECK_FACTOR) | 577250003Sadrian SM(1, AR_PHY_AIC_CAL_PWR_EST_LONG))); 578250003Sadrian 579250003Sadrian ar9300_aic_gain_table(ah); 580250003Sadrian 581250003Sadrian /* Need to enable AIC reference signal in BT modem. */ 582250003Sadrian OS_REG_WRITE(ah, ATH_AIC_BT_JUPITER_CTRL, 583250003Sadrian (OS_REG_READ(ah, ATH_AIC_BT_JUPITER_CTRL) | 584250003Sadrian ATH_AIC_BT_AIC_ENABLE)); 585250003Sadrian 586250003Sadrian while (cal_count) 587250003Sadrian { 588250003Sadrian /* Start calibration */ 589250003Sadrian OS_REG_CLR_BIT(ah, aic_ctrl_b1[0], AR_PHY_AIC_CAL_ENABLE); 590250003Sadrian OS_REG_SET_BIT(ah, aic_ctrl_b1[0], AR_PHY_AIC_CAL_CH_VALID_RESET); 591250003Sadrian OS_REG_SET_BIT(ah, aic_ctrl_b1[0], AR_PHY_AIC_CAL_ENABLE); 592250003Sadrian 593250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) Start calibration #%d\n", 594250003Sadrian (ATH_AIC_MAX_CAL_COUNT - cal_count)); 595250003Sadrian 596250003Sadrian /* Wait until calibration is completed. */ 597250003Sadrian for (i = 0; i < 10000; i++) { 598250003Sadrian /* 599250003Sadrian * Use AR_PHY_AIC_CAL_ENABLE bit instead of AR_PHY_AIC_CAL_DONE. 600250003Sadrian * Sometimes CAL_DONE bit is not asserted. 601250003Sadrian */ 602250003Sadrian if ((OS_REG_READ(ah, aic_ctrl_b1[0]) & AR_PHY_AIC_CAL_ENABLE) == 0) 603250003Sadrian { 604250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) Cal is done at #%d\n", i); 605250003Sadrian break; 606250003Sadrian } 607250003Sadrian OS_DELAY(1); 608250003Sadrian } 609250003Sadrian 610250003Sadrian /* print out status registers */ 611250003Sadrian aic_stat = OS_REG_READ(ah, aic_stat_b1[0]); 612250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 613250003Sadrian "(AIC) CAL_DONE = %d, CAL_ACTIVE = %d, MEAS_COUNT = %d\n", 614250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_DONE), 615250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_ACTIVE), 616250003Sadrian MS(aic_stat, AR_PHY_AIC_MEAS_COUNT)); 617250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 618250003Sadrian "(AIC) ANT_ISO = %d, HOP_COUNT = %d, VALID_COUNT = %d\n", 619250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_ANT_ISO_EST), 620250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_HOP_COUNT), 621250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_VALID_COUNT)); 622250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 623250003Sadrian "(AIC) BT_WEAK = %d, BT_STRONG = %d, , \n", 624250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_BT_TOO_WEAK_ERR), 625250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_BT_TOO_STRONG_ERR)); 626250003Sadrian 627250003Sadrian aic_stat = OS_REG_READ(ah, aic_stat_b1[1]); 628250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 629250003Sadrian "(AIC) MEAS_MAG_MIN = %d, CAL_AIC_SM = %d, AIC_SM = %d\n", 630250003Sadrian MS(aic_stat, AR_PHY_AIC_MEAS_MAG_MIN), 631250003Sadrian MS(aic_stat, AR_PHY_AIC_CAL_AIC_SM), 632250003Sadrian MS(aic_stat, AR_PHY_AIC_SM)); 633250003Sadrian 634250003Sadrian if (i >= 10000) { 635250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) Calibration failed.\n"); 636250003Sadrian break; 637250003Sadrian } 638250003Sadrian 639250003Sadrian /* print out calibration result */ 640250003Sadrian if (MS(aic_stat, AR_PHY_AIC_MEAS_MAG_MIN) < ATH_AIC_MEAS_MAG_THRESH) { 641250003Sadrian for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) { 642250003Sadrian OS_REG_WRITE(ah, AR_PHY_AIC_SRAM_ADDR_B1, 643250003Sadrian (ATH_AIC_SRAM_CAL_OFFSET + i*4)); 644250003Sadrian value = OS_REG_READ(ah, AR_PHY_AIC_SRAM_DATA_B1); 645250003Sadrian if (value & 0x01) { 646250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, 647250003Sadrian "(AIC) BT chan %02d: 0x%08x\n", i, value); 648250003Sadrian } 649250003Sadrian } 650250003Sadrian break; 651250003Sadrian } 652250003Sadrian cal_count--; 653250003Sadrian } 654250003Sadrian 655250003Sadrian if (!cal_count) { 656250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) Calibration failed2.\n"); 657250003Sadrian } 658250003Sadrian 659250003Sadrian /* Disable AIC reference signal in BT modem. */ 660250003Sadrian OS_REG_WRITE(ah, ATH_AIC_BT_JUPITER_CTRL, 661250003Sadrian (OS_REG_READ(ah, ATH_AIC_BT_JUPITER_CTRL) & 662250003Sadrian ~ATH_AIC_BT_AIC_ENABLE)); 663250003Sadrian 664250003Sadrian ahp->ah_aic_enabled = ar9300_aic_cal_post_process(ah) ? AH_TRUE : AH_FALSE; 665250003Sadrian 666250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) ah_aic_enable = %d\n", 667250003Sadrian ahp->ah_aic_enabled); 668250003Sadrian return 0; 669250003Sadrian} 670250003Sadrian 671250003Sadrian 672250003Sadrianu_int32_t 673250003Sadrianar9300_aic_start_normal (struct ath_hal *ah) 674250003Sadrian{ 675250003Sadrian struct ath_hal_9300 *ahp = AH9300(ah); 676250003Sadrian u_int32_t aic_ctrl0_b1, aic_ctrl1_b0, aic_ctrl1_b1; 677250003Sadrian int16_t i; 678250003Sadrian 679250003Sadrian /* Config LNA gain difference */ 680250003Sadrian OS_REG_WRITE(ah, AR_PHY_BT_COEX_4, 0x22180600); 681250003Sadrian OS_REG_WRITE(ah, AR_PHY_BT_COEX_5, 0x52443a2e); 682250003Sadrian 683250003Sadrian ar9300_aic_gain_table(ah); 684250003Sadrian 685250003Sadrian OS_REG_WRITE(ah, AR_PHY_AIC_SRAM_ADDR_B1, ATH_AIC_SRAM_AUTO_INCREMENT); 686250003Sadrian 687250003Sadrian for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) { 688250003Sadrian OS_REG_WRITE(ah, AR_PHY_AIC_SRAM_DATA_B1, ahp->ah_aic_sram[i]); 689250003Sadrian } 690250003Sadrian 691250003Sadrian if (AR_SREV_JUPITER_10(ah)) { 692250003Sadrian aic_ctrl0_b1 = AR_PHY_AIC_CTRL_0_B1_10; 693250003Sadrian aic_ctrl1_b0 = AR_PHY_AIC_CTRL_1_B0_10; 694250003Sadrian aic_ctrl1_b1 = AR_PHY_AIC_CTRL_1_B1_10; 695250003Sadrian } 696250003Sadrian else { 697250003Sadrian aic_ctrl0_b1 = AR_PHY_AIC_CTRL_0_B1_20; 698250003Sadrian aic_ctrl1_b0 = AR_PHY_AIC_CTRL_1_B0_20; 699250003Sadrian aic_ctrl1_b1 = AR_PHY_AIC_CTRL_1_B1_20; 700250003Sadrian } 701250003Sadrian 702250003Sadrian OS_REG_WRITE(ah, aic_ctrl1_b0, 703250003Sadrian (SM(0, AR_PHY_AIC_BT_IDLE_CFG) | 704250003Sadrian SM(1, AR_PHY_AIC_STDBY_COND) | 705250003Sadrian SM(37, AR_PHY_AIC_STDBY_ROT_ATT_DB) | 706250003Sadrian SM(5, AR_PHY_AIC_STDBY_COM_ATT_DB) | 707250003Sadrian SM(15, AR_PHY_AIC_RSSI_MAX) | 708250003Sadrian SM(0, AR_PHY_AIC_RSSI_MIN))); 709250003Sadrian 710250003Sadrian OS_REG_WRITE(ah, aic_ctrl1_b1, 711250003Sadrian (SM(15, AR_PHY_AIC_RSSI_MAX) | 712250003Sadrian SM(0, AR_PHY_AIC_RSSI_MIN))); 713250003Sadrian 714250003Sadrian OS_REG_WRITE(ah, aic_ctrl0_b1, 715250003Sadrian (SM(0x40, AR_PHY_AIC_BTTX_PWR_THR) | 716250003Sadrian SM(1, AR_PHY_AIC_ENABLE))); 717250003Sadrian 718250003Sadrian ahp->ah_aic_enabled = AH_TRUE; 719250003Sadrian 720250003Sadrian HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(AIC) Start normal operation mode.\n"); 721250003Sadrian return 0; 722250003Sadrian} 723250003Sadrian#endif 724250003Sadrian 725250003Sadrian#endif 726250003Sadrian 727250003Sadrian 728