Index: head/sys/dev/ena/ena.c =================================================================== --- head/sys/dev/ena/ena.c +++ head/sys/dev/ena/ena.c @@ -30,6 +30,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_rss.h" + #include #include #include @@ -61,6 +63,9 @@ #include #include #include +#ifdef RSS +#include +#endif #include #include @@ -2700,6 +2705,16 @@ } } +#ifdef RSS + uint8_t rss_algo = rss_gethashalgo(); + if (rss_algo == RSS_HASH_TOEPLITZ) { + uint8_t hash_key[RSS_KEYSIZE]; + + rss_getkey(hash_key); + rc = ena_com_fill_hash_function(ena_dev, ENA_ADMIN_TOEPLITZ, + hash_key, RSS_KEYSIZE, 0xFFFFFFFF); + } else +#endif rc = ena_com_fill_hash_function(ena_dev, ENA_ADMIN_CRC32, NULL, ENA_HASH_KEY_SIZE, 0xFFFFFFFF); if (unlikely((rc != 0) && (rc != EOPNOTSUPP))) { Index: head/sys/dev/ena/ena_datapath.c =================================================================== --- head/sys/dev/ena/ena_datapath.c +++ head/sys/dev/ena/ena_datapath.c @@ -30,6 +30,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_rss.h" #include "ena.h" #include "ena_datapath.h" #ifdef DEV_NETMAP @@ -335,6 +336,19 @@ if (likely(ENA_FLAG_ISSET(ENA_FLAG_RSS_ACTIVE, adapter))) { mbuf->m_pkthdr.flowid = ena_rx_ctx->hash; + +#ifdef RSS + /* + * Hardware and software RSS are in agreement only when both are + * configured to Toeplitz algorithm. This driver configures + * that algorithm only when software RSS is enabled and uses it. + */ + if (adapter->ena_dev->rss.hash_func != ENA_ADMIN_TOEPLITZ && + ena_rx_ctx->l3_proto != ENA_ETH_IO_L3_PROTO_UNKNOWN) { + M_HASHTYPE_SET(mbuf, M_HASHTYPE_OPAQUE_HASH); + return; + } +#endif if (ena_rx_ctx->frag && (ena_rx_ctx->l3_proto != ENA_ETH_IO_L3_PROTO_UNKNOWN)) {