Skip to content

Commit

Permalink
sfc: Implement NVRAM selftest for SFC9000 family
Browse files Browse the repository at this point in the history
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ben Hutchings authored and David S. Miller committed Feb 4, 2010
1 parent 4f16c07 commit 2e80340
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
46 changes: 46 additions & 0 deletions drivers/net/sfc/mcdi.c
Original file line number Diff line number Diff line change
Expand Up @@ -896,6 +896,52 @@ int efx_mcdi_nvram_update_finish(struct efx_nic *efx, unsigned int type)
return rc;
}

static int efx_mcdi_nvram_test(struct efx_nic *efx, unsigned int type)
{
u8 inbuf[MC_CMD_NVRAM_TEST_IN_LEN];
u8 outbuf[MC_CMD_NVRAM_TEST_OUT_LEN];
int rc;

MCDI_SET_DWORD(inbuf, NVRAM_TEST_IN_TYPE, type);

rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_TEST, inbuf, sizeof(inbuf),
outbuf, sizeof(outbuf), NULL);
if (rc)
return rc;

switch (MCDI_DWORD(outbuf, NVRAM_TEST_OUT_RESULT)) {
case MC_CMD_NVRAM_TEST_PASS:
case MC_CMD_NVRAM_TEST_NOTSUPP:
return 0;
default:
return -EIO;
}
}

int efx_mcdi_nvram_test_all(struct efx_nic *efx)
{
u32 nvram_types;
unsigned int type;
int rc;

rc = efx_mcdi_nvram_types(efx, &nvram_types);
if (rc)
return rc;

type = 0;
while (nvram_types != 0) {
if (nvram_types & 1) {
rc = efx_mcdi_nvram_test(efx, type);
if (rc)
return rc;
}
type++;
nvram_types >>= 1;
}

return 0;
}

static int efx_mcdi_read_assertion(struct efx_nic *efx)
{
u8 inbuf[MC_CMD_GET_ASSERTS_IN_LEN];
Expand Down
1 change: 1 addition & 0 deletions drivers/net/sfc/mcdi.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ extern int efx_mcdi_nvram_erase(struct efx_nic *efx, unsigned int type,
loff_t offset, size_t length);
extern int efx_mcdi_nvram_update_finish(struct efx_nic *efx,
unsigned int type);
extern int efx_mcdi_nvram_test_all(struct efx_nic *efx);
extern int efx_mcdi_handle_assertion(struct efx_nic *efx);
extern void efx_mcdi_set_id_led(struct efx_nic *efx, enum efx_led_mode mode);
extern int efx_mcdi_reset_port(struct efx_nic *efx);
Expand Down
1 change: 1 addition & 0 deletions drivers/net/sfc/siena.c
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,7 @@ struct efx_nic_type siena_a0_nic_type = {
.set_wol = siena_set_wol,
.resume_wol = siena_init_wol,
.test_registers = siena_test_registers,
.test_nvram = efx_mcdi_nvram_test_all,
.default_mac_ops = &efx_mcdi_mac_operations,

.revision = EFX_REV_SIENA_A0,
Expand Down

0 comments on commit 2e80340

Please sign in to comment.