diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/bt-coex.c | 50 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mvm.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/ops.c | 2 |
3 files changed, 58 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c index d37865af3254..61159f8abe78 100644 --- a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c +++ b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c | |||
@@ -64,6 +64,7 @@ | |||
64 | #include "fw-api-bt-coex.h" | 64 | #include "fw-api-bt-coex.h" |
65 | #include "iwl-modparams.h" | 65 | #include "iwl-modparams.h" |
66 | #include "mvm.h" | 66 | #include "mvm.h" |
67 | #include "iwl-debug.h" | ||
67 | 68 | ||
68 | #define EVENT_PRIO_ANT(_evt, _prio, _shrd_ant) \ | 69 | #define EVENT_PRIO_ANT(_evt, _prio, _shrd_ant) \ |
69 | [(_evt)] = (((_prio) << BT_COEX_PRIO_TBL_PRIO_POS) | \ | 70 | [(_evt)] = (((_prio) << BT_COEX_PRIO_TBL_PRIO_POS) | \ |
@@ -240,3 +241,52 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm) | |||
240 | return iwl_mvm_send_cmd_pdu(mvm, BT_CONFIG, CMD_SYNC, | 241 | return iwl_mvm_send_cmd_pdu(mvm, BT_CONFIG, CMD_SYNC, |
241 | sizeof(cmd), &cmd); | 242 | sizeof(cmd), &cmd); |
242 | } | 243 | } |
244 | |||
245 | int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm, | ||
246 | struct iwl_rx_cmd_buffer *rxb, | ||
247 | struct iwl_device_cmd *dev_cmd) | ||
248 | { | ||
249 | struct iwl_rx_packet *pkt = rxb_addr(rxb); | ||
250 | struct iwl_bt_coex_profile_notif *notif = (void *)pkt->data; | ||
251 | struct iwl_bt_coex_cmd cmd = {}; | ||
252 | enum iwl_bt_kill_msk bt_kill_msk; | ||
253 | |||
254 | IWL_DEBUG_COEX(mvm, "BT Coex Notification received\n"); | ||
255 | IWL_DEBUG_COEX(mvm, "\tBT %salive\n", notif->bt_status ? "" : "not "); | ||
256 | IWL_DEBUG_COEX(mvm, "\tBT open conn %d\n", notif->bt_open_conn); | ||
257 | IWL_DEBUG_COEX(mvm, "\tBT traffic load %d\n", notif->bt_traffic_load); | ||
258 | IWL_DEBUG_COEX(mvm, "\tBT agg traffic load %d\n", | ||
259 | notif->bt_agg_traffic_load); | ||
260 | IWL_DEBUG_COEX(mvm, "\tBT ci compliance %d\n", notif->bt_ci_compliance); | ||
261 | |||
262 | /* Low latency BT profile is active: give higher prio to BT */ | ||
263 | if (BT_MBOX_MSG(notif, 3, SCO_STATE) || | ||
264 | BT_MBOX_MSG(notif, 3, A2DP_STATE) || | ||
265 | BT_MBOX_MSG(notif, 3, SNIFF_STATE)) | ||
266 | bt_kill_msk = BT_KILL_MSK_SCO_HID_A2DP; | ||
267 | else | ||
268 | bt_kill_msk = BT_KILL_MSK_DEFAULT; | ||
269 | |||
270 | /* Don't send HCMD if there is no update */ | ||
271 | if (bt_kill_msk == mvm->bt_kill_msk) | ||
272 | return 0; | ||
273 | |||
274 | IWL_DEBUG_COEX(mvm, | ||
275 | "Udpate kill_msk: %d\n\t SCO %sactive A2DP %sactive SNIFF %sactive\n", | ||
276 | bt_kill_msk, | ||
277 | BT_MBOX_MSG(notif, 3, SCO_STATE) ? "" : "in", | ||
278 | BT_MBOX_MSG(notif, 3, A2DP_STATE) ? "" : "in", | ||
279 | BT_MBOX_MSG(notif, 3, SNIFF_STATE) ? "" : "in"); | ||
280 | |||
281 | mvm->bt_kill_msk = bt_kill_msk; | ||
282 | cmd.kill_ack_msk = cpu_to_le32(iwl_bt_ack_kill_msk[bt_kill_msk]); | ||
283 | cmd.kill_cts_msk = cpu_to_le32(iwl_bt_cts_kill_msk[bt_kill_msk]); | ||
284 | |||
285 | cmd.valid_bit_msk = cpu_to_le16(BT_VALID_KILL_ACK | BT_VALID_KILL_CTS); | ||
286 | |||
287 | if (iwl_mvm_send_cmd_pdu(mvm, BT_CONFIG, CMD_SYNC, sizeof(cmd), &cmd)) | ||
288 | IWL_ERR(mvm, "Failed to sent BT Coex CMD\n"); | ||
289 | |||
290 | /* This handler is ASYNC */ | ||
291 | return 0; | ||
292 | } | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h index b7f27d59fc24..a1f1a86643e5 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h | |||
@@ -334,6 +334,9 @@ struct iwl_mvm { | |||
334 | #ifdef CONFIG_PM_SLEEP | 334 | #ifdef CONFIG_PM_SLEEP |
335 | int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen; | 335 | int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen; |
336 | #endif | 336 | #endif |
337 | |||
338 | /* BT-Coex */ | ||
339 | u8 bt_kill_msk; | ||
337 | }; | 340 | }; |
338 | 341 | ||
339 | /* Extract MVM priv from op_mode and _hw */ | 342 | /* Extract MVM priv from op_mode and _hw */ |
@@ -507,5 +510,8 @@ void iwl_mvm_set_default_unicast_key(struct ieee80211_hw *hw, | |||
507 | /* BT Coex */ | 510 | /* BT Coex */ |
508 | int iwl_send_bt_prio_tbl(struct iwl_mvm *mvm); | 511 | int iwl_send_bt_prio_tbl(struct iwl_mvm *mvm); |
509 | int iwl_send_bt_init_conf(struct iwl_mvm *mvm); | 512 | int iwl_send_bt_init_conf(struct iwl_mvm *mvm); |
513 | int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm, | ||
514 | struct iwl_rx_cmd_buffer *rxb, | ||
515 | struct iwl_device_cmd *cmd); | ||
510 | 516 | ||
511 | #endif /* __IWL_MVM_H__ */ | 517 | #endif /* __IWL_MVM_H__ */ |
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c index 2003daa0cf76..54595eb7b92a 100644 --- a/drivers/net/wireless/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/iwlwifi/mvm/ops.c | |||
@@ -230,6 +230,8 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = { | |||
230 | RX_HANDLER(SCAN_REQUEST_CMD, iwl_mvm_rx_scan_response, false), | 230 | RX_HANDLER(SCAN_REQUEST_CMD, iwl_mvm_rx_scan_response, false), |
231 | RX_HANDLER(SCAN_COMPLETE_NOTIFICATION, iwl_mvm_rx_scan_complete, false), | 231 | RX_HANDLER(SCAN_COMPLETE_NOTIFICATION, iwl_mvm_rx_scan_complete, false), |
232 | 232 | ||
233 | RX_HANDLER(BT_PROFILE_NOTIFICATION, iwl_mvm_rx_bt_coex_notif, true), | ||
234 | |||
233 | RX_HANDLER(RADIO_VERSION_NOTIFICATION, iwl_mvm_rx_radio_ver, false), | 235 | RX_HANDLER(RADIO_VERSION_NOTIFICATION, iwl_mvm_rx_radio_ver, false), |
234 | RX_HANDLER(CARD_STATE_NOTIFICATION, iwl_mvm_rx_card_state_notif, false), | 236 | RX_HANDLER(CARD_STATE_NOTIFICATION, iwl_mvm_rx_card_state_notif, false), |
235 | 237 | ||