1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#ifndef __fw_api_bt_coex_h__
66#define __fw_api_bt_coex_h__
67
68#include <linux/types.h>
69#include <linux/bitops.h>
70
71#define BITS(nb) (BIT(nb) - 1)
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92enum iwl_bt_coex_flags {
93 BT_COEX_MODE_POS = 3,
94 BT_COEX_MODE_MSK = BITS(3) << BT_COEX_MODE_POS,
95 BT_COEX_DISABLE_OLD = 0x0 << BT_COEX_MODE_POS,
96 BT_COEX_2W_OLD = 0x1 << BT_COEX_MODE_POS,
97 BT_COEX_3W_OLD = 0x2 << BT_COEX_MODE_POS,
98 BT_COEX_NW_OLD = 0x3 << BT_COEX_MODE_POS,
99 BT_COEX_AUTO_OLD = 0x5 << BT_COEX_MODE_POS,
100 BT_COEX_BT_OLD = 0x6 << BT_COEX_MODE_POS,
101 BT_COEX_WIFI_OLD = 0x7 << BT_COEX_MODE_POS,
102 BT_COEX_SYNC2SCO = BIT(7),
103 BT_COEX_CORUNNING = BIT(8),
104 BT_COEX_MPLUT = BIT(9),
105 BT_COEX_TTC = BIT(20),
106 BT_COEX_RRC = BIT(21),
107};
108
109
110
111
112
113
114enum iwl_bt_coex_valid_bit_msk {
115 BT_VALID_ENABLE = BIT(0),
116 BT_VALID_BT_PRIO_BOOST = BIT(1),
117 BT_VALID_MAX_KILL = BIT(2),
118 BT_VALID_3W_TMRS = BIT(3),
119 BT_VALID_KILL_ACK = BIT(4),
120 BT_VALID_KILL_CTS = BIT(5),
121 BT_VALID_REDUCED_TX_POWER = BIT(6),
122 BT_VALID_LUT = BIT(7),
123 BT_VALID_WIFI_RX_SW_PRIO_BOOST = BIT(8),
124 BT_VALID_WIFI_TX_SW_PRIO_BOOST = BIT(9),
125 BT_VALID_MULTI_PRIO_LUT = BIT(10),
126 BT_VALID_TRM_KICK_FILTER = BIT(11),
127 BT_VALID_CORUN_LUT_20 = BIT(12),
128 BT_VALID_CORUN_LUT_40 = BIT(13),
129 BT_VALID_ANT_ISOLATION = BIT(14),
130 BT_VALID_ANT_ISOLATION_THRS = BIT(15),
131 BT_VALID_TXTX_DELTA_FREQ_THRS = BIT(16),
132 BT_VALID_TXRX_MAX_FREQ_0 = BIT(17),
133 BT_VALID_SYNC_TO_SCO = BIT(18),
134 BT_VALID_TTC = BIT(20),
135 BT_VALID_RRC = BIT(21),
136};
137
138
139
140
141
142
143
144
145
146
147enum iwl_bt_reduced_tx_power {
148 BT_REDUCED_TX_POWER_CTL = BIT(0),
149 BT_REDUCED_TX_POWER_DATA = BIT(1),
150};
151
152enum iwl_bt_coex_lut_type {
153 BT_COEX_TIGHT_LUT = 0,
154 BT_COEX_LOOSE_LUT,
155 BT_COEX_TX_DIS_LUT,
156
157 BT_COEX_MAX_LUT,
158 BT_COEX_INVALID_LUT = 0xff,
159};
160
161#define BT_COEX_LUT_SIZE (12)
162#define BT_COEX_CORUN_LUT_SIZE (32)
163#define BT_COEX_MULTI_PRIO_LUT_SIZE (2)
164#define BT_COEX_BOOST_SIZE (4)
165#define BT_REDUCED_TX_POWER_BIT BIT(7)
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193struct iwl_bt_coex_cmd_old {
194 __le32 flags;
195 u8 max_kill;
196 u8 bt_reduced_tx_power;
197 u8 override_primary_lut;
198 u8 override_secondary_lut;
199
200 u8 bt4_antenna_isolation;
201 u8 bt4_antenna_isolation_thr;
202 u8 bt4_tx_tx_delta_freq_thr;
203 u8 bt4_tx_rx_max_freq0;
204
205 __le32 bt_prio_boost[BT_COEX_BOOST_SIZE];
206 __le32 wifi_tx_prio_boost;
207 __le32 wifi_rx_prio_boost;
208 __le32 kill_ack_msk;
209 __le32 kill_cts_msk;
210
211 __le32 decision_lut[BT_COEX_MAX_LUT][BT_COEX_LUT_SIZE];
212 __le32 bt4_multiprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE];
213 __le32 bt4_corun_lut20[BT_COEX_CORUN_LUT_SIZE];
214 __le32 bt4_corun_lut40[BT_COEX_CORUN_LUT_SIZE];
215
216 __le32 valid_bit_msk;
217} __packed;
218
219enum iwl_bt_coex_mode {
220 BT_COEX_DISABLE = 0x0,
221 BT_COEX_NW = 0x1,
222 BT_COEX_BT = 0x2,
223 BT_COEX_WIFI = 0x3,
224};
225
226enum iwl_bt_coex_enabled_modules {
227 BT_COEX_MPLUT_ENABLED = BIT(0),
228 BT_COEX_MPLUT_BOOST_ENABLED = BIT(1),
229 BT_COEX_SYNC2SCO_ENABLED = BIT(2),
230 BT_COEX_CORUN_ENABLED = BIT(3),
231 BT_COEX_HIGH_BAND_RET = BIT(4),
232};
233
234
235
236
237
238
239
240
241struct iwl_bt_coex_cmd {
242 __le32 mode;
243 __le32 enabled_modules;
244} __packed;
245
246
247
248
249
250
251
252
253struct iwl_bt_coex_corun_lut_update_cmd {
254 __le32 corun_lut20[BT_COEX_CORUN_LUT_SIZE];
255 __le32 corun_lut40[BT_COEX_CORUN_LUT_SIZE];
256} __packed;
257
258
259
260
261
262
263struct iwl_bt_coex_reduced_txp_update_cmd {
264 __le32 reduced_txp;
265} __packed;
266
267
268
269
270
271
272
273
274
275
276struct iwl_bt_coex_ci_cmd {
277 __le64 bt_primary_ci;
278 __le32 primary_ch_phy_id;
279
280 __le64 bt_secondary_ci;
281 __le32 secondary_ch_phy_id;
282} __packed;
283
284#define BT_MBOX(n_dw, _msg, _pos, _nbits) \
285 BT_MBOX##n_dw##_##_msg##_POS = (_pos), \
286 BT_MBOX##n_dw##_##_msg = BITS(_nbits) << BT_MBOX##n_dw##_##_msg##_POS
287
288enum iwl_bt_mxbox_dw0 {
289 BT_MBOX(0, LE_SLAVE_LAT, 0, 3),
290 BT_MBOX(0, LE_PROF1, 3, 1),
291 BT_MBOX(0, LE_PROF2, 4, 1),
292 BT_MBOX(0, LE_PROF_OTHER, 5, 1),
293 BT_MBOX(0, CHL_SEQ_N, 8, 4),
294 BT_MBOX(0, INBAND_S, 13, 1),
295 BT_MBOX(0, LE_MIN_RSSI, 16, 4),
296 BT_MBOX(0, LE_SCAN, 20, 1),
297 BT_MBOX(0, LE_ADV, 21, 1),
298 BT_MBOX(0, LE_MAX_TX_POWER, 24, 4),
299 BT_MBOX(0, OPEN_CON_1, 28, 2),
300};
301
302enum iwl_bt_mxbox_dw1 {
303 BT_MBOX(1, BR_MAX_TX_POWER, 0, 4),
304 BT_MBOX(1, IP_SR, 4, 1),
305 BT_MBOX(1, LE_MSTR, 5, 1),
306 BT_MBOX(1, AGGR_TRFC_LD, 8, 6),
307 BT_MBOX(1, MSG_TYPE, 16, 3),
308 BT_MBOX(1, SSN, 19, 2),
309};
310
311enum iwl_bt_mxbox_dw2 {
312 BT_MBOX(2, SNIFF_ACT, 0, 3),
313 BT_MBOX(2, PAG, 3, 1),
314 BT_MBOX(2, INQUIRY, 4, 1),
315 BT_MBOX(2, CONN, 5, 1),
316 BT_MBOX(2, SNIFF_INTERVAL, 8, 5),
317 BT_MBOX(2, DISC, 13, 1),
318 BT_MBOX(2, SCO_TX_ACT, 16, 2),
319 BT_MBOX(2, SCO_RX_ACT, 18, 2),
320 BT_MBOX(2, ESCO_RE_TX, 20, 2),
321 BT_MBOX(2, SCO_DURATION, 24, 6),
322};
323
324enum iwl_bt_mxbox_dw3 {
325 BT_MBOX(3, SCO_STATE, 0, 1),
326 BT_MBOX(3, SNIFF_STATE, 1, 1),
327 BT_MBOX(3, A2DP_STATE, 2, 1),
328 BT_MBOX(3, ACL_STATE, 3, 1),
329 BT_MBOX(3, MSTR_STATE, 4, 1),
330 BT_MBOX(3, OBX_STATE, 5, 1),
331 BT_MBOX(3, OPEN_CON_2, 8, 2),
332 BT_MBOX(3, TRAFFIC_LOAD, 10, 2),
333 BT_MBOX(3, CHL_SEQN_LSB, 12, 1),
334 BT_MBOX(3, INBAND_P, 13, 1),
335 BT_MBOX(3, MSG_TYPE_2, 16, 3),
336 BT_MBOX(3, SSN_2, 19, 2),
337 BT_MBOX(3, UPDATE_REQUEST, 21, 1),
338};
339
340#define BT_MBOX_MSG(_notif, _num, _field) \
341 ((le32_to_cpu((_notif)->mbox_msg[(_num)]) & BT_MBOX##_num##_##_field)\
342 >> BT_MBOX##_num##_##_field##_POS)
343
344enum iwl_bt_activity_grading {
345 BT_OFF = 0,
346 BT_ON_NO_CONNECTION = 1,
347 BT_LOW_TRAFFIC = 2,
348 BT_HIGH_TRAFFIC = 3,
349
350 BT_MAX_AG,
351};
352
353enum iwl_bt_ci_compliance {
354 BT_CI_COMPLIANCE_NONE = 0,
355 BT_CI_COMPLIANCE_PRIMARY = 1,
356 BT_CI_COMPLIANCE_SECONDARY = 2,
357 BT_CI_COMPLIANCE_BOTH = 3,
358};
359
360#define IWL_COEX_IS_TTC_ON(_ttc_rrc_status, _phy_id) \
361 (_ttc_rrc_status & BIT(_phy_id))
362
363#define IWL_COEX_IS_RRC_ON(_ttc_rrc_status, _phy_id) \
364 ((_ttc_rrc_status >> 4) & BIT(_phy_id))
365
366
367
368
369
370
371
372
373
374
375
376struct iwl_bt_coex_profile_notif {
377 __le32 mbox_msg[4];
378 __le32 msg_idx;
379 __le32 bt_ci_compliance;
380
381 __le32 primary_ch_lut;
382 __le32 secondary_ch_lut;
383 __le32 bt_activity_grading;
384 u8 ttc_rrc_status;
385 u8 reserved[3];
386} __packed;
387
388enum iwl_bt_coex_prio_table_event {
389 BT_COEX_PRIO_TBL_EVT_INIT_CALIB1 = 0,
390 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2 = 1,
391 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW1 = 2,
392 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW2 = 3,
393 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH1 = 4,
394 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH2 = 5,
395 BT_COEX_PRIO_TBL_EVT_DTIM = 6,
396 BT_COEX_PRIO_TBL_EVT_SCAN52 = 7,
397 BT_COEX_PRIO_TBL_EVT_SCAN24 = 8,
398 BT_COEX_PRIO_TBL_EVT_IDLE = 9,
399 BT_COEX_PRIO_TBL_EVT_MAX = 16,
400};
401
402enum iwl_bt_coex_prio_table_prio {
403 BT_COEX_PRIO_TBL_DISABLED = 0,
404 BT_COEX_PRIO_TBL_PRIO_LOW = 1,
405 BT_COEX_PRIO_TBL_PRIO_HIGH = 2,
406 BT_COEX_PRIO_TBL_PRIO_BYPASS = 3,
407 BT_COEX_PRIO_TBL_PRIO_COEX_OFF = 4,
408 BT_COEX_PRIO_TBL_PRIO_COEX_ON = 5,
409 BT_COEX_PRIO_TBL_PRIO_COEX_IDLE = 6,
410 BT_COEX_PRIO_TBL_MAX = 8,
411};
412
413#define BT_COEX_PRIO_TBL_SHRD_ANT_POS (0)
414#define BT_COEX_PRIO_TBL_PRIO_POS (1)
415#define BT_COEX_PRIO_TBL_RESERVED_POS (4)
416
417
418
419
420
421struct iwl_bt_coex_prio_tbl_cmd {
422 u8 prio_tbl[BT_COEX_PRIO_TBL_EVT_MAX];
423} __packed;
424
425
426
427
428
429
430
431
432
433
434
435
436struct iwl_bt_coex_ci_cmd_old {
437 __le64 bt_primary_ci;
438 __le64 bt_secondary_ci;
439
440 u8 co_run_bw_primary;
441 u8 co_run_bw_secondary;
442 u8 primary_ch_phy_id;
443 u8 secondary_ch_phy_id;
444} __packed;
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459struct iwl_bt_coex_profile_notif_old {
460 __le32 mbox_msg[4];
461 __le32 msg_idx;
462 u8 bt_status;
463 u8 bt_open_conn;
464 u8 bt_traffic_load;
465 u8 bt_agg_traffic_load;
466 u8 bt_ci_compliance;
467 u8 ttc_enabled;
468 u8 rrc_enabled;
469 u8 reserved;
470
471 __le32 primary_ch_lut;
472 __le32 secondary_ch_lut;
473 __le32 bt_activity_grading;
474} __packed;
475
476#endif
477