u32 tlv_len;
enum iwl_ucode_tlv_type tlv_type;
const u8 *tlv_data;
- int ret = 0;
if (len < sizeof(*ucode)) {
IWL_ERR(priv, "uCode has invalid length: %zd\n", len);
len -= sizeof(*ucode);
- while (len >= sizeof(*tlv) && !ret) {
+ while (len >= sizeof(*tlv)) {
u16 tlv_alt;
- u32 fixed_tlv_size = 4;
len -= sizeof(*tlv);
tlv = (void *)data;
pieces->boot_size = tlv_len;
break;
case IWL_UCODE_TLV_PROBE_MAX_LEN:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- capa->max_probe_length =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ capa->max_probe_length =
le32_to_cpup((__le32 *)tlv_data);
break;
case IWL_UCODE_TLV_INIT_EVTLOG_PTR:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- pieces->init_evtlog_ptr =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ pieces->init_evtlog_ptr =
le32_to_cpup((__le32 *)tlv_data);
break;
case IWL_UCODE_TLV_INIT_EVTLOG_SIZE:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- pieces->init_evtlog_size =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ pieces->init_evtlog_size =
le32_to_cpup((__le32 *)tlv_data);
break;
case IWL_UCODE_TLV_INIT_ERRLOG_PTR:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- pieces->init_errlog_ptr =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ pieces->init_errlog_ptr =
le32_to_cpup((__le32 *)tlv_data);
break;
case IWL_UCODE_TLV_RUNT_EVTLOG_PTR:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- pieces->inst_evtlog_ptr =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ pieces->inst_evtlog_ptr =
le32_to_cpup((__le32 *)tlv_data);
break;
case IWL_UCODE_TLV_RUNT_EVTLOG_SIZE:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- pieces->inst_evtlog_size =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ pieces->inst_evtlog_size =
le32_to_cpup((__le32 *)tlv_data);
break;
case IWL_UCODE_TLV_RUNT_ERRLOG_PTR:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- pieces->inst_errlog_ptr =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ pieces->inst_errlog_ptr =
le32_to_cpup((__le32 *)tlv_data);
break;
case IWL_UCODE_TLV_ENHANCE_SENS_TBL:
if (tlv_len)
- ret = -EINVAL;
- else
- priv->enhance_sensitivity_table = true;
+ goto invalid_tlv_len;
+ priv->enhance_sensitivity_table = true;
break;
case IWL_UCODE_TLV_PHY_CALIBRATION_SIZE:
- if (tlv_len != fixed_tlv_size)
- ret = -EINVAL;
- else
- capa->standard_phy_calibration_size =
+ if (tlv_len != sizeof(u32))
+ goto invalid_tlv_len;
+ capa->standard_phy_calibration_size =
le32_to_cpup((__le32 *)tlv_data);
break;
default:
if (len) {
IWL_ERR(priv, "invalid TLV after parsing: %zd\n", len);
iwl_print_hex_dump(priv, IWL_DL_FW, (u8 *)data, len);
- ret = -EINVAL;
- } else if (ret) {
- IWL_ERR(priv, "TLV %d has invalid size: %u\n",
- tlv_type, tlv_len);
- iwl_print_hex_dump(priv, IWL_DL_FW, (u8 *)tlv_data, tlv_len);
+ return -EINVAL;
}
- return ret;
+ return 0;
+
+ invalid_tlv_len:
+ IWL_ERR(priv, "TLV %d has invalid size: %u\n", tlv_type, tlv_len);
+ iwl_print_hex_dump(priv, IWL_DL_FW, tlv_data, tlv_len);
+
+ return -EINVAL;
}
/**