Author: np
Date: Tue Jun  7 00:27:55 2016
New Revision: 301535
URL: https://svnweb.freebsd.org/changeset/base/301535

Log:
  cxgbe(4): Track the state of the hardware traffic schedulers in the
  driver.  This works as long as everyone uses set_sched_class_params
  to program them.
  
  Sponsored by: Chelsio Communications

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

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h        Mon Jun  6 23:00:42 2016        
(r301534)
+++ head/sys/dev/cxgbe/adapter.h        Tue Jun  7 00:27:55 2016        
(r301535)
@@ -54,6 +54,7 @@
 #include <netinet/tcp_lro.h>
 
 #include "offload.h"
+#include "t4_ioctl.h"
 #include "common/t4_msg.h"
 #include "firmware/t4fw_interface.h"
 
@@ -264,6 +265,17 @@ struct vi_info {
        uint8_t hw_addr[ETHER_ADDR_LEN]; /* factory MAC address, won't change */
 };
 
+enum {
+       /* tx_sched_class flags */
+       TX_SC_OK        = (1 << 0),     /* Set up in hardware, active. */
+};
+
+struct tx_sched_class {
+       int refcount;
+       int flags;
+       struct t4_sched_class_params params;
+};
+
 struct port_info {
        device_t dev;
        struct adapter *adapter;
@@ -273,6 +285,8 @@ struct port_info {
        int up_vis;
        int uld_vis;
 
+       struct tx_sched_class *tc;      /* traffic classes for this channel */
+
        struct mtx pi_lock;
        char lockname[16];
        unsigned long flags;

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Mon Jun  6 23:00:42 2016        
(r301534)
+++ head/sys/dev/cxgbe/t4_main.c        Tue Jun  7 00:27:55 2016        
(r301535)
@@ -875,6 +875,9 @@ t4_attach(device_t dev)
                mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF);
                sc->chan_map[pi->tx_chan] = i;
 
+               pi->tc = malloc(sizeof(struct tx_sched_class) *
+                   sc->chip_params->nsched_cls, M_CXGBE, M_ZERO | M_WAITOK);
+
                if (is_10G_port(pi) || is_40G_port(pi)) {
                        n10g++;
                        for_each_vi(pi, j, vi) {
@@ -1131,6 +1134,7 @@ t4_detach(device_t dev)
 
                        mtx_destroy(&pi->pi_lock);
                        free(pi->vi, M_CXGBE);
+                       free(pi->tc, M_CXGBE);
                        free(pi, M_CXGBE);
                }
        }
@@ -8319,6 +8323,7 @@ set_sched_class_params(struct adapter *s
 {
        int rc, top_speed, fw_level, fw_mode, fw_rateunit, fw_ratemode;
        struct port_info *pi;
+       struct tx_sched_class *tc;
 
        if (p->level == SCHED_CLASS_LEVEL_CL_RL)
                fw_level = FW_SCHED_PARAMS_LEVEL_CL_RL;
@@ -8401,9 +8406,20 @@ set_sched_class_params(struct adapter *s
            sleep_ok ? (SLEEP_OK | INTR_OK) : HOLD_LOCK, "t4sscp");
        if (rc)
                return (rc);
+       tc = &pi->tc[p->cl];
+       tc->params = *p;
        rc = -t4_sched_params(sc, FW_SCHED_TYPE_PKTSCHED, fw_level, fw_mode,
            fw_rateunit, fw_ratemode, p->channel, p->cl, p->minrate, p->maxrate,
            p->weight, p->pktsize, sleep_ok);
+       if (rc == 0)
+               tc->flags |= TX_SC_OK;
+       else {
+               /*
+                * Unknown state at this point, see tc->params for what was
+                * attempted.
+                */
+               tc->flags &= ~TX_SC_OK;
+       }
        end_synchronized_op(sc, sleep_ok ? 0 : LOCK_HELD);
 
        return (rc);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to