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