Author: gallatin
Date: Mon Jan 11 21:32:39 2010
New Revision: 202118
URL: http://svn.freebsd.org/changeset/base/202118

Log:
  MFC: Merge older mxge(4) fixes/improvements from head:
  
  r193250: Set an rx jumbo cluster to the correct size for 
bus_dmamap_load_mbuf_sg()
  r194836: Initial mtu
  r195818: Rename hw.mxge.rss_hash_type -> hw.mxge.rss_hashtype
  r197391: Add support for TX throttling.

Modified:
  stable/6/sys/dev/mxge/if_mxge.c
  stable/6/sys/dev/mxge/if_mxge_var.h
Directory Properties:
  stable/6/sys/   (props changed)
  stable/6/sys/contrib/pf/   (props changed)
  stable/6/sys/dev/cxgb/   (props changed)

Modified: stable/6/sys/dev/mxge/if_mxge.c
==============================================================================
--- stable/6/sys/dev/mxge/if_mxge.c     Mon Jan 11 21:23:59 2010        
(r202117)
+++ stable/6/sys/dev/mxge/if_mxge.c     Mon Jan 11 21:32:39 2010        
(r202118)
@@ -99,6 +99,8 @@ static int mxge_ticks;
 static int mxge_max_slices = 1;
 static int mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT;
 static int mxge_always_promisc = 0;
+static int mxge_initial_mtu = ETHERMTU_JUMBO;
+static int mxge_throttle = 0;
 static char *mxge_fw_unaligned = "mxge_ethp_z8e";
 static char *mxge_fw_aligned = "mxge_eth_z8e";
 static char *mxge_fw_rss_aligned = "mxge_rss_eth_z8e";
