Author: np
Date: Wed May  7 02:13:55 2014
New Revision: 265478
URL: http://svnweb.freebsd.org/changeset/base/265478

Log:
  MFC r253701, r253829, r253873, r253889, r253890, r254577, r254727, and 
r254933.
  
  r253701:
  Display a string instead of a numeric code in the linkdnrc sysctl.
  
  r253829:
  Display SGE tunables in the sysctl tree.
  
  dev.t5nex.0.fl_pktshift: payload DMA offset in rx buffer (bytes)
  dev.t5nex.0.fl_pad: payload pad boundary (bytes)
  dev.t5nex.0.spg_len: status page size (bytes)
  dev.t5nex.0.cong_drop: congestion drop setting
  
  r253873:
  Set up congestion manager context properly for T5 based cards.
  
  r253889:
  Fix previous commit (r253873).  "cong" has one bit per channel but the
  congestion channel map has 1 nibble per channel.  So bits wxyz need to
  be blown up into 000w000x000y000z.
  
  r253890:
  Display temperature sensor data.  Shows -1 if sensor not
  available on the card.
  
  # sysctl dev.t4nex.0.temperature
  # sysctl dev.t5nex.0.temperature
  
  r254577:
  Display P/N information in the description.
  
  r254727:
  There is no need to hold the freelist lock around alloc/free of
  software descriptors.  This also silences WITNESS warnings when
  the software descriptors are allocated with M_WAITOK.
  
  r254933:
  Use correct mailbox and PCIe PF number when querying RDMA parameters.

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

