| 1664 | } |
| 1665 | |
| 1666 | static int |
| 1667 | sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode) |
| 1668 | { |
| 1669 | struct sfc_adapter_shared * const sas = sfc_sa2shared(sa); |
| 1670 | uint64_t offloads_supported = sfc_rx_get_dev_offload_caps(sa) | |
| 1671 | sfc_rx_get_queue_offload_caps(sa); |
| 1672 | struct sfc_rss *rss = &sas->rss; |
| 1673 | int rc = 0; |
| 1674 | |
| 1675 | switch (rxmode->mq_mode) { |
| 1676 | case RTE_ETH_MQ_RX_NONE: |
| 1677 | /* No special checks are required */ |
| 1678 | break; |
| 1679 | case RTE_ETH_MQ_RX_RSS: |
| 1680 | if (rss->context_type == EFX_RX_SCALE_UNAVAILABLE) { |
| 1681 | sfc_err(sa, "RSS is not available"); |
| 1682 | rc = EINVAL; |
| 1683 | } |
| 1684 | break; |
| 1685 | default: |
| 1686 | sfc_err(sa, "Rx multi-queue mode %u not supported", |
| 1687 | rxmode->mq_mode); |
| 1688 | rc = EINVAL; |
| 1689 | } |
| 1690 | |
| 1691 | /* |
| 1692 | * Requested offloads are validated against supported by ethdev, |
| 1693 | * so unsupported offloads cannot be added as the result of |
| 1694 | * below check. |
| 1695 | */ |
| 1696 | if ((rxmode->offloads & RTE_ETH_RX_OFFLOAD_CHECKSUM) != |
| 1697 | (offloads_supported & RTE_ETH_RX_OFFLOAD_CHECKSUM)) { |
| 1698 | sfc_warn(sa, "Rx checksum offloads cannot be disabled - always on (IPv4/TCP/UDP)"); |
| 1699 | rxmode->offloads |= RTE_ETH_RX_OFFLOAD_CHECKSUM; |
| 1700 | } |
| 1701 | |
| 1702 | if ((offloads_supported & RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) && |
| 1703 | (~rxmode->offloads & RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM)) { |
| 1704 | sfc_warn(sa, "Rx outer IPv4 checksum offload cannot be disabled - always on"); |
| 1705 | rxmode->offloads |= RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM; |
| 1706 | } |
| 1707 | |
| 1708 | return rc; |
| 1709 | } |
| 1710 | |
| 1711 | /** |
| 1712 | * Destroy excess queues that are no longer needed after reconfiguration |
no test coverage detected