]> www.infradead.org Git - users/hch/configfs.git/commitdiff
wifi: iwlwifi: mvm: handle BA session teardown in RF-kill
authorJohannes Berg <johannes.berg@intel.com>
Mon, 13 May 2024 10:27:10 +0000 (13:27 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 29 May 2024 13:30:13 +0000 (15:30 +0200)
When entering RF-kill, mac80211 tears down BA sessions, but
due to RF-kill the commands aren't sent to the device. As a
result, there can be frames pending on the reorder buffer or
perhaps even received while doing so, leading to warnings.

Avoid the warnings by doing the BA session teardown normally
even in RF-kill, which also requires queue sync.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240513132416.0762cd80fb3d.I43c5877f3b546159b2db4f36d6d956b333c41cf0@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-sta.c
drivers/net/wireless/intel/iwlwifi/mvm/sta.c

index 628b50ee02443c56d499b0d4f5c5212cbf854e8e..de9f0b446545625b51288b7565871c6ff5bdcf6c 100644 (file)
@@ -6385,7 +6385,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
                .len[0] = sizeof(cmd),
                .data[1] = data,
                .len[1] = size,
-               .flags = sync ? 0 : CMD_ASYNC,
+               .flags = CMD_SEND_IN_RFKILL | (sync ? 0 : CMD_ASYNC),
        };
        int ret;
 
index ae3cde0e64f3f819d0f6ec5f94295ca3d77443a1..9d139b56e1527cdeb21e87433f9e54f169b76dd3 100644 (file)
@@ -1014,7 +1014,8 @@ static int iwl_mvm_mld_update_sta_baids(struct iwl_mvm *mvm,
 
                cmd.modify.tid = cpu_to_le32(data->tid);
 
-               ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(cmd), &cmd);
+               ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, CMD_SEND_IN_RFKILL,
+                                          sizeof(cmd), &cmd);
                data->sta_mask = new_sta_mask;
                if (ret)
                        return ret;
index 20d4968d692a3664387b14951ebdf01af147cae8..cc79fe991c2633586d13701ebabb82c646a8f36e 100644 (file)
@@ -2848,7 +2848,12 @@ static int iwl_mvm_fw_baid_op_cmd(struct iwl_mvm *mvm,
                .action = start ? cpu_to_le32(IWL_RX_BAID_ACTION_ADD) :
                                  cpu_to_le32(IWL_RX_BAID_ACTION_REMOVE),
        };
-       u32 cmd_id = WIDE_ID(DATA_PATH_GROUP, RX_BAID_ALLOCATION_CONFIG_CMD);
+       struct iwl_host_cmd hcmd = {
+               .id = WIDE_ID(DATA_PATH_GROUP, RX_BAID_ALLOCATION_CONFIG_CMD),
+               .flags = CMD_SEND_IN_RFKILL,
+               .len[0] = sizeof(cmd),
+               .data[0] = &cmd,
+       };
        int ret;
 
        BUILD_BUG_ON(sizeof(struct iwl_rx_baid_cfg_resp) != sizeof(baid));
@@ -2860,7 +2865,7 @@ static int iwl_mvm_fw_baid_op_cmd(struct iwl_mvm *mvm,
                cmd.alloc.ssn = cpu_to_le16(ssn);
                cmd.alloc.win_size = cpu_to_le16(buf_size);
                baid = -EIO;
-       } else if (iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 1) == 1) {
+       } else if (iwl_fw_lookup_cmd_ver(mvm->fw, hcmd.id, 1) == 1) {
                cmd.remove_v1.baid = cpu_to_le32(baid);
                BUILD_BUG_ON(sizeof(cmd.remove_v1) > sizeof(cmd.remove));
        } else {
@@ -2869,8 +2874,7 @@ static int iwl_mvm_fw_baid_op_cmd(struct iwl_mvm *mvm,
                cmd.remove.tid = cpu_to_le32(tid);
        }
 
-       ret = iwl_mvm_send_cmd_pdu_status(mvm, cmd_id, sizeof(cmd),
-                                         &cmd, &baid);
+       ret = iwl_mvm_send_cmd_status(mvm, &hcmd, &baid);
        if (ret)
                return ret;