From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM04-CO1-obe.outbound.protection.outlook.com (NAM04-CO1-obe.outbound.protection.outlook.com [40.92.10.20]) by mx.groups.io with SMTP id smtpd.web10.144010.1598045027205493175 for ; Fri, 21 Aug 2020 14:23:47 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@outlook.com header.s=selector1 header.b=uYyCS+qy; spf=pass (domain: outlook.com, ip: 40.92.10.20, mailfrom: michael.kubacki@outlook.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VIEVCfzJKhoKnYvRnKi5LnF/nyTDwlQtYFNSyMfQoU+CXoqGDJexM0ckrAuKHaPuTchQy9pWg9zQvGgurueUQKNpqgs4neNwBmyI15vbPsNyIXaYrXYl2QxZ1YP74WpQ6CZ5Xj0eWZ29GZhErBJO+43VsayB/3engfK6zjOuzEpij2v8Y8KqdxQlcx0qoqNnJF+YoyPtdDvlLuSNZcLiNMzhU/v/0KqDClV1K2diRR4Wqj+/e0OcptPn3JWA/5o0Ec9YeehnuGFf/fq+BDAWnl7fSbi2ZnK+qpfIogvg7iAF3rEWIh0r1jGkQ7vcQ7NQ82ocv4lY7T6urOe/mMFtYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7TyhV7xhmb/RJ79wI6KjUlNlFsDtxXRRWVfcOLMB/D0=; b=JiMfbqgKmmo29SGzf8vLcXm9A7uP+/apoPtNbbjnxv6aqH9DWmGqVYGAzdRHkiFUmT/RU9wsy5wl6HwMWR0ykPb2/4CXPAvdN7GbvKzv1ibZxJ+spklfJc/3NZhxoJffoMp3hQ8D0S5T3Ir1d8l6/dOcK0FwrlFNmgRxirLoS2Wht7wnaHL9bJ2tD/LK4MG5yVNY4Ry8jtSdgdCmQTR8RTePR1FX2945Jy3syErMX0R19laL5BzeGQPu7ZhWI2kzFHVVQEj6OPaIKs8PWzGZ+HJmuCZyKmO9PQlNQEBzr2BO00LqwdM4RP8seRrecWbF7Fjuw3ZQ29Efj2mdf4sMvQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7TyhV7xhmb/RJ79wI6KjUlNlFsDtxXRRWVfcOLMB/D0=; b=uYyCS+qyQCQQLToh+waYIvSfKM6P43AxWx2AmkcPxEfo4BphTycS1BXVu/EUJQjmxZoIzb4ZxXn4obH+36tWNnOVRpXjx0y64zJM7AR7uWUevoOtfmNxRM/s3+Y/voJIqJ/sgIT9rdorKsadHT0KXhxcZT3cXpnMcmg0BYEGs/887aAFQTmw2OsMxZcOWWxsXPwvdCCbtpIo3Yid8xLzH2WybrOJoYSRk3NSzjZ7SPaS+qktebbkL2PAFUWM+xg0hca5Tdl9dDOvMmRGX5ykC6Zn6vN9vXwRZHwu5RqLotHlbXdLQcT5Kds20Yew4Ms+Qlx07WnRpo8YRqe4sa67GQ== Received: from BN3NAM04FT020.eop-NAM04.prod.protection.outlook.com (10.152.92.56) by BN3NAM04HT012.eop-NAM04.prod.protection.outlook.com (10.152.92.124) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3305.25; Fri, 21 Aug 2020 21:23:45 +0000 Received: from MWHPR07MB3440.namprd07.prod.outlook.com (2a01:111:e400:7e4e::52) by BN3NAM04FT020.mail.protection.outlook.com (2a01:111:e400:7e4e::167) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3305.25 via Frontend Transport; Fri, 21 Aug 2020 21:23:45 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:F7BA0CC61D728BF10C570F2B8460ED486C6828E8E0F7CA993D672085C62094A7;UpperCasedChecksum:E11033180646CC614BAC84108512B515BADB655E53D6CDF39F6D9D4AB2D50374;SizeAsReceived:9499;Count:49 Received: from MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::eda9:ccc8:2ef:2471]) by MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::eda9:ccc8:2ef:2471%7]) with mapi id 15.20.3305.026; Fri, 21 Aug 2020 21:23:45 +0000 Subject: Re: [edk2-devel] [PATCH v2 2/6] FmpDevicePkg: Add LastAttemptStatus.h To: "Desimone, Nathaniel L" , "devel@edk2.groups.io" CC: "Gao, Liming" , "Kinney, Michael D" , "Jiang, Guomin" , "Xu, Wei6" References: <20200810202753.1318-1-michael.kubacki@outlook.com> From: "Michael Kubacki" Message-ID: Date: Fri, 21 Aug 2020 14:23:45 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.11.0 In-Reply-To: X-ClientProxiedBy: MWHPR22CA0066.namprd22.prod.outlook.com (2603:10b6:300:12a::28) To MWHPR07MB3440.namprd07.prod.outlook.com (2603:10b6:301:69::28) Return-Path: michael.kubacki@outlook.com X-Microsoft-Original-Message-ID: <420854f1-556a-3fa9-6fe4-4eba051ac368@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from 255.255.255.255 (255.255.255.255) by MWHPR22CA0066.namprd22.prod.outlook.com (2603:10b6:300:12a::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3305.25 via Frontend Transport; Fri, 21 Aug 2020 21:23:44 +0000 X-Microsoft-Original-Message-ID: <420854f1-556a-3fa9-6fe4-4eba051ac368@outlook.com> X-TMN: [wzvGnpAcTlEZneaw6nj2KSoDtl1HVz1gH/170OTMHOfh+EYt+z8ZFkcmnwoY2XCM] X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 49 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 8de387bb-733c-4519-819e-08d846187c29 X-MS-TrafficTypeDiagnostic: BN3NAM04HT012: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZTxJ/db/tisLD+jM3Ga2d530KeZf+ZvnxUuHeknDv9f0XSjdgJC84ifbDcnFYHICupqYUrezdZzOWnUkhP5YbXs0JocEmlL8p3BJHB69MnUUBjCIvFNS70agWLAljAiNrWNUpMScXJbYy1dWKhZpmH7JfUqvd5MTnnpV8IhOcsmgZVOqC9pUnWY6PaZeNh0iCLYREaVA8559Qwkf+2RwC6uFypvVZMDKztZbeO8Qif7g6GC/5T6qHlL4V6vsFmQI X-MS-Exchange-AntiSpam-MessageData: Lpm4l7uSAefCS/Ox6Ru/lww4lw2wYkWOCQMuwR4aWnkvT8JPx7qrLUKK/xrzEYFCavDkZNs/tydIYlF0BU6ydJzKWPs72Gd6NC/feJ65x6Qqb5BQgVSUkoZhdlgyFkv0z98g0p7W1t/OH3XZWFo6yWkaj07JogxZI6aVuY1axwhfGLxfHNjl/3uJTaAvyMP/R22f453z0E8DAZfDGbUZ4w== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8de387bb-733c-4519-819e-08d846187c29 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2020 21:23:45.2907 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: BN3NAM04FT020.eop-NAM04.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3NAM04HT012 Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: quoted-printable Hi Nate, Yes, these are individual codes used within FmpDevicePkg. The specific=20 error codes in the enum in v2 are not intended to be used outside=20 FmpDevicePkg. I refactored this in v3. What is desired is a way to consistently map error codes to specific=20 error sources during the update flow. The codes might come from common=20 FmpDevicePkg source code (like FmpDxe) or platform authored source code=20 (like FmpDeviceLib). The exact codes used in FmpDevicePkg implementation= =20 do not necessarily need to be known to the library (it doesn't receive=20 those as input) and the library is free to define codes for its own=20 library instance implementation to use as output. For example, there=20 might be cases where the FmpDxe driver and a FmpDeviceLib instance both=20 define a similar error code (e.g. memory allocation failed) but the=20 specific value leads to a particular error condition in either component. At the moment, FmpDevicePkg implementation and FmpDeviceLib instances=20 are the two high-level pieces involved in producing error codes so=20 within the overall 0x1000 - 0x3FFF range available, they're each be=20 assigned an overall range in the public header of length 0x800 (in v4)=20 leaving 0x2000 for future expansion. In V3, this led to the ranges being= =20 defined in a public header but the specific error codes in the enum=20 being defined in a private header. Thanks, Michael On 8/20/2020 10:33 PM, Desimone, Nathaniel L wrote: > Hi Michael, >=20 > I guess I might not understand the exact use cases for the enum. It seem= s like the meaning of the error codes you only want to be known within FmpD= evicePkg, but it appears to me that the error code values could traverse to= drivers outside this package, is that correct? >=20 > Thanks, > Nate >=20 > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Michael K= ubacki > Sent: Tuesday, August 11, 2020 11:58 AM > To: Desimone, Nathaniel L ; devel@edk2.g= roups.io > Cc: Gao, Liming ; Kinney, Michael D ; Jiang, Guomin ; Xu, Wei6 > Subject: Re: [edk2-devel] [PATCH v2 2/6] FmpDevicePkg: Add LastAttemptSt= atus.h >=20 > I realized there is room for misinterpretation of the macros LAST_ATTEMP= T_STATUS_DRIVER_ERROR_COUNT and LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_COUNT = based on name. >=20 > If there's no further feedback on the topic, I'll change them to LAST_AT= TEMPT_STATUS_DRIVER_ERROR_RANGE_LENGTH and LAST_ATTEMPT_STATUS_DEPENDENCY_E= RROR_RANGE_LENGTH. >=20 > Thanks, > Michael >=20 > On 8/11/2020 10:46 AM, Michael Kubacki wrote: >> #1: In v3, I'm going to split it such that the defines are in the >> public header and the enum specifying the internal driver and >> dependency ranges are in a private header to FmpDevicePkg. >> >> Here's the current set of v3 changes to agree upon before sending a ser= ies: >> 1. Move the defines for the ranges to a public header 2. Move the enum >> to a private instance file 3. Rename >> LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ERROR_CODE to >> LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_ERROR_MIN_ERROR_CODE >> 4. Include a comment to explicitly state new codes within a given >> range must be added at the end of the range >> >> Please let me know if there's any further feedback. >> >> Thanks, >> Michael >> >> On 8/10/2020 5:31 PM, Desimone, Nathaniel L wrote: >>> My feedback: >>> >>> #1: Why is LastAttemptStatus.h in PrivateInclude? Seems like >>> something you would want to have as a public header. >>> >>> #2: If someone inserts a new enum value in the middle of >>> LAST_ATTEMPT_STATUS_EXPANDED_ERROR_LIST it will make it difficult to >>> decode error codes in the future. Either put a comment that new error >>> code should go on the bottom. Or add some space between each entry >>> using something like this: >>> >>> enum LAST_ATTEMPT_STATUS_EXPANDED_ERROR_LIST >>> { >>> =C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN, >>> =C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_PROGRESS_CALLBACK_ERROR= =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN + 10, >>> =C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_CHECK_POWER_API =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN + 20, >>> =C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_CHECK_SYS_THERMAL_API = =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN + 30, >>> =C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_THERMAL =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN + 40, >>> =C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_CHECK_SYS_ENV_API =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN + 50, >>> =C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_SYSTEM_ENV =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN + 60, >>> >>> Then you can insert something in the middle by adding +5. >>> >>> Thanks, >>> Nate >>> >>> =EF=BB=BFOn 8/10/20, 1:28 PM, "devel@edk2.groups.io on behalf of Micha= el >>> Kubacki" >> michael.kubacki@outlook.com> wrote: >>> >>> =C2=A0=C2=A0=C2=A0=C2=A0 From: Michael Kubacki >>> >>> =C2=A0=C2=A0=C2=A0=C2=A0 Introduces a header file to contain Last Att= empt Status codes >>> that >>> =C2=A0=C2=A0=C2=A0=C2=A0 define granular FmpDevicePkg usage of the UE= FI Specification >>> =C2=A0=C2=A0=C2=A0=C2=A0 defined vendor range. The vendor range is de= scribed in UEFI >>> =C2=A0=C2=A0=C2=A0=C2=A0 Specification 2.8A section 23.4. >>> >>> =C2=A0=C2=A0=C2=A0=C2=A0 With this change, FmpDevicePkg currently def= ines three subranges >>> of >>> =C2=A0=C2=A0=C2=A0=C2=A0 the Last Attempt Status vendor range: >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1. Driver - Codes returned from = operations performed by the >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FmpDxe driver. >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 2. Dependency - Codes returned f= rom FMP dependency related >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 functionality = (e.g. FmpDependencyLib). >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 3. Library - Codes returned from= FmpDeviceLib instances. >>> >>> =C2=A0=C2=A0=C2=A0=C2=A0 Cc: Liming Gao >>> =C2=A0=C2=A0=C2=A0=C2=A0 Cc: Michael D Kinney >>> =C2=A0=C2=A0=C2=A0=C2=A0 Cc: Guomin Jiang >>> =C2=A0=C2=A0=C2=A0=C2=A0 Cc: Wei6 Xu >>> =C2=A0=C2=A0=C2=A0=C2=A0 Signed-off-by: Michael Kubacki >>> =C2=A0=C2=A0=C2=A0=C2=A0 --- >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FmpDevicePkg/PrivateInclude/LastAttemp= tStatus.h | 81 >>> ++++++++++++++++++++ >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1 file changed, 81 insertions(+) >>> >>> =C2=A0=C2=A0=C2=A0=C2=A0 diff --git a/FmpDevicePkg/PrivateInclude/Las= tAttemptStatus.h >>> b/FmpDevicePkg/PrivateInclude/LastAttemptStatus.h >>> =C2=A0=C2=A0=C2=A0=C2=A0 new file mode 100644 >>> =C2=A0=C2=A0=C2=A0=C2=A0 index 000000000000..01e96b23edad >>> =C2=A0=C2=A0=C2=A0=C2=A0 --- /dev/null >>> =C2=A0=C2=A0=C2=A0=C2=A0 +++ b/FmpDevicePkg/PrivateInclude/LastAttemp= tStatus.h >>> =C2=A0=C2=A0=C2=A0=C2=A0 @@ -0,0 +1,81 @@ >>> =C2=A0=C2=A0=C2=A0=C2=A0 +/** @file >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 Defines last attempt status codes us= ed in FmpDevicePkg. >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 Copyright (c) Microsoft Corporation.=
>>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 SPDX-License-Identifier: BSD-2-Claus= e-Patent >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +**/ >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#ifndef __FMP_LAST_ATTEMPT_STATUS_H__ >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#define __FMP_LAST_ATTEMPT_STATUS_H__ >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// Size of the error code range for FMP dri= ver-specific errors >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#define LAST_ATTEMPT_STATUS_DRIVER_ERROR_CO= UNT >>> 0x80 >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// Size of the error code range for FMP dep= endency related >>> errors >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#define LAST_ATTEMPT_STATUS_DEPENDENCY_ERRO= R_COUNT >>> 0x20 >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#define LAST_ATTEMPT_STATUS_DRIVER_MAX_ERRO= R_CODE_VALUE >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN + \ >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> LAST_ATTEMPT_STATUS_DRIVER_ERROR_COUNT - 1 >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#define LAST_ATTEMPT_STATUS_DEPENDENCY_MAX_= ERROR_CODE_VALUE >>> LAST_ATTEMPT_STATUS_DRIVER_MAX_ERROR_CODE_VALUE + \ >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_COUNT >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#define LAST_ATTEMPT_STATUS_LIBRARY_MAX_ERR= OR_CODE_VALUE >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX - 1 >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// Last attempt status codes defined for ad= ditional granularity >>> in the FMP stack. >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// These codes are defined within the highe= r-level UEFI >>> specification defined UNSUCCESSFUL_VENDOR_RANGE. >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// The following last attempt status code r= anges are defined >>> for the following corresponding component: >>> =C2=A0=C2=A0=C2=A0=C2=A0 +//=C2=A0=C2=A0 * LAST_ATTEMPT_STATUS_DRIVER= - FMP driver >>> =C2=A0=C2=A0=C2=A0=C2=A0 +//=C2=A0=C2=A0 * LAST_ATTEMPT_STATUS_DEPEND= ENCY - FMP dependency >>> functionality >>> =C2=A0=C2=A0=C2=A0=C2=A0 +//=C2=A0=C2=A0 * LAST_ATTEMPT_STATUS_LIBRAR= Y - FMP device library >>> instances >>> =C2=A0=C2=A0=C2=A0=C2=A0 +// >>> =C2=A0=C2=A0=C2=A0=C2=A0 +enum LAST_ATTEMPT_STATUS_EXPANDED_ERROR_LIS= T >>> =C2=A0=C2=A0=C2=A0=C2=A0 +{ >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 =3D >>> LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN, >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_PRO= GRESS_CALLBACK_ERROR >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_CHE= CK_POWER_API >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_CHE= CK_SYS_THERMAL_API >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_THE= RMAL >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_CHE= CK_SYS_ENV_API >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_SYS= TEM_ENV >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET= _FMP_HEADER_SIZE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET= _ALL_HEADER_SIZE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET= _FMP_HEADER_VERSION >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMA= GE_NOT_PROVIDED >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMA= GE_NOT_UPDATABLE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_INV= ALID_CERTIFICATE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_INV= ALID_IMAGE_INDEX >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_INV= ALID_KEY_LENGTH >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_INV= ALID_KEY_LENGTH_VALUE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_VER= SION_TOO_LOW >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_DEV= ICE_LOCKED >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMA= GE_AUTH_FAILURE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DRIVER_ERROR_PRO= TOCOL_ARG_MISSING >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> LAST_ATTEMPT_STATUS_DRIVER_ERROR_MAX_ERROR_CODE=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 =3D >>> LAST_ATTEMPT_STATUS_DRIVER_MAX_ERROR_CODE_VALUE, >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _GET_DEPEX_FAILURE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _NO_END_OPCODE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _UNKNOWN_OPCODE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _MEMORY_ALLOCATION_FAILED >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _GUID_BEYOND_DEPEX >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _VERSION_BEYOND_DEPEX >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _VERSION_STR_BEYOND_DEPEX >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _FMP_NOT_FOUND >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _PUSH_FAILURE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR= _POP_FAILURE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_MAX_ERROR_CODE=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D >>> LAST_ATTEMPT_STATUS_DEPENDENCY_MAX_ERROR_CODE_VALUE, >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +=C2=A0 LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MI= N_ERROR_CODE >>> , >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ERROR_CODE=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D >>> LAST_ATTEMPT_STATUS_LIBRARY_MAX_ERROR_CODE_VALUE >>> =C2=A0=C2=A0=C2=A0=C2=A0 +}; >>> =C2=A0=C2=A0=C2=A0=C2=A0 + >>> =C2=A0=C2=A0=C2=A0=C2=A0 +#endif >>> =C2=A0=C2=A0=C2=A0=C2=A0 -- >>> =C2=A0=C2=A0=C2=A0=C2=A0 2.28.0.windows.1 >>> >>> >>> =20 >>> >>> >=20 >=20 >=20