Commit ca589822 authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Johannes Berg
Browse files

wifi: iwlwifi: Fix firmware version handling

On my system the arithmetic done on the firmware numbers
results in a negative number, but since the types are
unsigned it gets interpreted as a large positive number.

The end result is that the firmware gets rejected and wifi
is defunct.

Switch to signed types to handle this case correctly.

iwlwifi 0000:0c:00.0: Driver unable to support your firmware API. Driver supports FW core 4294967294..2, firmware is 2.
iwlwifi 0000:0c:00.0: Direct firmware load for iwlwifi-5000-4.ucode failed with error -2
iwlwifi 0000:0c:00.0: Direct firmware load for iwlwifi-5000-3.ucode failed with error -2
iwlwifi 0000:0c:00.0: Direct firmware load for iwlwifi-5000-2.ucode failed with error -2
iwlwifi 0000:0c:00.0: Direct firmware load for iwlwifi-5000-1.ucode failed with error -2
iwlwifi 0000:0c:00.0: no suitable firmware found!
iwlwifi 0000:0c:00.0: minimum version required: iwlwifi-5000-1
iwlwifi 0000:0c:00.0: maximum version supported: iwlwifi-5000-5
iwlwifi 0000:0c:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git



Cc: stable@vger.kernel.org
Fixes: 5f708ccc ("wifi: iwlwifi: add a new FW file numbering scheme")
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220805
Link: https://patch.msgid.link/20251113222852.15896-1-ville.syrjala@linux.intel.com


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ff4071c6
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1597,7 +1597,7 @@ static void _iwl_op_mode_stop(struct iwl_drv *drv)
 */
static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
{
	unsigned int min_core, max_core, loaded_core;
	int min_core, max_core, loaded_core;
	struct iwl_drv *drv = context;
	struct iwl_fw *fw = &drv->fw;
	const struct iwl_ucode_header *ucode;
@@ -1676,7 +1676,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
	if (loaded_core < min_core || loaded_core > max_core) {
		IWL_ERR(drv,
			"Driver unable to support your firmware API. "
			"Driver supports FW core %u..%u, firmware is %u.\n",
			"Driver supports FW core %d..%d, firmware is %d.\n",
			min_core, max_core, loaded_core);
		goto try_again;
	}