diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c index bc21e77e59d..d6ac5d208b4 100644 --- a/sys/dev/ena/ena.c +++ b/sys/dev/ena/ena.c @@ -30,6 +30,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_rss.h" + #include #include #include @@ -61,6 +63,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef RSS +#include +#endif #include #include @@ -2700,6 +2705,16 @@ ena_rss_init_default(struct ena_adapter *adapter) } } +#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))) { diff --git a/sys/dev/ena/ena_datapath.c b/sys/dev/ena/ena_datapath.c index 51beabc283f..f95bab8dc1a 100644 --- a/sys/dev/ena/ena_datapath.c +++ b/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 @@ -336,6 +337,19 @@ ena_rx_hash_mbuf(struct ena_ring *rx_ring, struct ena_com_rx_ctx *ena_rx_ctx, 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)) { M_HASHTYPE_SET(mbuf, M_HASHTYPE_OPAQUE_HASH);