Signed-off-by: Ira Weiny <wei...@llnl.gov>
---
 include/ibdiag_common.h |    1 +
 src/iblinkinfo.c        |   61 ++++++++++++++++++++++++++++++++++++----------
 2 files changed, 48 insertions(+), 14 deletions(-)

diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h
index 57bde20..a7ce62f 100644
--- a/include/ibdiag_common.h
+++ b/include/ibdiag_common.h
@@ -49,6 +49,7 @@ extern enum MAD_DEST ibd_dest_type;
 extern ib_portid_t *ibd_sm_id;
 extern int ibd_timeout;
 
+
 /*========================================================*/
 /*                External interface                      */
 /*========================================================*/
diff --git a/src/iblinkinfo.c b/src/iblinkinfo.c
index c07d33e..81fa8aa 100644
--- a/src/iblinkinfo.c
+++ b/src/iblinkinfo.c
@@ -92,6 +92,9 @@ void get_msg(char *width_msg, char *speed_msg, int msg_size, 
ibnd_port_t * port)
 {
        char buf[64];
        uint32_t max_speed = 0;
+       uint32_t loc_sup_speed = 0;
+       uint32_t rem_sup_speed = 0;
+       uint32_t speed = 0;
 
        uint32_t max_width = get_max(mad_get_field(port->info, 0,
                                                   
IB_PORT_LINK_WIDTH_SUPPORTED_F)
@@ -105,17 +108,33 @@ void get_msg(char *width_msg, char *speed_msg, int 
msg_size, ibnd_port_t * port)
                         mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F,
                                      buf, 64, &max_width));
 
-       max_speed = get_max(mad_get_field(port->info, 0,
-                                         IB_PORT_LINK_SPEED_SUPPORTED_F)
-                           & mad_get_field(port->remoteport->info, 0,
-                                           IB_PORT_LINK_SPEED_SUPPORTED_F));
-       if ((max_speed & mad_get_field(port->info, 0,
-                                      IB_PORT_LINK_SPEED_ACTIVE_F)) == 0)
+       loc_sup_speed = mad_get_field(port->info, 0, 
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F);
+       loc_sup_speed <<= 4;
+       loc_sup_speed |= mad_get_field(port->info, 0, 
IB_PORT_LINK_SPEED_SUPPORTED_F);
+
+       rem_sup_speed = mad_get_field(port->remoteport->info, 0, 
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F);
+       rem_sup_speed <<= 4;
+       rem_sup_speed |= mad_get_field(port->remoteport->info, 0, 
IB_PORT_LINK_SPEED_SUPPORTED_F);
+
+       max_speed = get_max(loc_sup_speed & rem_sup_speed);
+
+       speed = mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
+       speed <<= 4;
+       speed |= mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
+
+       if ((max_speed & speed) == 0) {
                // we are not at the max supported speed
                // print what we could be at.
-               snprintf(speed_msg, msg_size, "Could be %s",
-                        mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F,
-                                     buf, 64, &max_speed));
+               if (max_speed & 0xF0) {
+                       max_speed >>= 4;
+                       snprintf(speed_msg, msg_size, "Could be %s",
+                                mad_dump_val(IB_PORT_LINK_SPEED_EXT_ACTIVE_F,
+                                             buf, 64, &max_speed));
+               } else
+                       snprintf(speed_msg, msg_size, "Could be %s",
+                                mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F,
+                                             buf, 64, &max_speed));
+       }
 }
 
 int filterdownport_check(ibnd_node_t * node, ibnd_port_t * port)
@@ -158,7 +177,9 @@ void print_port(ibnd_node_t * node, ibnd_port_t * port, 
char *out_prefix)
                return;
 
        iwidth = mad_get_field(port->info, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
-       ispeed = mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
+       ispeed = mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
+       ispeed <<= 4;
+       ispeed |= mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
        istate = mad_get_field(port->info, 0, IB_PORT_STATE_F);
        iphystate = mad_get_field(port->info, 0, IB_PORT_PHYS_STATE_F);
 
@@ -177,11 +198,23 @@ void print_port(ibnd_node_t * node, ibnd_port_t * port, 
char *out_prefix)
         * returned for all PortInfo components except PortState and
         * PortPhysicalState */
        if (istate != IB_LINK_DOWN) {
-               n = snprintf(link_str, 256, "(%3s %9s %6s/%8s)",
+
+               n = snprintf(link_str, 256, "(%3s",
                     mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64,
-                                 &iwidth),
-                    mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed, 64,
-                                 &ispeed),
+                                 &iwidth));
+
+               if (ispeed & 0xF0) {
+                       ispeed >>= 4;
+                       n += snprintf(link_str + n, 256 - n, " %12s",
+                               mad_dump_val(IB_PORT_LINK_SPEED_EXT_ACTIVE_F, 
speed, 64,
+                                               &ispeed));
+               } else {
+                       n += snprintf(link_str + n, 256 - n, " %12s",
+                               mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, 
speed, 64,
+                                       &ispeed));
+               }
+
+               n += snprintf(link_str + n, 256 - n, " %6s/%8s)",
                     mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
                     mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64,
                                  &iphystate));
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to