mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
107 lines
4 KiB
Diff
107 lines
4 KiB
Diff
|
From af4e94c56581b446b2010854a983ef722ad9ed1f Mon Sep 17 00:00:00 2001
|
||
|
From: Luciano Coelho <coelho@ti.com>
|
||
|
Date: Tue, 27 Nov 2012 13:51:58 +0000
|
||
|
Subject: wlcore: change way of checking the firmware version
|
||
|
|
||
|
The firmwares version string contain 5 integers. We used to consider
|
||
|
all the digits (except for the first one, which indicates the chip) as
|
||
|
linearly increasing version numbers. This is not correct, because
|
||
|
some of the integers indicate type of firmware (eg. single-role
|
||
|
vs. multi-role) or the internal project it was created for.
|
||
|
|
||
|
Besides, this varies a bit from chip to chip, so we need to make the
|
||
|
firmware version checks more flexible (eg. allow the lower driver to
|
||
|
ignore some of the integers). Additionally, we need to change the
|
||
|
code so that we only check for a linearly increasing number on the
|
||
|
fields where this actually makes sense.
|
||
|
|
||
|
Signed-off-by: Luciano Coelho <coelho@ti.com>
|
||
|
---
|
||
|
(limited to 'drivers/net/wireless/ti/wlcore/boot.c')
|
||
|
|
||
|
diff --git a/drivers/net/wireless/ti/wlcore/boot.c b/drivers/net/wireless/ti/wlcore/boot.c
|
||
|
index 230c765..2c57246 100644
|
||
|
--- a/drivers/net/wireless/ti/wlcore/boot.c
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/boot.c
|
||
|
@@ -85,46 +85,55 @@ static int wlcore_validate_fw_ver(struct wl1271 *wl)
|
||
|
{
|
||
|
unsigned int *fw_ver = wl->chip.fw_ver;
|
||
|
unsigned int *min_ver = wl->min_fw_ver;
|
||
|
+ char min_fw_str[32] = "";
|
||
|
+ int i;
|
||
|
|
||
|
/* the chip must be exactly equal */
|
||
|
- if (min_ver[FW_VER_CHIP] != fw_ver[FW_VER_CHIP])
|
||
|
+ if ((min_ver[FW_VER_CHIP] != WLCORE_FW_VER_IGNORE) &&
|
||
|
+ (min_ver[FW_VER_CHIP] != fw_ver[FW_VER_CHIP]))
|
||
|
goto fail;
|
||
|
|
||
|
- /* always check the next digit if all previous ones are equal */
|
||
|
-
|
||
|
- if (min_ver[FW_VER_IF_TYPE] < fw_ver[FW_VER_IF_TYPE])
|
||
|
- goto out;
|
||
|
- else if (min_ver[FW_VER_IF_TYPE] > fw_ver[FW_VER_IF_TYPE])
|
||
|
+ /* the firmware type must be equal */
|
||
|
+ if ((min_ver[FW_VER_IF_TYPE] != WLCORE_FW_VER_IGNORE) &&
|
||
|
+ (min_ver[FW_VER_IF_TYPE] != fw_ver[FW_VER_IF_TYPE]))
|
||
|
goto fail;
|
||
|
|
||
|
- if (min_ver[FW_VER_MAJOR] < fw_ver[FW_VER_MAJOR])
|
||
|
- goto out;
|
||
|
- else if (min_ver[FW_VER_MAJOR] > fw_ver[FW_VER_MAJOR])
|
||
|
+ /* the project number must be equal */
|
||
|
+ if ((min_ver[FW_VER_SUBTYPE] != WLCORE_FW_VER_IGNORE) &&
|
||
|
+ (min_ver[FW_VER_SUBTYPE] != fw_ver[FW_VER_SUBTYPE]))
|
||
|
goto fail;
|
||
|
|
||
|
- if (min_ver[FW_VER_SUBTYPE] < fw_ver[FW_VER_SUBTYPE])
|
||
|
- goto out;
|
||
|
- else if (min_ver[FW_VER_SUBTYPE] > fw_ver[FW_VER_SUBTYPE])
|
||
|
+ /* the API version must be greater or equal */
|
||
|
+ if ((min_ver[FW_VER_MAJOR] != WLCORE_FW_VER_IGNORE) &&
|
||
|
+ (min_ver[FW_VER_MAJOR] > fw_ver[FW_VER_MAJOR]))
|
||
|
goto fail;
|
||
|
|
||
|
- if (min_ver[FW_VER_MINOR] < fw_ver[FW_VER_MINOR])
|
||
|
- goto out;
|
||
|
- else if (min_ver[FW_VER_MINOR] > fw_ver[FW_VER_MINOR])
|
||
|
+ /* if the API version is equal... */
|
||
|
+ if (((min_ver[FW_VER_MAJOR] == WLCORE_FW_VER_IGNORE) ||
|
||
|
+ (min_ver[FW_VER_MAJOR] == fw_ver[FW_VER_MAJOR])) &&
|
||
|
+ /* ...the minor must be greater or equal */
|
||
|
+ ((min_ver[FW_VER_MINOR] != WLCORE_FW_VER_IGNORE) &&
|
||
|
+ (min_ver[FW_VER_MINOR] > fw_ver[FW_VER_MINOR])))
|
||
|
goto fail;
|
||
|
|
||
|
-out:
|
||
|
return 0;
|
||
|
|
||
|
fail:
|
||
|
- wl1271_error("Your WiFi FW version (%u.%u.%u.%u.%u) is outdated.\n"
|
||
|
- "Please use at least FW %u.%u.%u.%u.%u.\n"
|
||
|
- "You can get more information at:\n"
|
||
|
- "http://wireless.kernel.org/en/users/Drivers/wl12xx",
|
||
|
+ for (i = 0; i < NUM_FW_VER; i++)
|
||
|
+ if (min_ver[i] == WLCORE_FW_VER_IGNORE)
|
||
|
+ snprintf(min_fw_str, sizeof(min_fw_str),
|
||
|
+ "%s*.", min_fw_str);
|
||
|
+ else
|
||
|
+ snprintf(min_fw_str, sizeof(min_fw_str),
|
||
|
+ "%s%u.", min_fw_str, min_ver[i]);
|
||
|
+
|
||
|
+ wl1271_error("Your WiFi FW version (%u.%u.%u.%u.%u) is invalid.\n"
|
||
|
+ "Please use at least FW %s\n"
|
||
|
+ "You can get the latest firmwares at:\n"
|
||
|
+ "git://github.com/TI-OpenLink/firmwares.git",
|
||
|
fw_ver[FW_VER_CHIP], fw_ver[FW_VER_IF_TYPE],
|
||
|
fw_ver[FW_VER_MAJOR], fw_ver[FW_VER_SUBTYPE],
|
||
|
- fw_ver[FW_VER_MINOR], min_ver[FW_VER_CHIP],
|
||
|
- min_ver[FW_VER_IF_TYPE], min_ver[FW_VER_MAJOR],
|
||
|
- min_ver[FW_VER_SUBTYPE], min_ver[FW_VER_MINOR]);
|
||
|
+ fw_ver[FW_VER_MINOR], min_fw_str);
|
||
|
return -EINVAL;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
cgit v0.9.2
|