net/sfc/base: pass Rx buffer size to RxQ init if supported
Riverhead requires Rx buffer size to be specified in INIT_RXQ. If the parameter is not supported (e.g. on EF10 family adapters), zero must be used on INIT_RXQ. Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
This commit is contained in:
parent
5df5d2647f
commit
ec6080a1ac
@ -1205,6 +1205,16 @@ ef10_get_datapath_caps(
|
|||||||
else
|
else
|
||||||
encp->enc_no_cont_ev_mode_supported = B_FALSE;
|
encp->enc_no_cont_ev_mode_supported = B_FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if buffer size may and must be specified on INIT_RXQ.
|
||||||
|
* It may be always specified to efx_rx_qcreate(), but will be
|
||||||
|
* just kept libefx internal if MCDI does not support it.
|
||||||
|
*/
|
||||||
|
if (CAP_FLAGS2(req, INIT_RXQ_WITH_BUFFER_SIZE))
|
||||||
|
encp->enc_init_rxq_with_buffer_size = B_TRUE;
|
||||||
|
else
|
||||||
|
encp->enc_init_rxq_with_buffer_size = B_FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if firmware-verified NVRAM updates must be used.
|
* Check if firmware-verified NVRAM updates must be used.
|
||||||
*
|
*
|
||||||
|
@ -21,6 +21,7 @@ efx_mcdi_init_rxq(
|
|||||||
__in efsys_mem_t *esmp,
|
__in efsys_mem_t *esmp,
|
||||||
__in boolean_t disable_scatter,
|
__in boolean_t disable_scatter,
|
||||||
__in boolean_t want_inner_classes,
|
__in boolean_t want_inner_classes,
|
||||||
|
__in uint32_t buf_size,
|
||||||
__in uint32_t ps_bufsize,
|
__in uint32_t ps_bufsize,
|
||||||
__in uint32_t es_bufs_per_desc,
|
__in uint32_t es_bufs_per_desc,
|
||||||
__in uint32_t es_max_dma_len,
|
__in uint32_t es_max_dma_len,
|
||||||
@ -29,8 +30,8 @@ efx_mcdi_init_rxq(
|
|||||||
{
|
{
|
||||||
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
|
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
|
||||||
efx_mcdi_req_t req;
|
efx_mcdi_req_t req;
|
||||||
EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V3_IN_LEN,
|
EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
|
||||||
MC_CMD_INIT_RXQ_V3_OUT_LEN);
|
MC_CMD_INIT_RXQ_V4_OUT_LEN);
|
||||||
int npages = efx_rxq_nbufs(enp, ndescs);
|
int npages = efx_rxq_nbufs(enp, ndescs);
|
||||||
int i;
|
int i;
|
||||||
efx_qword_t *dma_addr;
|
efx_qword_t *dma_addr;
|
||||||
@ -84,9 +85,9 @@ efx_mcdi_init_rxq(
|
|||||||
|
|
||||||
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_V3_IN_LEN;
|
req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
|
||||||
req.emr_out_buf = payload;
|
req.emr_out_buf = payload;
|
||||||
req.emr_out_length = MC_CMD_INIT_RXQ_V3_OUT_LEN;
|
req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
|
||||||
|
|
||||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
|
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
|
||||||
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
|
MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
|
||||||
@ -120,6 +121,10 @@ efx_mcdi_init_rxq(
|
|||||||
hol_block_timeout);
|
hol_block_timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (encp->enc_init_rxq_with_buffer_size)
|
||||||
|
MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
|
||||||
|
buf_size);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@ -1140,7 +1145,7 @@ ef10_rx_qcreate(
|
|||||||
want_inner_classes = B_FALSE;
|
want_inner_classes = B_FALSE;
|
||||||
|
|
||||||
if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
|
if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
|
||||||
esmp, disable_scatter, want_inner_classes,
|
esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
|
||||||
ps_buf_size, es_bufs_per_desc, es_max_dma_len,
|
ps_buf_size, es_bufs_per_desc, es_max_dma_len,
|
||||||
es_buf_stride, hol_block_timeout)) != 0)
|
es_buf_stride, hol_block_timeout)) != 0)
|
||||||
goto fail12;
|
goto fail12;
|
||||||
|
@ -1371,6 +1371,7 @@ typedef struct efx_nic_cfg_s {
|
|||||||
boolean_t enc_enhanced_set_mac_supported;
|
boolean_t enc_enhanced_set_mac_supported;
|
||||||
boolean_t enc_init_evq_v2_supported;
|
boolean_t enc_init_evq_v2_supported;
|
||||||
boolean_t enc_no_cont_ev_mode_supported;
|
boolean_t enc_no_cont_ev_mode_supported;
|
||||||
|
boolean_t enc_init_rxq_with_buffer_size;
|
||||||
boolean_t enc_rx_packed_stream_supported;
|
boolean_t enc_rx_packed_stream_supported;
|
||||||
boolean_t enc_rx_var_packed_stream_supported;
|
boolean_t enc_rx_var_packed_stream_supported;
|
||||||
boolean_t enc_rx_es_super_buffer_supported;
|
boolean_t enc_rx_es_super_buffer_supported;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user