2 * Copyright 2007-2009 Solarflare Communications Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 #include <sys/cdefs.h>
27 __FBSDID("$FreeBSD$");
31 #include "efx_types.h"
43 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
44 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
46 if (!(enp->en_mod_flags & EFX_MOD_EV)) {
51 if (enp->en_mod_flags & EFX_MOD_RX) {
56 EFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);
58 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_DESC_PUSH_EN, 0);
59 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_HASH_ALG, 0);
60 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_IP_HASH, 0);
61 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_TCP_SUP, 0);
62 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_HASH_INSRT_HDR, 0);
63 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_USR_BUF_SIZE, 0x3000 / 32);
64 EFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);
66 /* Zero the RSS table */
67 for (index = 0; index < FR_BZ_RX_INDIRECTION_TBL_ROWS;
69 EFX_ZERO_OWORD(oword);
70 EFX_BAR_TBL_WRITEO(enp, FR_BZ_RX_INDIRECTION_TBL,
74 enp->en_mod_flags |= EFX_MOD_RX;
80 EFSYS_PROBE1(fail1, int, rc);
85 #if EFSYS_OPT_RX_HDR_SPLIT
87 efx_rx_hdr_split_enable(
89 __in unsigned int hdr_buf_size,
90 __in unsigned int pld_buf_size)
97 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
98 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
99 EFSYS_ASSERT3U(enp->en_family, >=, EFX_FAMILY_SIENA);
101 nhdr32 = hdr_buf_size / 32;
103 (nhdr32 >= (1 << FRF_CZ_RX_HDR_SPLIT_HDR_BUF_SIZE_WIDTH)) ||
104 ((hdr_buf_size % 32) != 0)) {
109 npld32 = pld_buf_size / 32;
111 (npld32 >= (1 << FRF_CZ_RX_HDR_SPLIT_PLD_BUF_SIZE_WIDTH)) ||
112 ((pld_buf_size % 32) != 0)) {
117 if (enp->en_rx_qcount > 0) {
122 EFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);
124 EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_HDR_SPLIT_EN, 1);
125 EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_HDR_SPLIT_HDR_BUF_SIZE, nhdr32);
126 EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_HDR_SPLIT_PLD_BUF_SIZE, npld32);
128 EFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);
137 EFSYS_PROBE1(fail1, int, rc);
141 #endif /* EFSYS_OPT_RX_HDR_SPLIT */
144 #if EFSYS_OPT_RX_SCATTER
146 efx_rx_scatter_enable(
148 __in unsigned int buf_size)
154 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
155 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
156 EFSYS_ASSERT3U(enp->en_family, >=, EFX_FAMILY_FALCON);
158 nbuf32 = buf_size / 32;
160 (nbuf32 >= (1 << FRF_BZ_RX_USR_BUF_SIZE_WIDTH)) ||
161 ((buf_size % 32) != 0)) {
166 if (enp->en_rx_qcount > 0) {
171 /* Set scatter buffer size */
172 EFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);
173 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_USR_BUF_SIZE, nbuf32);
174 EFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);
176 /* Enable scatter for packets not matching a filter */
177 EFX_BAR_READO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
178 EFX_SET_OWORD_FIELD(oword, FRF_BZ_SCATTER_ENBL_NO_MATCH_Q, 1);
179 EFX_BAR_WRITEO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
186 EFSYS_PROBE1(fail1, int, rc);
190 #endif /* EFSYS_OPT_RX_SCATTER */
193 #define EFX_RX_LFSR_HASH(_enp, _insert) \
197 EFX_BAR_READO((_enp), FR_AZ_RX_CFG_REG, &oword); \
198 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_HASH_ALG, 0); \
199 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_IP_HASH, 0); \
200 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_TCP_SUP, 0); \
201 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_HASH_INSRT_HDR, \
202 (_insert) ? 1 : 0); \
203 EFX_BAR_WRITEO((_enp), FR_AZ_RX_CFG_REG, &oword); \
205 if ((_enp)->en_family == EFX_FAMILY_SIENA) { \
206 EFX_BAR_READO((_enp), FR_CZ_RX_RSS_IPV6_REG3, \
208 EFX_SET_OWORD_FIELD(oword, \
209 FRF_CZ_RX_RSS_IPV6_THASH_ENABLE, 0); \
210 EFX_BAR_WRITEO((_enp), FR_CZ_RX_RSS_IPV6_REG3, \
214 _NOTE(CONSTANTCONDITION) \
217 #define EFX_RX_TOEPLITZ_IPV4_HASH(_enp, _insert, _ip, _tcp) \
221 EFX_BAR_READO((_enp), FR_AZ_RX_CFG_REG, &oword); \
222 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_HASH_ALG, 1); \
223 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_IP_HASH, \
225 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_TCP_SUP, \
227 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_HASH_INSRT_HDR, \
228 (_insert) ? 1 : 0); \
229 EFX_BAR_WRITEO((_enp), FR_AZ_RX_CFG_REG, &oword); \
231 _NOTE(CONSTANTCONDITION) \
234 #define EFX_RX_TOEPLITZ_IPV6_HASH(_enp, _ip, _tcp, _rc) \
238 if ((_enp)->en_family == EFX_FAMILY_FALCON) { \
239 (_rc) = ((_ip) || (_tcp)) ? ENOTSUP : 0; \
243 EFX_BAR_READO((_enp), FR_CZ_RX_RSS_IPV6_REG3, &oword); \
244 EFX_SET_OWORD_FIELD(oword, \
245 FRF_CZ_RX_RSS_IPV6_THASH_ENABLE, 1); \
246 EFX_SET_OWORD_FIELD(oword, \
247 FRF_CZ_RX_RSS_IPV6_IP_THASH_ENABLE, (_ip) ? 1 : 0); \
248 EFX_SET_OWORD_FIELD(oword, \
249 FRF_CZ_RX_RSS_IPV6_TCP_SUPPRESS, (_tcp) ? 0 : 1); \
250 EFX_BAR_WRITEO((_enp), FR_CZ_RX_RSS_IPV6_REG3, &oword); \
254 _NOTE(CONSTANTCONDITION) \
258 #if EFSYS_OPT_RX_SCALE
260 efx_rx_scale_mode_set(
262 __in efx_rx_hash_alg_t alg,
263 __in efx_rx_hash_type_t type,
264 __in boolean_t insert)
268 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
269 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
270 EFSYS_ASSERT3U(enp->en_family, >=, EFX_FAMILY_FALCON);
273 case EFX_RX_HASHALG_LFSR:
274 EFX_RX_LFSR_HASH(enp, insert);
277 case EFX_RX_HASHALG_TOEPLITZ:
278 EFX_RX_TOEPLITZ_IPV4_HASH(enp, insert,
279 type & (1 << EFX_RX_HASH_IPV4),
280 type & (1 << EFX_RX_HASH_TCPIPV4));
282 EFX_RX_TOEPLITZ_IPV6_HASH(enp,
283 type & (1 << EFX_RX_HASH_IPV6),
284 type & (1 << EFX_RX_HASH_TCPIPV6),
301 EFSYS_PROBE1(fail1, int, rc);
303 EFX_RX_LFSR_HASH(enp, B_FALSE);
309 #if EFSYS_OPT_RX_SCALE
311 efx_rx_scale_toeplitz_ipv4_key_set(
313 __in_ecount(n) uint8_t *key,
321 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
322 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
326 /* Write toeplitz hash key */
327 EFX_ZERO_OWORD(oword);
328 for (offset = (FRF_BZ_RX_RSS_TKEY_LBN + FRF_BZ_RX_RSS_TKEY_WIDTH) / 8;
329 offset > 0 && byte < n;
331 oword.eo_u8[offset - 1] = key[byte++];
333 EFX_BAR_WRITEO(enp, FR_BZ_RX_RSS_TKEY_REG, &oword);
337 /* Verify toeplitz hash key */
338 EFX_BAR_READO(enp, FR_BZ_RX_RSS_TKEY_REG, &oword);
339 for (offset = (FRF_BZ_RX_RSS_TKEY_LBN + FRF_BZ_RX_RSS_TKEY_WIDTH) / 8;
340 offset > 0 && byte < n;
342 if (oword.eo_u8[offset - 1] != key[byte++]) {
351 EFSYS_PROBE1(fail1, int, rc);
357 #if EFSYS_OPT_RX_SCALE
359 efx_rx_scale_toeplitz_ipv6_key_set(
361 __in_ecount(n) uint8_t *key,
369 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
370 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
374 /* Write toeplitz hash key 3 */
375 EFX_BAR_READO(enp, FR_CZ_RX_RSS_IPV6_REG3, &oword);
376 for (offset = (FRF_CZ_RX_RSS_IPV6_TKEY_HI_LBN +
377 FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH) / 8;
378 offset > 0 && byte < n;
380 oword.eo_u8[offset - 1] = key[byte++];
382 EFX_BAR_WRITEO(enp, FR_CZ_RX_RSS_IPV6_REG3, &oword);
384 /* Write toeplitz hash key 2 */
385 EFX_ZERO_OWORD(oword);
386 for (offset = (FRF_CZ_RX_RSS_IPV6_TKEY_MID_LBN +
387 FRF_CZ_RX_RSS_IPV6_TKEY_MID_WIDTH) / 8;
388 offset > 0 && byte < n;
390 oword.eo_u8[offset - 1] = key[byte++];
392 EFX_BAR_WRITEO(enp, FR_CZ_RX_RSS_IPV6_REG2, &oword);
394 /* Write toeplitz hash key 1 */
395 EFX_ZERO_OWORD(oword);
396 for (offset = (FRF_CZ_RX_RSS_IPV6_TKEY_LO_LBN +
397 FRF_CZ_RX_RSS_IPV6_TKEY_LO_WIDTH) / 8;
398 offset > 0 && byte < n;
400 oword.eo_u8[offset - 1] = key[byte++];
402 EFX_BAR_WRITEO(enp, FR_CZ_RX_RSS_IPV6_REG1, &oword);
406 /* Verify toeplitz hash key 3 */
407 EFX_BAR_READO(enp, FR_CZ_RX_RSS_IPV6_REG3, &oword);
408 for (offset = (FRF_CZ_RX_RSS_IPV6_TKEY_HI_LBN +
409 FRF_CZ_RX_RSS_IPV6_TKEY_HI_WIDTH) / 8;
410 offset > 0 && byte < n;
412 if (oword.eo_u8[offset - 1] != key[byte++]) {
418 /* Verify toeplitz hash key 2 */
419 EFX_BAR_READO(enp, FR_CZ_RX_RSS_IPV6_REG2, &oword);
420 for (offset = (FRF_CZ_RX_RSS_IPV6_TKEY_MID_LBN +
421 FRF_CZ_RX_RSS_IPV6_TKEY_MID_WIDTH) / 8;
422 offset > 0 && byte < n;
424 if (oword.eo_u8[offset - 1] != key[byte++]) {
430 /* Verify toeplitz hash key 1 */
431 EFX_BAR_READO(enp, FR_CZ_RX_RSS_IPV6_REG1, &oword);
432 for (offset = (FRF_CZ_RX_RSS_IPV6_TKEY_LO_LBN +
433 FRF_CZ_RX_RSS_IPV6_TKEY_LO_WIDTH) / 8;
434 offset > 0 && byte < n;
436 if (oword.eo_u8[offset - 1] != key[byte++]) {
449 EFSYS_PROBE1(fail1, int, rc);
455 #if EFSYS_OPT_RX_SCALE
457 efx_rx_scale_tbl_set(
459 __in_ecount(n) unsigned int *table,
466 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
467 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
469 EFX_STATIC_ASSERT(EFX_RSS_TBL_SIZE == FR_BZ_RX_INDIRECTION_TBL_ROWS);
470 EFX_STATIC_ASSERT(EFX_MAXRSS == (1 << FRF_BZ_IT_QUEUE_WIDTH));
472 if (n > FR_BZ_RX_INDIRECTION_TBL_ROWS) {
477 for (index = 0; index < FR_BZ_RX_INDIRECTION_TBL_ROWS; index++) {
480 /* Calculate the entry to place in the table */
481 byte = (uint32_t)table[index % n];
483 EFSYS_PROBE2(table, int, index, uint32_t, byte);
485 EFX_POPULATE_OWORD_1(oword, FRF_BZ_IT_QUEUE, byte);
487 /* Write the table */
488 EFX_BAR_TBL_WRITEO(enp, FR_BZ_RX_INDIRECTION_TBL,
492 for (index = FR_BZ_RX_INDIRECTION_TBL_ROWS - 1; index >= 0; --index) {
495 /* Determine if we're starting a new batch */
496 byte = (uint32_t)table[index % n];
499 EFX_BAR_TBL_READO(enp, FR_BZ_RX_INDIRECTION_TBL,
502 /* Verify the entry */
503 if (EFX_OWORD_FIELD(oword, FRF_BZ_IT_QUEUE) != byte) {
514 EFSYS_PROBE1(fail1, int, rc);
521 extern __checkReturn int
522 efx_rx_filter_insert(
524 __inout efx_filter_spec_t *spec)
526 EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
527 EFSYS_ASSERT3P(spec, !=, NULL);
529 spec->efs_dmaq_id = (uint16_t)erp->er_index;
530 return efx_filter_insert_filter(erp->er_enp, spec, B_FALSE);
535 extern __checkReturn int
536 efx_rx_filter_remove(
538 __inout efx_filter_spec_t *spec)
540 EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
541 EFSYS_ASSERT3P(spec, !=, NULL);
543 spec->efs_dmaq_id = (uint16_t)erp->er_index;
544 return efx_filter_remove_filter(erp->er_enp, spec);
551 __in_ecount(n) efsys_dma_addr_t *addrp,
554 __in unsigned int completed,
555 __in unsigned int added)
562 EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
564 /* The client driver must not overfill the queue */
565 EFSYS_ASSERT3U(added - completed + n, <=,
566 EFX_RXQ_LIMIT(erp->er_mask + 1));
568 id = added & (erp->er_mask);
569 for (i = 0; i < n; i++) {
570 EFSYS_PROBE4(rx_post, unsigned int, erp->er_index,
571 unsigned int, id, efsys_dma_addr_t, addrp[i],
574 EFX_POPULATE_QWORD_3(qword,
575 FSF_AZ_RX_KER_BUF_SIZE, (uint32_t)(size),
576 FSF_AZ_RX_KER_BUF_ADDR_DW0,
577 (uint32_t)(addrp[i] & 0xffffffff),
578 FSF_AZ_RX_KER_BUF_ADDR_DW1,
579 (uint32_t)(addrp[i] >> 32));
581 offset = id * sizeof (efx_qword_t);
582 EFSYS_MEM_WRITEQ(erp->er_esmp, offset, &qword);
584 id = (id + 1) & (erp->er_mask);
591 __in unsigned int added)
593 efx_nic_t *enp = erp->er_enp;
598 EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
600 /* Guarantee ordering of memory (descriptors) and PIO (doorbell) */
601 EFSYS_PIO_WRITE_BARRIER();
603 /* Push the populated descriptors out */
604 wptr = added & erp->er_mask;
606 EFX_POPULATE_OWORD_1(oword, FRF_AZ_RX_DESC_WPTR, wptr);
608 /* Only write the third DWORD */
609 EFX_POPULATE_DWORD_1(dword,
610 EFX_DWORD_0, EFX_OWORD_FIELD(oword, EFX_DWORD_3));
611 EFX_BAR_TBL_WRITED3(enp, FR_BZ_RX_DESC_UPD_REGP0,
612 erp->er_index, &dword, B_FALSE);
619 efx_nic_t *enp = erp->er_enp;
623 EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
625 label = erp->er_index;
627 /* Flush the queue */
628 EFX_POPULATE_OWORD_2(oword, FRF_AZ_RX_FLUSH_DESCQ_CMD, 1,
629 FRF_AZ_RX_FLUSH_DESCQ, label);
630 EFX_BAR_WRITEO(enp, FR_AZ_RX_FLUSH_DESCQ_REG, &oword);
637 efx_nic_t *enp = erp->er_enp;
640 EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
642 EFX_BAR_TBL_READO(enp, FR_AZ_RX_DESC_PTR_TBL,
643 erp->er_index, &oword);
645 EFX_SET_OWORD_FIELD(oword, FRF_AZ_RX_DC_HW_RPTR, 0);
646 EFX_SET_OWORD_FIELD(oword, FRF_AZ_RX_DESCQ_HW_RPTR, 0);
647 EFX_SET_OWORD_FIELD(oword, FRF_AZ_RX_DESCQ_EN, 1);
649 EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
650 erp->er_index, &oword);
656 __in unsigned int index,
657 __in unsigned int label,
658 __in efx_rxq_type_t type,
659 __in efsys_mem_t *esmp,
663 __deref_out efx_rxq_t **erpp)
665 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
673 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
674 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
676 EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
677 EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
678 EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit);
680 if (!ISP2(n) || !(n & EFX_RXQ_NDESCS_MASK)) {
684 if (index >= encp->enc_rxq_limit) {
688 for (size = 0; (1 << size) <= (EFX_RXQ_MAXNDESCS / EFX_RXQ_MINNDESCS);
690 if ((1 << size) == (int)(n / EFX_RXQ_MINNDESCS))
692 if (id + (1 << size) >= encp->enc_buftbl_limit) {
698 case EFX_RXQ_TYPE_DEFAULT:
703 #if EFSYS_OPT_RX_HDR_SPLIT
704 case EFX_RXQ_TYPE_SPLIT_HEADER:
705 if ((enp->en_family < EFX_FAMILY_SIENA) || ((index & 1) != 0)) {
713 case EFX_RXQ_TYPE_SPLIT_PAYLOAD:
714 if ((enp->en_family < EFX_FAMILY_SIENA) || ((index & 1) == 0)) {
721 #endif /* EFSYS_OPT_RX_HDR_SPLIT */
723 #if EFSYS_OPT_RX_SCATTER
724 case EFX_RXQ_TYPE_SCATTER:
725 if (enp->en_family < EFX_FAMILY_SIENA) {
732 #endif /* EFSYS_OPT_RX_SCATTER */
739 /* Allocate an RXQ object */
740 EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_rxq_t), erp);
747 erp->er_magic = EFX_RXQ_MAGIC;
749 erp->er_index = index;
750 erp->er_mask = n - 1;
753 /* Set up the new descriptor queue */
754 EFX_POPULATE_OWORD_10(oword,
755 FRF_CZ_RX_HDR_SPLIT, split,
756 FRF_AZ_RX_ISCSI_DDIG_EN, 0,
757 FRF_AZ_RX_ISCSI_HDIG_EN, 0,
758 FRF_AZ_RX_DESCQ_BUF_BASE_ID, id,
759 FRF_AZ_RX_DESCQ_EVQ_ID, eep->ee_index,
760 FRF_AZ_RX_DESCQ_OWNER_ID, 0,
761 FRF_AZ_RX_DESCQ_LABEL, label,
762 FRF_AZ_RX_DESCQ_SIZE, size,
763 FRF_AZ_RX_DESCQ_TYPE, 0,
764 FRF_AZ_RX_DESCQ_JUMBO, jumbo);
766 EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
767 erp->er_index, &oword);
782 EFSYS_PROBE1(fail1, int, rc);
791 efx_nic_t *enp = erp->er_enp;
794 EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
796 EFSYS_ASSERT(enp->en_rx_qcount != 0);
799 /* Purge descriptor queue */
800 EFX_ZERO_OWORD(oword);
802 EFX_BAR_TBL_WRITEO(enp, FR_AZ_RX_DESC_PTR_TBL,
803 erp->er_index, &oword);
805 /* Free the RXQ object */
806 EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_rxq_t), erp);
813 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
814 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
815 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
816 EFSYS_ASSERT3U(enp->en_rx_qcount, ==, 0);
818 enp->en_mod_flags &= ~EFX_MOD_RX;