Skip to content

Commit 5fb1bee

Browse files
sf-hgkdavem330
authored andcommitted
sfc: extend MTD support for newer hardware
The X2 family of NICs (based on the SFC9250) have additional MTD partitions for firmware and configuration. This includes partitions that are read-only. The NICs also have extended versions of the NVRAM interface, allowing more detailed status information to be returned. Signed-off-by: Bert Kenward <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent cea3bfb commit 5fb1bee

File tree

3 files changed

+63
-10
lines changed

3 files changed

+63
-10
lines changed

drivers/net/ethernet/sfc/ef10.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6041,10 +6041,11 @@ static const struct efx_ef10_nvram_type_info efx_ef10_nvram_types[] = {
60416041
{ NVRAM_PARTITION_TYPE_EXPROM_CONFIG_PORT3, 0, 3, "sfc_exp_rom_cfg" },
60426042
{ NVRAM_PARTITION_TYPE_LICENSE, 0, 0, "sfc_license" },
60436043
{ NVRAM_PARTITION_TYPE_PHY_MIN, 0xff, 0, "sfc_phy_fw" },
6044-
/* MUM and SUC firmware share the same partition type */
60456044
{ NVRAM_PARTITION_TYPE_MUM_FIRMWARE, 0, 0, "sfc_mumfw" },
60466045
{ NVRAM_PARTITION_TYPE_EXPANSION_UEFI, 0, 0, "sfc_uefi" },
6047-
{ NVRAM_PARTITION_TYPE_STATUS, 0, 0, "sfc_status" }
6046+
{ NVRAM_PARTITION_TYPE_DYNCONFIG_DEFAULTS, 0, 0, "sfc_dynamic_cfg_dflt" },
6047+
{ NVRAM_PARTITION_TYPE_ROMCONFIG_DEFAULTS, 0, 0, "sfc_exp_rom_cfg_dflt" },
6048+
{ NVRAM_PARTITION_TYPE_STATUS, 0, 0, "sfc_status" },
60486049
};
60496050

60506051
static int efx_ef10_mtd_probe_partition(struct efx_nic *efx,
@@ -6071,8 +6072,15 @@ static int efx_ef10_mtd_probe_partition(struct efx_nic *efx,
60716072
rc = efx_mcdi_nvram_info(efx, type, &size, &erase_size, &protected);
60726073
if (rc)
60736074
return rc;
6075+
if (protected &&
6076+
(type != NVRAM_PARTITION_TYPE_DYNCONFIG_DEFAULTS &&
6077+
type != NVRAM_PARTITION_TYPE_ROMCONFIG_DEFAULTS))
6078+
/* Hide protected partitions that don't provide defaults. */
6079+
return -ENODEV;
6080+
60746081
if (protected)
6075-
return -ENODEV; /* hide it */
6082+
/* Protected partitions are read only. */
6083+
erase_size = 0;
60766084

60776085
part->nvram_type = type;
60786086

drivers/net/ethernet/sfc/mcdi.c

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2074,22 +2074,26 @@ int efx_mcdi_get_workarounds(struct efx_nic *efx, unsigned int *impl_out,
20742074

20752075
static int efx_mcdi_nvram_update_start(struct efx_nic *efx, unsigned int type)
20762076
{
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);
20782078
int rc;
20792079

20802080
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);
20812084

20822085
BUILD_BUG_ON(MC_CMD_NVRAM_UPDATE_START_OUT_LEN != 0);
20832086

20842087
rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_UPDATE_START, inbuf, sizeof(inbuf),
20852088
NULL, 0, NULL);
2089+
20862090
return rc;
20872091
}
20882092

20892093
static int efx_mcdi_nvram_read(struct efx_nic *efx, unsigned int type,
20902094
loff_t offset, u8 *buffer, size_t length)
20912095
{
2092-
MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_READ_IN_LEN);
2096+
MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_READ_IN_V2_LEN);
20932097
MCDI_DECLARE_BUF(outbuf,
20942098
MC_CMD_NVRAM_READ_OUT_LEN(EFX_MCDI_NVRAM_LEN_MAX));
20952099
size_t outlen;
@@ -2098,6 +2102,8 @@ static int efx_mcdi_nvram_read(struct efx_nic *efx, unsigned int type,
20982102
MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_TYPE, type);
20992103
MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_OFFSET, offset);
21002104
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);
21012107

21022108
rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_READ, inbuf, sizeof(inbuf),
21032109
outbuf, sizeof(outbuf), &outlen);
@@ -2147,15 +2153,51 @@ static int efx_mcdi_nvram_erase(struct efx_nic *efx, unsigned int type,
21472153

21482154
static int efx_mcdi_nvram_update_finish(struct efx_nic *efx, unsigned int type)
21492155
{
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;
21522160

21532161
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);
21562166

21572167
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+
21592201
return rc;
21602202
}
21612203

drivers/net/ethernet/sfc/mtd.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ int efx_mtd_add(struct efx_nic *efx, struct efx_mtd_partition *parts,
6666

6767
part->mtd.writesize = 1;
6868

69+
if (!(part->mtd.flags & MTD_NO_ERASE))
70+
part->mtd.flags |= MTD_WRITEABLE;
71+
6972
part->mtd.owner = THIS_MODULE;
7073
part->mtd.priv = efx;
7174
part->mtd.name = part->name;

0 commit comments

Comments
 (0)