@@ -1529,11 +1529,12 @@ static u32 iavf_adv_rss_parse_hdrs(struct ethtool_rxnfc *cmd)
15291529/**
15301530 * iavf_adv_rss_parse_hash_flds - parses hash fields from RSS hash input
15311531 * @cmd: ethtool rxnfc command
1532+ * @symm: true if Symmetric Topelitz is set
15321533 *
15331534 * This function parses the rxnfc command and returns intended hash fields for
15341535 * RSS configuration
15351536 */
1536- static u64 iavf_adv_rss_parse_hash_flds (struct ethtool_rxnfc * cmd )
1537+ static u64 iavf_adv_rss_parse_hash_flds (struct ethtool_rxnfc * cmd , bool symm )
15371538{
15381539 u64 hfld = IAVF_ADV_RSS_HASH_INVALID ;
15391540
@@ -1605,25 +1606,29 @@ iavf_set_adv_rss_hash_opt(struct iavf_adapter *adapter,
16051606 struct iavf_adv_rss * rss_old , * rss_new ;
16061607 bool rss_new_add = false;
16071608 int count = 50 , err = 0 ;
1609+ bool symm = false;
16081610 u64 hash_flds ;
16091611 u32 hdrs ;
16101612
16111613 if (!ADV_RSS_SUPPORT (adapter ))
16121614 return - EOPNOTSUPP ;
16131615
1616+ symm = !!(adapter -> hfunc == VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC );
1617+
16141618 hdrs = iavf_adv_rss_parse_hdrs (cmd );
16151619 if (hdrs == IAVF_ADV_RSS_FLOW_SEG_HDR_NONE )
16161620 return - EINVAL ;
16171621
1618- hash_flds = iavf_adv_rss_parse_hash_flds (cmd );
1622+ hash_flds = iavf_adv_rss_parse_hash_flds (cmd , symm );
16191623 if (hash_flds == IAVF_ADV_RSS_HASH_INVALID )
16201624 return - EINVAL ;
16211625
16221626 rss_new = kzalloc (sizeof (* rss_new ), GFP_KERNEL );
16231627 if (!rss_new )
16241628 return - ENOMEM ;
16251629
1626- if (iavf_fill_adv_rss_cfg_msg (& rss_new -> cfg_msg , hdrs , hash_flds )) {
1630+ if (iavf_fill_adv_rss_cfg_msg (& rss_new -> cfg_msg , hdrs , hash_flds ,
1631+ symm )) {
16271632 kfree (rss_new );
16281633 return - EINVAL ;
16291634 }
@@ -1642,9 +1647,11 @@ iavf_set_adv_rss_hash_opt(struct iavf_adapter *adapter,
16421647 if (rss_old ) {
16431648 if (rss_old -> state != IAVF_ADV_RSS_ACTIVE ) {
16441649 err = - EBUSY ;
1645- } else if (rss_old -> hash_flds != hash_flds ) {
1650+ } else if (rss_old -> hash_flds != hash_flds ||
1651+ rss_old -> symm != symm ) {
16461652 rss_old -> state = IAVF_ADV_RSS_ADD_REQUEST ;
16471653 rss_old -> hash_flds = hash_flds ;
1654+ rss_old -> symm = symm ;
16481655 memcpy (& rss_old -> cfg_msg , & rss_new -> cfg_msg ,
16491656 sizeof (rss_new -> cfg_msg ));
16501657 } else {
@@ -1655,6 +1662,7 @@ iavf_set_adv_rss_hash_opt(struct iavf_adapter *adapter,
16551662 rss_new -> state = IAVF_ADV_RSS_ADD_REQUEST ;
16561663 rss_new -> packet_hdrs = hdrs ;
16571664 rss_new -> hash_flds = hash_flds ;
1665+ rss_new -> symm = symm ;
16581666 list_add_tail (& rss_new -> list , & adapter -> adv_rss_list_head );
16591667 }
16601668 spin_unlock_bh (& adapter -> adv_rss_lock );
@@ -1905,6 +1913,9 @@ static int iavf_get_rxfh(struct net_device *netdev,
19051913 u16 i ;
19061914
19071915 rxfh -> hfunc = ETH_RSS_HASH_TOP ;
1916+ if (adapter -> hfunc == VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC )
1917+ rxfh -> input_xfrm |= RXH_XFRM_SYM_XOR ;
1918+
19081919 if (rxfh -> key )
19091920 memcpy (rxfh -> key , adapter -> rss_key , adapter -> rss_key_size );
19101921
@@ -1937,6 +1948,18 @@ static int iavf_set_rxfh(struct net_device *netdev,
19371948 rxfh -> hfunc != ETH_RSS_HASH_TOP )
19381949 return - EOPNOTSUPP ;
19391950
1951+ if ((rxfh -> input_xfrm & RXH_XFRM_SYM_XOR ) &&
1952+ adapter -> hfunc != VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC ) {
1953+ if (!ADV_RSS_SUPPORT (adapter ))
1954+ return - EOPNOTSUPP ;
1955+ adapter -> hfunc = VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC ;
1956+ adapter -> aq_required |= IAVF_FLAG_AQ_SET_RSS_HFUNC ;
1957+ } else if (!(rxfh -> input_xfrm & RXH_XFRM_SYM_XOR ) &&
1958+ adapter -> hfunc != VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC ) {
1959+ adapter -> hfunc = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC ;
1960+ adapter -> aq_required |= IAVF_FLAG_AQ_SET_RSS_HFUNC ;
1961+ }
1962+
19401963 if (!rxfh -> key && !rxfh -> indir )
19411964 return 0 ;
19421965
@@ -1955,6 +1978,7 @@ static int iavf_set_rxfh(struct net_device *netdev,
19551978static const struct ethtool_ops iavf_ethtool_ops = {
19561979 .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
19571980 ETHTOOL_COALESCE_USE_ADAPTIVE ,
1981+ .cap_rss_sym_xor_supported = true,
19581982 .get_drvinfo = iavf_get_drvinfo ,
19591983 .get_link = ethtool_op_get_link ,
19601984 .get_ringparam = iavf_get_ringparam ,
0 commit comments