Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/ef10_rx.c
Show First 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | efx_mcdi_init_rxq( | ||||
__in uint32_t size, | __in uint32_t size, | ||||
__in uint32_t target_evq, | __in uint32_t target_evq, | ||||
__in uint32_t label, | __in uint32_t label, | ||||
__in uint32_t instance, | __in uint32_t instance, | ||||
__in efsys_mem_t *esmp, | __in efsys_mem_t *esmp, | ||||
__in boolean_t disable_scatter, | __in boolean_t disable_scatter, | ||||
__in uint32_t ps_bufsize) | __in uint32_t ps_bufsize) | ||||
{ | { | ||||
efx_nic_cfg_t *encp = &(enp->en_nic_cfg); | |||||
efx_mcdi_req_t req; | efx_mcdi_req_t req; | ||||
uint8_t payload[MAX(MC_CMD_INIT_RXQ_EXT_IN_LEN, | uint8_t payload[MAX(MC_CMD_INIT_RXQ_EXT_IN_LEN, | ||||
MC_CMD_INIT_RXQ_EXT_OUT_LEN)]; | MC_CMD_INIT_RXQ_EXT_OUT_LEN)]; | ||||
int npages = EFX_RXQ_NBUFS(size); | int npages = EFX_RXQ_NBUFS(size); | ||||
int i; | int i; | ||||
efx_qword_t *dma_addr; | efx_qword_t *dma_addr; | ||||
uint64_t addr; | uint64_t addr; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
uint32_t dma_mode; | uint32_t dma_mode; | ||||
boolean_t want_outer_classes; | |||||
/* If this changes, then the payload size might need to change. */ | /* If this changes, then the payload size might need to change. */ | ||||
EFSYS_ASSERT3U(MC_CMD_INIT_RXQ_OUT_LEN, ==, 0); | EFSYS_ASSERT3U(MC_CMD_INIT_RXQ_OUT_LEN, ==, 0); | ||||
EFSYS_ASSERT3U(size, <=, EFX_RXQ_MAXNDESCS); | EFSYS_ASSERT3U(size, <=, EFX_RXQ_MAXNDESCS); | ||||
if (ps_bufsize > 0) | if (ps_bufsize > 0) | ||||
dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM; | dma_mode = MC_CMD_INIT_RXQ_EXT_IN_PACKED_STREAM; | ||||
else | else | ||||
dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET; | dma_mode = MC_CMD_INIT_RXQ_EXT_IN_SINGLE_PACKET; | ||||
if (encp->enc_tunnel_encapsulations_supported != 0) { | |||||
/* | |||||
* WANT_OUTER_CLASSES can only be specified on hardware which | |||||
* supports tunnel encapsulation offloads, even though it is | |||||
* effectively the behaviour the hardware gives. | |||||
* | |||||
* Also, on hardware which does support such offloads, older | |||||
* firmware rejects the flag if the offloads are not supported | |||||
* by the current firmware variant, which means this may fail if | |||||
* the capabilities are not updated when the firmware variant | |||||
* changes. This is not an issue on newer firmware, as it was | |||||
* changed in bug 69842 (v6.4.2.1007) to permit this flag to be | |||||
* specified on all firmware variants. | |||||
*/ | |||||
want_outer_classes = B_TRUE; | |||||
} else { | |||||
want_outer_classes = B_FALSE; | |||||
} | |||||
(void) memset(payload, 0, sizeof (payload)); | (void) memset(payload, 0, sizeof (payload)); | ||||
req.emr_cmd = MC_CMD_INIT_RXQ; | req.emr_cmd = MC_CMD_INIT_RXQ; | ||||
req.emr_in_buf = payload; | req.emr_in_buf = payload; | ||||
req.emr_in_length = MC_CMD_INIT_RXQ_EXT_IN_LEN; | req.emr_in_length = MC_CMD_INIT_RXQ_EXT_IN_LEN; | ||||
req.emr_out_buf = payload; | req.emr_out_buf = payload; | ||||
req.emr_out_length = MC_CMD_INIT_RXQ_EXT_OUT_LEN; | req.emr_out_length = MC_CMD_INIT_RXQ_EXT_OUT_LEN; | ||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, size); | MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, size); | ||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, target_evq); | MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, target_evq); | ||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label); | MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_LABEL, label); | ||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance); | MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_INSTANCE, instance); | ||||
MCDI_IN_POPULATE_DWORD_8(req, INIT_RXQ_EXT_IN_FLAGS, | MCDI_IN_POPULATE_DWORD_9(req, INIT_RXQ_EXT_IN_FLAGS, | ||||
INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0, | INIT_RXQ_EXT_IN_FLAG_BUFF_MODE, 0, | ||||
INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0, | INIT_RXQ_EXT_IN_FLAG_HDR_SPLIT, 0, | ||||
INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0, | INIT_RXQ_EXT_IN_FLAG_TIMESTAMP, 0, | ||||
INIT_RXQ_EXT_IN_CRC_MODE, 0, | INIT_RXQ_EXT_IN_CRC_MODE, 0, | ||||
INIT_RXQ_EXT_IN_FLAG_PREFIX, 1, | INIT_RXQ_EXT_IN_FLAG_PREFIX, 1, | ||||
INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter, | INIT_RXQ_EXT_IN_FLAG_DISABLE_SCATTER, disable_scatter, | ||||
INIT_RXQ_EXT_IN_DMA_MODE, | INIT_RXQ_EXT_IN_DMA_MODE, | ||||
dma_mode, | dma_mode, | ||||
INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize); | INIT_RXQ_EXT_IN_PACKED_STREAM_BUFF_SIZE, ps_bufsize, | ||||
INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes); | |||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0); | MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0); | ||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, EVB_PORT_ID_ASSIGNED); | MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, EVB_PORT_ID_ASSIGNED); | ||||
dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR); | dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR); | ||||
addr = EFSYS_MEM_ADDR(esmp); | addr = EFSYS_MEM_ADDR(esmp); | ||||
for (i = 0; i < npages; i++) { | for (i = 0; i < npages; i++) { | ||||
EFX_POPULATE_QWORD_2(*dma_addr, | EFX_POPULATE_QWORD_2(*dma_addr, | ||||
▲ Show 20 Lines • Show All 968 Lines • Show Last 20 Lines |