Commit 41901c22 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files
Johannes Berg says:

====================
Regressions:
 * wfx: fix for open network connection
 * iwlwifi: fix for hibernate (due to fast resume feature)
 * iwlwifi: fix for a few warnings that were recently added
   (had previously been messages not warnings)

Previously broken:
 * mwifiex: fix static structures used for per-device data
 * iwlwifi: some harmless FW related messages were tagged
   too high priority
 * iwlwifi: scan buffers weren't checked correctly
 * mac80211: SKB leak on beacon error path
 * iwlwifi: fix ACPI table interop with certain BIOSes
 * iwlwifi: fix locking for link selection
 * mac80211: fix SSID comparison in beacon validation

* tag 'wireless-2024-08-28' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless:
  wifi: iwlwifi: clear trans->state earlier upon error
  wifi: wfx: repair open network AP mode
  wifi: mac80211: free skb on error path in ieee80211_beacon_get_ap()
  wifi: iwlwifi: mvm: don't wait for tx queues if firmware is dead
  wifi: iwlwifi: mvm: allow 6 GHz channels in MLO scan
  wifi: iwlwifi: mvm: pause TCM when the firmware is stopped
  wifi: iwlwifi: fw: fix wgds rev 3 exact size
  wifi: iwlwifi: mvm: take the mutex before running link selection
  wifi: iwlwifi: mvm: fix iwl_mvm_max_scan_ie_fw_cmd_room()
  wifi: iwlwifi: mvm: fix iwl_mvm_scan_fits() calculation
  wifi: iwlwifi: lower message level for FW buffer destination
  wifi: iwlwifi: mvm: fix hibernation
  wifi: mac80211: fix beacon SSID mismatch handling
  wifi: mwifiex: duplicate static structs used in driver instances
====================

Link: https://patch.msgid.link/20240828100151.23662-3-johannes@sipsolutions.net


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 3a0504d5 094513f8
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -725,22 +725,25 @@ int iwl_acpi_get_wgds_table(struct iwl_fw_runtime *fwrt)
				entry = &wifi_pkg->package.elements[entry_idx];
				entry_idx++;
				if (entry->type != ACPI_TYPE_INTEGER ||
				    entry->integer.value > num_profiles) {
				    entry->integer.value > num_profiles ||
				    entry->integer.value <
					rev_data[idx].min_profiles) {
					ret = -EINVAL;
					goto out_free;
				}
				num_profiles = entry->integer.value;

				/*
				 * this also validates >= min_profiles since we
				 * otherwise wouldn't have gotten the data when
				 * looking up in ACPI
				 * Check to see if we received package count
				 * same as max # of profiles
				 */
				if (wifi_pkg->package.count !=
				    hdr_size + profile_size * num_profiles) {
					ret = -EINVAL;
					goto out_free;
				}

				/* Number of valid profiles */
				num_profiles = entry->integer.value;
			}
			goto read_table;
		}
+1 −1
Original line number Diff line number Diff line
@@ -3348,7 +3348,7 @@ void iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt,
{
	int ret __maybe_unused = 0;

	if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status))
	if (!iwl_trans_fw_running(fwrt->trans))
		return;

	if (fw_has_capa(&fwrt->fw->ucode_capa,
+12 −0
Original line number Diff line number Diff line
@@ -85,6 +85,10 @@ struct iwl_cfg;
 *	May sleep
 * @wimax_active: invoked when WiMax becomes active. May sleep
 * @time_point: called when transport layer wants to collect debug data
 * @device_powered_off: called upon resume from hibernation but not only.
 *	Op_mode needs to reset its internal state because the device did not
 *	survive the system state transition. The firmware is no longer running,
 *	etc...
 */
struct iwl_op_mode_ops {
	struct iwl_op_mode *(*start)(struct iwl_trans *trans,
@@ -107,6 +111,7 @@ struct iwl_op_mode_ops {
	void (*time_point)(struct iwl_op_mode *op_mode,
			   enum iwl_fw_ini_time_point tp_id,
			   union iwl_dbg_tlv_tp_data *tp_data);
	void (*device_powered_off)(struct iwl_op_mode *op_mode);
};

int iwl_opmode_register(const char *name, const struct iwl_op_mode_ops *ops);
@@ -204,4 +209,11 @@ static inline void iwl_op_mode_time_point(struct iwl_op_mode *op_mode,
	op_mode->ops->time_point(op_mode, tp_id, tp_data);
}

static inline void iwl_op_mode_device_powered_off(struct iwl_op_mode *op_mode)
{
	if (!op_mode || !op_mode->ops || !op_mode->ops->device_powered_off)
		return;
	op_mode->ops->device_powered_off(op_mode);
}

#endif /* __iwl_op_mode_h__ */
+1 −1
Original line number Diff line number Diff line
@@ -1128,8 +1128,8 @@ static inline void iwl_trans_fw_error(struct iwl_trans *trans, bool sync)

	/* prevent double restarts due to the same erroneous FW */
	if (!test_and_set_bit(STATUS_FW_ERROR, &trans->status)) {
		iwl_op_mode_nic_error(trans->op_mode, sync);
		trans->state = IWL_TRANS_NO_FW;
		iwl_op_mode_nic_error(trans->op_mode, sync);
	}
}

+10 −0
Original line number Diff line number Diff line
@@ -3439,6 +3439,16 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)

	mutex_lock(&mvm->mutex);

	/* Apparently, the device went away and device_powered_off() was called,
	 * don't even try to read the rt_status, the device is currently
	 * inaccessible.
	 */
	if (!test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status)) {
		IWL_INFO(mvm,
			 "Can't resume, device_powered_off() was called during wowlan\n");
		goto err;
	}

	mvm->last_reset_or_resume_time_jiffies = jiffies;

	/* get the BSS vif pointer again */
Loading