Modified: stable/9/sys/dev/cxgbe/adapter.h
==============================================================================
--- stable/9/sys/dev/cxgbe/adapter.h    Wed May  7 00:51:24 2014        
(r265477)
+++ stable/9/sys/dev/cxgbe/adapter.h    Wed May  7 02:13:55 2014        
(r265478)
@@ -792,6 +792,8 @@ void t4_init_sge_cpl_handlers(struct ada
 void t4_tweak_chip_settings(struct adapter *);
 int t4_read_chip_settings(struct adapter *);
 int t4_create_dma_tag(struct adapter *);
+void t4_sge_sysctls(struct adapter *, struct sysctl_ctx_list *,
+    struct sysctl_oid_list *);
 int t4_destroy_dma_tag(struct adapter *);
 int t4_setup_adapter_queues(struct adapter *);
 int t4_teardown_adapter_queues(struct adapter *);

Modified: stable/9/sys/dev/cxgbe/t4_main.c
==============================================================================
--- stable/9/sys/dev/cxgbe/t4_main.c    Wed May  7 00:51:24 2014        
(r265477)
+++ stable/9/sys/dev/cxgbe/t4_main.c    Wed May  7 02:13:55 2014        
(r265478)
@@ -379,6 +379,7 @@ static int sysctl_holdoff_pktc_idx(SYSCT
 static int sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS);
 static int sysctl_qsize_txq(SYSCTL_HANDLER_ARGS);
 static int sysctl_handle_t4_reg64(SYSCTL_HANDLER_ARGS);
+static int sysctl_temperature(SYSCTL_HANDLER_ARGS);
 #ifdef SBUF_DRAIN
 static int sysctl_cctrl(SYSCTL_HANDLER_ARGS);
 static int sysctl_cim_ibq_obq(SYSCTL_HANDLER_ARGS);
@@ -392,6 +393,7 @@ static int sysctl_devlog(SYSCTL_HANDLER_
 static int sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS);
 static int sysctl_hw_sched(SYSCTL_HANDLER_ARGS);
 static int sysctl_lb_stats(SYSCTL_HANDLER_ARGS);
+static int sysctl_linkdnrc(SYSCTL_HANDLER_ARGS);
 static int sysctl_meminfo(SYSCTL_HANDLER_ARGS);
 static int sysctl_mps_tcam(SYSCTL_HANDLER_ARGS);
 static int sysctl_path_mtus(SYSCTL_HANDLER_ARGS);
@@ -2474,7 +2476,7 @@ get_params__post_init(struct adapter *sc
                param[3] = FW_PARAM_PFVF(CQ_END);
                param[4] = FW_PARAM_PFVF(OCQ_START);
                param[5] = FW_PARAM_PFVF(OCQ_END);
-               rc = -t4_query_params(sc, 0, 0, 0, 6, param, val);
+               rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
                if (rc != 0) {
                        device_printf(sc->dev,
                            "failed to query RDMA parameters(2): %d.\n", rc);
@@ -2531,9 +2533,9 @@ t4_set_desc(struct adapter *sc)
        char buf[128];
        struct adapter_params *p = &sc->params;
 
-       snprintf(buf, sizeof(buf), "Chelsio %s %sNIC (rev %d), S/N:%s, E/C:%s",
-           p->vpd.id, is_offload(sc) ? "R" : "", chip_rev(sc), p->vpd.sn,
-           p->vpd.ec);
+       snprintf(buf, sizeof(buf), "Chelsio %s %sNIC (rev %d), S/N:%s, "
+           "P/N:%s, E/C:%s", p->vpd.id, is_offload(sc) ? "R" : "",
+           chip_rev(sc), p->vpd.sn, p->vpd.pn, p->vpd.ec);
 
        device_set_desc_copy(sc->dev, buf);
 }
@@ -4195,6 +4197,12 @@ t4_sysctls(struct adapter *sc)
        SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nfilters", CTLFLAG_RD,
            NULL, sc->tids.nftids, "number of filters");
 
+       SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature", CTLTYPE_INT |
+           CTLFLAG_RD, sc, 0, sysctl_temperature, "A",
+           "chip temperature (in Celsius)");
+
+       t4_sge_sysctls(sc, ctx, children);
+
 #ifdef SBUF_DRAIN
        /*
         * dev.t4nex.X.misc.  Marked CTLFLAG_SKIP to avoid information overload.
@@ -4412,8 +4420,8 @@ cxgbe_sysctls(struct port_info *pi)
        oid = device_get_sysctl_tree(pi->dev);
        children = SYSCTL_CHILDREN(oid);
 
-       SYSCTL_ADD_INT(ctx, children, OID_AUTO, "linkdnrc", CTLFLAG_RD,
-           &pi->linkdnrc, 0, "reason why link is down");
+       SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "linkdnrc", CTLTYPE_STRING |
+          CTLFLAG_RD, pi, 0, sysctl_linkdnrc, "A", "reason why link is down");
        if (pi->port_type == FW_PORT_TYPE_BT_XAUI) {
                SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature",
                    CTLTYPE_INT | CTLFLAG_RD, pi, 0, sysctl_btphy, "I",
@@ -4835,6 +4843,31 @@ sysctl_handle_t4_reg64(SYSCTL_HANDLER_AR
        return (sysctl_handle_64(oidp, &val, 0, req));
 }
 
+static int
+sysctl_temperature(SYSCTL_HANDLER_ARGS)
+{
+       struct adapter *sc = arg1;
+       int rc, t;
+       uint32_t param, val;
+
+       rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4temp");
+       if (rc)
+               return (rc);
+       param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
+           V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_DIAG) |
+           V_FW_PARAMS_PARAM_Y(FW_PARAM_DEV_DIAG_TMP);
+       rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
+       end_synchronized_op(sc, 0);
+       if (rc)
+               return (rc);
+
+       /* unknown is returned as 0 but we display -1 in that case */
+       t = val == 0 ? -1 : val;
+
+       rc = sysctl_handle_int(oidp, &t, 0, req);
+       return (rc);
+}
+
 #ifdef SBUF_DRAIN
 static int
 sysctl_cctrl(SYSCTL_HANDLER_ARGS)
@@ -5459,6 +5492,37 @@ sysctl_lb_stats(SYSCTL_HANDLER_ARGS)
        return (rc);
 }
 
+static int
+sysctl_linkdnrc(SYSCTL_HANDLER_ARGS)
+{
+       int rc = 0;
+       struct port_info *pi = arg1;
+       struct sbuf *sb;
+       static const char *linkdnreasons[] = {
+               "non-specific", "remote fault", "autoneg failed", "reserved3",
+               "PHY overheated", "unknown", "rx los", "reserved7"
+       };
+
+       rc = sysctl_wire_old_buffer(req, 0);
+       if (rc != 0)
+               return(rc);
+       sb = sbuf_new_for_sysctl(NULL, NULL, 64, req);
+       if (sb == NULL)
+               return (ENOMEM);
+
+       if (pi->linkdnrc < 0)
+               sbuf_printf(sb, "n/a");
+       else if (pi->linkdnrc < nitems(linkdnreasons))
+               sbuf_printf(sb, "%s", linkdnreasons[pi->linkdnrc]);
+       else
+               sbuf_printf(sb, "%d", pi->linkdnrc);
+
+       rc = sbuf_finish(sb);
+       sbuf_delete(sb);
+
+       return (rc);
+}
+
 struct mem_desc {
        unsigned int base;
        unsigned int limit;

Modified: stable/9/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- stable/9/sys/dev/cxgbe/t4_sge.c     Wed May  7 00:51:24 2014        
(r265477)
+++ stable/9/sys/dev/cxgbe/t4_sge.c     Wed May  7 02:13:55 2014        
(r265478)
@@ -496,6 +496,24 @@ t4_create_dma_tag(struct adapter *sc)
        return (rc);
 }
 
