Author: np
Date: Sun Dec  8 17:47:37 2013
New Revision: 259103
URL: http://svnweb.freebsd.org/changeset/base/259103

Log:
  cxgbe(4): save a copy of the RSS map for each port for the driver's use.

Modified:
  head/sys/dev/cxgbe/adapter.h
  head/sys/dev/cxgbe/t4_main.c
  head/sys/dev/cxgbe/t4_sge.c

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h        Sun Dec  8 15:25:19 2013        
(r259102)
+++ head/sys/dev/cxgbe/adapter.h        Sun Dec  8 17:47:37 2013        
(r259103)
@@ -200,6 +200,7 @@ struct port_info {
        unsigned long flags;
        int if_flags;
 
+       uint16_t *rss;
        uint16_t viid;
        int16_t  xact_addr_filt;/* index of exact MAC address filter */
        uint16_t rss_size;      /* size of VI's RSS table slice */

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Sun Dec  8 15:25:19 2013        
(r259102)
+++ head/sys/dev/cxgbe/t4_main.c        Sun Dec  8 17:47:37 2013        
(r259103)
@@ -3157,7 +3157,7 @@ port_full_init(struct port_info *pi)
        struct ifnet *ifp = pi->ifp;
        uint16_t *rss;
        struct sge_rxq *rxq;
-       int rc, i;
+       int rc, i, j;
 
        ASSERT_SYNCHRONIZED_OP(sc);
        KASSERT((pi->flags & PORT_INIT_DONE) == 0,
@@ -3174,21 +3174,25 @@ port_full_init(struct port_info *pi)
                goto done;      /* error message displayed already */
 
        /*
-        * Setup RSS for this port.
+        * Setup RSS for this port.  Save a copy of the RSS table for later use.
         */
-       rss = malloc(pi->nrxq * sizeof (*rss), M_CXGBE,
-           M_ZERO | M_WAITOK);
-       for_each_rxq(pi, i, rxq) {
-               rss[i] = rxq->iq.abs_id;
+       rss = malloc(pi->rss_size * sizeof (*rss), M_CXGBE, M_ZERO | M_WAITOK);
+       for (i = 0; i < pi->rss_size;) {
+               for_each_rxq(pi, j, rxq) {
+                       rss[i++] = rxq->iq.abs_id;
+                       if (i == pi->rss_size)
+                               break;
+               }
        }
-       rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0,
-           pi->rss_size, rss, pi->nrxq);
-       free(rss, M_CXGBE);
+
+       rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0, pi->rss_size, rss,
+           pi->rss_size);
        if (rc != 0) {
                if_printf(ifp, "rss_config failed: %d\n", rc);
                goto done;
        }
 
+       pi->rss = rss;
        pi->flags |= PORT_INIT_DONE;
 done:
        if (rc != 0)
@@ -3237,6 +3241,7 @@ port_full_uninit(struct port_info *pi)
                        quiesce_fl(sc, &ofld_rxq->fl);
                }
 #endif
+               free(pi->rss, M_CXGBE);
        }
 
        t4_teardown_port_queues(pi);

Modified: head/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- head/sys/dev/cxgbe/t4_sge.c Sun Dec  8 15:25:19 2013        (r259102)
+++ head/sys/dev/cxgbe/t4_sge.c Sun Dec  8 17:47:37 2013        (r259103)
@@ -1678,7 +1678,7 @@ t4_eth_rx(struct sge_iq *iq, const struc
 
        m0->m_pkthdr.rcvif = ifp;
        m0->m_flags |= M_FLOWID;
-       m0->m_pkthdr.flowid = rss->hash_val;
+       m0->m_pkthdr.flowid = be32toh(rss->hash_val);
 
        if (cpl->csum_calc && !cpl->err_vec) {
                if (ifp->if_capenable & IFCAP_RXCSUM &&
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to