@@ -2074,22 +2074,26 @@ int efx_mcdi_get_workarounds(struct efx_nic *efx, unsigned int *impl_out,
2074
2074
2075
2075
static int efx_mcdi_nvram_update_start (struct efx_nic * efx , unsigned int type )
2076
2076
{
2077
- MCDI_DECLARE_BUF (inbuf , MC_CMD_NVRAM_UPDATE_START_IN_LEN );
2077
+ MCDI_DECLARE_BUF (inbuf , MC_CMD_NVRAM_UPDATE_START_V2_IN_LEN );
2078
2078
int rc ;
2079
2079
2080
2080
MCDI_SET_DWORD (inbuf , NVRAM_UPDATE_START_IN_TYPE , type );
2081
+ MCDI_POPULATE_DWORD_1 (inbuf , NVRAM_UPDATE_START_V2_IN_FLAGS ,
2082
+ NVRAM_UPDATE_START_V2_IN_FLAG_REPORT_VERIFY_RESULT ,
2083
+ 1 );
2081
2084
2082
2085
BUILD_BUG_ON (MC_CMD_NVRAM_UPDATE_START_OUT_LEN != 0 );
2083
2086
2084
2087
rc = efx_mcdi_rpc (efx , MC_CMD_NVRAM_UPDATE_START , inbuf , sizeof (inbuf ),
2085
2088
NULL , 0 , NULL );
2089
+
2086
2090
return rc ;
2087
2091
}
2088
2092
2089
2093
static int efx_mcdi_nvram_read (struct efx_nic * efx , unsigned int type ,
2090
2094
loff_t offset , u8 * buffer , size_t length )
2091
2095
{
2092
- MCDI_DECLARE_BUF (inbuf , MC_CMD_NVRAM_READ_IN_LEN );
2096
+ MCDI_DECLARE_BUF (inbuf , MC_CMD_NVRAM_READ_IN_V2_LEN );
2093
2097
MCDI_DECLARE_BUF (outbuf ,
2094
2098
MC_CMD_NVRAM_READ_OUT_LEN (EFX_MCDI_NVRAM_LEN_MAX ));
2095
2099
size_t outlen ;
@@ -2098,6 +2102,8 @@ static int efx_mcdi_nvram_read(struct efx_nic *efx, unsigned int type,
2098
2102
MCDI_SET_DWORD (inbuf , NVRAM_READ_IN_TYPE , type );
2099
2103
MCDI_SET_DWORD (inbuf , NVRAM_READ_IN_OFFSET , offset );
2100
2104
MCDI_SET_DWORD (inbuf , NVRAM_READ_IN_LENGTH , length );
2105
+ MCDI_SET_DWORD (inbuf , NVRAM_READ_IN_V2_MODE ,
2106
+ MC_CMD_NVRAM_READ_IN_V2_DEFAULT );
2101
2107
2102
2108
rc = efx_mcdi_rpc (efx , MC_CMD_NVRAM_READ , inbuf , sizeof (inbuf ),
2103
2109
outbuf , sizeof (outbuf ), & outlen );
@@ -2147,15 +2153,51 @@ static int efx_mcdi_nvram_erase(struct efx_nic *efx, unsigned int type,
2147
2153
2148
2154
static int efx_mcdi_nvram_update_finish (struct efx_nic * efx , unsigned int type )
2149
2155
{
2150
- MCDI_DECLARE_BUF (inbuf , MC_CMD_NVRAM_UPDATE_FINISH_IN_LEN );
2151
- int rc ;
2156
+ MCDI_DECLARE_BUF (inbuf , MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_LEN );
2157
+ MCDI_DECLARE_BUF (outbuf , MC_CMD_NVRAM_UPDATE_FINISH_V2_OUT_LEN );
2158
+ size_t outlen ;
2159
+ int rc , rc2 ;
2152
2160
2153
2161
MCDI_SET_DWORD (inbuf , NVRAM_UPDATE_FINISH_IN_TYPE , type );
2154
-
2155
- BUILD_BUG_ON (MC_CMD_NVRAM_UPDATE_FINISH_OUT_LEN != 0 );
2162
+ /* Always set this flag. Old firmware ignores it */
2163
+ MCDI_POPULATE_DWORD_1 (inbuf , NVRAM_UPDATE_FINISH_V2_IN_FLAGS ,
2164
+ NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT ,
2165
+ 1 );
2156
2166
2157
2167
rc = efx_mcdi_rpc (efx , MC_CMD_NVRAM_UPDATE_FINISH , inbuf , sizeof (inbuf ),
2158
- NULL , 0 , NULL );
2168
+ outbuf , sizeof (outbuf ), & outlen );
2169
+ if (!rc && outlen >= MC_CMD_NVRAM_UPDATE_FINISH_V2_OUT_LEN ) {
2170
+ rc2 = MCDI_DWORD (outbuf , NVRAM_UPDATE_FINISH_V2_OUT_RESULT_CODE );
2171
+ if (rc2 != MC_CMD_NVRAM_VERIFY_RC_SUCCESS )
2172
+ netif_err (efx , drv , efx -> net_dev ,
2173
+ "NVRAM update failed verification with code 0x%x\n" ,
2174
+ rc2 );
2175
+ switch (rc2 ) {
2176
+ case MC_CMD_NVRAM_VERIFY_RC_SUCCESS :
2177
+ break ;
2178
+ case MC_CMD_NVRAM_VERIFY_RC_CMS_CHECK_FAILED :
2179
+ case MC_CMD_NVRAM_VERIFY_RC_MESSAGE_DIGEST_CHECK_FAILED :
2180
+ case MC_CMD_NVRAM_VERIFY_RC_SIGNATURE_CHECK_FAILED :
2181
+ case MC_CMD_NVRAM_VERIFY_RC_TRUSTED_APPROVERS_CHECK_FAILED :
2182
+ case MC_CMD_NVRAM_VERIFY_RC_SIGNATURE_CHAIN_CHECK_FAILED :
2183
+ rc = - EIO ;
2184
+ break ;
2185
+ case MC_CMD_NVRAM_VERIFY_RC_INVALID_CMS_FORMAT :
2186
+ case MC_CMD_NVRAM_VERIFY_RC_BAD_MESSAGE_DIGEST :
2187
+ rc = - EINVAL ;
2188
+ break ;
2189
+ case MC_CMD_NVRAM_VERIFY_RC_NO_VALID_SIGNATURES :
2190
+ case MC_CMD_NVRAM_VERIFY_RC_NO_TRUSTED_APPROVERS :
2191
+ case MC_CMD_NVRAM_VERIFY_RC_NO_SIGNATURE_MATCH :
2192
+ rc = - EPERM ;
2193
+ break ;
2194
+ default :
2195
+ netif_err (efx , drv , efx -> net_dev ,
2196
+ "Unknown response to NVRAM_UPDATE_FINISH\n" );
2197
+ rc = - EIO ;
2198
+ }
2199
+ }
2200
+
2159
2201
return rc ;
2160
2202
}
2161
2203
0 commit comments