+void
+t4_sge_sysctls(struct adapter *sc, struct sysctl_ctx_list *ctx,
+    struct sysctl_oid_list *children)
+{
+
+       SYSCTL_ADD_INT(ctx, children, OID_AUTO, "fl_pktshift", CTLFLAG_RD,
+           NULL, fl_pktshift, "payload DMA offset in rx buffer (bytes)");
+
+       SYSCTL_ADD_INT(ctx, children, OID_AUTO, "fl_pad", CTLFLAG_RD,
+           NULL, fl_pad, "payload pad boundary (bytes)");
+
+       SYSCTL_ADD_INT(ctx, children, OID_AUTO, "spg_len", CTLFLAG_RD,
+           NULL, spg_len, "status page size (bytes)");
+
+       SYSCTL_ADD_INT(ctx, children, OID_AUTO, "cong_drop", CTLFLAG_RD,
+           NULL, cong_drop, "congestion drop setting");
+}
+
 int
 t4_destroy_dma_tag(struct adapter *sc)
 {
@@ -1782,9 +1800,7 @@ alloc_iq_fl(struct port_info *pi, struct
 
                /* Allocate space for one software descriptor per buffer. */
                fl->cap = (fl->qsize - spg_len / RX_FL_ESIZE) * 8;
-               FL_LOCK(fl);
                rc = alloc_fl_sdesc(fl);
-               FL_UNLOCK(fl);
                if (rc != 0) {
                        device_printf(sc->dev,
                            "failed to setup fl software descriptors: %d\n",
@@ -1852,6 +1868,31 @@ alloc_iq_fl(struct port_info *pi, struct
                iq->flags |= IQ_HAS_FL;
        }
 
+       if (is_t5(sc) && cong >= 0) {
+               uint32_t param, val;
+
+               param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) |
+                   V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) |
+                   V_FW_PARAMS_PARAM_YZ(iq->cntxt_id);
+               if (cong == 0)
+                       val = 1 << 19;
+               else {
+                       val = 2 << 19;
+                       for (i = 0; i < 4; i++) {
+                               if (cong & (1 << i))
+                                       val |= 1 << (i << 2);
+                       }
+               }
+
+               rc = -t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
+               if (rc != 0) {
+                       /* report error but carry on */
+                       device_printf(sc->dev,
+                           "failed to set congestion manager context for "
+                           "ingress queue %d: %d\n", iq->cntxt_id, rc);
+               }
+       }
+
        /* Enable IQ interrupts */
        atomic_store_rel_int(&iq->state, IQS_IDLE);
        t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_SEINTARM(iq->intr_params) |
@@ -1892,11 +1933,8 @@ free_iq_fl(struct port_info *pi, struct 
                free_ring(sc, fl->desc_tag, fl->desc_map, fl->ba,
                    fl->desc);
 
-               if (fl->sdesc) {
-                       FL_LOCK(fl);
+               if (fl->sdesc)
                        free_fl_sdesc(fl);
-                       FL_UNLOCK(fl);
-               }
 
                if (mtx_initialized(&fl->fl_lock))
                        mtx_destroy(&fl->fl_lock);
@@ -2743,8 +2781,6 @@ alloc_fl_sdesc(struct sge_fl *fl)
        bus_dma_tag_t tag;
        int i, rc;
 
-       FL_LOCK_ASSERT_OWNED(fl);
-
        fl->sdesc = malloc(fl->cap * sizeof(struct fl_sdesc), M_CXGBE,
            M_ZERO | M_WAITOK);
 
@@ -2783,8 +2819,6 @@ free_fl_sdesc(struct sge_fl *fl)
        struct fl_sdesc *sd;
        int i;
 
-       FL_LOCK_ASSERT_OWNED(fl);
-
        sd = fl->sdesc;
        for (i = 0; i < fl->cap; i++, sd++) {
 
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to