Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Feb 2012 19:31:16 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r231601 - stable/9/sys/dev/cxgbe
Message-ID:  <201202131931.q1DJVGiZ058191@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: np
Date: Mon Feb 13 19:31:16 2012
New Revision: 231601
URL: http://svn.freebsd.org/changeset/base/231601

Log:
  MFC r231172:
  Program the MAC exact match table in batches of 7 addresses at
  a time when possible.  This is more efficient than one at a time.

Modified:
  stable/9/sys/dev/cxgbe/t4_main.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/dev/cxgbe/t4_main.c
==============================================================================
--- stable/9/sys/dev/cxgbe/t4_main.c	Mon Feb 13 19:25:58 2012	(r231600)
+++ stable/9/sys/dev/cxgbe/t4_main.c	Mon Feb 13 19:31:16 2012	(r231601)
@@ -2013,6 +2013,8 @@ build_medialist(struct port_info *pi)
 	PORT_UNLOCK(pi);
 }
 
+#define FW_MAC_EXACT_CHUNK	7
+
 /*
  * Program the port's XGMAC based on parameters in ifnet.  The caller also
  * indicates which parameters should be programmed (the rest are left alone).
@@ -2064,28 +2066,57 @@ update_mac_settings(struct port_info *pi
 	}
 
 	if (flags & XGMAC_MCADDRS) {
-		const uint8_t *mcaddr;
+		const uint8_t *mcaddr[FW_MAC_EXACT_CHUNK];
 		int del = 1;
 		uint64_t hash = 0;
 		struct ifmultiaddr *ifma;
+		int i = 0, j;
 
 		if_maddr_rlock(ifp);
 		TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-			if (ifma->ifma_addr->sa_family != AF_LINK)
+			if (ifma->ifma_addr->sa_family == AF_LINK)
 				continue;
-			mcaddr = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
+			mcaddr[i++] =
+			    LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
 
-			rc = t4_alloc_mac_filt(sc, sc->mbox, pi->viid, del, 1,
-			    &mcaddr, NULL, &hash, 0);
+			if (i == FW_MAC_EXACT_CHUNK) {
+				rc = t4_alloc_mac_filt(sc, sc->mbox, pi->viid,
+				    del, i, mcaddr, NULL, &hash, 0);
+				if (rc < 0) {
+					rc = -rc;
+					for (j = 0; j < i; j++) {
+						if_printf(ifp,
+						    "failed to add mc address"
+						    " %02x:%02x:%02x:"
+						    "%02x:%02x:%02x rc=%d\n",
+						    mcaddr[j][0], mcaddr[j][1],
+						    mcaddr[j][2], mcaddr[j][3],
+						    mcaddr[j][4], mcaddr[j][5],
+						    rc);
+					}
+					goto mcfail;
+				}
+				del = 0;
+				i = 0;
+			}
+		}
+		if (i > 0) {
+			rc = t4_alloc_mac_filt(sc, sc->mbox, pi->viid,
+			    del, i, mcaddr, NULL, &hash, 0);
 			if (rc < 0) {
 				rc = -rc;
-				if_printf(ifp, "failed to add mc address"
-				    " %02x:%02x:%02x:%02x:%02x:%02x rc=%d\n",
-				    mcaddr[0], mcaddr[1], mcaddr[2], mcaddr[3],
-				    mcaddr[4], mcaddr[5], rc);
+				for (j = 0; j < i; j++) {
+					if_printf(ifp,
+					    "failed to add mc address"
+					    " %02x:%02x:%02x:"
+					    "%02x:%02x:%02x rc=%d\n",
+					    mcaddr[j][0], mcaddr[j][1],
+					    mcaddr[j][2], mcaddr[j][3],
+					    mcaddr[j][4], mcaddr[j][5],
+					    rc);
+				}
 				goto mcfail;
 			}
-			del = 0;
 		}
 
 		rc = -t4_set_addr_hash(sc, sc->mbox, pi->viid, 0, hash, 0);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202131931.q1DJVGiZ058191>