libibmad/dump.c: Use bit mask approach to decoding LinkWidth/Speed
Enabled/Supported

Based on email from Jason Gunthorpe <[EMAIL PROTECTED]>

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

diff --git a/libibmad/src/dump.c b/libibmad/src/dump.c
index 9628eba..05efdca 100644
--- a/libibmad/src/dump.c
+++ b/libibmad/src/dump.c
@@ -227,39 +227,45 @@ mad_dump_linkwidth(char *buf, int bufsz, void *val, int 
valsz)
        }
 }
 
+static void
+dump_linkwidth(char *buf, int bufsz, int width)
+{
+       char *s = buf, *e = s + bufsz;
+
+       if (width & 0x1)
+               s += snprintf(s, e - s, "1X or ");
+       if (s < e && (width & 0x2))
+               s += snprintf(s, e - s, "4X or ");
+       if (s < e && (width & 0x4))
+               s += snprintf(s, e - s, "8X or ");
+       if (s < e && (width & 0x8))
+               s += snprintf(s, e - s, "12X or ");
+
+       if ((width >> 4) || s == buf)
+               s += snprintf(s, e - s, "?(%d)", width);
+       else
+               s[-3] = 0;
+}
+
 void
 mad_dump_linkwidthsup(char *buf, int bufsz, void *val, int valsz)
 {
        int width = *(int *)val;
 
-       switch (width) {
+       dump_linkwidth(buf, bufsz, width);
+
+       switch(width) {
        case 1:
-               snprintf(buf, bufsz, "1X");
-               break;
-       case 2:
-               snprintf(buf, bufsz, "4X (IBA extension)");
-               break;
        case 3:
-               snprintf(buf, bufsz, "1X or 4X");
-               break;
-       case 4:
-               snprintf(buf, bufsz, "8X (IBA extension)");
-               break;
        case 7:
-               snprintf(buf, bufsz, "1X or 4X or 8X");
-               break;
-       case 8:
-               snprintf(buf, bufsz, "12X (IBA extension)");
-               break;
        case 11:
-               snprintf(buf, bufsz, "1X or 4X or 12X");
-               break;
        case 15:
-               snprintf(buf, bufsz, "1X or 4X or 8X or 12X");
                break;
+
        default:
-               IBWARN("bad width %d", width);
-               buf[0] = 0;
+               snprintf(buf + strlen(buf), bufsz - strlen(buf),
+                        "(IBA extension)");
+               break;
        }
 }
 
@@ -267,21 +273,8 @@ void
 mad_dump_linkwidthen(char *buf, int bufsz, void *val, int valsz)
 {
        int width = *(int *)val;
-       char *s = buf, *e = s + bufsz;
 
-       if (width & 0x1)
-               s += snprintf(s, e - s, "1X or ");
-       if (s < e && (width & 0x2))
-               s += snprintf(s, e - s, "4X or ");
-       if (s < e && (width & 0x4))
-               s += snprintf(s, e - s, "8X or ");
-       if (s < e && (width & 0x8))
-               s += snprintf(s, e - s, "12X or ");
-
-       if ((width >> 4) || s == buf)
-               s += snprintf(s, e - s, "?(%d)", width);
-       else
-               s[-3] = 0;
+       dump_linkwidth(buf, bufsz, width);
 }
 
 void
@@ -305,70 +298,49 @@ mad_dump_linkspeed(char *buf, int bufsz, void *val, int 
valsz)
        }
 }
 
-void
-mad_dump_linkspeedsup(char *buf, int bufsz, void *val, int valsz)
+static void
+dump_linkspeed(char *buf, int bufsz, int speed)
 {
-       int speed = *(int *)val;
+       char *s = buf, *e = s + bufsz;
+
+       if (speed & 0x1)
+               s += snprintf(s, e - s, "2.5 Gbps or ");
+       if (s < e && (speed & 0x2))
+               s += snprintf(s, e - s, "5.0 Gbps or ");
+       if (s < e && (speed & 0x4))
+               s += snprintf(s, e - s, "10.0 Gbps or ");
+
+       if ((speed >> 4) || s == buf)
+               s += snprintf(s, e - s, "?(%d)", speed);
+       else
+               s[-3] = 0;
 
        switch (speed) {
        case 1:
-               snprintf(buf, bufsz, "2.5 Gbps");
-               break;
-       case 2:
-               snprintf(buf, bufsz, "5.0 Gbps (IBA extension)");
-               break;
        case 3:
-               snprintf(buf, bufsz, "2.5 or 5.0 Gbps");
-               break;
-       case 4:
-               snprintf(buf, bufsz, "10.0 Gbps (IBA extension)");
-               break;
        case 5:
-               snprintf(buf, bufsz, "2.5 or 10.0 Gbps");
-               break;
        case 7:
-               snprintf(buf, bufsz, "2.5 or 5.0 or 10.0 Gbps");
                break;
        default:
-               snprintf(buf, bufsz, "?(%d)", speed);
+               snprintf(s, e - s, "(IBA extension)"); 
                break;
        }
 }
 
 void
+mad_dump_linkspeedsup(char *buf, int bufsz, void *val, int valsz)
+{
+       int speed = *(int *)val;
+
+       dump_linkspeed(buf, bufsz, speed);
+}
+
+void
 mad_dump_linkspeeden(char *buf, int bufsz, void *val, int valsz)
 {
        int speed = *(int *)val;
 
-       switch (speed) {
-       case 1:
-               snprintf(buf, bufsz, "2.5 Gbps");
-               break;
-       case 2:
-               snprintf(buf, bufsz, "5.0 Gbps (IBA extension)");
-               break;
-       case 3:
-               snprintf(buf, bufsz, "2.5 or 5.0 Gbps");
-               break;
-       case 4:
-               snprintf(buf, bufsz, "10.0 Gbps (IBA extension)");
-               break;
-       case 5:
-               snprintf(buf, bufsz, "2.5 or 10.0 Gbps");
-               break;
-       case 6:
-               snprintf(buf, bufsz, "5.0 or 10.0 Gbps");
-               break;
-       case 7:
-               snprintf(buf, bufsz, "2.5 or 5.0 or 10.0 Gbps");
-               break;
-       case 15:
-               snprintf(buf, bufsz, "SpeedSupported");
-               break;
-       default:
-               snprintf(buf, bufsz, "?(%d)", speed);
-               break;
-       }
+       dump_linkspeed(buf, bufsz, speed);
 }
 
 void

_______________________________________________
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