1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright(c) 2019-2020 Xilinx, Inc.
4 * Copyright(c) 2018-2019 Solarflare Communications Inc.
11 #if EFSYS_OPT_RIVERHEAD
14 * Default Rx prefix layout on Riverhead if FW does not support Rx
15 * prefix choice using MC_CMD_GET_RX_PREFIX_ID and query its layout
16 * using MC_CMD_QUERY_RX_PREFIX_ID.
18 * See SF-119689-TC Riverhead Host Interface section 6.4.
20 static const efx_rx_prefix_layout_t rhead_default_rx_prefix_layout = {
22 .erpl_length = ESE_GZ_RX_PKT_PREFIX_LEN,
24 #define RHEAD_RX_PREFIX_FIELD(_name, _big_endian) \
25 EFX_RX_PREFIX_FIELD(_name, ESF_GZ_RX_PREFIX_ ## _name, _big_endian)
27 RHEAD_RX_PREFIX_FIELD(LENGTH, B_FALSE),
28 RHEAD_RX_PREFIX_FIELD(RSS_HASH_VALID, B_FALSE),
29 RHEAD_RX_PREFIX_FIELD(USER_FLAG, B_FALSE),
30 RHEAD_RX_PREFIX_FIELD(CLASS, B_FALSE),
31 RHEAD_RX_PREFIX_FIELD(PARTIAL_TSTAMP, B_FALSE),
32 RHEAD_RX_PREFIX_FIELD(RSS_HASH, B_FALSE),
33 RHEAD_RX_PREFIX_FIELD(USER_MARK, B_FALSE),
34 RHEAD_RX_PREFIX_FIELD(INGRESS_VPORT, B_FALSE),
35 RHEAD_RX_PREFIX_FIELD(CSUM_FRAME, B_TRUE),
36 RHEAD_RX_PREFIX_FIELD(VLAN_STRIP_TCI, B_TRUE),
38 #undef RHEAD_RX_PREFIX_FIELD
42 __checkReturn efx_rc_t
48 rc = ef10_rx_init(enp);
55 EFSYS_PROBE1(fail1, efx_rc_t, rc);
66 #if EFSYS_OPT_RX_SCATTER
67 __checkReturn efx_rc_t
68 rhead_rx_scatter_enable(
70 __in unsigned int buf_size)
72 _NOTE(ARGUNUSED(enp, buf_size))
73 /* Nothing to do here */
76 #endif /* EFSYS_OPT_RX_SCATTER */
78 #if EFSYS_OPT_RX_SCALE
80 __checkReturn efx_rc_t
81 rhead_rx_scale_context_alloc(
83 __in efx_rx_scale_context_type_t type,
84 __in uint32_t num_queues,
85 __out uint32_t *rss_contextp)
89 rc = ef10_rx_scale_context_alloc(enp, type, num_queues, rss_contextp);
96 EFSYS_PROBE1(fail1, efx_rc_t, rc);
100 __checkReturn efx_rc_t
101 rhead_rx_scale_context_free(
103 __in uint32_t rss_context)
107 rc = ef10_rx_scale_context_free(enp, rss_context);
114 EFSYS_PROBE1(fail1, efx_rc_t, rc);
118 __checkReturn efx_rc_t
119 rhead_rx_scale_mode_set(
121 __in uint32_t rss_context,
122 __in efx_rx_hash_alg_t alg,
123 __in efx_rx_hash_type_t type,
124 __in boolean_t insert)
128 rc = ef10_rx_scale_mode_set(enp, rss_context, alg, type, insert);
135 EFSYS_PROBE1(fail1, efx_rc_t, rc);
139 __checkReturn efx_rc_t
140 rhead_rx_scale_key_set(
142 __in uint32_t rss_context,
143 __in_ecount(n) uint8_t *key,
148 rc = ef10_rx_scale_key_set(enp, rss_context, key, n);
155 EFSYS_PROBE1(fail1, efx_rc_t, rc);
159 __checkReturn efx_rc_t
160 rhead_rx_scale_tbl_set(
162 __in uint32_t rss_context,
163 __in_ecount(n) unsigned int *table,
168 rc = ef10_rx_scale_tbl_set(enp, rss_context, table, n);
175 EFSYS_PROBE1(fail1, efx_rc_t, rc);
179 __checkReturn uint32_t
180 rhead_rx_prefix_hash(
182 __in efx_rx_hash_alg_t func,
183 __in uint8_t *buffer)
185 _NOTE(ARGUNUSED(enp, func, buffer))
187 /* FIXME implement the method for Riverhead */
192 #endif /* EFSYS_OPT_RX_SCALE */
194 __checkReturn efx_rc_t
195 rhead_rx_prefix_pktlen(
197 __in uint8_t *buffer,
198 __out uint16_t *lengthp)
200 _NOTE(ARGUNUSED(enp, buffer, lengthp))
202 /* FIXME implement the method for Riverhead */
210 __in_ecount(ndescs) efsys_dma_addr_t *addrp,
212 __in unsigned int ndescs,
213 __in unsigned int completed,
214 __in unsigned int added)
216 _NOTE(ARGUNUSED(erp, addrp, size, ndescs, completed, added))
218 /* FIXME implement the method for Riverhead */
220 EFSYS_ASSERT(B_FALSE);
226 __in unsigned int added,
227 __inout unsigned int *pushedp)
229 _NOTE(ARGUNUSED(erp, added, pushedp))
231 /* FIXME implement the method for Riverhead */
233 EFSYS_ASSERT(B_FALSE);
236 __checkReturn efx_rc_t
240 efx_nic_t *enp = erp->er_enp;
243 if ((rc = efx_mcdi_fini_rxq(enp, erp->er_index)) != 0)
250 * EALREADY is not an error, but indicates that the MC has rebooted and
251 * that the RXQ has already been destroyed. Callers need to know that
252 * the RXQ flush has completed to avoid waiting until timeout for a
253 * flush done event that will not be delivered.
256 EFSYS_PROBE1(fail1, efx_rc_t, rc);
265 _NOTE(ARGUNUSED(erp))
268 __checkReturn efx_rc_t
271 __in unsigned int index,
272 __in unsigned int label,
273 __in efx_rxq_type_t type,
274 __in const efx_rxq_type_data_t *type_data,
275 __in efsys_mem_t *esmp,
278 __in unsigned int flags,
282 const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
283 efx_mcdi_init_rxq_params_t params;
288 EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS <=
289 (1 << ESF_GZ_EV_RXPKTS_Q_LABEL_WIDTH));
290 EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
292 memset(¶ms, 0, sizeof (params));
295 case EFX_RXQ_TYPE_DEFAULT:
296 if (type_data == NULL) {
300 params.buf_size = type_data->ertd_default.ed_buf_size;
307 /* Scatter can only be disabled if the firmware supports doing so */
308 if (flags & EFX_RXQ_FLAG_SCATTER)
309 params.disable_scatter = B_FALSE;
311 params.disable_scatter = encp->enc_rx_disable_scatter_supported;
314 * Ignore EFX_RXQ_FLAG_INNER_CLASSES since in accordance with
315 * EF100 host interface both inner and outer classes are provided
316 * by HW if applicable.
319 if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
320 esmp, ¶ms)) != 0)
324 erp->er_label = label;
325 erp->er_buf_size = params.buf_size;
326 erp->er_prefix_layout = rhead_default_rx_prefix_layout;
335 EFSYS_PROBE1(fail1, efx_rc_t, rc);
344 _NOTE(ARGUNUSED(erp))
345 /* Nothing to do here */
348 #endif /* EFSYS_OPT_RIVERHEAD */