Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e803407 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller
Browse files

sfc: Implement NVRAM selftest for SFC9000 family

parent 4f16c073
Loading
Loading
Loading
Loading
+46 −0
Original line number Original line Diff line number Diff line
@@ -896,6 +896,52 @@ int efx_mcdi_nvram_update_finish(struct efx_nic *efx, unsigned int type)
	return rc;
	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)
static int efx_mcdi_read_assertion(struct efx_nic *efx)
{
{
	u8 inbuf[MC_CMD_GET_ASSERTS_IN_LEN];
	u8 inbuf[MC_CMD_GET_ASSERTS_IN_LEN];
+1 −0
Original line number Original line Diff line number Diff line
@@ -116,6 +116,7 @@ extern int efx_mcdi_nvram_erase(struct efx_nic *efx, unsigned int type,
				loff_t offset, size_t length);
				loff_t offset, size_t length);
extern int efx_mcdi_nvram_update_finish(struct efx_nic *efx,
extern int efx_mcdi_nvram_update_finish(struct efx_nic *efx,
					unsigned int type);
					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 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 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);
extern int efx_mcdi_reset_port(struct efx_nic *efx);
+1 −0
Original line number Original line Diff line number Diff line
@@ -583,6 +583,7 @@ struct efx_nic_type siena_a0_nic_type = {
	.set_wol = siena_set_wol,
	.set_wol = siena_set_wol,
	.resume_wol = siena_init_wol,
	.resume_wol = siena_init_wol,
	.test_registers = siena_test_registers,
	.test_registers = siena_test_registers,
	.test_nvram = efx_mcdi_nvram_test_all,
	.default_mac_ops = &efx_mcdi_mac_operations,
	.default_mac_ops = &efx_mcdi_mac_operations,


	.revision = EFX_REV_SIENA_A0,
	.revision = EFX_REV_SIENA_A0,