mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-26 02:51:33 -05:00
wifi: iwlwifi: mvm: handle the new EML OMN failure notification
Take the proper action upon EML OMN frame failure. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20240825090005.01ff45fa69db.I9f2d3ea851050f6031ac07bbe69eb38000fd5683@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
committed by
Johannes Berg
parent
1987bf29f8
commit
a08cf01905
@@ -710,7 +710,7 @@ enum iwl_esr_trans_fail_code {
|
||||
/**
|
||||
* struct iwl_esr_trans_fail_notif - FW reports a failure in EMLSR transition
|
||||
*
|
||||
* @link_id: the link_id that was activated / de-activated
|
||||
* @link_id: the link_id that still works after the failure
|
||||
* @activation: true if the link was activated, false otherwise
|
||||
* @err_code: see &enum iwl_esr_trans_fail_code
|
||||
*/
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
HOW(EXIT_COEX) \
|
||||
HOW(EXIT_BANDWIDTH) \
|
||||
HOW(EXIT_CSA) \
|
||||
HOW(EXIT_LINK_USAGE)
|
||||
HOW(EXIT_LINK_USAGE) \
|
||||
HOW(EXIT_FAIL_ENTRY)
|
||||
|
||||
static const char *const iwl_mvm_esr_states_names[] = {
|
||||
#define NAME_ENTRY(x) [ilog2(IWL_MVM_ESR_##x)] = #x,
|
||||
|
||||
@@ -368,6 +368,7 @@ struct iwl_mvm_vif_link_info {
|
||||
* preventing the enablement of EMLSR
|
||||
* @IWL_MVM_ESR_EXIT_CSA: CSA happened, so exit EMLSR
|
||||
* @IWL_MVM_ESR_EXIT_LINK_USAGE: Exit EMLSR due to low tpt on secondary link
|
||||
* @IWL_MVM_ESR_EXIT_FAIL_ENTRY: Exit EMLSR due to entry failure
|
||||
*/
|
||||
enum iwl_mvm_esr_state {
|
||||
IWL_MVM_ESR_BLOCKED_PREVENTION = 0x1,
|
||||
@@ -382,6 +383,7 @@ enum iwl_mvm_esr_state {
|
||||
IWL_MVM_ESR_EXIT_BANDWIDTH = 0x80000,
|
||||
IWL_MVM_ESR_EXIT_CSA = 0x100000,
|
||||
IWL_MVM_ESR_EXIT_LINK_USAGE = 0x200000,
|
||||
IWL_MVM_ESR_EXIT_FAIL_ENTRY = 0x400000,
|
||||
};
|
||||
|
||||
#define IWL_MVM_BLOCK_ESR_REASONS 0xffff
|
||||
|
||||
@@ -159,6 +159,43 @@ static void iwl_mvm_rx_esr_mode_notif(struct iwl_mvm *mvm,
|
||||
iwl_mvm_get_primary_link(vif));
|
||||
}
|
||||
|
||||
static void iwl_mvm_rx_esr_trans_fail_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_cmd_buffer *rxb)
|
||||
{
|
||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||
struct iwl_esr_trans_fail_notif *notif = (void *)pkt->data;
|
||||
struct ieee80211_vif *vif = iwl_mvm_get_bss_vif(mvm);
|
||||
u8 fw_link_id = le32_to_cpu(notif->link_id);
|
||||
struct ieee80211_bss_conf *bss_conf;
|
||||
|
||||
if (IS_ERR_OR_NULL(vif))
|
||||
return;
|
||||
|
||||
IWL_DEBUG_INFO(mvm, "Failed to %s eSR on link %d, reason %d\n",
|
||||
le32_to_cpu(notif->activation) ? "enter" : "exit",
|
||||
le32_to_cpu(notif->link_id),
|
||||
le32_to_cpu(notif->err_code));
|
||||
|
||||
/* we couldn't go back to single link, disconnect */
|
||||
if (!le32_to_cpu(notif->activation)) {
|
||||
iwl_mvm_connection_loss(mvm, vif, "emlsr exit failed");
|
||||
return;
|
||||
}
|
||||
|
||||
bss_conf = iwl_mvm_rcu_fw_link_id_to_link_conf(mvm, fw_link_id, false);
|
||||
if (IWL_FW_CHECK(mvm, !bss_conf,
|
||||
"FW reported failure to activate EMLSR on a non-existing link: %d\n",
|
||||
fw_link_id))
|
||||
return;
|
||||
|
||||
/*
|
||||
* We failed to activate the second link and enter EMLSR, we need to go
|
||||
* back to single link.
|
||||
*/
|
||||
iwl_mvm_exit_esr(mvm, vif, IWL_MVM_ESR_EXIT_FAIL_ENTRY,
|
||||
bss_conf->link_id);
|
||||
}
|
||||
|
||||
static void iwl_mvm_rx_monitor_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_cmd_buffer *rxb)
|
||||
{
|
||||
@@ -486,6 +523,10 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {
|
||||
RX_HANDLER_GRP(SCAN_GROUP, CHANNEL_SURVEY_NOTIF,
|
||||
iwl_mvm_rx_channel_survey_notif, RX_HANDLER_ASYNC_LOCKED,
|
||||
struct iwl_umac_scan_channel_survey_notif),
|
||||
RX_HANDLER_GRP(MAC_CONF_GROUP, EMLSR_TRANS_FAIL_NOTIF,
|
||||
iwl_mvm_rx_esr_trans_fail_notif,
|
||||
RX_HANDLER_ASYNC_LOCKED_WIPHY,
|
||||
struct iwl_esr_trans_fail_notif),
|
||||
};
|
||||
#undef RX_HANDLER
|
||||
#undef RX_HANDLER_GRP
|
||||
@@ -616,6 +657,7 @@ static const struct iwl_hcmd_names iwl_mvm_mac_conf_names[] = {
|
||||
HCMD_NAME(STA_REMOVE_CMD),
|
||||
HCMD_NAME(STA_DISABLE_TX_CMD),
|
||||
HCMD_NAME(ROC_CMD),
|
||||
HCMD_NAME(EMLSR_TRANS_FAIL_NOTIF),
|
||||
HCMD_NAME(ROC_NOTIF),
|
||||
HCMD_NAME(CHANNEL_SWITCH_ERROR_NOTIF),
|
||||
HCMD_NAME(MISSED_VAP_NOTIF),
|
||||
|
||||
Reference in New Issue
Block a user