xref: /linux/drivers/net/wireless/intel/iwlwifi/mld/coex.c (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
1*d1e879ecSMiri Korenblit // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2*d1e879ecSMiri Korenblit /*
3*d1e879ecSMiri Korenblit  * Copyright (C) 2024-2025 Intel Corporation
4*d1e879ecSMiri Korenblit  */
5*d1e879ecSMiri Korenblit 
6*d1e879ecSMiri Korenblit #include "fw/api/coex.h"
7*d1e879ecSMiri Korenblit 
8*d1e879ecSMiri Korenblit #include "coex.h"
9*d1e879ecSMiri Korenblit #include "mld.h"
10*d1e879ecSMiri Korenblit #include "hcmd.h"
11*d1e879ecSMiri Korenblit #include "mlo.h"
12*d1e879ecSMiri Korenblit 
13*d1e879ecSMiri Korenblit int iwl_mld_send_bt_init_conf(struct iwl_mld *mld)
14*d1e879ecSMiri Korenblit {
15*d1e879ecSMiri Korenblit 	struct iwl_bt_coex_cmd cmd = {
16*d1e879ecSMiri Korenblit 		.mode = cpu_to_le32(BT_COEX_NW),
17*d1e879ecSMiri Korenblit 		.enabled_modules = cpu_to_le32(BT_COEX_MPLUT_ENABLED |
18*d1e879ecSMiri Korenblit 					       BT_COEX_HIGH_BAND_RET),
19*d1e879ecSMiri Korenblit 	};
20*d1e879ecSMiri Korenblit 
21*d1e879ecSMiri Korenblit 	return iwl_mld_send_cmd_pdu(mld, BT_CONFIG, &cmd);
22*d1e879ecSMiri Korenblit }
23*d1e879ecSMiri Korenblit 
24*d1e879ecSMiri Korenblit void iwl_mld_handle_bt_coex_notif(struct iwl_mld *mld,
25*d1e879ecSMiri Korenblit 				  struct iwl_rx_packet *pkt)
26*d1e879ecSMiri Korenblit {
27*d1e879ecSMiri Korenblit 	const struct iwl_bt_coex_profile_notif *notif = (void *)pkt->data;
28*d1e879ecSMiri Korenblit 	const struct iwl_bt_coex_profile_notif zero_notif = {};
29*d1e879ecSMiri Korenblit 	/* zeroed structure means that BT is OFF */
30*d1e879ecSMiri Korenblit 	bool bt_is_active = memcmp(notif, &zero_notif, sizeof(*notif));
31*d1e879ecSMiri Korenblit 
32*d1e879ecSMiri Korenblit 	if (bt_is_active == mld->bt_is_active)
33*d1e879ecSMiri Korenblit 		return;
34*d1e879ecSMiri Korenblit 
35*d1e879ecSMiri Korenblit 	IWL_DEBUG_INFO(mld, "BT was turned %s\n", bt_is_active ? "ON" : "OFF");
36*d1e879ecSMiri Korenblit 
37*d1e879ecSMiri Korenblit 	mld->bt_is_active = bt_is_active;
38*d1e879ecSMiri Korenblit 
39*d1e879ecSMiri Korenblit 	iwl_mld_emlsr_check_bt(mld);
40*d1e879ecSMiri Korenblit }
41