162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright (c) 2010-2011 Atheros Communications Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission to use, copy, modify, and/or distribute this software for any 562306a36Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above 662306a36Sopenharmony_ci * copyright notice and this permission notice appear in all copies. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 962306a36Sopenharmony_ci * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1062306a36Sopenharmony_ci * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1162306a36Sopenharmony_ci * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1262306a36Sopenharmony_ci * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1362306a36Sopenharmony_ci * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1462306a36Sopenharmony_ci * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#ifndef MCI_H 1862306a36Sopenharmony_ci#define MCI_H 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include "ar9003_mci.h" 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define ATH_MCI_SCHED_BUF_SIZE (16 * 16) /* 16 entries, 4 dword each */ 2362306a36Sopenharmony_ci#define ATH_MCI_GPM_MAX_ENTRY 16 2462306a36Sopenharmony_ci#define ATH_MCI_GPM_BUF_SIZE (ATH_MCI_GPM_MAX_ENTRY * 16) 2562306a36Sopenharmony_ci#define ATH_MCI_DEF_BT_PERIOD 40 2662306a36Sopenharmony_ci#define ATH_MCI_BDR_DUTY_CYCLE 20 2762306a36Sopenharmony_ci#define ATH_MCI_MAX_DUTY_CYCLE 90 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define ATH_MCI_DEF_AGGR_LIMIT 6 /* in 0.24 ms */ 3062306a36Sopenharmony_ci#define ATH_MCI_MAX_ACL_PROFILE 7 3162306a36Sopenharmony_ci#define ATH_MCI_MAX_SCO_PROFILE 1 3262306a36Sopenharmony_ci#define ATH_MCI_MAX_PROFILE (ATH_MCI_MAX_ACL_PROFILE +\ 3362306a36Sopenharmony_ci ATH_MCI_MAX_SCO_PROFILE) 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define ATH_MCI_INQUIRY_PRIO 62 3662306a36Sopenharmony_ci#define ATH_MCI_HI_PRIO 60 3762306a36Sopenharmony_ci#define ATH_MCI_NUM_BT_CHANNELS 79 3862306a36Sopenharmony_ci#define ATH_MCI_CONCUR_TX_SWITCH 5 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define MCI_GPM_SET_CHANNEL_BIT(_p_gpm, _bt_chan) \ 4162306a36Sopenharmony_ci do { \ 4262306a36Sopenharmony_ci if (_bt_chan < ATH_MCI_NUM_BT_CHANNELS) { \ 4362306a36Sopenharmony_ci *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_CHANNEL_MAP + \ 4462306a36Sopenharmony_ci (_bt_chan / 8)) |= (1 << (_bt_chan & 7)); \ 4562306a36Sopenharmony_ci } \ 4662306a36Sopenharmony_ci } while (0) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define MCI_GPM_CLR_CHANNEL_BIT(_p_gpm, _bt_chan) \ 4962306a36Sopenharmony_ci do { \ 5062306a36Sopenharmony_ci if (_bt_chan < ATH_MCI_NUM_BT_CHANNELS) { \ 5162306a36Sopenharmony_ci *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_CHANNEL_MAP + \ 5262306a36Sopenharmony_ci (_bt_chan / 8)) &= ~(1 << (_bt_chan & 7));\ 5362306a36Sopenharmony_ci } \ 5462306a36Sopenharmony_ci } while (0) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define INC_PROF(_mci, _info) do { \ 5762306a36Sopenharmony_ci switch (_info->type) { \ 5862306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_RFCOMM:\ 5962306a36Sopenharmony_ci _mci->num_other_acl++; \ 6062306a36Sopenharmony_ci break; \ 6162306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_A2DP: \ 6262306a36Sopenharmony_ci _mci->num_a2dp++; \ 6362306a36Sopenharmony_ci if (!_info->edr) \ 6462306a36Sopenharmony_ci _mci->num_bdr++; \ 6562306a36Sopenharmony_ci break; \ 6662306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_HID: \ 6762306a36Sopenharmony_ci _mci->num_hid++; \ 6862306a36Sopenharmony_ci break; \ 6962306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_BNEP: \ 7062306a36Sopenharmony_ci _mci->num_pan++; \ 7162306a36Sopenharmony_ci break; \ 7262306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_VOICE: \ 7362306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_A2DPVO:\ 7462306a36Sopenharmony_ci _mci->num_sco++; \ 7562306a36Sopenharmony_ci break; \ 7662306a36Sopenharmony_ci default: \ 7762306a36Sopenharmony_ci break; \ 7862306a36Sopenharmony_ci } \ 7962306a36Sopenharmony_ci } while (0) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define DEC_PROF(_mci, _info) do { \ 8262306a36Sopenharmony_ci switch (_info->type) { \ 8362306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_RFCOMM:\ 8462306a36Sopenharmony_ci _mci->num_other_acl--; \ 8562306a36Sopenharmony_ci break; \ 8662306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_A2DP: \ 8762306a36Sopenharmony_ci _mci->num_a2dp--; \ 8862306a36Sopenharmony_ci if (!_info->edr) \ 8962306a36Sopenharmony_ci _mci->num_bdr--; \ 9062306a36Sopenharmony_ci break; \ 9162306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_HID: \ 9262306a36Sopenharmony_ci _mci->num_hid--; \ 9362306a36Sopenharmony_ci break; \ 9462306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_BNEP: \ 9562306a36Sopenharmony_ci _mci->num_pan--; \ 9662306a36Sopenharmony_ci break; \ 9762306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_VOICE: \ 9862306a36Sopenharmony_ci case MCI_GPM_COEX_PROFILE_A2DPVO:\ 9962306a36Sopenharmony_ci _mci->num_sco--; \ 10062306a36Sopenharmony_ci break; \ 10162306a36Sopenharmony_ci default: \ 10262306a36Sopenharmony_ci break; \ 10362306a36Sopenharmony_ci } \ 10462306a36Sopenharmony_ci } while (0) 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#define NUM_PROF(_mci) (_mci->num_other_acl + _mci->num_a2dp + \ 10762306a36Sopenharmony_ci _mci->num_hid + _mci->num_pan + _mci->num_sco) 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistruct ath_mci_profile_info { 11062306a36Sopenharmony_ci u8 type; 11162306a36Sopenharmony_ci u8 conn_handle; 11262306a36Sopenharmony_ci bool start; 11362306a36Sopenharmony_ci bool master; 11462306a36Sopenharmony_ci bool edr; 11562306a36Sopenharmony_ci u8 voice_type; 11662306a36Sopenharmony_ci u16 T; /* Voice: Tvoice, HID: Tsniff, in slots */ 11762306a36Sopenharmony_ci u8 W; /* Voice: Wvoice, HID: Sniff timeout, in slots */ 11862306a36Sopenharmony_ci u8 A; /* HID: Sniff attempt, in slots */ 11962306a36Sopenharmony_ci struct list_head list; 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistruct ath_mci_profile_status { 12362306a36Sopenharmony_ci bool is_critical; 12462306a36Sopenharmony_ci bool is_link; 12562306a36Sopenharmony_ci u8 conn_handle; 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistruct ath_mci_profile { 12962306a36Sopenharmony_ci struct list_head info; 13062306a36Sopenharmony_ci DECLARE_BITMAP(status, ATH_MCI_MAX_PROFILE); 13162306a36Sopenharmony_ci u16 aggr_limit; 13262306a36Sopenharmony_ci u8 num_mgmt; 13362306a36Sopenharmony_ci u8 num_sco; 13462306a36Sopenharmony_ci u8 num_a2dp; 13562306a36Sopenharmony_ci u8 num_hid; 13662306a36Sopenharmony_ci u8 num_pan; 13762306a36Sopenharmony_ci u8 num_other_acl; 13862306a36Sopenharmony_ci u8 num_bdr; 13962306a36Sopenharmony_ci u8 voice_priority; 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistruct ath_mci_buf { 14362306a36Sopenharmony_ci void *bf_addr; /* virtual addr of desc */ 14462306a36Sopenharmony_ci dma_addr_t bf_paddr; /* physical addr of buffer */ 14562306a36Sopenharmony_ci u32 bf_len; /* len of data */ 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistruct ath_mci_coex { 14962306a36Sopenharmony_ci struct ath_mci_buf sched_buf; 15062306a36Sopenharmony_ci struct ath_mci_buf gpm_buf; 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_civoid ath_mci_flush_profile(struct ath_mci_profile *mci); 15462306a36Sopenharmony_ciint ath_mci_setup(struct ath_softc *sc); 15562306a36Sopenharmony_civoid ath_mci_cleanup(struct ath_softc *sc); 15662306a36Sopenharmony_civoid ath_mci_intr(struct ath_softc *sc); 15762306a36Sopenharmony_civoid ath9k_mci_update_rssi(struct ath_softc *sc); 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 16062306a36Sopenharmony_civoid ath_mci_enable(struct ath_softc *sc); 16162306a36Sopenharmony_civoid ath9k_mci_update_wlan_channels(struct ath_softc *sc, bool allow_all); 16262306a36Sopenharmony_civoid ath9k_mci_set_txpower(struct ath_softc *sc, bool setchannel, 16362306a36Sopenharmony_ci bool concur_tx); 16462306a36Sopenharmony_ci#else 16562306a36Sopenharmony_cistatic inline void ath_mci_enable(struct ath_softc *sc) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_cistatic inline void ath9k_mci_update_wlan_channels(struct ath_softc *sc, 16962306a36Sopenharmony_ci bool allow_all) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci} 17262306a36Sopenharmony_cistatic inline void ath9k_mci_set_txpower(struct ath_softc *sc, bool setchannel, 17362306a36Sopenharmony_ci bool concur_tx) 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci} 17662306a36Sopenharmony_ci#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */ 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci#endif /* MCI_H*/ 179