svn commit: r268916 - head/sys/dev/ixgbe

Adrian Chadd adrian at FreeBSD.org
Sun Jul 20 07:45:49 UTC 2014


Author: adrian
Date: Sun Jul 20 07:45:48 2014
New Revision: 268916
URL: http://svnweb.freebsd.org/changeset/base/268916

Log:
  Teach ixgbe(4) about rss_gethashconfig().
  
  If RSS is enabled, ixgbe(4) will query the RSS API for the types of hashes
  which should be used.  It'll then only enable hashes that are exposed via
  the RSS layer.
  
  This way it won't try to do things like enable UDP hashing if RSS explicitly
  states that it isn't supported in lookups.
  
  Tested:
  
  * 82599EB ixgbe(4) NIC

Modified:
  head/sys/dev/ixgbe/ixgbe.c

Modified: head/sys/dev/ixgbe/ixgbe.c
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.c	Sun Jul 20 07:43:41 2014	(r268915)
+++ head/sys/dev/ixgbe/ixgbe.c	Sun Jul 20 07:45:48 2014	(r268916)
@@ -4204,6 +4204,9 @@ ixgbe_initialise_rss_mapping(struct adap
 	int i, j, queue_id;
 	uint32_t rss_key[10];
 	uint32_t mrqc;
+#ifdef	RSS
+	uint32_t rss_hash_config;
+#endif
 
 	/* Setup RSS */
 	reta = 0;
@@ -4247,6 +4250,32 @@ ixgbe_initialise_rss_mapping(struct adap
 		IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
 
 	/* Perform hash on these packet types */
+#ifdef	RSS
+	mrqc = IXGBE_MRQC_RSSEN;
+	rss_hash_config = rss_gethashconfig();
+	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4_EX)
+		device_printf(adapter->dev,
+		    "%s: RSS_HASHTYPE_RSS_UDP_IPV4_EX defined, "
+		    "but not supported\n", __func__);
+	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
+	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
+		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
+#else
 	/*
 	 * Disable UDP - IP fragments aren't currently being handled
 	 * and so we end up with a mix of 2-tuple and 4-tuple
@@ -4267,6 +4296,7 @@ ixgbe_initialise_rss_mapping(struct adap
 	     | IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP
 #endif
 	;
+#endif /* RSS */
 	IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
 }
 


More information about the svn-src-all mailing list