Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/efx_nvram.c
Show First 20 Lines • Show All 892 Lines • ▼ Show 20 Lines | |||||
efx_mcdi_nvram_write( | efx_mcdi_nvram_write( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in uint32_t partn, | __in uint32_t partn, | ||||
__in uint32_t offset, | __in uint32_t offset, | ||||
__in_bcount(size) caddr_t data, | __in_bcount(size) caddr_t data, | ||||
__in size_t size) | __in size_t size) | ||||
{ | { | ||||
efx_mcdi_req_t req; | efx_mcdi_req_t req; | ||||
uint8_t payload[MAX(MCDI_CTL_SDU_LEN_MAX_V1, | uint8_t *payload; | ||||
MCDI_CTL_SDU_LEN_MAX_V2)]; | |||||
efx_rc_t rc; | efx_rc_t rc; | ||||
size_t max_data_size; | size_t max_data_size; | ||||
size_t payload_len = enp->en_nic_cfg.enc_mcdi_max_payload_length; | |||||
max_data_size = enp->en_nic_cfg.enc_mcdi_max_payload_length | max_data_size = payload_len - MC_CMD_NVRAM_WRITE_IN_LEN(0); | ||||
- MC_CMD_NVRAM_WRITE_IN_LEN(0); | EFSYS_ASSERT3U(payload_len, >, 0); | ||||
EFSYS_ASSERT3U(enp->en_nic_cfg.enc_mcdi_max_payload_length, >, 0); | EFSYS_ASSERT3U(max_data_size, <, payload_len); | ||||
EFSYS_ASSERT3U(max_data_size, <, | |||||
enp->en_nic_cfg.enc_mcdi_max_payload_length); | |||||
if (size > max_data_size) { | if (size > max_data_size) { | ||||
rc = EINVAL; | rc = EINVAL; | ||||
goto fail1; | goto fail1; | ||||
} | } | ||||
(void) memset(payload, 0, sizeof (payload)); | EFSYS_KMEM_ALLOC(enp->en_esip, payload_len, payload); | ||||
if (payload == NULL) { | |||||
rc = ENOMEM; | |||||
goto fail2; | |||||
} | |||||
(void) memset(payload, 0, payload_len); | |||||
req.emr_cmd = MC_CMD_NVRAM_WRITE; | req.emr_cmd = MC_CMD_NVRAM_WRITE; | ||||
req.emr_in_buf = payload; | req.emr_in_buf = payload; | ||||
req.emr_in_length = MC_CMD_NVRAM_WRITE_IN_LEN(size); | req.emr_in_length = MC_CMD_NVRAM_WRITE_IN_LEN(size); | ||||
req.emr_out_buf = payload; | req.emr_out_buf = payload; | ||||
req.emr_out_length = MC_CMD_NVRAM_WRITE_OUT_LEN; | req.emr_out_length = MC_CMD_NVRAM_WRITE_OUT_LEN; | ||||
MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_TYPE, partn); | MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_TYPE, partn); | ||||
MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_OFFSET, offset); | MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_OFFSET, offset); | ||||
MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_LENGTH, size); | MCDI_IN_SET_DWORD(req, NVRAM_WRITE_IN_LENGTH, size); | ||||
memcpy(MCDI_IN2(req, uint8_t, NVRAM_WRITE_IN_WRITE_BUFFER), | memcpy(MCDI_IN2(req, uint8_t, NVRAM_WRITE_IN_WRITE_BUFFER), | ||||
data, size); | data, size); | ||||
efx_mcdi_execute(enp, &req); | efx_mcdi_execute(enp, &req); | ||||
if (req.emr_rc != 0) { | if (req.emr_rc != 0) { | ||||
rc = req.emr_rc; | rc = req.emr_rc; | ||||
goto fail2; | goto fail3; | ||||
} | } | ||||
EFSYS_KMEM_FREE(enp->en_esip, payload_len, payload); | |||||
return (0); | return (0); | ||||
fail3: | |||||
EFSYS_PROBE(fail3); | |||||
EFSYS_KMEM_FREE(enp->en_esip, payload_len, payload); | |||||
fail2: | fail2: | ||||
EFSYS_PROBE(fail2); | EFSYS_PROBE(fail2); | ||||
fail1: | fail1: | ||||
EFSYS_PROBE1(fail1, efx_rc_t, rc); | EFSYS_PROBE1(fail1, efx_rc_t, rc); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 136 Lines • Show Last 20 Lines |