mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 22:22:08 +02:00
wifi: iwlwifi: mvm: start to support the new BT profile notification
We have a new notification the BT profile. It contains almost nothing, only the wifi loss information. Copy this into mvm. We still need to iterate over the vifs / links to use this data. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20240729201718.637499f3a85a.I8bf654cf5d8aa038100273876c936845ecc338f7@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
1c9c5aebb5
commit
b85b397a9e
|
|
@ -126,4 +126,29 @@ struct iwl_bt_coex_prof_old_notif {
|
|||
* BT_COEX_PROFILE_NTFY_API_S_VER_5
|
||||
*/
|
||||
|
||||
/**
|
||||
* enum iwl_bt_coex_subcmd_ids - coex configuration command IDs
|
||||
*/
|
||||
enum iwl_bt_coex_subcmd_ids {
|
||||
/**
|
||||
*@PROFILE_NOTIF: &struct iwl_bt_coex_profile_notif
|
||||
*/
|
||||
PROFILE_NOTIF = 0xFF,
|
||||
};
|
||||
|
||||
#define COEX_NUM_BAND 3
|
||||
#define COEX_NUM_CHAINS 2
|
||||
|
||||
/**
|
||||
* struct iwl_bt_coex_profile_notif - notification about BT coex
|
||||
* @wifi_loss_low_rssi: The predicted lost WiFi rate (% of air time that BT is
|
||||
* utilizing) when the RSSI is low (<= -65 dBm)
|
||||
* @wifi_loss_mid_high_rssi: The predicted lost WiFi rate (% of air time that
|
||||
* BT is utilizing) when the RSSI is mid/high (>= -65 dBm)
|
||||
*/
|
||||
struct iwl_bt_coex_profile_notif {
|
||||
u8 wifi_loss_low_rssi[COEX_NUM_BAND][COEX_NUM_CHAINS];
|
||||
u8 wifi_loss_mid_high_rssi[COEX_NUM_BAND][COEX_NUM_CHAINS];
|
||||
} __packed; /* BT_COEX_BT_PROFILE_NTF_API_S_VER_1 */
|
||||
|
||||
#endif /* __iwl_fw_api_coex_h__ */
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@
|
|||
* @NAN_GROUP: NAN group, uses command IDs from &enum iwl_nan_subcmd_ids
|
||||
* @LOCATION_GROUP: location group, uses command IDs from
|
||||
* &enum iwl_location_subcmd_ids
|
||||
* @BT_COEX_GROUP: bt coex group, uses command IDs from
|
||||
* &enum iwl_bt_coex_subcmd_ids
|
||||
* @PROT_OFFLOAD_GROUP: protocol offload group, uses command IDs from
|
||||
* &enum iwl_prot_offload_subcmd_ids
|
||||
* @REGULATORY_AND_NVM_GROUP: regulatory/NVM group, uses command IDs from
|
||||
|
|
@ -43,6 +45,7 @@ enum iwl_mvm_command_groups {
|
|||
SCAN_GROUP = 0x6,
|
||||
NAN_GROUP = 0x7,
|
||||
LOCATION_GROUP = 0x8,
|
||||
BT_COEX_GROUP = 0x9,
|
||||
PROT_OFFLOAD_GROUP = 0xb,
|
||||
REGULATORY_AND_NVM_GROUP = 0xc,
|
||||
DEBUG_GROUP = 0xf,
|
||||
|
|
|
|||
|
|
@ -266,10 +266,26 @@ iwl_mvm_bt_coex_calculate_esr_mode(struct iwl_mvm *mvm,
|
|||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
bool have_wifi_loss_rate =
|
||||
iwl_fw_lookup_notif_ver(mvm->fw, LEGACY_GROUP,
|
||||
BT_PROFILE_NOTIFICATION, 0) > 4;
|
||||
BT_PROFILE_NOTIFICATION, 0) > 4 ||
|
||||
iwl_fw_lookup_notif_ver(mvm->fw, BT_COEX_GROUP,
|
||||
PROFILE_NOTIF, 0) >= 1;
|
||||
u8 wifi_loss_mid_high_rssi;
|
||||
u8 wifi_loss_low_rssi;
|
||||
u8 wifi_loss_rate;
|
||||
|
||||
if (mvm->last_bt_notif.wifi_loss_low_rssi == BT_OFF)
|
||||
if (iwl_fw_lookup_notif_ver(mvm->fw, BT_COEX_GROUP,
|
||||
PROFILE_NOTIF, 0) >= 1) {
|
||||
/* For now, we consider 2.4 GHz band / ANT_A only */
|
||||
wifi_loss_mid_high_rssi =
|
||||
mvm->last_bt_wifi_loss.wifi_loss_mid_high_rssi[PHY_BAND_24][0];
|
||||
wifi_loss_low_rssi =
|
||||
mvm->last_bt_wifi_loss.wifi_loss_low_rssi[PHY_BAND_24][0];
|
||||
} else {
|
||||
wifi_loss_mid_high_rssi = mvm->last_bt_notif.wifi_loss_mid_high_rssi;
|
||||
wifi_loss_low_rssi = mvm->last_bt_notif.wifi_loss_low_rssi;
|
||||
}
|
||||
|
||||
if (wifi_loss_low_rssi == BT_OFF)
|
||||
return true;
|
||||
|
||||
if (primary)
|
||||
|
|
@ -286,20 +302,20 @@ iwl_mvm_bt_coex_calculate_esr_mode(struct iwl_mvm *mvm,
|
|||
* we will get an update on this and exit eSR.
|
||||
*/
|
||||
if (!link_rssi)
|
||||
wifi_loss_rate = mvm->last_bt_notif.wifi_loss_mid_high_rssi;
|
||||
wifi_loss_rate = wifi_loss_mid_high_rssi;
|
||||
|
||||
else if (mvmvif->esr_active)
|
||||
/* RSSI needs to get really low to disable eSR... */
|
||||
wifi_loss_rate =
|
||||
link_rssi <= -IWL_MVM_BT_COEX_DISABLE_ESR_THRESH ?
|
||||
mvm->last_bt_notif.wifi_loss_low_rssi :
|
||||
mvm->last_bt_notif.wifi_loss_mid_high_rssi;
|
||||
wifi_loss_low_rssi :
|
||||
wifi_loss_mid_high_rssi;
|
||||
else
|
||||
/* ...And really high before we enable it back */
|
||||
wifi_loss_rate =
|
||||
link_rssi <= -IWL_MVM_BT_COEX_ENABLE_ESR_THRESH ?
|
||||
mvm->last_bt_notif.wifi_loss_low_rssi :
|
||||
mvm->last_bt_notif.wifi_loss_mid_high_rssi;
|
||||
wifi_loss_low_rssi :
|
||||
wifi_loss_mid_high_rssi;
|
||||
|
||||
return wifi_loss_rate <= IWL_MVM_BT_COEX_WIFI_LOSS_THRESH;
|
||||
}
|
||||
|
|
@ -612,6 +628,17 @@ void iwl_mvm_rx_bt_coex_old_notif(struct iwl_mvm *mvm,
|
|||
iwl_mvm_bt_coex_notif_handle(mvm);
|
||||
}
|
||||
|
||||
void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_cmd_buffer *rxb)
|
||||
{
|
||||
const struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||
const struct iwl_bt_coex_profile_notif *notif = (const void *)pkt->data;
|
||||
|
||||
mvm->last_bt_wifi_loss = *notif;
|
||||
|
||||
/* TODO: Iterate over vifs / links to take that into account */
|
||||
}
|
||||
|
||||
void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
enum ieee80211_rssi_event_data rssi_event)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1200,8 +1200,11 @@ struct iwl_mvm {
|
|||
|
||||
wait_queue_head_t rx_sync_waitq;
|
||||
|
||||
/* BT-Coex */
|
||||
struct iwl_bt_coex_prof_old_notif last_bt_notif;
|
||||
/* BT-Coex - only one of those will be used */
|
||||
union {
|
||||
struct iwl_bt_coex_prof_old_notif last_bt_notif;
|
||||
struct iwl_bt_coex_profile_notif last_bt_wifi_loss;
|
||||
};
|
||||
struct iwl_bt_coex_ci_cmd last_bt_ci_cmd;
|
||||
|
||||
u8 bt_tx_prio;
|
||||
|
|
@ -2324,6 +2327,8 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
|
|||
int iwl_mvm_send_bt_init_conf(struct iwl_mvm *mvm);
|
||||
void iwl_mvm_rx_bt_coex_old_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_cmd_buffer *rxb);
|
||||
void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_cmd_buffer *rxb);
|
||||
void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
enum ieee80211_rssi_event_data);
|
||||
void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm);
|
||||
|
|
|
|||
|
|
@ -336,6 +336,9 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {
|
|||
RX_HANDLER(BT_PROFILE_NOTIFICATION, iwl_mvm_rx_bt_coex_old_notif,
|
||||
RX_HANDLER_ASYNC_LOCKED_WIPHY,
|
||||
struct iwl_bt_coex_prof_old_notif),
|
||||
RX_HANDLER_GRP(BT_COEX_GROUP, PROFILE_NOTIF, iwl_mvm_rx_bt_coex_notif,
|
||||
RX_HANDLER_ASYNC_LOCKED_WIPHY,
|
||||
struct iwl_bt_coex_profile_notif),
|
||||
RX_HANDLER_NO_SIZE(BEACON_NOTIFICATION, iwl_mvm_rx_beacon_notif,
|
||||
RX_HANDLER_ASYNC_LOCKED),
|
||||
RX_HANDLER_NO_SIZE(STATISTICS_NOTIFICATION, iwl_mvm_rx_statistics,
|
||||
|
|
@ -713,6 +716,13 @@ static const struct iwl_hcmd_names iwl_mvm_regulatory_and_nvm_names[] = {
|
|||
HCMD_NAME(TAS_CONFIG),
|
||||
};
|
||||
|
||||
/* Please keep this array *SORTED* by hex value.
|
||||
* Access is done through binary search
|
||||
*/
|
||||
static const struct iwl_hcmd_names iwl_mvm_bt_coex_names[] = {
|
||||
HCMD_NAME(PROFILE_NOTIF),
|
||||
};
|
||||
|
||||
static const struct iwl_hcmd_arr iwl_mvm_groups[] = {
|
||||
[LEGACY_GROUP] = HCMD_ARR(iwl_mvm_legacy_names),
|
||||
[LONG_GROUP] = HCMD_ARR(iwl_mvm_legacy_names),
|
||||
|
|
@ -722,6 +732,7 @@ static const struct iwl_hcmd_arr iwl_mvm_groups[] = {
|
|||
[DATA_PATH_GROUP] = HCMD_ARR(iwl_mvm_data_path_names),
|
||||
[SCAN_GROUP] = HCMD_ARR(iwl_mvm_scan_names),
|
||||
[LOCATION_GROUP] = HCMD_ARR(iwl_mvm_location_names),
|
||||
[BT_COEX_GROUP] = HCMD_ARR(iwl_mvm_bt_coex_names),
|
||||
[PROT_OFFLOAD_GROUP] = HCMD_ARR(iwl_mvm_prot_offload_names),
|
||||
[REGULATORY_AND_NVM_GROUP] =
|
||||
HCMD_ARR(iwl_mvm_regulatory_and_nvm_names),
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user