Greg,

Can you try this version out ? This is again against OFED 1.3.

Differences from previous version are:
1. In perfquery.c, two places where PortSelect is faked out when all
ports is being "simulated".
2. Trivial mod to ibcheckerrs.in to eliminate AllPortSelect warning.

Thanks!

-- Hal

-------- Forwarded Message --------
From: Hal Rosenstock <[EMAIL PROTECTED]>
To: Greg Kurtzer <[EMAIL PROTECTED]>
Cc: [email protected]
Subject: [ofa-general] [RFC/PATCHv2] infiniband-diags: Support PMAs
which don't support AllPortSelect option
Date: Tue, 16 Oct 2007 11:18:00 -0700
infiniband-diags: Support PMAs which don't support AllPortSelect option

Currently only support single port HCAs but can be extended for other
devices if needed

Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>

diff --git a/infiniband-diags/scripts/ibcheckerrs.in 
b/infiniband-diags/scripts/ibcheckerrs.in
index aa29525..1a2d228 100644
--- a/infiniband-diags/scripts/ibcheckerrs.in
+++ b/infiniband-diags/scripts/ibcheckerrs.in
@@ -186,6 +186,8 @@ BEGIN {
 
 /^CounterSelect/ {next}
 
+/AllPortSelect/ {next}
+
 /^ib/  {print $0}
 /ibpanic:/     {print $0}
 /ibwarn:/      {print $0}
diff --git a/infiniband-diags/src/perfquery.c b/infiniband-diags/src/perfquery.c
index 148e452..17aafb6 100644
--- a/infiniband-diags/src/perfquery.c
+++ b/infiniband-diags/src/perfquery.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2007 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2007 Xsigo Systems Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -42,7 +43,7 @@
 #include <getopt.h>
 #include <netinet/in.h>
 
-#define __BUILD_VERSION_TAG__ 1.2.2
+#define __BUILD_VERSION_TAG__ 1.2.3
 #include <infiniband/common.h>
 #include <infiniband/umad.h>
 #include <infiniband/mad.h>
@@ -99,6 +100,9 @@ main(int argc, char **argv)
        int ca_port = 0;
        int extended = 0;
        uint16_t cap_mask;
+       int allports = 0;
+       int node_type, num_ports;
+       uint8_t data[IB_SMP_DATA_SIZE];
 
        static char const str_opts[] = "C:P:s:t:dGearRVhu";
        static const struct option long_opts[] = {
@@ -191,6 +195,35 @@ main(int argc, char **argv)
        /* PerfMgt ClassPortInfo is a required attribute */
        if (!perf_classportinfo_query(pc, &portid, port, timeout))
                IBERROR("classportinfo query");
+       /* ClassPortInfo should be supported as part of libibmad */
+       memcpy(&cap_mask, pc+2, sizeof(cap_mask));      /* CapabilityMask */
+       cap_mask = ntohs(cap_mask);
+       if (!(cap_mask & 0x100)) /* bit 8 is AllPortSelect */
+               if (port == 255) {
+                       allports = 1;
+                       IBWARN("AllPortSelect not supported");
+               }
+
+       if (allports == 1) {
+
+               /*
+                * Simulate all ports support in PMA
+                * Determine node type, number of (physical) ports,
+                * and, if switch, whether SP0 is enhanced
+                * to determine first and last port to query
+                */
+
+               /* For now, support single port CAs */
+               if (smp_query(data, &portid, IB_ATTR_NODE_INFO, 0, 0) < 0)
+                       IBERROR("smp query nodeinfo failed");
+               node_type = mad_get_field(data, 0, IB_NODE_TYPE_F);
+               if (node_type != IB_NODE_CA)    /* NodeType other than CA ? */
+                       IBERROR("smp query nodeinfo: Node type not CA");
+               mad_decode_field(data, IB_NODE_NPORTS_F, &num_ports);
+               if (num_ports != 1)
+                       IBERROR("smp query nodeinfo: %d ports; only 1 supported 
currently", num_ports);
+               port = num_ports;
+       }
 
        if (reset_only)
                goto do_reset;
@@ -199,17 +232,20 @@ main(int argc, char **argv)
                if (!port_performance_query(pc, &portid, port, timeout))
                        IBERROR("perfquery");
 
+               if (allports == 1)
+                       pc[1] = 255;    /* fake PortSelect */
+
                mad_dump_perfcounters(buf, sizeof buf, pc, sizeof pc);
        } else {
-               /* Should ClassPortInfo be implemented in libibmad ? */
-               memcpy(&cap_mask, pc+2, sizeof(cap_mask));      /* 
CapabilityMask */
-               cap_mask = ntohs(cap_mask);
                if (!(cap_mask & 0x200)) /* 1.2 errata: bit 9 is extended 
counter support */
                        IBWARN("PerfMgt ClassPortInfo 0x%x extended counters 
not indicated\n", cap_mask);
 
                if (!port_performance_ext_query(pc, &portid, port, timeout))
                        IBERROR("perfextquery");
 
+               if (allports == 1)
+                       pc[1] = 255;    /* fake PortSelect */
+
                mad_dump_perfcounters_ext(buf, sizeof buf, pc, sizeof pc);
        }
 

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to