1 /****************************************************************************** 2 * 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * GPL LICENSE SUMMARY 7 * 8 * Copyright(c) 2013 Intel Corporation. All rights reserved. 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of version 2 of the GNU General Public License as 12 * published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, but 15 * WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 22 * USA 23 * 24 * The full GNU General Public License is included in this distribution 25 * in the file called COPYING. 26 * 27 * Contact Information: 28 * Intel Linux Wireless <ilw@linux.intel.com> 29 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 30 * 31 * BSD LICENSE 32 * 33 * Copyright(c) 2013 Intel Corporation. All rights reserved. 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 40 * * Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * * Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in 44 * the documentation and/or other materials provided with the 45 * distribution. 46 * * Neither the name Intel Corporation nor the names of its 47 * contributors may be used to endorse or promote products derived 48 * from this software without specific prior written permission. 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 61 *****************************************************************************/ 62 63 #ifndef __fw_api_bt_coex_h__ 64 #define __fw_api_bt_coex_h__ 65 66 #include <linux/types.h> 67 #include <linux/bitops.h> 68 69 #define BITS(nb) (BIT(nb) - 1) 70 71 /** 72 * enum iwl_bt_coex_flags - flags for BT_COEX command 73 * @BT_CH_PRIMARY_EN: 74 * @BT_CH_SECONDARY_EN: 75 * @BT_NOTIF_COEX_OFF: 76 * @BT_COEX_MODE_POS: 77 * @BT_COEX_MODE_MSK: 78 * @BT_COEX_DISABLE: 79 * @BT_COEX_2W: 80 * @BT_COEX_3W: 81 * @BT_COEX_NW: 82 * @BT_USE_DEFAULTS: 83 * @BT_SYNC_2_BT_DISABLE: 84 * @BT_COEX_CORUNNING_TBL_EN: 85 */ 86 enum iwl_bt_coex_flags { 87 BT_CH_PRIMARY_EN = BIT(0), 88 BT_CH_SECONDARY_EN = BIT(1), 89 BT_NOTIF_COEX_OFF = BIT(2), 90 BT_COEX_MODE_POS = 3, 91 BT_COEX_MODE_MSK = BITS(3) << BT_COEX_MODE_POS, 92 BT_COEX_DISABLE = 0x0 << BT_COEX_MODE_POS, 93 BT_COEX_2W = 0x1 << BT_COEX_MODE_POS, 94 BT_COEX_3W = 0x2 << BT_COEX_MODE_POS, 95 BT_COEX_NW = 0x3 << BT_COEX_MODE_POS, 96 BT_USE_DEFAULTS = BIT(6), 97 BT_SYNC_2_BT_DISABLE = BIT(7), 98 /* 99 * For future use - when the flags will be enlarged 100 * BT_COEX_CORUNNING_TBL_EN = BIT(8), 101 */ 102 }; 103 104 /* 105 * indicates what has changed in the BT_COEX command. 106 */ 107 enum iwl_bt_coex_valid_bit_msk { 108 BT_VALID_ENABLE = BIT(0), 109 BT_VALID_BT_PRIO_BOOST = BIT(1), 110 BT_VALID_MAX_KILL = BIT(2), 111 BT_VALID_3W_TMRS = BIT(3), 112 BT_VALID_KILL_ACK = BIT(4), 113 BT_VALID_KILL_CTS = BIT(5), 114 BT_VALID_REDUCED_TX_POWER = BIT(6), 115 BT_VALID_LUT = BIT(7), 116 BT_VALID_WIFI_RX_SW_PRIO_BOOST = BIT(8), 117 BT_VALID_WIFI_TX_SW_PRIO_BOOST = BIT(9), 118 BT_VALID_MULTI_PRIO_LUT = BIT(10), 119 BT_VALID_TRM_KICK_FILTER = BIT(11), 120 BT_VALID_CORUN_LUT_20 = BIT(12), 121 BT_VALID_CORUN_LUT_40 = BIT(13), 122 BT_VALID_ANT_ISOLATION = BIT(14), 123 BT_VALID_ANT_ISOLATION_THRS = BIT(15), 124 /* 125 * For future use - when the valid flags will be enlarged 126 * BT_VALID_TXTX_DELTA_FREQ_THRS = BIT(16), 127 * BT_VALID_TXRX_MAX_FREQ_0 = BIT(17), 128 */ 129 }; 130 131 /** 132 * enum iwl_bt_reduced_tx_power - allows to reduce txpower for WiFi frames. 133 * @BT_REDUCED_TX_POWER_CTL: reduce Tx power for control frames 134 * @BT_REDUCED_TX_POWER_DATA: reduce Tx power for data frames 135 * 136 * This mechanism allows to have BT and WiFi run concurrently. Since WiFi 137 * reduces its Tx power, it can work along with BT, hence reducing the amount 138 * of WiFi frames being killed by BT. 139 */ 140 enum iwl_bt_reduced_tx_power { 141 BT_REDUCED_TX_POWER_CTL = BIT(0), 142 BT_REDUCED_TX_POWER_DATA = BIT(1), 143 }; 144 145 #define BT_COEX_LUT_SIZE (12) 146 147 /** 148 * struct iwl_bt_coex_cmd - bt coex configuration command 149 * @flags:&enum iwl_bt_coex_flags 150 * @lead_time: 151 * @max_kill: 152 * @bt3_time_t7_value: 153 * @kill_ack_msk: 154 * @kill_cts_msk: 155 * @bt3_prio_sample_time: 156 * @bt3_timer_t2_value: 157 * @bt4_reaction_time: 158 * @decision_lut[12]: 159 * @bt_reduced_tx_power: enum %iwl_bt_reduced_tx_power 160 * @valid_bit_msk: enum %iwl_bt_coex_valid_bit_msk 161 * @bt_prio_boost: values for PTA boost register 162 * @wifi_tx_prio_boost: SW boost of wifi tx priority 163 * @wifi_rx_prio_boost: SW boost of wifi rx priority 164 * 165 * The structure is used for the BT_COEX command. 166 */ 167 struct iwl_bt_coex_cmd { 168 u8 flags; 169 u8 lead_time; 170 u8 max_kill; 171 u8 bt3_time_t7_value; 172 __le32 kill_ack_msk; 173 __le32 kill_cts_msk; 174 u8 bt3_prio_sample_time; 175 u8 bt3_timer_t2_value; 176 __le16 bt4_reaction_time; 177 __le32 decision_lut[BT_COEX_LUT_SIZE]; 178 u8 bt_reduced_tx_power; 179 u8 reserved; 180 __le16 valid_bit_msk; 181 __le32 bt_prio_boost; 182 u8 reserved2; 183 u8 wifi_tx_prio_boost; 184 __le16 wifi_rx_prio_boost; 185 } __packed; /* BT_COEX_CMD_API_S_VER_3 */ 186 187 #define BT_MBOX(n_dw, _msg, _pos, _nbits) \ 188 BT_MBOX##n_dw##_##_msg##_POS = (_pos), \ 189 BT_MBOX##n_dw##_##_msg = BITS(_nbits) << BT_MBOX##n_dw##_##_msg##_POS 190 191 enum iwl_bt_mxbox_dw0 { 192 BT_MBOX(0, LE_SLAVE_LAT, 0, 3), 193 BT_MBOX(0, LE_PROF1, 3, 1), 194 BT_MBOX(0, LE_PROF2, 4, 1), 195 BT_MBOX(0, LE_PROF_OTHER, 5, 1), 196 BT_MBOX(0, CHL_SEQ_N, 8, 4), 197 BT_MBOX(0, INBAND_S, 13, 1), 198 BT_MBOX(0, LE_MIN_RSSI, 16, 4), 199 BT_MBOX(0, LE_SCAN, 20, 1), 200 BT_MBOX(0, LE_ADV, 21, 1), 201 BT_MBOX(0, LE_MAX_TX_POWER, 24, 4), 202 BT_MBOX(0, OPEN_CON_1, 28, 2), 203 }; 204 205 enum iwl_bt_mxbox_dw1 { 206 BT_MBOX(1, BR_MAX_TX_POWER, 0, 4), 207 BT_MBOX(1, IP_SR, 4, 1), 208 BT_MBOX(1, LE_MSTR, 5, 1), 209 BT_MBOX(1, AGGR_TRFC_LD, 8, 6), 210 BT_MBOX(1, MSG_TYPE, 16, 3), 211 BT_MBOX(1, SSN, 19, 2), 212 }; 213 214 enum iwl_bt_mxbox_dw2 { 215 BT_MBOX(2, SNIFF_ACT, 0, 3), 216 BT_MBOX(2, PAG, 3, 1), 217 BT_MBOX(2, INQUIRY, 4, 1), 218 BT_MBOX(2, CONN, 5, 1), 219 BT_MBOX(2, SNIFF_INTERVAL, 8, 5), 220 BT_MBOX(2, DISC, 13, 1), 221 BT_MBOX(2, SCO_TX_ACT, 16, 2), 222 BT_MBOX(2, SCO_RX_ACT, 18, 2), 223 BT_MBOX(2, ESCO_RE_TX, 20, 2), 224 BT_MBOX(2, SCO_DURATION, 24, 6), 225 }; 226 227 enum iwl_bt_mxbox_dw3 { 228 BT_MBOX(3, SCO_STATE, 0, 1), 229 BT_MBOX(3, SNIFF_STATE, 1, 1), 230 BT_MBOX(3, A2DP_STATE, 2, 1), 231 BT_MBOX(3, ACL_STATE, 3, 1), 232 BT_MBOX(3, MSTR_STATE, 4, 1), 233 BT_MBOX(3, OBX_STATE, 5, 1), 234 BT_MBOX(3, OPEN_CON_2, 8, 2), 235 BT_MBOX(3, TRAFFIC_LOAD, 10, 2), 236 BT_MBOX(3, CHL_SEQN_LSB, 12, 1), 237 BT_MBOX(3, INBAND_P, 13, 1), 238 BT_MBOX(3, MSG_TYPE_2, 16, 3), 239 BT_MBOX(3, SSN_2, 19, 2), 240 BT_MBOX(3, UPDATE_REQUEST, 21, 1), 241 }; 242 243 #define BT_MBOX_MSG(_notif, _num, _field) \ 244 ((le32_to_cpu((_notif)->mbox_msg[(_num)]) & BT_MBOX##_num##_##_field)\ 245 >> BT_MBOX##_num##_##_field##_POS) 246 247 /** 248 * struct iwl_bt_coex_profile_notif - notification about BT coex 249 * @mbox_msg: message from BT to WiFi 250 * @:bt_status: 0 - off, 1 - on 251 * @:bt_open_conn: number of BT connections open 252 * @:bt_traffic_load: load of BT traffic 253 * @:bt_agg_traffic_load: aggregated load of BT traffic 254 * @:bt_ci_compliance: 0 - no CI compliance, 1 - CI compliant 255 */ 256 struct iwl_bt_coex_profile_notif { 257 __le32 mbox_msg[4]; 258 u8 bt_status; 259 u8 bt_open_conn; 260 u8 bt_traffic_load; 261 u8 bt_agg_traffic_load; 262 u8 bt_ci_compliance; 263 u8 reserved[3]; 264 } __packed; /* BT_COEX_PROFILE_NTFY_API_S_VER_2 */ 265 266 enum iwl_bt_coex_prio_table_event { 267 BT_COEX_PRIO_TBL_EVT_INIT_CALIB1 = 0, 268 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2 = 1, 269 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW1 = 2, 270 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW2 = 3, 271 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH1 = 4, 272 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH2 = 5, 273 BT_COEX_PRIO_TBL_EVT_DTIM = 6, 274 BT_COEX_PRIO_TBL_EVT_SCAN52 = 7, 275 BT_COEX_PRIO_TBL_EVT_SCAN24 = 8, 276 BT_COEX_PRIO_TBL_EVT_IDLE = 9, 277 BT_COEX_PRIO_TBL_EVT_MAX = 16, 278 }; /* BT_COEX_PRIO_TABLE_EVENTS_API_E_VER_1 */ 279 280 enum iwl_bt_coex_prio_table_prio { 281 BT_COEX_PRIO_TBL_DISABLED = 0, 282 BT_COEX_PRIO_TBL_PRIO_LOW = 1, 283 BT_COEX_PRIO_TBL_PRIO_HIGH = 2, 284 BT_COEX_PRIO_TBL_PRIO_BYPASS = 3, 285 BT_COEX_PRIO_TBL_PRIO_COEX_OFF = 4, 286 BT_COEX_PRIO_TBL_PRIO_COEX_ON = 5, 287 BT_COEX_PRIO_TBL_PRIO_COEX_IDLE = 6, 288 BT_COEX_PRIO_TBL_MAX = 8, 289 }; /* BT_COEX_PRIO_TABLE_PRIORITIES_API_E_VER_1 */ 290 291 #define BT_COEX_PRIO_TBL_SHRD_ANT_POS (0) 292 #define BT_COEX_PRIO_TBL_PRIO_POS (1) 293 #define BT_COEX_PRIO_TBL_RESERVED_POS (4) 294 295 /** 296 * struct iwl_bt_coex_prio_tbl_cmd - priority table for BT coex 297 * @prio_tbl: 298 */ 299 struct iwl_bt_coex_prio_tbl_cmd { 300 u8 prio_tbl[BT_COEX_PRIO_TBL_EVT_MAX]; 301 } __packed; 302 303 enum iwl_bt_coex_env_action { 304 BT_COEX_ENV_CLOSE = 0, 305 BT_COEX_ENV_OPEN = 1, 306 }; /* BT_COEX_PROT_ENV_ACTION_API_E_VER_1 */ 307 308 /** 309 * struct iwl_bt_coex_prot_env_cmd - BT Protection Envelope 310 * @action: enum %iwl_bt_coex_env_action 311 * @type: enum %iwl_bt_coex_prio_table_event 312 */ 313 struct iwl_bt_coex_prot_env_cmd { 314 u8 action; /* 0 = closed, 1 = open */ 315 u8 type; /* 0 .. 15 */ 316 u8 reserved[2]; 317 } __packed; 318 319 #endif /* __fw_api_bt_coex_h__ */ 320