On Wed, 31 Aug 2011 08:26:28 -0700
Hal Rosenstock <h...@dev.mellanox.co.il> wrote:

> 
> Signed-off-by: Hal Rosenstock <h...@mellanox.com>

Thanks, applied,
Ira

> ---
> Changes since v1:
> Rebased to latest master
> 
>  man/ibportstate.8 |    5 ++-
>  src/ibportstate.c |   95 +++++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 96 insertions(+), 4 deletions(-)
> 
> diff --git a/man/ibportstate.8 b/man/ibportstate.8
> index 2a60db9..0537d7e 100644
> --- a/man/ibportstate.8
> +++ b/man/ibportstate.8
> @@ -23,7 +23,7 @@ also allows the link speed/width enabled on any IB port to 
> be adjusted.
>  .TP
>  op
>  Port operations allowed
> - supported ops: enable, disable, reset, speed, espeed, width, query,
> + supported ops: enable, disable, reset, speed, espeed, fdr10, width, query,
>               down, arm, active, vls, mtu, lid, smlid, lmc
>   Default is query
>  .PP
> @@ -34,6 +34,7 @@ Port operations allowed
>   (An error is indicated if PortInfo:LinkSpeedSupported does not support
>    this setting)
>   espeed ops are allowed on any port supporting extended link speeds
> + fdr10 ops are allowed on any port supporting fdr10
>  (An error is indicated if port's capability mask indicates extended
>   link speeds are not supported or if PortInfo:LinkSpeedExtSupported
>   does not support this setting)
> @@ -42,7 +43,7 @@ Port operations allowed
>    this setting)
>   (NOTE: Speed and width changes are not effected until the port goes through
>    link renegotiation)
> - query also validates port characteristics (link width, speed, and espeed)
> + query also validates port characteristics (link width, speed, espeed, and 
> fdr10)
>    based on the peer port. This checking is done when the port
>    queried is a switch port as it relies on combined routing
>    (an initial LID route with directed routing to the peer) which
> diff --git a/src/ibportstate.c b/src/ibportstate.c
> index f7ad37f..9077413 100644
> --- a/src/ibportstate.c
> +++ b/src/ibportstate.c
> @@ -54,6 +54,7 @@ enum port_ops {
>       DISABLE,
>       SPEED,
>       ESPEED,
> +     FDR10SPEED,
>       WIDTH,
>       DOWN,
>       ARM,
> @@ -68,6 +69,7 @@ enum port_ops {
>  struct ibmad_port *srcport;
>  int speed = 0; /* no state change */
>  int espeed = 0; /* no state change */
> +int fdr10 = 0; /* no state change */
>  int width = 0; /* no state change */
>  int lid;
>  int smlid;
> @@ -86,6 +88,7 @@ struct {
>       {"disable", NULL, 0},   /* DISABLE */
>       {"speed", &speed, 0},   /* SPEED */
>       {"espeed", &espeed, 0}, /* EXTENDED SPEED */
> +     {"fdr10", &fdr10, 0},   /* FDR10 SPEED */
>       {"width", &width, 0},   /* WIDTH */
>       {"down", NULL, 0},      /* DOWN */
>       {"arm", NULL, 0},       /* ARM */
> @@ -118,6 +121,15 @@ static int get_node_info(ib_portid_t * dest, uint8_t * 
> data)
>               return 0;
>  }
>  
> +static int is_mlnx_ext_port_info_supported(uint32_t devid)
> +{
> +     if (devid == 0xc738)
> +             return 1;
> +     if (devid >= 0x1003 && devid <= 0x1010)
> +             return 1;
> +     return 0;
> +}
> +
>  static int get_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
>                        int is_switch)
>  {
> @@ -212,6 +224,33 @@ static void set_port_info(ib_portid_t * dest, uint8_t * 
> data, int portnum,
>       show_port_info(dest, data, portnum, espeed_cap);
>  }
>  
> +static void get_ext_port_info(ib_portid_t * dest, uint8_t * data, int 
> portnum)
> +{
> +     if (!smp_query_via(data, dest, IB_ATTR_MLNX_EXT_PORT_INFO,
> +                        portnum, 0, srcport))
> +             IBERROR("smp query ext portinfo failed");
> +}
> +
> +static void show_ext_port_info(ib_portid_t * dest, uint8_t * data, int 
> portnum)
> +{
> +     char buf[256];
> +
> +     mad_dump_mlnx_ext_port_info(buf, sizeof buf, data, IB_SMP_DATA_SIZE);
> +
> +     printf("# Extended Port info: %s port %d\n%s", portid2str(dest),
> +            portnum, buf);
> +}
> +
> +static void set_ext_port_info(ib_portid_t * dest, uint8_t * data, int 
> portnum)
> +{
> +     if (!smp_set_via(data, dest, IB_ATTR_MLNX_EXT_PORT_INFO,
> +                      portnum, 0, srcport))
> +             IBERROR("smp set ext portinfo failed");
> +
> +     printf("\nAfter ExtendedPortInfo set:\n");
> +     show_ext_port_info(dest, data, portnum);
> +}
> +
>  static int get_link_width(int lwe, int lws)
>  {
>       if (lwe == 255)
> @@ -303,17 +342,21 @@ int main(int argc, char **argv)
>       ib_portid_t portid = { 0 };
>       int port_op = -1;
>       int is_switch, is_peer_switch, espeed_cap, peer_espeed_cap;
> -     int state, physstate, lwe, lws, lwa, lse, lss, lsa, lsee, lses, lsea;
> +     int state, physstate, lwe, lws, lwa, lse, lss, lsa, lsee, lses, lsea,
> +         fdr10s, fdr10e, fdr10a;
>       int peerlocalportnum, peerlwe, peerlws, peerlwa, peerlse, peerlss,
> -         peerlsa, peerlsee, peerlses, peerlsea;
> +         peerlsa, peerlsee, peerlses, peerlsea, peerfdr10s, peerfdr10e,
> +         peerfdr10a;
>       int peerwidth, peerspeed, peerespeed;
>       uint8_t data[IB_SMP_DATA_SIZE] = { 0 };
> +     uint8_t data2[IB_SMP_DATA_SIZE] = { 0 };
>       ib_portid_t peerportid = { 0 };
>       int portnum = 0;
>       ib_portid_t selfportid = { 0 };
>       int selfport = 0;
>       int changed = 0;
>       int i;
> +     uint16_t devid, rem_devid;
>       long val;
>       char usage_args[] = "<dest dr_path|lid|guid> <portnum> [<op>]\n"
>           "\nSupported ops: enable, disable, reset, speed, width, query,\n"
> @@ -379,6 +422,10 @@ int main(int argc, char **argv)
>                               if (val < 0 || val > 31)
>                                       IBERROR("invalid extended speed value 
> %ld", val);
>                               break;
> +                     case FDR10SPEED:
> +                             if (val < 0 || val > 1)
> +                                     IBERROR("invalid fdr10 speed value 
> %ld", val);
> +                             break;
>                       case WIDTH:
>                               if (val < 0 || (val > 15 && val != 255))
>                                       IBERROR("invalid width value %ld", val);
> @@ -415,6 +462,7 @@ int main(int argc, char **argv)
>               port_op = QUERY;
>  
>       is_switch = get_node_info(&portid, data);
> +     devid = mad_get_field(data, 0, IB_NODE_DEVID_F);
>  
>       if (port_op != QUERY || changed)
>               printf("Initial %s PortInfo:\n", is_switch ? "Switch" : "CA");
> @@ -422,6 +470,10 @@ int main(int argc, char **argv)
>               printf("%s PortInfo:\n", is_switch ? "Switch" : "CA");
>       espeed_cap = get_port_info(&portid, data, portnum, is_switch);
>       show_port_info(&portid, data, portnum, espeed_cap);
> +     if (is_mlnx_ext_port_info_supported(devid)) {
> +             get_ext_port_info(&portid, data2, portnum);
> +             show_ext_port_info(&portid, data2, portnum);
> +     }
>  
>       if (port_op != QUERY || changed) {
>               /*
> @@ -475,6 +527,15 @@ int main(int argc, char **argv)
>               if (port_args[LMC].set)
>                       mad_set_field(data, 0, IB_PORT_LMC_F, lmc);
>  
> +             if (port_args[FDR10SPEED].set) {
> +                     mad_set_field(data2, 0,
> +                                   IB_MLNX_EXT_PORT_STATE_CHG_ENABLE_F,
> +                                   FDR10);
> +                     mad_set_field(data2, 0,
> +                                   IB_MLNX_EXT_PORT_LINK_SPEED_ENABLED_F,
> +                                   fdr10);
> +                     set_ext_port_info(&portid, data2, portnum);
> +             }
>               set_port_info(&portid, data, portnum, is_switch);
>  
>       } else if (is_switch && portnum) {
> @@ -495,6 +556,15 @@ int main(int argc, char **argv)
>                                        &lsa);
>                       mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F,
>                                        &lse);
> +                     mad_decode_field(data2,
> +                                      
> IB_MLNX_EXT_PORT_LINK_SPEED_SUPPORTED_F,
> +                                      &fdr10s);
> +                     mad_decode_field(data2,
> +                                      IB_MLNX_EXT_PORT_LINK_SPEED_ENABLED_F,
> +                                      &fdr10e);
> +                     mad_decode_field(data2,
> +                                      IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F,
> +                                      &fdr10a);
>                       if (espeed_cap) {
>                               mad_decode_field(data,
>                                                
> IB_PORT_LINK_SPEED_EXT_SUPPORTED_F,
> @@ -521,6 +591,7 @@ int main(int argc, char **argv)
>  
>                       /* Get peer port NodeInfo to obtain peer port number */
>                       is_peer_switch = get_node_info(&peerportid, data);
> +                     rem_devid = mad_get_field(data, 0, IB_NODE_DEVID_F);
>  
>                       mad_decode_field(data, IB_NODE_LOCAL_PORT_F,
>                                        &peerlocalportnum);
> @@ -530,8 +601,14 @@ int main(int argc, char **argv)
>                       peer_espeed_cap = get_port_info(&peerportid, data,
>                                                       peerlocalportnum,
>                                                       is_peer_switch);
> +                     if (is_mlnx_ext_port_info_supported(rem_devid))
> +                             get_ext_port_info(&peerportid, data2,
> +                                               peerlocalportnum);
>                       show_port_info(&peerportid, data, peerlocalportnum,
>                                      peer_espeed_cap);
> +                     if (is_mlnx_ext_port_info_supported(rem_devid))
> +                             show_ext_port_info(&peerportid, data2,
> +                                                peerlocalportnum);
>  
>                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F,
>                                        &peerlwe);
> @@ -545,6 +622,15 @@ int main(int argc, char **argv)
>                                        &peerlsa);
>                       mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F,
>                                        &peerlse);
> +                     mad_decode_field(data2,
> +                                      
> IB_MLNX_EXT_PORT_LINK_SPEED_SUPPORTED_F,
> +                                      &peerfdr10s);
> +                     mad_decode_field(data2,
> +                                      IB_MLNX_EXT_PORT_LINK_SPEED_ENABLED_F,
> +                                      &peerfdr10e);
> +                     mad_decode_field(data2,
> +                                      IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F,
> +                                      &peerfdr10a);
>                       if (peer_espeed_cap) {
>                               mad_decode_field(data,
>                                                
> IB_PORT_LINK_SPEED_EXT_SUPPORTED_F,
> @@ -574,6 +660,11 @@ int main(int argc, char **argv)
>                                                               peerlses);
>                               validate_extended_speed(espeed, peerespeed,
>                                                       lsea);
> +                     } else {
> +                             if (fdr10e & FDR10 && peerfdr10e & FDR10) {
> +                                     if (!(fdr10a & FDR10))
> +                                             IBWARN("Peer ports operating at 
>  active speed %d rather than FDR10", lsa);
> +                             }
>                       }
>               }
>       }
> -- 
> 1.5.3
> 


-- 
Ira Weiny
Math Programmer/Computer Scientist
Lawrence Livermore National Lab
925-423-8008
wei...@llnl.gov
--
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