|
|
@@ -404,6 +404,38 @@ static int iwl_set_default_calib(struct iwl_drv *drv, const u8 *data)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int iwl_set_ucode_api_flags(struct iwl_drv *drv, const u8 *data,
|
|
|
+ struct iwl_ucode_capabilities *capa)
|
|
|
+{
|
|
|
+ const struct iwl_ucode_api *ucode_api = (void *)data;
|
|
|
+ u32 api_index = le32_to_cpu(ucode_api->api_index);
|
|
|
+
|
|
|
+ if (api_index >= IWL_API_ARRAY_SIZE) {
|
|
|
+ IWL_ERR(drv, "api_index larger than supported by driver\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ capa->api[api_index] = le32_to_cpu(ucode_api->api_flags);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int iwl_set_ucode_capabilities(struct iwl_drv *drv, const u8 *data,
|
|
|
+ struct iwl_ucode_capabilities *capa)
|
|
|
+{
|
|
|
+ const struct iwl_ucode_capa *ucode_capa = (void *)data;
|
|
|
+ u32 api_index = le32_to_cpu(ucode_capa->api_index);
|
|
|
+
|
|
|
+ if (api_index >= IWL_CAPABILITIES_ARRAY_SIZE) {
|
|
|
+ IWL_ERR(drv, "api_index larger than supported by driver\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ capa->capa[api_index] = le32_to_cpu(ucode_capa->api_capa);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int iwl_parse_v1_v2_firmware(struct iwl_drv *drv,
|
|
|
const struct firmware *ucode_raw,
|
|
|
struct iwl_firmware_pieces *pieces)
|
|
|
@@ -638,6 +670,18 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
|
|
|
*/
|
|
|
capa->flags = le32_to_cpup((__le32 *)tlv_data);
|
|
|
break;
|
|
|
+ case IWL_UCODE_TLV_API_CHANGES_SET:
|
|
|
+ if (tlv_len != sizeof(struct iwl_ucode_api))
|
|
|
+ goto invalid_tlv_len;
|
|
|
+ if (iwl_set_ucode_api_flags(drv, tlv_data, capa))
|
|
|
+ goto tlv_error;
|
|
|
+ break;
|
|
|
+ case IWL_UCODE_TLV_ENABLED_CAPABILITIES:
|
|
|
+ if (tlv_len != sizeof(struct iwl_ucode_capa))
|
|
|
+ goto invalid_tlv_len;
|
|
|
+ if (iwl_set_ucode_capabilities(drv, tlv_data, capa))
|
|
|
+ goto tlv_error;
|
|
|
+ break;
|
|
|
case IWL_UCODE_TLV_INIT_EVTLOG_PTR:
|
|
|
if (tlv_len != sizeof(u32))
|
|
|
goto invalid_tlv_len;
|