perform reset in a single mad

Perform reset by changing physical state to polling instead of
disable and enable.
This ensures that reset a port will not disconnect it (assuming negotiation 
succeeds).
Only disable operation is not allowed on HCA ports since it will irreversibly
disconnect it though this may also happen on a switch ingress port.

Signed-off-by: Eli Dorfman <[email protected]>
---
 infiniband-diags/src/ibportstate.c |   24 ++++++++----------------
 1 files changed, 8 insertions(+), 16 deletions(-)

diff --git a/infiniband-diags/src/ibportstate.c 
b/infiniband-diags/src/ibportstate.c
index d19a2e5..93738c0 100644
--- a/infiniband-diags/src/ibportstate.c
+++ b/infiniband-diags/src/ibportstate.c
@@ -233,6 +233,9 @@ int main(int argc, char **argv)
                                ibd_sm_id, srcport) < 0)
                IBERROR("can't resolve destination port %s", argv[0]);
 
+       if (argc > 1)
+               portnum = strtol(argv[1], 0, 0);
+
        /* First, make sure it is a switch port if it is a "set" */
        if (argc >= 3) {
                if (!strcmp(argv[2], "enable"))
@@ -258,13 +261,10 @@ int main(int argc, char **argv)
        if (err) {              /* not switch */
                if (port_op == 0)       /* query op */
                        is_switch = 0;
-               else if (port_op != 4)  /* other than speed op */
-                       IBERROR("smp query nodeinfo: Node type not switch");
+               else if (port_op == 2)  /* disable */
+                       IBERROR("Node type not switch - disable not allowed");
        }
 
-       if (argc-1 > 0)
-               portnum = strtol(argv[1], 0, 0);
-
        if (port_op)
                printf("Initial PortInfo:\n");
        else
@@ -275,11 +275,11 @@ int main(int argc, char **argv)
 
        /* Only if one of the "set" options is chosen */
        if (port_op) {
-               if (port_op == 1) {             /* Enable port */
+               if ((port_op == 1) || (port_op == 3)) {         /* Enable or 
Reset port */
                        mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2);        
/* Polling */
                        mad_set_field(data, 0, IB_PORT_STATE_F, 0);             
/* No Change */
-               }
-               else if ((port_op == 2) || (port_op == 3)) { /* Disable port */
+               } else if (port_op == 2) { /* Disable port */
+                       printf("Disable may be irreversible\n");
                        mad_set_field(data, 0, IB_PORT_STATE_F, 1);             
/* Down */
                        mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 3);        
/* Disabled */
                } else if (port_op == 4) {      /* Set speed */
@@ -291,14 +291,6 @@ int main(int argc, char **argv)
                err = set_port_info(&portid, data, portnum, port_op);
                if (err < 0)
                        IBERROR("smp set portinfo failed");
-
-               if (port_op == 3) {     /* Reset port - so also enable */
-                       mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2);        
/* Polling */
-                       mad_set_field(data, 0, IB_PORT_STATE_F, 0);             
/* No Change */
-                       err = set_port_info(&portid, data, portnum, port_op);
-                       if (err < 0)
-                               IBERROR("smp set portinfo failed");
-               }
        } else {        /* query op */
                /* only compare peer port if switch port */
                if (is_switch) {
-- 
1.5.5

_______________________________________________
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