| 874 | } |
| 875 | |
| 876 | static __checkReturn efx_rc_t |
| 877 | efx_rx_qcreate_internal( |
| 878 | __in efx_nic_t *enp, |
| 879 | __in unsigned int index, |
| 880 | __in unsigned int label, |
| 881 | __in efx_rxq_type_t type, |
| 882 | __in_opt const efx_rxq_type_data_t *type_data, |
| 883 | __in efsys_mem_t *esmp, |
| 884 | __in size_t ndescs, |
| 885 | __in uint32_t id, |
| 886 | __in unsigned int flags, |
| 887 | __in efx_evq_t *eep, |
| 888 | __deref_out efx_rxq_t **erpp) |
| 889 | { |
| 890 | const efx_rx_ops_t *erxop = enp->en_erxop; |
| 891 | efx_rxq_t *erp; |
| 892 | const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); |
| 893 | efx_rc_t rc; |
| 894 | |
| 895 | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); |
| 896 | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); |
| 897 | |
| 898 | EFSYS_ASSERT3U(enp->en_rx_qcount + 1, <, encp->enc_rxq_limit); |
| 899 | |
| 900 | EFSYS_ASSERT(ISP2(encp->enc_rxq_max_ndescs)); |
| 901 | EFSYS_ASSERT(ISP2(encp->enc_rxq_min_ndescs)); |
| 902 | |
| 903 | if (index >= encp->enc_rxq_limit) { |
| 904 | rc = EINVAL; |
| 905 | goto fail1; |
| 906 | } |
| 907 | |
| 908 | if (!ISP2(ndescs) || |
| 909 | ndescs < encp->enc_rxq_min_ndescs || |
| 910 | ndescs > encp->enc_rxq_max_ndescs) { |
| 911 | rc = EINVAL; |
| 912 | goto fail2; |
| 913 | } |
| 914 | |
| 915 | /* Allocate an RXQ object */ |
| 916 | EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_rxq_t), erp); |
| 917 | |
| 918 | if (erp == NULL) { |
| 919 | rc = ENOMEM; |
| 920 | goto fail3; |
| 921 | } |
| 922 | |
| 923 | erp->er_magic = EFX_RXQ_MAGIC; |
| 924 | erp->er_enp = enp; |
| 925 | erp->er_index = index; |
| 926 | erp->er_mask = ndescs - 1; |
| 927 | erp->er_esmp = esmp; |
| 928 | |
| 929 | if ((rc = erxop->erxo_qcreate(enp, index, label, type, type_data, esmp, |
| 930 | ndescs, id, flags, eep, erp)) != 0) |
| 931 | goto fail4; |
| 932 | |
| 933 | /* Sanity check queue creation result */ |
no test coverage detected