@@ -589,10 +591,13 @@ static int
 mxge_select_firmware(mxge_softc_t *sc)
 {
        int aligned = 0;
+       int force_firmware = mxge_force_firmware;
 
+       if (sc->throttle)
+               force_firmware = sc->throttle;
 
-       if (mxge_force_firmware != 0) {
-               if (mxge_force_firmware == 1)
+       if (force_firmware != 0) {
+               if (force_firmware == 1)
                        aligned = 1;
                else
                        aligned = 0;
@@ -1300,10 +1305,48 @@ mxge_reset(mxge_softc_t *sc, int interru
        mxge_change_promisc(sc, sc->ifp->if_flags & IFF_PROMISC);
        mxge_change_pause(sc, sc->pause);
        mxge_set_multicast_list(sc);
+       if (sc->throttle) {
+               cmd.data0 = sc->throttle;
+               if (mxge_send_cmd(sc, MXGEFW_CMD_SET_THROTTLE_FACTOR,
+                                 &cmd)) {
+                       device_printf(sc->dev,
+                                     "can't enable throttle\n");
+               }
+       }
        return status;
 }
 
 static int
+mxge_change_throttle(SYSCTL_HANDLER_ARGS)
+{
+       mxge_cmd_t cmd;
+       mxge_softc_t *sc;
+       int err;
+       unsigned int throttle;
+
+       sc = arg1;
+       throttle = sc->throttle;
+       err = sysctl_handle_int(oidp, &throttle, arg2, req);
+        if (err != 0) {
+                return err;
+        }
+
+       if (throttle == sc->throttle)
+               return 0;
+
+        if (throttle < MXGE_MIN_THROTTLE || throttle > MXGE_MAX_THROTTLE)
+                return EINVAL;
+       
+       mtx_lock(&sc->driver_mtx);
+       cmd.data0 = throttle;
+       err = mxge_send_cmd(sc, MXGEFW_CMD_SET_THROTTLE_FACTOR, &cmd);
+       if (err == 0)
+               sc->throttle = throttle;
+       mtx_unlock(&sc->driver_mtx);    
+       return err;
+}
+
+static int
 mxge_change_intr_coal(SYSCTL_HANDLER_ARGS)
 {
         mxge_softc_t *sc;
@@ -1495,6 +1538,12 @@ mxge_add_sysctls(mxge_softc_t *sc)
                        "I", "interrupt coalescing delay in usecs");
 
        SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
+                       "throttle",
+                       CTLTYPE_INT|CTLFLAG_RW, sc,
+                       0, mxge_change_throttle, 
+                       "I", "transmit throttling");
+
+       SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
                        "flow_control_enabled",
                        CTLTYPE_INT|CTLFLAG_RW, sc,
                        0, mxge_change_flow_control,
@@ -2206,7 +2255,7 @@ mxge_get_buf_big(struct mxge_slice_state
                err = ENOBUFS;
                goto done;
        }
-       m->m_len = rx->cl_size;
+       m->m_len = rx->mlen;
        err = bus_dmamap_load_mbuf_sg(rx->dmat, map, m, 
                                      seg, &cnt, BUS_DMA_NOWAIT);
        if (err != 0) {
@@ -3240,6 +3289,8 @@ mxge_slice_open(struct mxge_slice_state 
        }
        ss->rx_big.nbufs = nbufs;
        ss->rx_big.cl_size = cl_size;
+       ss->rx_big.mlen = ss->sc->ifp->if_mtu + ETHER_HDR_LEN +
+               ETHER_VLAN_ENCAP_LEN + MXGEFW_PAD;
        for (i = 0; i <= ss->rx_big.mask; i += ss->rx_big.nbufs) {
                map = ss->rx_big.info[i].map;
                err = mxge_get_buf_big(ss, map, i);
@@ -3840,6 +3891,9 @@ mxge_fetch_tunables(mxge_softc_t *sc)
        TUNABLE_INT_FETCH("hw.mxge.lro_cnt", &sc->lro_cnt);
        TUNABLE_INT_FETCH("hw.mxge.always_promisc", &mxge_always_promisc);
        TUNABLE_INT_FETCH("hw.mxge.rss_hash_type", &mxge_rss_hash_type);
+       TUNABLE_INT_FETCH("hw.mxge.rss_hashtype", &mxge_rss_hash_type);
+       TUNABLE_INT_FETCH("hw.mxge.initial_mtu", &mxge_initial_mtu);
+       TUNABLE_INT_FETCH("hw.mxge.throttle", &mxge_throttle);
        if (sc->lro_cnt != 0)
                mxge_lro_cnt = sc->lro_cnt;
 
@@ -3854,6 +3908,15 @@ mxge_fetch_tunables(mxge_softc_t *sc)
            || mxge_rss_hash_type > MXGEFW_RSS_HASH_TYPE_MAX) {
                mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT;
        }
+       if (mxge_initial_mtu > ETHERMTU_JUMBO ||
+           mxge_initial_mtu < ETHER_MIN_LEN)
+               mxge_initial_mtu = ETHERMTU_JUMBO;
+
+       if (mxge_throttle && mxge_throttle > MXGE_MAX_THROTTLE)
+               mxge_throttle = MXGE_MAX_THROTTLE;
+       if (mxge_throttle && mxge_throttle < MXGE_MIN_THROTTLE)
+               mxge_throttle = MXGE_MIN_THROTTLE;
+       sc->throttle = mxge_throttle;
 }
 
 
@@ -4414,9 +4477,9 @@ mxge_attach(device_t dev)
        mxge_media_probe(sc);
        sc->dying = 0;
        ether_ifattach(ifp, sc->mac_addr);
-       /* ether_ifattach sets mtu to 1500 */
-       if (ifp->if_capabilities & IFCAP_JUMBO_MTU)
-               ifp->if_mtu = 9000;
+       /* ether_ifattach sets mtu to ETHERMTU */
+       if (mxge_initial_mtu != ETHERMTU)
+               mxge_change_mtu(sc, mxge_initial_mtu);
 
        mxge_add_sysctls(sc);
        callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc);

Modified: stable/6/sys/dev/mxge/if_mxge_var.h
==============================================================================
--- stable/6/sys/dev/mxge/if_mxge_var.h Mon Jan 11 21:23:59 2010        
(r202117)
+++ stable/6/sys/dev/mxge/if_mxge_var.h Mon Jan 11 21:32:39 2010        
(r202118)
@@ -119,6 +119,7 @@ typedef struct
        int cl_size;
        int alloc_fail;
        int mask;                       /* number of rx slots -1 */
+       int mlen;
 } mxge_rx_ring_t;
 
 typedef struct
@@ -242,6 +243,7 @@ struct mxge_softc {
        int fw_multicast_support;
        int link_width;
        int max_mtu;
+       int throttle;
        int tx_defrag;
        int media_flags;
        int need_media_probe;
@@ -270,6 +272,8 @@ struct mxge_softc {
 #define MXGE_PCI_REV_Z8ES      1
 #define MXGE_XFP_COMPLIANCE_BYTE       131
 #define MXGE_SFP_COMPLIANCE_BYTE         3
+#define MXGE_MIN_THROTTLE      416
+#define MXGE_MAX_THROTTLE      4096
 
 #define MXGE_HIGHPART_TO_U32(X) \
 (sizeof (X) == 8) ? ((uint32_t)((uint64_t)(X) >> 32)) : (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