Commit 0479c19d authored by Johannes Berg's avatar Johannes Berg Committed by Wey-Yi Guy

iwlwifi: remove uCode alternatives mechanism

We've never released firmware using the alternatives
mechanism and our build process makes that difficult
anyway. This means that in every file we have ever
built (except maybe by hand for testing) the listed
alternative was 0. Make the alternative field in the
TLVs part of the TLV number (thus expanding that to
32 bits); this gives us more TLV numbers (not really
needed) and more importantly protects against rogue
firmware files that actually do use the alternatives
mechanism -- those will now be rejected since they
don't contain any valid TLVs.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
parent 84965795
...@@ -101,7 +101,6 @@ struct iwl_mod_params iwlagn_mod_params = { ...@@ -101,7 +101,6 @@ struct iwl_mod_params iwlagn_mod_params = {
.bt_coex_active = true, .bt_coex_active = true,
.power_level = IWL_POWER_INDEX_1, .power_level = IWL_POWER_INDEX_1,
.bt_ch_announce = true, .bt_ch_announce = true,
.wanted_ucode_alternative = 1,
.auto_agg = true, .auto_agg = true,
/* the rest are 0 by default */ /* the rest are 0 by default */
}; };
......
...@@ -2409,12 +2409,6 @@ MODULE_PARM_DESC(amsdu_size_8K, "enable 8K amsdu size"); ...@@ -2409,12 +2409,6 @@ MODULE_PARM_DESC(amsdu_size_8K, "enable 8K amsdu size");
module_param_named(fw_restart, iwlagn_mod_params.restart_fw, int, S_IRUGO); module_param_named(fw_restart, iwlagn_mod_params.restart_fw, int, S_IRUGO);
MODULE_PARM_DESC(fw_restart, "restart firmware in case of error"); MODULE_PARM_DESC(fw_restart, "restart firmware in case of error");
module_param_named(ucode_alternative,
iwlagn_mod_params.wanted_ucode_alternative,
int, S_IRUGO);
MODULE_PARM_DESC(ucode_alternative,
"specify ucode alternative to use from ucode file");
module_param_named(antenna_coupling, iwlagn_mod_params.ant_coupling, module_param_named(antenna_coupling, iwlagn_mod_params.ant_coupling,
int, S_IRUGO); int, S_IRUGO);
MODULE_PARM_DESC(antenna_coupling, MODULE_PARM_DESC(antenna_coupling,
......
...@@ -414,9 +414,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, ...@@ -414,9 +414,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
struct iwl_ucode_tlv *tlv; struct iwl_ucode_tlv *tlv;
size_t len = ucode_raw->size; size_t len = ucode_raw->size;
const u8 *data; const u8 *data;
int wanted_alternative = iwlagn_mod_params.wanted_ucode_alternative;
int tmp;
u64 alternatives;
u32 tlv_len; u32 tlv_len;
enum iwl_ucode_tlv_type tlv_type; enum iwl_ucode_tlv_type tlv_type;
const u8 *tlv_data; const u8 *tlv_data;
...@@ -434,23 +431,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, ...@@ -434,23 +431,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
return -EINVAL; return -EINVAL;
} }
/*
* Check which alternatives are present, and "downgrade"
* when the chosen alternative is not present, warning
* the user when that happens. Some files may not have
* any alternatives, so don't warn in that case.
*/
alternatives = le64_to_cpu(ucode->alternatives);
tmp = wanted_alternative;
if (wanted_alternative > 63)
wanted_alternative = 63;
while (wanted_alternative && !(alternatives & BIT(wanted_alternative)))
wanted_alternative--;
if (wanted_alternative && wanted_alternative != tmp)
IWL_WARN(drv,
"uCode alternative %d not available, choosing %d\n",
tmp, wanted_alternative);
drv->fw.ucode_ver = le32_to_cpu(ucode->ver); drv->fw.ucode_ver = le32_to_cpu(ucode->ver);
build = le32_to_cpu(ucode->build); build = le32_to_cpu(ucode->build);
...@@ -475,14 +455,11 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, ...@@ -475,14 +455,11 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
len -= sizeof(*ucode); len -= sizeof(*ucode);
while (len >= sizeof(*tlv)) { while (len >= sizeof(*tlv)) {
u16 tlv_alt;
len -= sizeof(*tlv); len -= sizeof(*tlv);
tlv = (void *)data; tlv = (void *)data;
tlv_len = le32_to_cpu(tlv->length); tlv_len = le32_to_cpu(tlv->length);
tlv_type = le16_to_cpu(tlv->type); tlv_type = le32_to_cpu(tlv->type);
tlv_alt = le16_to_cpu(tlv->alternative);
tlv_data = tlv->data; tlv_data = tlv->data;
if (len < tlv_len) { if (len < tlv_len) {
...@@ -493,14 +470,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, ...@@ -493,14 +470,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
len -= ALIGN(tlv_len, 4); len -= ALIGN(tlv_len, 4);
data += sizeof(*tlv) + ALIGN(tlv_len, 4); data += sizeof(*tlv) + ALIGN(tlv_len, 4);
/*
* Alternative 0 is always valid.
*
* Skip alternative TLVs that are not selected.
*/
if (tlv_alt != 0 && tlv_alt != wanted_alternative)
continue;
switch (tlv_type) { switch (tlv_type) {
case IWL_UCODE_TLV_INST: case IWL_UCODE_TLV_INST:
set_sec_data(pieces, IWL_UCODE_REGULAR, set_sec_data(pieces, IWL_UCODE_REGULAR,
......
...@@ -93,15 +93,7 @@ struct iwl_ucode_header { ...@@ -93,15 +93,7 @@ struct iwl_ucode_header {
* new TLV uCode file layout * new TLV uCode file layout
* *
* The new TLV file format contains TLVs, that each specify * The new TLV file format contains TLVs, that each specify
* some piece of data. To facilitate "groups", for example * some piece of data.
* different instruction image with different capabilities,
* bundled with the same init image, an alternative mechanism
* is provided:
* When the alternative field is 0, that means that the item
* is always valid. When it is non-zero, then it is only
* valid in conjunction with items of the same alternative,
* in which case the driver (user) selects one alternative
* to use.
*/ */
enum iwl_ucode_tlv_type { enum iwl_ucode_tlv_type {
...@@ -132,8 +124,7 @@ enum iwl_ucode_tlv_type { ...@@ -132,8 +124,7 @@ enum iwl_ucode_tlv_type {
}; };
struct iwl_ucode_tlv { struct iwl_ucode_tlv {
__le16 type; /* see above */ __le32 type; /* see above */
__le16 alternative; /* see comment */
__le32 length; /* not including type/length fields */ __le32 length; /* not including type/length fields */
u8 data[0]; u8 data[0];
}; };
...@@ -152,7 +143,7 @@ struct iwl_tlv_ucode_header { ...@@ -152,7 +143,7 @@ struct iwl_tlv_ucode_header {
u8 human_readable[64]; u8 human_readable[64];
__le32 ver; /* major/minor/API/serial */ __le32 ver; /* major/minor/API/serial */
__le32 build; __le32 build;
__le64 alternatives; /* bitmask of valid alternatives */ __le64 ignore;
/* /*
* The data contained herein has a TLV layout, * The data contained herein has a TLV layout,
* see above for the TLV header and types. * see above for the TLV header and types.
......
...@@ -129,7 +129,6 @@ extern struct iwl_mod_params iwlagn_mod_params; ...@@ -129,7 +129,6 @@ extern struct iwl_mod_params iwlagn_mod_params;
* @debug_level: levels are IWL_DL_* * @debug_level: levels are IWL_DL_*
* @ant_coupling: antenna coupling in dB, default = 0 * @ant_coupling: antenna coupling in dB, default = 0
* @bt_ch_announce: BT channel inhibition, default = enable * @bt_ch_announce: BT channel inhibition, default = enable
* @wanted_ucode_alternative: ucode alternative to use, default = 1
* @auto_agg: enable agg. without check, default = true * @auto_agg: enable agg. without check, default = true
*/ */
struct iwl_mod_params { struct iwl_mod_params {
...@@ -147,7 +146,6 @@ struct iwl_mod_params { ...@@ -147,7 +146,6 @@ struct iwl_mod_params {
u32 debug_level; u32 debug_level;
int ant_coupling; int ant_coupling;
bool bt_ch_announce; bool bt_ch_announce;
int wanted_ucode_alternative;
bool auto_agg; bool auto_agg;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment