179 lines · c
1/*2 * Copyright (c) 2010-2011 Atheros Communications Inc.3 *4 * Permission to use, copy, modify, and/or distribute this software for any5 * purpose with or without fee is hereby granted, provided that the above6 * copyright notice and this permission notice appear in all copies.7 *8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.15 */16 17#ifndef MCI_H18#define MCI_H19 20#include "ar9003_mci.h"21 22#define ATH_MCI_SCHED_BUF_SIZE (16 * 16) /* 16 entries, 4 dword each */23#define ATH_MCI_GPM_MAX_ENTRY 1624#define ATH_MCI_GPM_BUF_SIZE (ATH_MCI_GPM_MAX_ENTRY * 16)25#define ATH_MCI_DEF_BT_PERIOD 4026#define ATH_MCI_BDR_DUTY_CYCLE 2027#define ATH_MCI_MAX_DUTY_CYCLE 9028 29#define ATH_MCI_DEF_AGGR_LIMIT 6 /* in 0.24 ms */30#define ATH_MCI_MAX_ACL_PROFILE 731#define ATH_MCI_MAX_SCO_PROFILE 132#define ATH_MCI_MAX_PROFILE (ATH_MCI_MAX_ACL_PROFILE +\33 ATH_MCI_MAX_SCO_PROFILE)34 35#define ATH_MCI_INQUIRY_PRIO 6236#define ATH_MCI_HI_PRIO 6037#define ATH_MCI_NUM_BT_CHANNELS 7938#define ATH_MCI_CONCUR_TX_SWITCH 539 40#define MCI_GPM_SET_CHANNEL_BIT(_p_gpm, _bt_chan) \41 do { \42 if (_bt_chan < ATH_MCI_NUM_BT_CHANNELS) { \43 *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_CHANNEL_MAP + \44 (_bt_chan / 8)) |= (1 << (_bt_chan & 7)); \45 } \46 } while (0)47 48#define MCI_GPM_CLR_CHANNEL_BIT(_p_gpm, _bt_chan) \49 do { \50 if (_bt_chan < ATH_MCI_NUM_BT_CHANNELS) { \51 *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_CHANNEL_MAP + \52 (_bt_chan / 8)) &= ~(1 << (_bt_chan & 7));\53 } \54 } while (0)55 56#define INC_PROF(_mci, _info) do { \57 switch (_info->type) { \58 case MCI_GPM_COEX_PROFILE_RFCOMM:\59 _mci->num_other_acl++; \60 break; \61 case MCI_GPM_COEX_PROFILE_A2DP: \62 _mci->num_a2dp++; \63 if (!_info->edr) \64 _mci->num_bdr++; \65 break; \66 case MCI_GPM_COEX_PROFILE_HID: \67 _mci->num_hid++; \68 break; \69 case MCI_GPM_COEX_PROFILE_BNEP: \70 _mci->num_pan++; \71 break; \72 case MCI_GPM_COEX_PROFILE_VOICE: \73 case MCI_GPM_COEX_PROFILE_A2DPVO:\74 _mci->num_sco++; \75 break; \76 default: \77 break; \78 } \79 } while (0)80 81#define DEC_PROF(_mci, _info) do { \82 switch (_info->type) { \83 case MCI_GPM_COEX_PROFILE_RFCOMM:\84 _mci->num_other_acl--; \85 break; \86 case MCI_GPM_COEX_PROFILE_A2DP: \87 _mci->num_a2dp--; \88 if (!_info->edr) \89 _mci->num_bdr--; \90 break; \91 case MCI_GPM_COEX_PROFILE_HID: \92 _mci->num_hid--; \93 break; \94 case MCI_GPM_COEX_PROFILE_BNEP: \95 _mci->num_pan--; \96 break; \97 case MCI_GPM_COEX_PROFILE_VOICE: \98 case MCI_GPM_COEX_PROFILE_A2DPVO:\99 _mci->num_sco--; \100 break; \101 default: \102 break; \103 } \104 } while (0)105 106#define NUM_PROF(_mci) (_mci->num_other_acl + _mci->num_a2dp + \107 _mci->num_hid + _mci->num_pan + _mci->num_sco)108 109struct ath_mci_profile_info {110 u8 type;111 u8 conn_handle;112 bool start;113 bool master;114 bool edr;115 u8 voice_type;116 u16 T; /* Voice: Tvoice, HID: Tsniff, in slots */117 u8 W; /* Voice: Wvoice, HID: Sniff timeout, in slots */118 u8 A; /* HID: Sniff attempt, in slots */119 struct list_head list;120};121 122struct ath_mci_profile_status {123 bool is_critical;124 bool is_link;125 u8 conn_handle;126};127 128struct ath_mci_profile {129 struct list_head info;130 DECLARE_BITMAP(status, ATH_MCI_MAX_PROFILE);131 u16 aggr_limit;132 u8 num_mgmt;133 u8 num_sco;134 u8 num_a2dp;135 u8 num_hid;136 u8 num_pan;137 u8 num_other_acl;138 u8 num_bdr;139 u8 voice_priority;140};141 142struct ath_mci_buf {143 void *bf_addr; /* virtual addr of desc */144 dma_addr_t bf_paddr; /* physical addr of buffer */145 u32 bf_len; /* len of data */146};147 148struct ath_mci_coex {149 struct ath_mci_buf sched_buf;150 struct ath_mci_buf gpm_buf;151};152 153void ath_mci_flush_profile(struct ath_mci_profile *mci);154int ath_mci_setup(struct ath_softc *sc);155void ath_mci_cleanup(struct ath_softc *sc);156void ath_mci_intr(struct ath_softc *sc);157void ath9k_mci_update_rssi(struct ath_softc *sc);158 159#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT160void ath_mci_enable(struct ath_softc *sc);161void ath9k_mci_update_wlan_channels(struct ath_softc *sc, bool allow_all);162void ath9k_mci_set_txpower(struct ath_softc *sc, bool setchannel,163 bool concur_tx);164#else165static inline void ath_mci_enable(struct ath_softc *sc)166{167}168static inline void ath9k_mci_update_wlan_channels(struct ath_softc *sc,169 bool allow_all)170{171}172static inline void ath9k_mci_set_txpower(struct ath_softc *sc, bool setchannel,173 bool concur_tx)174{175}176#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */177 178#endif /* MCI_H*/179