Author: np
Date: Wed Feb  8 00:36:36 2012
New Revision: 231172
URL: http://svn.freebsd.org/changeset/base/231172

Log:
  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.
  
  Submitted by: gnn
  MFC after:    3 days

Modified:
  head/sys/dev/cxgbe/t4_main.c

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Wed Feb  8 00:08:21 2012        
(r231171)
+++ head/sys/dev/cxgbe/t4_main.c        Wed Feb  8 00:36:36 2012        
(r231172)
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to