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