1301013Sadrian/*
2301013Sadrian * Copyright (c) 2014 Qualcomm Atheros, Inc.
3301013Sadrian * All Rights Reserved.
4301013Sadrian *
5301013Sadrian * Permission to use, copy, modify, and/or distribute this software for any
6301013Sadrian * purpose with or without fee is hereby granted, provided that the above
7301013Sadrian * copyright notice and this permission notice appear in all copies.
8301013Sadrian *
9301013Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10301013Sadrian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11301013Sadrian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12301013Sadrian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13301013Sadrian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14301013Sadrian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15301013Sadrian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16301013Sadrian *
17301013Sadrian * $FreeBSD$
18301013Sadrian */
19301013Sadrian#ifndef	__ATH_HAL_BTCOEX_H__
20301013Sadrian#define	__ATH_HAL_BTCOEX_H__
21301013Sadrian
22301013Sadrian/*
23301013Sadrian * General BT coexistence definitions.
24301013Sadrian */
25301013Sadriantypedef enum {
26301013Sadrian	HAL_BT_MODULE_CSR_BC4	= 0,	/* CSR BlueCore v4 */
27301013Sadrian	HAL_BT_MODULE_JANUS	= 1,	/* Kite + Valkyrie combo */
28301013Sadrian	HAL_BT_MODULE_HELIUS	= 2,	/* Kiwi + Valkyrie combo */
29301013Sadrian	HAL_MAX_BT_MODULES
30301013Sadrian} HAL_BT_MODULE;
31301013Sadrian
32301013Sadriantypedef struct {
33301013Sadrian	HAL_BT_MODULE	bt_module;
34301013Sadrian	u_int8_t	bt_coex_config;
35301013Sadrian	u_int8_t	bt_gpio_bt_active;
36301013Sadrian	u_int8_t	bt_gpio_bt_priority;
37301013Sadrian	u_int8_t	bt_gpio_wlan_active;
38301013Sadrian	u_int8_t	bt_active_polarity;
39301013Sadrian	HAL_BOOL	bt_single_ant;
40301013Sadrian	u_int8_t	bt_isolation;
41301013Sadrian} HAL_BT_COEX_INFO;
42301013Sadrian
43301013Sadriantypedef enum {
44301013Sadrian	HAL_BT_COEX_MODE_LEGACY		= 0,	/* legacy rx_clear mode */
45301013Sadrian	HAL_BT_COEX_MODE_UNSLOTTED	= 1,	/* untimed/unslotted mode */
46301013Sadrian	HAL_BT_COEX_MODE_SLOTTED	= 2,	/* slotted mode */
47301013Sadrian	HAL_BT_COEX_MODE_DISALBED	= 3,	/* coexistence disabled */
48301013Sadrian} HAL_BT_COEX_MODE;
49301013Sadrian
50301013Sadriantypedef enum {
51301013Sadrian	HAL_BT_COEX_CFG_NONE,		/* No bt coex enabled */
52301013Sadrian	HAL_BT_COEX_CFG_2WIRE_2CH,	/* 2-wire with 2 chains */
53301013Sadrian	HAL_BT_COEX_CFG_2WIRE_CH1,	/* 2-wire with ch1 */
54301013Sadrian	HAL_BT_COEX_CFG_2WIRE_CH0,	/* 2-wire with ch0 */
55301013Sadrian	HAL_BT_COEX_CFG_3WIRE,		/* 3-wire */
56301013Sadrian	HAL_BT_COEX_CFG_MCI		/* MCI */
57301013Sadrian} HAL_BT_COEX_CFG;
58301013Sadrian
59301013Sadriantypedef enum {
60301013Sadrian	HAL_BT_COEX_SET_ACK_PWR		= 0,	/* Change ACK power setting */
61301013Sadrian	HAL_BT_COEX_LOWER_TX_PWR,		/* Change transmit power */
62301013Sadrian	HAL_BT_COEX_ANTENNA_DIVERSITY,	/* Enable RX diversity for Kite */
63301013Sadrian	HAL_BT_COEX_MCI_MAX_TX_PWR,	/* Set max tx power for concurrent tx */
64301013Sadrian	HAL_BT_COEX_MCI_FTP_STOMP_RX,	/* Use a different weight for stomp low */
65301013Sadrian} HAL_BT_COEX_SET_PARAMETER;
66301013Sadrian
67301013Sadrian/*
68301013Sadrian * MCI specific coexistence definitions.
69301013Sadrian */
70301013Sadrian
71301013Sadrian#define	HAL_BT_COEX_FLAG_LOW_ACK_PWR	0x00000001
72301013Sadrian#define	HAL_BT_COEX_FLAG_LOWER_TX_PWR	0x00000002
73301013Sadrian/* Check Rx Diversity is allowed */
74301013Sadrian#define	HAL_BT_COEX_FLAG_ANT_DIV_ALLOW	0x00000004
75301013Sadrian/* Check Diversity is on or off */
76301013Sadrian#define	HAL_BT_COEX_FLAG_ANT_DIV_ENABLE	0x00000008
77301013Sadrian
78301013Sadrian#define	HAL_BT_COEX_ANTDIV_CONTROL1_ENABLE	0x0b
79301013Sadrian/* main: LNA1, alt: LNA2 */
80301013Sadrian#define	HAL_BT_COEX_ANTDIV_CONTROL2_ENABLE	0x09
81301013Sadrian#define	HAL_BT_COEX_ANTDIV_CONTROL1_FIXED_A	0x04
82301013Sadrian#define	HAL_BT_COEX_ANTDIV_CONTROL2_FIXED_A	0x09
83301013Sadrian#define	HAL_BT_COEX_ANTDIV_CONTROL1_FIXED_B	0x02
84301013Sadrian#define	HAL_BT_COEX_ANTDIV_CONTROL2_FIXED_B	0x06
85301013Sadrian
86301013Sadrian#define	HAL_BT_COEX_ISOLATION_FOR_NO_COEX	30
87301013Sadrian
88301013Sadrian#define	HAL_BT_COEX_ANT_DIV_SWITCH_COM	0x66666666
89301013Sadrian
90301013Sadrian#define	HAL_BT_COEX_HELIUS_CHAINMASK	0x02
91301013Sadrian
92301013Sadrian#define	HAL_BT_COEX_LOW_ACK_POWER	0x0
93301013Sadrian#define	HAL_BT_COEX_HIGH_ACK_POWER	0x3f3f3f
94301013Sadrian
95301013Sadriantypedef enum {
96301013Sadrian	HAL_BT_COEX_NO_STOMP = 0,
97301013Sadrian	HAL_BT_COEX_STOMP_ALL,
98301013Sadrian	HAL_BT_COEX_STOMP_LOW,
99301013Sadrian	HAL_BT_COEX_STOMP_NONE,
100301013Sadrian	HAL_BT_COEX_STOMP_ALL_FORCE,
101301013Sadrian	HAL_BT_COEX_STOMP_LOW_FORCE,
102301303Sadrian	HAL_BT_COEX_STOMP_AUDIO,
103301013Sadrian} HAL_BT_COEX_STOMP_TYPE;
104301013Sadrian
105301013Sadriantypedef struct {
106301013Sadrian	/* extend rx_clear after tx/rx to protect the burst (in usec). */
107301013Sadrian	u_int8_t	bt_time_extend;
108301013Sadrian
109301013Sadrian	/*
110301013Sadrian	 * extend rx_clear as long as txsm is
111301013Sadrian	 * transmitting or waiting for ack.
112301013Sadrian	 */
113301013Sadrian	HAL_BOOL	bt_txstate_extend;
114301013Sadrian
115301013Sadrian	/*
116301013Sadrian	 * extend rx_clear so that when tx_frame
117301013Sadrian	 * is asserted, rx_clear will drop.
118301013Sadrian	 */
119301013Sadrian	HAL_BOOL	bt_txframe_extend;
120301013Sadrian
121301013Sadrian	/*
122301013Sadrian	 * coexistence mode
123301013Sadrian	 */
124301013Sadrian	HAL_BT_COEX_MODE	bt_mode;
125301013Sadrian
126301013Sadrian	/*
127301013Sadrian	 * treat BT high priority traffic as
128301013Sadrian	 * a quiet collision
129301013Sadrian	 */
130301013Sadrian	HAL_BOOL	bt_quiet_collision;
131301013Sadrian
132301013Sadrian	/*
133301013Sadrian	 * invert rx_clear as WLAN_ACTIVE
134301013Sadrian	 */
135301013Sadrian	HAL_BOOL	bt_rxclear_polarity;
136301013Sadrian
137301013Sadrian	/*
138301013Sadrian	 * slotted mode only. indicate the time in usec
139301013Sadrian	 * from the rising edge of BT_ACTIVE to the time
140301013Sadrian	 * BT_PRIORITY can be sampled to indicate priority.
141301013Sadrian	 */
142301013Sadrian	u_int8_t	bt_priority_time;
143301013Sadrian
144301013Sadrian	/*
145301013Sadrian	 * slotted mode only. indicate the time in usec
146301013Sadrian	 * from the rising edge of BT_ACTIVE to the time
147301013Sadrian	 * BT_PRIORITY can be sampled to indicate tx/rx and
148301013Sadrian	 * BT_FREQ is sampled.
149301013Sadrian	 */
150301013Sadrian	u_int8_t	bt_first_slot_time;
151301013Sadrian
152301013Sadrian	/*
153301013Sadrian	 * slotted mode only. rx_clear and bt_ant decision
154301013Sadrian	 * will be held the entire time that BT_ACTIVE is asserted,
155301013Sadrian	 * otherwise the decision is made before every slot boundary.
156301013Sadrian	 */
157301013Sadrian	HAL_BOOL	bt_hold_rxclear;
158301013Sadrian} HAL_BT_COEX_CONFIG;
159301013Sadrian
160301013Sadrian#define HAL_BT_COEX_FLAG_LOW_ACK_PWR        0x00000001
161301013Sadrian#define HAL_BT_COEX_FLAG_LOWER_TX_PWR       0x00000002
162301013Sadrian#define HAL_BT_COEX_FLAG_ANT_DIV_ALLOW      0x00000004    /* Check Rx Diversity is allowed */
163301013Sadrian#define HAL_BT_COEX_FLAG_ANT_DIV_ENABLE     0x00000008    /* Check Diversity is on or off */
164301013Sadrian#define HAL_BT_COEX_FLAG_MCI_MAX_TX_PWR     0x00000010
165301013Sadrian#define HAL_BT_COEX_FLAG_MCI_FTP_STOMP_RX   0x00000020
166301013Sadrian
167301013Sadrian#define HAL_MCI_FLAG_DISABLE_TIMESTAMP      0x00000001      /* Disable time stamp */
168301013Sadrian
169301013Sadriantypedef enum mci_message_header {
170301013Sadrian    MCI_LNA_CTRL     = 0x10,        /* len = 0 */
171301013Sadrian    MCI_CONT_NACK    = 0x20,        /* len = 0 */
172301013Sadrian    MCI_CONT_INFO    = 0x30,        /* len = 4 */
173301013Sadrian    MCI_CONT_RST     = 0x40,        /* len = 0 */
174301013Sadrian    MCI_SCHD_INFO    = 0x50,        /* len = 16 */
175301013Sadrian    MCI_CPU_INT      = 0x60,        /* len = 4 */
176301013Sadrian    MCI_SYS_WAKING   = 0x70,        /* len = 0 */
177301013Sadrian    MCI_GPM          = 0x80,        /* len = 16 */
178301013Sadrian    MCI_LNA_INFO     = 0x90,        /* len = 1 */
179301013Sadrian    MCI_LNA_STATE    = 0x94,
180301013Sadrian    MCI_LNA_TAKE     = 0x98,
181301013Sadrian    MCI_LNA_TRANS    = 0x9c,
182301013Sadrian    MCI_SYS_SLEEPING = 0xa0,        /* len = 0 */
183301013Sadrian    MCI_REQ_WAKE     = 0xc0,        /* len = 0 */
184301013Sadrian    MCI_DEBUG_16     = 0xfe,        /* len = 2 */
185301013Sadrian    MCI_REMOTE_RESET = 0xff         /* len = 16 */
186301013Sadrian} MCI_MESSAGE_HEADER;
187301013Sadrian
188301013Sadrian/* Default remote BT device MCI COEX version */
189301013Sadrian#define MCI_GPM_COEX_MAJOR_VERSION_DEFAULT  3
190301013Sadrian#define MCI_GPM_COEX_MINOR_VERSION_DEFAULT  0
191301013Sadrian/* Local WLAN MCI COEX version */
192301013Sadrian#define MCI_GPM_COEX_MAJOR_VERSION_WLAN     3
193301013Sadrian#define MCI_GPM_COEX_MINOR_VERSION_WLAN     0
194301013Sadrian
195301013Sadriantypedef enum mci_gpm_subtype {
196301013Sadrian    MCI_GPM_BT_CAL_REQ      = 0,
197301013Sadrian    MCI_GPM_BT_CAL_GRANT    = 1,
198301013Sadrian    MCI_GPM_BT_CAL_DONE     = 2,
199301013Sadrian    MCI_GPM_WLAN_CAL_REQ    = 3,
200301013Sadrian    MCI_GPM_WLAN_CAL_GRANT  = 4,
201301013Sadrian    MCI_GPM_WLAN_CAL_DONE   = 5,
202301013Sadrian    MCI_GPM_COEX_AGENT      = 0x0C,
203301013Sadrian    MCI_GPM_RSVD_PATTERN    = 0xFE,
204301013Sadrian    MCI_GPM_RSVD_PATTERN32  = 0xFEFEFEFE,
205301013Sadrian    MCI_GPM_BT_DEBUG        = 0xFF
206301013Sadrian} MCI_GPM_SUBTYPE_T;
207301013Sadrian
208301013Sadriantypedef enum mci_gpm_coex_opcode {
209301013Sadrian    MCI_GPM_COEX_VERSION_QUERY      = 0,
210301013Sadrian    MCI_GPM_COEX_VERSION_RESPONSE   = 1,
211301013Sadrian    MCI_GPM_COEX_STATUS_QUERY       = 2,
212301013Sadrian    MCI_GPM_COEX_HALT_BT_GPM        = 3,
213301013Sadrian    MCI_GPM_COEX_WLAN_CHANNELS      = 4,
214301013Sadrian    MCI_GPM_COEX_BT_PROFILE_INFO    = 5,
215301013Sadrian    MCI_GPM_COEX_BT_STATUS_UPDATE   = 6,
216301013Sadrian    MCI_GPM_COEX_BT_UPDATE_FLAGS    = 7
217301013Sadrian} MCI_GPM_COEX_OPCODE_T;
218301013Sadrian
219301013Sadriantypedef enum mci_gpm_coex_query_type {
220301013Sadrian    /* WLAN information */
221301013Sadrian    MCI_GPM_COEX_QUERY_WLAN_ALL_INFO    = 0x01,
222301013Sadrian    /* BT information */
223301013Sadrian    MCI_GPM_COEX_QUERY_BT_ALL_INFO      = 0x01,
224301013Sadrian    MCI_GPM_COEX_QUERY_BT_TOPOLOGY      = 0x02,
225301013Sadrian    MCI_GPM_COEX_QUERY_BT_DEBUG         = 0x04
226301013Sadrian} MCI_GPM_COEX_QUERY_TYPE_T;
227301013Sadrian
228301013Sadriantypedef enum mci_gpm_coex_halt_bt_gpm {
229301013Sadrian    MCI_GPM_COEX_BT_GPM_UNHALT      = 0,
230301013Sadrian    MCI_GPM_COEX_BT_GPM_HALT        = 1
231301013Sadrian} MCI_GPM_COEX_HALT_BT_GPM_T;
232301013Sadrian
233301013Sadriantypedef enum mci_gpm_coex_profile_type {
234301013Sadrian    MCI_GPM_COEX_PROFILE_UNKNOWN    = 0,
235301013Sadrian    MCI_GPM_COEX_PROFILE_RFCOMM     = 1,
236301013Sadrian    MCI_GPM_COEX_PROFILE_A2DP       = 2,
237301013Sadrian    MCI_GPM_COEX_PROFILE_HID        = 3,
238301013Sadrian    MCI_GPM_COEX_PROFILE_BNEP       = 4,
239301013Sadrian    MCI_GPM_COEX_PROFILE_VOICE      = 5,
240301013Sadrian    MCI_GPM_COEX_PROFILE_MAX
241301013Sadrian} MCI_GPM_COEX_PROFILE_TYPE_T;
242301013Sadrian
243301013Sadriantypedef enum mci_gpm_coex_profile_state {
244301013Sadrian    MCI_GPM_COEX_PROFILE_STATE_END      = 0,
245301013Sadrian    MCI_GPM_COEX_PROFILE_STATE_START    = 1
246301013Sadrian} MCI_GPM_COEX_PROFILE_STATE_T;
247301013Sadrian
248301013Sadriantypedef enum mci_gpm_coex_profile_role {
249301013Sadrian    MCI_GPM_COEX_PROFILE_SLAVE      = 0,
250301013Sadrian    MCI_GPM_COEX_PROFILE_MASTER     = 1
251301013Sadrian} MCI_GPM_COEX_PROFILE_ROLE_T;
252301013Sadrian
253301013Sadriantypedef enum mci_gpm_coex_bt_status_type {
254301013Sadrian    MCI_GPM_COEX_BT_NONLINK_STATUS  = 0,
255301013Sadrian    MCI_GPM_COEX_BT_LINK_STATUS     = 1
256301013Sadrian} MCI_GPM_COEX_BT_STATUS_TYPE_T;
257301013Sadrian
258301013Sadriantypedef enum mci_gpm_coex_bt_status_state {
259301013Sadrian    MCI_GPM_COEX_BT_NORMAL_STATUS   = 0,
260301013Sadrian    MCI_GPM_COEX_BT_CRITICAL_STATUS = 1
261301013Sadrian} MCI_GPM_COEX_BT_STATUS_STATE_T;
262301013Sadrian
263301013Sadrian#define MCI_GPM_INVALID_PROFILE_HANDLE  0xff
264301013Sadrian
265301013Sadriantypedef enum mci_gpm_coex_bt_updata_flags_op {
266301013Sadrian    MCI_GPM_COEX_BT_FLAGS_READ          = 0x00,
267301013Sadrian    MCI_GPM_COEX_BT_FLAGS_SET           = 0x01,
268301013Sadrian    MCI_GPM_COEX_BT_FLAGS_CLEAR         = 0x02
269301013Sadrian} MCI_GPM_COEX_BT_FLAGS_OP_T;
270301013Sadrian
271301013Sadrian/* MCI GPM/Coex opcode/type definitions */
272301013Sadrianenum {
273301013Sadrian    MCI_GPM_COEX_W_GPM_PAYLOAD      = 1,
274301013Sadrian    MCI_GPM_COEX_B_GPM_TYPE         = 4,
275301013Sadrian    MCI_GPM_COEX_B_GPM_OPCODE       = 5,
276301013Sadrian    /* MCI_GPM_WLAN_CAL_REQ, MCI_GPM_WLAN_CAL_DONE */
277301013Sadrian    MCI_GPM_WLAN_CAL_W_SEQUENCE     = 2,
278301013Sadrian    /* MCI_GPM_COEX_VERSION_QUERY */
279301013Sadrian    /* MCI_GPM_COEX_VERSION_RESPONSE */
280301013Sadrian    MCI_GPM_COEX_B_MAJOR_VERSION    = 6,
281301013Sadrian    MCI_GPM_COEX_B_MINOR_VERSION    = 7,
282301013Sadrian    /* MCI_GPM_COEX_STATUS_QUERY */
283301013Sadrian    MCI_GPM_COEX_B_BT_BITMAP        = 6,
284301013Sadrian    MCI_GPM_COEX_B_WLAN_BITMAP      = 7,
285301013Sadrian    /* MCI_GPM_COEX_HALT_BT_GPM */
286301013Sadrian    MCI_GPM_COEX_B_HALT_STATE       = 6,
287301013Sadrian    /* MCI_GPM_COEX_WLAN_CHANNELS */
288301013Sadrian    MCI_GPM_COEX_B_CHANNEL_MAP      = 6,
289301013Sadrian    /* MCI_GPM_COEX_BT_PROFILE_INFO */
290301013Sadrian    MCI_GPM_COEX_B_PROFILE_TYPE     = 6,
291301013Sadrian    MCI_GPM_COEX_B_PROFILE_LINKID   = 7,
292301013Sadrian    MCI_GPM_COEX_B_PROFILE_STATE    = 8,
293301013Sadrian    MCI_GPM_COEX_B_PROFILE_ROLE     = 9,
294301013Sadrian    MCI_GPM_COEX_B_PROFILE_RATE     = 10,
295301013Sadrian    MCI_GPM_COEX_B_PROFILE_VOTYPE   = 11,
296301013Sadrian    MCI_GPM_COEX_H_PROFILE_T        = 12,
297301013Sadrian    MCI_GPM_COEX_B_PROFILE_W        = 14,
298301013Sadrian    MCI_GPM_COEX_B_PROFILE_A        = 15,
299301013Sadrian    /* MCI_GPM_COEX_BT_STATUS_UPDATE */
300301013Sadrian    MCI_GPM_COEX_B_STATUS_TYPE      = 6,
301301013Sadrian    MCI_GPM_COEX_B_STATUS_LINKID    = 7,
302301013Sadrian    MCI_GPM_COEX_B_STATUS_STATE     = 8,
303301013Sadrian    /* MCI_GPM_COEX_BT_UPDATE_FLAGS */
304301013Sadrian    MCI_GPM_COEX_B_BT_FLAGS_OP      = 10,
305301013Sadrian    MCI_GPM_COEX_W_BT_FLAGS         = 6
306301013Sadrian};
307301013Sadrian
308301013Sadrian#define MCI_GPM_RECYCLE(_p_gpm) \
309301013Sadrian    {                           \
310301013Sadrian        *(((u_int32_t *)(_p_gpm)) + MCI_GPM_COEX_W_GPM_PAYLOAD) = MCI_GPM_RSVD_PATTERN32; \
311301013Sadrian    }
312301013Sadrian#define MCI_GPM_TYPE(_p_gpm)    \
313301013Sadrian    (*(((u_int8_t *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) & 0xff)
314301013Sadrian#define MCI_GPM_OPCODE(_p_gpm)  \
315301013Sadrian    (*(((u_int8_t *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_OPCODE) & 0xff)
316301013Sadrian
317301013Sadrian#define MCI_GPM_SET_CAL_TYPE(_p_gpm, _cal_type)             \
318301013Sadrian    {                                                       \
319301013Sadrian        *(((u_int8_t *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) = (_cal_type) & 0xff; \
320301013Sadrian    }
321301013Sadrian#define MCI_GPM_SET_TYPE_OPCODE(_p_gpm, _type, _opcode)     \
322301013Sadrian    {                                                       \
323301013Sadrian        *(((u_int8_t *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) = (_type) & 0xff;     \
324301013Sadrian        *(((u_int8_t *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_OPCODE) = (_opcode) & 0xff;   \
325301013Sadrian    }
326301013Sadrian#define MCI_GPM_IS_CAL_TYPE(_type) ((_type) <= MCI_GPM_WLAN_CAL_DONE)
327301013Sadrian
328301013Sadrian#define MCI_NUM_BT_CHANNELS     79
329301013Sadrian
330301013Sadrian#define MCI_GPM_SET_CHANNEL_BIT(_p_gpm, _bt_chan)                   \
331301013Sadrian    {                                                               \
332301013Sadrian        if (_bt_chan < MCI_NUM_BT_CHANNELS) {                       \
333301013Sadrian            *(((u_int8_t *)(_p_gpm)) + MCI_GPM_COEX_B_CHANNEL_MAP + \
334301013Sadrian                (_bt_chan / 8)) |= 1 << (_bt_chan & 7);             \
335301013Sadrian        }                                                           \
336301013Sadrian    }
337301013Sadrian
338301013Sadrian#define MCI_GPM_CLR_CHANNEL_BIT(_p_gpm, _bt_chan)                   \
339301013Sadrian    {                                                               \
340301013Sadrian        if (_bt_chan < MCI_NUM_BT_CHANNELS) {                       \
341301013Sadrian            *(((u_int8_t *)(_p_gpm)) + MCI_GPM_COEX_B_CHANNEL_MAP + \
342301013Sadrian                (_bt_chan / 8)) &= ~(1 << (_bt_chan & 7));          \
343301013Sadrian        }                                                           \
344301013Sadrian    }
345301013Sadrian
346301013Sadrian#define HAL_MCI_INTERRUPT_SW_MSG_DONE            0x00000001
347301013Sadrian#define HAL_MCI_INTERRUPT_CPU_INT_MSG            0x00000002
348301013Sadrian#define HAL_MCI_INTERRUPT_RX_CHKSUM_FAIL         0x00000004
349301013Sadrian#define HAL_MCI_INTERRUPT_RX_INVALID_HDR         0x00000008
350301013Sadrian#define HAL_MCI_INTERRUPT_RX_HW_MSG_FAIL         0x00000010
351301013Sadrian#define HAL_MCI_INTERRUPT_RX_SW_MSG_FAIL         0x00000020
352301013Sadrian#define HAL_MCI_INTERRUPT_TX_HW_MSG_FAIL         0x00000080
353301013Sadrian#define HAL_MCI_INTERRUPT_TX_SW_MSG_FAIL         0x00000100
354301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG                 0x00000200
355301013Sadrian#define HAL_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE    0x00000400
356301013Sadrian#define HAL_MCI_INTERRUPT_CONT_INFO_TIMEOUT      0x80000000
357301013Sadrian#define HAL_MCI_INTERRUPT_MSG_FAIL_MASK ( HAL_MCI_INTERRUPT_RX_HW_MSG_FAIL | \
358301013Sadrian                                          HAL_MCI_INTERRUPT_RX_SW_MSG_FAIL | \
359301013Sadrian                                          HAL_MCI_INTERRUPT_TX_HW_MSG_FAIL | \
360301013Sadrian                                          HAL_MCI_INTERRUPT_TX_SW_MSG_FAIL )
361301013Sadrian
362301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_REMOTE_RESET    0x00000001
363301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_LNA_CONTROL     0x00000002
364301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_CONT_NACK       0x00000004
365301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_CONT_INFO       0x00000008
366301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_CONT_RST        0x00000010
367301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_SCHD_INFO       0x00000020
368301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_CPU_INT         0x00000040
369301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_GPM             0x00000100
370301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_LNA_INFO        0x00000200
371301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING    0x00000400
372301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_SYS_WAKING      0x00000800
373301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_REQ_WAKE        0x00001000
374301013Sadrian#define HAL_MCI_INTERRUPT_RX_MSG_MONITOR         (HAL_MCI_INTERRUPT_RX_MSG_LNA_CONTROL | \
375301013Sadrian                                                  HAL_MCI_INTERRUPT_RX_MSG_LNA_INFO    | \
376301013Sadrian                                                  HAL_MCI_INTERRUPT_RX_MSG_CONT_NACK   | \
377301013Sadrian                                                  HAL_MCI_INTERRUPT_RX_MSG_CONT_INFO   | \
378301013Sadrian                                                  HAL_MCI_INTERRUPT_RX_MSG_CONT_RST)
379301013Sadrian
380301013Sadriantypedef enum mci_bt_state {
381301013Sadrian    MCI_BT_SLEEP,
382301013Sadrian    MCI_BT_AWAKE,
383301013Sadrian    MCI_BT_CAL_START,
384301013Sadrian    MCI_BT_CAL
385301013Sadrian} MCI_BT_STATE_T;
386301013Sadrian
387301013Sadrian/* Type of state query */
388301013Sadriantypedef enum mci_state_type {
389301013Sadrian    HAL_MCI_STATE_ENABLE,
390301013Sadrian    HAL_MCI_STATE_INIT_GPM_OFFSET,
391301013Sadrian    HAL_MCI_STATE_NEXT_GPM_OFFSET,
392301013Sadrian    HAL_MCI_STATE_LAST_GPM_OFFSET,
393301013Sadrian    HAL_MCI_STATE_BT,
394301013Sadrian    HAL_MCI_STATE_SET_BT_SLEEP,
395301013Sadrian    HAL_MCI_STATE_SET_BT_AWAKE,
396301013Sadrian    HAL_MCI_STATE_SET_BT_CAL_START,
397301013Sadrian    HAL_MCI_STATE_SET_BT_CAL,
398301013Sadrian    HAL_MCI_STATE_LAST_SCHD_MSG_OFFSET,
399301013Sadrian    HAL_MCI_STATE_REMOTE_SLEEP,
400301013Sadrian    HAL_MCI_STATE_CONT_RSSI_POWER,
401301013Sadrian    HAL_MCI_STATE_CONT_PRIORITY,
402301013Sadrian    HAL_MCI_STATE_CONT_TXRX,
403301013Sadrian    HAL_MCI_STATE_RESET_REQ_WAKE,
404301013Sadrian    HAL_MCI_STATE_SEND_WLAN_COEX_VERSION,
405301013Sadrian    HAL_MCI_STATE_SET_BT_COEX_VERSION,
406301013Sadrian    HAL_MCI_STATE_SEND_WLAN_CHANNELS,
407301013Sadrian    HAL_MCI_STATE_SEND_VERSION_QUERY,
408301013Sadrian    HAL_MCI_STATE_SEND_STATUS_QUERY,
409301013Sadrian    HAL_MCI_STATE_NEED_FLUSH_BT_INFO,
410301013Sadrian    HAL_MCI_STATE_SET_CONCUR_TX_PRI,
411301013Sadrian    HAL_MCI_STATE_RECOVER_RX,
412301013Sadrian    HAL_MCI_STATE_NEED_FTP_STOMP,
413301013Sadrian    HAL_MCI_STATE_NEED_TUNING,
414301013Sadrian    HAL_MCI_STATE_SHARED_CHAIN_CONCUR_TX,
415301013Sadrian    HAL_MCI_STATE_DEBUG,
416301013Sadrian    HAL_MCI_STATE_MAX
417301013Sadrian} HAL_MCI_STATE_TYPE;
418301013Sadrian
419301013Sadrian#define HAL_MCI_STATE_DEBUG_REQ_BT_DEBUG    1
420301013Sadrian
421301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_UPDATE_CORR          0x00000002
422301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_UPDATE_HDR           0x00000004
423301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_UPDATE_PLD           0x00000008
424301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_LNA_CTRL             0x00000010
425301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_DEBUG                0x00000020
426301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_SCHED_MSG            0x00000040
427301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_CONT_MSG             0x00000080
428301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_COEX_GPM             0x00000100
429301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_CPU_INT_MSG          0x00000200
430301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_MCI_MODE             0x00000400
431301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_EGRET_MODE           0x00000800
432301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_JUPITER_MODE         0x00001000
433301013Sadrian#define HAL_MCI_BT_MCI_FLAGS_OTHER                0x00010000
434301013Sadrian
435301013Sadrian#define HAL_MCI_DEFAULT_BT_MCI_FLAGS        0x00011dde
436301013Sadrian/*
437301013Sadrian    HAL_MCI_BT_MCI_FLAGS_UPDATE_CORR  = 1
438301013Sadrian    HAL_MCI_BT_MCI_FLAGS_UPDATE_HDR   = 1
439301013Sadrian    HAL_MCI_BT_MCI_FLAGS_UPDATE_PLD   = 1
440301013Sadrian    HAL_MCI_BT_MCI_FLAGS_LNA_CTRL     = 1
441301013Sadrian    HAL_MCI_BT_MCI_FLAGS_DEBUG        = 0
442301013Sadrian    HAL_MCI_BT_MCI_FLAGS_SCHED_MSG    = 1
443301013Sadrian    HAL_MCI_BT_MCI_FLAGS_CONT_MSG     = 1
444301013Sadrian    HAL_MCI_BT_MCI_FLAGS_COEX_GPM     = 1
445301013Sadrian    HAL_MCI_BT_MCI_FLAGS_CPU_INT_MSG  = 0
446301013Sadrian    HAL_MCI_BT_MCI_FLAGS_MCI_MODE     = 1
447301013Sadrian    HAL_MCI_BT_MCI_FLAGS_EGRET_MODE   = 1
448301013Sadrian    HAL_MCI_BT_MCI_FLAGS_JUPITER_MODE = 1
449301013Sadrian    HAL_MCI_BT_MCI_FLAGS_OTHER        = 1
450301013Sadrian*/
451301013Sadrian
452301013Sadrian#define HAL_MCI_TOGGLE_BT_MCI_FLAGS \
453301013Sadrian    (   HAL_MCI_BT_MCI_FLAGS_UPDATE_CORR    |   \
454301013Sadrian        HAL_MCI_BT_MCI_FLAGS_UPDATE_HDR     |   \
455301013Sadrian        HAL_MCI_BT_MCI_FLAGS_UPDATE_PLD     |   \
456301013Sadrian        HAL_MCI_BT_MCI_FLAGS_MCI_MODE   )
457301013Sadrian
458301013Sadrian#define HAL_MCI_2G_FLAGS_CLEAR_MASK         0x00000000
459301013Sadrian#define HAL_MCI_2G_FLAGS_SET_MASK           HAL_MCI_TOGGLE_BT_MCI_FLAGS
460301013Sadrian#define HAL_MCI_2G_FLAGS                    HAL_MCI_DEFAULT_BT_MCI_FLAGS
461301013Sadrian
462301013Sadrian#define HAL_MCI_5G_FLAGS_CLEAR_MASK         HAL_MCI_TOGGLE_BT_MCI_FLAGS
463301013Sadrian#define HAL_MCI_5G_FLAGS_SET_MASK           0x00000000
464301013Sadrian#define HAL_MCI_5G_FLAGS                    (HAL_MCI_DEFAULT_BT_MCI_FLAGS & \
465301013Sadrian                                            ~HAL_MCI_TOGGLE_BT_MCI_FLAGS)
466301013Sadrian
467301013Sadrian#define HAL_MCI_GPM_NOMORE  0
468301013Sadrian#define HAL_MCI_GPM_MORE    1
469301013Sadrian#define HAL_MCI_GPM_INVALID 0xffffffff
470301013Sadrian
471301013Sadrian#define ATH_AIC_MAX_BT_CHANNEL          79
472301013Sadrian
473301013Sadrian/*
474301013Sadrian * Default value for Jupiter   is 0x00002201
475301013Sadrian * Default value for Aphrodite is 0x00002282
476301013Sadrian */
477301013Sadrian#define ATH_MCI_CONFIG_CONCUR_TX            0x00000003
478301013Sadrian#define ATH_MCI_CONFIG_MCI_OBS_MCI          0x00000004
479301013Sadrian#define ATH_MCI_CONFIG_MCI_OBS_TXRX         0x00000008
480301013Sadrian#define ATH_MCI_CONFIG_MCI_OBS_BT           0x00000010
481301013Sadrian#define ATH_MCI_CONFIG_DISABLE_MCI_CAL      0x00000020
482301013Sadrian#define ATH_MCI_CONFIG_DISABLE_OSLA         0x00000040
483301013Sadrian#define ATH_MCI_CONFIG_DISABLE_FTP_STOMP    0x00000080
484301013Sadrian#define ATH_MCI_CONFIG_AGGR_THRESH          0x00000700
485301013Sadrian#define ATH_MCI_CONFIG_AGGR_THRESH_S        8
486301013Sadrian#define ATH_MCI_CONFIG_DISABLE_AGGR_THRESH  0x00000800
487301013Sadrian#define ATH_MCI_CONFIG_CLK_DIV              0x00003000
488301013Sadrian#define ATH_MCI_CONFIG_CLK_DIV_S            12
489301013Sadrian#define ATH_MCI_CONFIG_DISABLE_TUNING       0x00004000
490301089Sadrian#define ATH_MCI_CONFIG_DISABLE_AIC          0x00008000
491301089Sadrian#define ATH_MCI_CONFIG_AIC_CAL_NUM_CHAN     0x007f0000
492301089Sadrian#define ATH_MCI_CONFIG_AIC_CAL_NUM_CHAN_S   16
493301089Sadrian#define ATH_MCI_CONFIG_NO_QUIET_ACK         0x00800000
494301089Sadrian#define ATH_MCI_CONFIG_NO_QUIET_ACK_S       23
495301089Sadrian#define ATH_MCI_CONFIG_ANT_ARCH             0x07000000
496301089Sadrian#define ATH_MCI_CONFIG_ANT_ARCH_S           24
497301089Sadrian#define ATH_MCI_CONFIG_FORCE_QUIET_ACK      0x08000000
498301089Sadrian#define ATH_MCI_CONFIG_FORCE_QUIET_ACK_S    27
499301089Sadrian#define ATH_MCI_CONFIG_FORCE_2CHAIN_ACK     0x10000000
500301089Sadrian#define ATH_MCI_CONFIG_MCI_STAT_DBG         0x20000000
501301013Sadrian#define ATH_MCI_CONFIG_MCI_WEIGHT_DBG       0x40000000
502301013Sadrian#define ATH_MCI_CONFIG_DISABLE_MCI          0x80000000
503301013Sadrian
504301013Sadrian#define ATH_MCI_CONFIG_MCI_OBS_MASK     ( ATH_MCI_CONFIG_MCI_OBS_MCI | \
505301013Sadrian                                          ATH_MCI_CONFIG_MCI_OBS_TXRX | \
506301013Sadrian                                          ATH_MCI_CONFIG_MCI_OBS_BT )
507301013Sadrian#define ATH_MCI_CONFIG_MCI_OBS_GPIO     0x0000002F
508301013Sadrian
509301089Sadrian#define ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_NON_SHARED 0x00
510301089Sadrian#define ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_SHARED     0x01
511301089Sadrian#define ATH_MCI_ANT_ARCH_2_ANT_PA_LNA_NON_SHARED 0x02
512301089Sadrian#define ATH_MCI_ANT_ARCH_2_ANT_PA_LNA_SHARED     0x03
513301089Sadrian#define ATH_MCI_ANT_ARCH_3_ANT                   0x04
514301089Sadrian
515301089Sadrian#define	MCI_ANT_ARCH_PA_LNA_SHARED(c)		\
516301089Sadrian	    ((MS(c, ATH_MCI_CONFIG_ANT_ARCH) == ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_SHARED) || \
517301089Sadrian	    (MS(c, ATH_MCI_CONFIG_ANT_ARCH) == ATH_MCI_ANT_ARCH_2_ANT_PA_LNA_SHARED))
518301089Sadrian
519301013Sadrian#define ATH_MCI_CONCUR_TX_SHARED_CHN    0x01
520301013Sadrian#define ATH_MCI_CONCUR_TX_UNSHARED_CHN  0x02
521301013Sadrian#define ATH_MCI_CONCUR_TX_DEBUG         0x03
522301013Sadrian
523301013Sadrian#endif
524