Пример #1
0
int efx_mcdi_nvram_read(struct efx_nic *efx, unsigned int type,
			loff_t offset, u8 *buffer, size_t length)
{
	u8 inbuf[MC_CMD_NVRAM_READ_IN_LEN];
	u8 outbuf[MC_CMD_NVRAM_READ_OUT_LEN(EFX_MCDI_NVRAM_LEN_MAX)];
	size_t outlen;
	int rc;

	MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_TYPE, type);
	MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_OFFSET, offset);
	MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_LENGTH, length);

	rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_READ, inbuf, sizeof(inbuf),
			  outbuf, sizeof(outbuf), &outlen);
	if (rc)
		goto fail;

	memcpy(buffer, MCDI_PTR(outbuf, NVRAM_READ_OUT_READ_BUFFER), length);
	return 0;

fail:
	netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
	return rc;
}
Пример #2
0
	EFSYS_PROBE1(fail1, int, rc);

	return (rc);
}

	__checkReturn		int
siena_nvram_partn_read(
	__in			efx_nic_t *enp,
	__in			unsigned int partn,
	__in			unsigned int offset,
	__out_bcount(size)	caddr_t data,
	__in			size_t size)
{
	efx_mcdi_req_t req;
	uint8_t payload[MAX(MC_CMD_NVRAM_READ_IN_LEN,
			    MC_CMD_NVRAM_READ_OUT_LEN(SIENA_NVRAM_CHUNK))];
	size_t chunk;
	int rc;

	while (size > 0) {
		chunk = MIN(size, SIENA_NVRAM_CHUNK);

		req.emr_cmd = MC_CMD_NVRAM_READ;
		req.emr_in_buf = payload;
		req.emr_in_length = MC_CMD_NVRAM_READ_IN_LEN;
		req.emr_out_buf = payload;
		req.emr_out_length =
			MC_CMD_NVRAM_READ_OUT_LEN(SIENA_NVRAM_CHUNK);

		MCDI_IN_SET_DWORD(req, NVRAM_READ_IN_TYPE, partn);
		MCDI_IN_SET_DWORD(req, NVRAM_READ_IN_OFFSET, offset);