mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
97 lines
3.6 KiB
Diff
97 lines
3.6 KiB
Diff
diff --git a/drivers/net/wireless/ti/wlcore/boot.c b/drivers/net/wireless/ti/wlcore/boot.c
|
|
index 375ea57..be216b8 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;
|
|
}
|
|
|
|
diff --git a/drivers/net/wireless/ti/wlcore/wlcore.h b/drivers/net/wireless/ti/wlcore/wlcore.h
|
|
index 96af4a1..6184f53 100644
|
|
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
|
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
|
@@ -430,6 +430,9 @@ wlcore_set_ht_cap(struct wl1271 *wl, enum ieee80211_band band,
|
|
memcpy(&wl->ht_cap[band], ht_cap, sizeof(*ht_cap));
|
|
}
|
|
|
|
+/* Tell wlcore not to care about this element when checking the version */
|
|
+#define WLCORE_FW_VER_IGNORE -1
|
|
+
|
|
static inline void
|
|
wlcore_set_min_fw_ver(struct wl1271 *wl, unsigned int chip,
|
|
unsigned int iftype, unsigned int major,
|