| 2805 | } |
| 2806 | |
| 2807 | static int |
| 2808 | sfc_eth_dev_set_ops(struct rte_eth_dev *dev) |
| 2809 | { |
| 2810 | struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); |
| 2811 | struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev); |
| 2812 | const struct sfc_dp_rx *dp_rx; |
| 2813 | const struct sfc_dp_tx *dp_tx; |
| 2814 | const efx_nic_cfg_t *encp; |
| 2815 | unsigned int avail_caps = 0; |
| 2816 | const char *rx_name = NULL; |
| 2817 | const char *tx_name = NULL; |
| 2818 | int rc; |
| 2819 | |
| 2820 | switch (sa->family) { |
| 2821 | case EFX_FAMILY_HUNTINGTON: |
| 2822 | case EFX_FAMILY_MEDFORD: |
| 2823 | case EFX_FAMILY_MEDFORD2: |
| 2824 | avail_caps |= SFC_DP_HW_FW_CAP_EF10; |
| 2825 | avail_caps |= SFC_DP_HW_FW_CAP_RX_EFX; |
| 2826 | avail_caps |= SFC_DP_HW_FW_CAP_TX_EFX; |
| 2827 | break; |
| 2828 | case EFX_FAMILY_RIVERHEAD: |
| 2829 | avail_caps |= SFC_DP_HW_FW_CAP_EF100; |
| 2830 | break; |
| 2831 | default: |
| 2832 | break; |
| 2833 | } |
| 2834 | |
| 2835 | encp = efx_nic_cfg_get(sa->nic); |
| 2836 | if (encp->enc_rx_es_super_buffer_supported) |
| 2837 | avail_caps |= SFC_DP_HW_FW_CAP_RX_ES_SUPER_BUFFER; |
| 2838 | |
| 2839 | rc = sfc_kvargs_process(sa, SFC_KVARG_RX_DATAPATH, |
| 2840 | sfc_kvarg_string_handler, &rx_name); |
| 2841 | if (rc != 0) |
| 2842 | goto fail_kvarg_rx_datapath; |
| 2843 | |
| 2844 | if (rx_name != NULL) { |
| 2845 | dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, rx_name); |
| 2846 | if (dp_rx == NULL) { |
| 2847 | sfc_err(sa, "Rx datapath %s not found", rx_name); |
| 2848 | rc = ENOENT; |
| 2849 | goto fail_dp_rx; |
| 2850 | } |
| 2851 | if (!sfc_dp_match_hw_fw_caps(&dp_rx->dp, avail_caps)) { |
| 2852 | sfc_err(sa, |
| 2853 | "Insufficient Hw/FW capabilities to use Rx datapath %s", |
| 2854 | rx_name); |
| 2855 | rc = EINVAL; |
| 2856 | goto fail_dp_rx_caps; |
| 2857 | } |
| 2858 | } else { |
| 2859 | dp_rx = sfc_dp_find_rx_by_caps(&sfc_dp_head, avail_caps); |
| 2860 | if (dp_rx == NULL) { |
| 2861 | sfc_err(sa, "Rx datapath by caps %#x not found", |
| 2862 | avail_caps); |
| 2863 | rc = ENOENT; |
| 2864 | goto fail_dp_rx; |
no test coverage detected