1219820Sjeff/* 2219820Sjeff * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved. 3219820Sjeff * 4219820Sjeff * This software is available to you under a choice of one of two 5219820Sjeff * licenses. You may choose to be licensed under the terms of the GNU 6219820Sjeff * General Public License (GPL) Version 2, available from the file 7219820Sjeff * COPYING in the main directory of this source tree, or the 8219820Sjeff * OpenIB.org BSD license below: 9219820Sjeff * 10219820Sjeff * Redistribution and use in source and binary forms, with or 11219820Sjeff * without modification, are permitted provided that the following 12219820Sjeff * conditions are met: 13219820Sjeff * 14219820Sjeff * - Redistributions of source code must retain the above 15219820Sjeff * copyright notice, this list of conditions and the following 16219820Sjeff * disclaimer. 17219820Sjeff * 18219820Sjeff * - Redistributions in binary form must reproduce the above 19219820Sjeff * copyright notice, this list of conditions and the following 20219820Sjeff * disclaimer in the documentation and/or other materials 21219820Sjeff * provided with the distribution. 22219820Sjeff * 23219820Sjeff * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24219820Sjeff * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25219820Sjeff * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26219820Sjeff * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27219820Sjeff * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28219820Sjeff * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29219820Sjeff * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30219820Sjeff * SOFTWARE. 31219820Sjeff * 32219820Sjeff */ 33219820Sjeff 34219820Sjeff#if HAVE_CONFIG_H 35219820Sjeff# include <config.h> 36219820Sjeff#endif /* HAVE_CONFIG_H */ 37219820Sjeff 38219820Sjeff#include <stdio.h> 39219820Sjeff#include <stdlib.h> 40219820Sjeff#include <unistd.h> 41219820Sjeff#include <stdarg.h> 42219820Sjeff#include <time.h> 43219820Sjeff#include <string.h> 44219820Sjeff#include <getopt.h> 45219820Sjeff 46219820Sjeff#include <infiniband/common.h> 47219820Sjeff#include <infiniband/umad.h> 48219820Sjeff#include <infiniband/mad.h> 49219820Sjeff 50219820Sjeff#include "ibdiag_common.h" 51219820Sjeff 52219820Sjeff#undef DEBUG 53219820Sjeff#define DEBUG if (verbose>1) IBWARN 54219820Sjeff 55219820Sjeffstatic int dest_type = IB_DEST_LID; 56219820Sjeffstatic int verbose; 57219820Sjeff 58219820Sjeffchar *argv0 = "ibportstate"; 59219820Sjeff 60219820Sjeff/*******************************************/ 61219820Sjeff 62219820Sjeffstatic int 63219820Sjeffget_node_info(ib_portid_t *dest, uint8_t *data) 64219820Sjeff{ 65219820Sjeff int node_type; 66219820Sjeff 67219820Sjeff if (!smp_query(data, dest, IB_ATTR_NODE_INFO, 0, 0)) 68219820Sjeff return -1; 69219820Sjeff 70219820Sjeff node_type = mad_get_field(data, 0, IB_NODE_TYPE_F); 71219820Sjeff if (node_type == IB_NODE_SWITCH) /* Switch NodeType ? */ 72219820Sjeff return 0; 73219820Sjeff else 74219820Sjeff return 1; 75219820Sjeff} 76219820Sjeff 77219820Sjeffstatic int 78219820Sjeffget_port_info(ib_portid_t *dest, uint8_t *data, int portnum, int port_op) 79219820Sjeff{ 80219820Sjeff char buf[2048]; 81219820Sjeff char val[64]; 82219820Sjeff 83219820Sjeff if (!smp_query(data, dest, IB_ATTR_PORT_INFO, portnum, 0)) 84219820Sjeff return -1; 85219820Sjeff 86219820Sjeff if (port_op != 4) { 87219820Sjeff mad_dump_portstates(buf, sizeof buf, data, sizeof data); 88219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F, val); 89219820Sjeff mad_dump_field(IB_PORT_LINK_WIDTH_SUPPORTED_F, buf + strlen(buf), sizeof buf - strlen(buf), val); 90219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 91219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F, val); 92219820Sjeff mad_dump_field(IB_PORT_LINK_WIDTH_ENABLED_F, buf + strlen(buf), sizeof buf - strlen(buf), val); 93219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 94219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F, val); 95219820Sjeff mad_dump_field(IB_PORT_LINK_WIDTH_ACTIVE_F, buf + strlen(buf), sizeof buf - strlen(buf), val); 96219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 97219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F, val); 98219820Sjeff mad_dump_field(IB_PORT_LINK_SPEED_SUPPORTED_F, buf + strlen(buf), sizeof buf - strlen(buf), val); 99219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 100219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, val); 101219820Sjeff mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf + strlen(buf), sizeof buf - strlen(buf), val); 102219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 103219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F, val); 104219820Sjeff mad_dump_field(IB_PORT_LINK_SPEED_ACTIVE_F, buf + strlen(buf), sizeof buf - strlen(buf), val); 105219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 106219820Sjeff } else { 107219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, val); 108219820Sjeff mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf, sizeof buf, val); 109219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 110219820Sjeff } 111219820Sjeff 112219820Sjeff printf("# Port info: %s port %d\n%s", portid2str(dest), portnum, buf); 113219820Sjeff return 0; 114219820Sjeff} 115219820Sjeff 116219820Sjeffstatic int 117219820Sjeffset_port_info(ib_portid_t *dest, uint8_t *data, int portnum, int port_op) 118219820Sjeff{ 119219820Sjeff char buf[2048]; 120219820Sjeff char val[64]; 121219820Sjeff 122219820Sjeff if (!smp_set(data, dest, IB_ATTR_PORT_INFO, portnum, 0)) 123219820Sjeff return -1; 124219820Sjeff 125219820Sjeff if (port_op != 4) 126219820Sjeff mad_dump_portstates(buf, sizeof buf, data, sizeof data); 127219820Sjeff else { 128219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, val); 129219820Sjeff mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf, sizeof buf, val); 130219820Sjeff sprintf(buf+strlen(buf), "%s", "\n"); 131219820Sjeff } 132219820Sjeff 133219820Sjeff printf("\nAfter PortInfo set:\n"); 134219820Sjeff printf("# Port info: %s port %d\n%s", portid2str(dest), portnum, buf); 135219820Sjeff return 0; 136219820Sjeff} 137219820Sjeff 138219820Sjeffstatic int 139219820Sjeffget_link_width(int lwe, int lws) 140219820Sjeff{ 141219820Sjeff if (lwe == 255) 142219820Sjeff return lws; 143219820Sjeff else 144219820Sjeff return lwe; 145219820Sjeff} 146219820Sjeff 147219820Sjeffstatic int 148219820Sjeffget_link_speed(int lse, int lss) 149219820Sjeff{ 150219820Sjeff if (lse == 15) 151219820Sjeff return lss; 152219820Sjeff else 153219820Sjeff return lse; 154219820Sjeff} 155219820Sjeff 156219820Sjeffstatic void 157219820Sjeffvalidate_width(int width, int peerwidth, int lwa) 158219820Sjeff{ 159219820Sjeff if ((width & 0x8) && (peerwidth & 0x8)) { 160219820Sjeff if (lwa != 8) 161219820Sjeff IBWARN("Peer ports operating at active width %d rather than 8 (12x)", lwa); 162219820Sjeff } else { 163219820Sjeff if ((width & 0x4) && (peerwidth & 0x4)) { 164219820Sjeff if (lwa != 4) 165219820Sjeff IBWARN("Peer ports operating at active width %d rather than 4 (8x)", lwa); 166219820Sjeff } else { 167219820Sjeff if ((width & 0x2) && (peerwidth & 0x2)) { 168219820Sjeff if (lwa != 2) 169219820Sjeff IBWARN("Peer ports operating at active width %d rather than 2 (4x)", lwa); 170219820Sjeff } else { 171219820Sjeff if ((width & 0x1) && (peerwidth & 0x1)) { 172219820Sjeff if (lwa != 1) 173219820Sjeff IBWARN("Peer ports operating at active width %d rather than 1 (1x)", lwa); 174219820Sjeff } 175219820Sjeff } 176219820Sjeff } 177219820Sjeff } 178219820Sjeff} 179219820Sjeff 180219820Sjeffstatic void 181219820Sjeffvalidate_speed(int speed, int peerspeed, int lsa) 182219820Sjeff{ 183219820Sjeff if ((speed & 0x4) && (peerspeed & 0x4)) { 184219820Sjeff if (lsa != 4) 185219820Sjeff IBWARN("Peer ports operating at active speed %d rather than 4 (10.0 Gbps)", lsa); 186219820Sjeff } else { 187219820Sjeff if ((speed & 0x2) && (peerspeed & 0x2)) { 188219820Sjeff if (lsa != 2) 189219820Sjeff IBWARN("Peer ports operating at active speed %d rather than 2 (5.0 Gbps)", lsa); 190219820Sjeff } else { 191219820Sjeff if ((speed & 0x1) && (peerspeed & 0x1)) { 192219820Sjeff if (lsa != 1) 193219820Sjeff IBWARN("Peer ports operating at active speed %d rather than 1 (2.5 Gbps)", lsa); 194219820Sjeff } 195219820Sjeff } 196219820Sjeff } 197219820Sjeff} 198219820Sjeff 199219820Sjeffvoid 200219820Sjeffusage(void) 201219820Sjeff{ 202219820Sjeff char *basename; 203219820Sjeff 204219820Sjeff if (!(basename = strrchr(argv0, '/'))) 205219820Sjeff basename = argv0; 206219820Sjeff else 207219820Sjeff basename++; 208219820Sjeff 209219820Sjeff fprintf(stderr, "Usage: %s [-d(ebug) -e(rr_show) -v(erbose) -D(irect) -G(uid) -s smlid -V(ersion) -C ca_name -P ca_port " 210219820Sjeff "-t(imeout) timeout_ms] <dest dr_path|lid|guid> <portnum> [<op>]\n", 211219820Sjeff basename); 212219820Sjeff fprintf(stderr, "\tsupported ops: enable, disable, reset, speed, query\n"); 213219820Sjeff fprintf(stderr, "\n\texamples:\n"); 214219820Sjeff fprintf(stderr, "\t\t%s 3 1 disable\t\t\t# by lid\n", basename); 215219820Sjeff fprintf(stderr, "\t\t%s -G 0x2C9000100D051 1 enable\t# by guid\n", basename); 216219820Sjeff fprintf(stderr, "\t\t%s -D 0 1\t\t\t# (query) by direct route\n", basename); 217219820Sjeff fprintf(stderr, "\t\t%s 3 1 reset\t\t\t# by lid\n", basename); 218219820Sjeff fprintf(stderr, "\t\t%s 3 1 speed 1\t\t\t# by lid\n", basename); 219219820Sjeff exit(-1); 220219820Sjeff} 221219820Sjeff 222219820Sjeffint 223219820Sjeffmain(int argc, char **argv) 224219820Sjeff{ 225219820Sjeff int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS}; 226219820Sjeff ib_portid_t portid = {0}; 227219820Sjeff ib_portid_t *sm_id = 0, sm_portid = {0}; 228219820Sjeff extern int ibdebug; 229219820Sjeff int err; 230219820Sjeff int timeout = 0, udebug = 0; 231219820Sjeff char *ca = 0; 232219820Sjeff int ca_port = 0; 233219820Sjeff int port_op = 0; /* default to query */ 234219820Sjeff int speed = 15; 235219820Sjeff int is_switch = 1; 236219820Sjeff int state, physstate, lwe, lws, lwa, lse, lss, lsa; 237219820Sjeff int peerlocalportnum, peerlwe, peerlws, peerlwa, peerlse, peerlss, peerlsa; 238219820Sjeff int width, peerwidth, peerspeed; 239219820Sjeff uint8_t data[IB_SMP_DATA_SIZE]; 240219820Sjeff ib_portid_t peerportid = {0}; 241219820Sjeff int portnum = 0; 242219820Sjeff ib_portid_t selfportid = {0}; 243219820Sjeff int selfport = 0; 244219820Sjeff 245219820Sjeff static char const str_opts[] = "C:P:t:s:devDGVhu"; 246219820Sjeff static const struct option long_opts[] = { 247219820Sjeff { "C", 1, 0, 'C'}, 248219820Sjeff { "P", 1, 0, 'P'}, 249219820Sjeff { "debug", 0, 0, 'd'}, 250219820Sjeff { "err_show", 0, 0, 'e'}, 251219820Sjeff { "verbose", 0, 0, 'v'}, 252219820Sjeff { "Direct", 0, 0, 'D'}, 253219820Sjeff { "Guid", 0, 0, 'G'}, 254219820Sjeff { "timeout", 1, 0, 't'}, 255219820Sjeff { "s", 1, 0, 's'}, 256219820Sjeff { "Version", 0, 0, 'V'}, 257219820Sjeff { "help", 0, 0, 'h'}, 258219820Sjeff { "usage", 0, 0, 'u'}, 259219820Sjeff { } 260219820Sjeff }; 261219820Sjeff 262219820Sjeff argv0 = argv[0]; 263219820Sjeff 264219820Sjeff while (1) { 265219820Sjeff int ch = getopt_long(argc, argv, str_opts, long_opts, NULL); 266219820Sjeff if ( ch == -1 ) 267219820Sjeff break; 268219820Sjeff switch(ch) { 269219820Sjeff case 'd': 270219820Sjeff ibdebug++; 271219820Sjeff madrpc_show_errors(1); 272219820Sjeff umad_debug(udebug); 273219820Sjeff udebug++; 274219820Sjeff break; 275219820Sjeff case 'e': 276219820Sjeff madrpc_show_errors(1); 277219820Sjeff break; 278219820Sjeff case 'D': 279219820Sjeff dest_type = IB_DEST_DRPATH; 280219820Sjeff break; 281219820Sjeff case 'G': 282219820Sjeff dest_type = IB_DEST_GUID; 283219820Sjeff break; 284219820Sjeff case 'C': 285219820Sjeff ca = optarg; 286219820Sjeff break; 287219820Sjeff case 'P': 288219820Sjeff ca_port = strtoul(optarg, 0, 0); 289219820Sjeff break; 290219820Sjeff case 's': 291219820Sjeff if (ib_resolve_portid_str(&sm_portid, optarg, IB_DEST_LID, 0) < 0) 292219820Sjeff IBERROR("can't resolve SM destination port %s", optarg); 293219820Sjeff sm_id = &sm_portid; 294219820Sjeff break; 295219820Sjeff case 't': 296219820Sjeff timeout = strtoul(optarg, 0, 0); 297219820Sjeff madrpc_set_timeout(timeout); 298219820Sjeff break; 299219820Sjeff case 'v': 300219820Sjeff verbose++; 301219820Sjeff break; 302219820Sjeff case 'V': 303219820Sjeff fprintf(stderr, "%s %s\n", argv0, get_build_version() ); 304219820Sjeff exit(-1); 305219820Sjeff default: 306219820Sjeff usage(); 307219820Sjeff break; 308219820Sjeff } 309219820Sjeff } 310219820Sjeff argc -= optind; 311219820Sjeff argv += optind; 312219820Sjeff 313219820Sjeff if (argc < 2) 314219820Sjeff usage(); 315219820Sjeff 316219820Sjeff madrpc_init(ca, ca_port, mgmt_classes, 3); 317219820Sjeff 318219820Sjeff if (ib_resolve_portid_str(&portid, argv[0], dest_type, sm_id) < 0) 319219820Sjeff IBERROR("can't resolve destination port %s", argv[0]); 320219820Sjeff 321219820Sjeff /* First, make sure it is a switch port if it is a "set" */ 322219820Sjeff if (argc >= 3) { 323219820Sjeff if (!strcmp(argv[2], "enable")) 324219820Sjeff port_op = 1; 325219820Sjeff else if (!strcmp(argv[2], "disable")) 326219820Sjeff port_op = 2; 327219820Sjeff else if (!strcmp(argv[2], "reset")) 328219820Sjeff port_op = 3; 329219820Sjeff else if (!strcmp(argv[2], "speed")) { 330219820Sjeff if (argc < 4) 331219820Sjeff IBERROR("speed requires an additional parameter"); 332219820Sjeff port_op = 4; 333219820Sjeff /* Parse speed value */ 334219820Sjeff speed = strtoul(argv[3], 0, 0); 335219820Sjeff if (speed > 15) 336219820Sjeff IBERROR("invalid speed value %d", speed); 337219820Sjeff } 338219820Sjeff } 339219820Sjeff 340219820Sjeff err = get_node_info(&portid, data); 341219820Sjeff if (err < 0) 342219820Sjeff IBERROR("smp query nodeinfo failed"); 343219820Sjeff if (err) { /* not switch */ 344219820Sjeff if (port_op == 0) /* query op */ 345219820Sjeff is_switch = 0; 346219820Sjeff else if (port_op != 4) /* other than speed op */ 347219820Sjeff IBERROR("smp query nodeinfo: Node type not switch"); 348219820Sjeff } 349219820Sjeff 350219820Sjeff if (argc-1 > 0) 351219820Sjeff portnum = strtol(argv[1], 0, 0); 352219820Sjeff 353219820Sjeff if (port_op) 354219820Sjeff printf("Initial PortInfo:\n"); 355219820Sjeff else 356219820Sjeff printf("PortInfo:\n"); 357219820Sjeff err = get_port_info(&portid, data, portnum, port_op); 358219820Sjeff if (err < 0) 359219820Sjeff IBERROR("smp query portinfo failed"); 360219820Sjeff 361219820Sjeff /* Only if one of the "set" options is chosen */ 362219820Sjeff if (port_op) { 363219820Sjeff if (port_op == 1) /* Enable port */ 364219820Sjeff mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2); /* Polling */ 365219820Sjeff else if ((port_op == 2) || (port_op == 3)) { /* Disable port */ 366219820Sjeff mad_set_field(data, 0, IB_PORT_STATE_F, 1); /* Down */ 367219820Sjeff mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 3); /* Disabled */ 368219820Sjeff } else if (port_op == 4) { /* Set speed */ 369219820Sjeff mad_set_field(data, 0, IB_PORT_LINK_SPEED_ENABLED_F, speed); 370219820Sjeff mad_set_field(data, 0, IB_PORT_STATE_F, 0); 371219820Sjeff mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 0); 372219820Sjeff } 373219820Sjeff 374219820Sjeff err = set_port_info(&portid, data, portnum, port_op); 375219820Sjeff if (err < 0) 376219820Sjeff IBERROR("smp set portinfo failed"); 377219820Sjeff 378219820Sjeff if (port_op == 3) { /* Reset port - so also enable */ 379219820Sjeff mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2); /* Polling */ 380219820Sjeff err = set_port_info(&portid, data, portnum, port_op); 381219820Sjeff if (err < 0) 382219820Sjeff IBERROR("smp set portinfo failed"); 383219820Sjeff } 384219820Sjeff } else { /* query op */ 385219820Sjeff /* only compare peer port if switch port */ 386219820Sjeff if (is_switch) { 387219820Sjeff /* First, exclude SP0 */ 388219820Sjeff if (portnum) { 389219820Sjeff /* Now, make sure PortState is Active */ 390219820Sjeff /* Or is PortPhysicalState LinkUp sufficient ? */ 391219820Sjeff mad_decode_field(data, IB_PORT_STATE_F, &state); 392219820Sjeff mad_decode_field(data, IB_PORT_PHYS_STATE_F, &physstate); 393219820Sjeff if (state == 4) { /* Active */ 394219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F, &lwe ); 395219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F, &lws); 396219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F, &lwa); 397219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F, &lss); 398219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F, &lsa); 399219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, &lse); 400219820Sjeff 401219820Sjeff /* Setup portid for peer port */ 402219820Sjeff memcpy(&peerportid, &portid, sizeof(peerportid)); 403219820Sjeff peerportid.drpath.cnt = 1; 404219820Sjeff peerportid.drpath.p[1] = portnum; 405219820Sjeff 406219820Sjeff /* Set DrSLID to local lid */ 407219820Sjeff if (ib_resolve_self(&selfportid, &selfport, 0) < 0) 408219820Sjeff IBERROR("could not resolve self"); 409219820Sjeff peerportid.drpath.drslid = selfportid.lid; 410219820Sjeff peerportid.drpath.drdlid = 0xffff; 411219820Sjeff 412219820Sjeff /* Get peer port NodeInfo to obtain peer port number */ 413219820Sjeff err = get_node_info(&peerportid, data); 414219820Sjeff if (err < 0) 415219820Sjeff IBERROR("smp query nodeinfo failed"); 416219820Sjeff 417219820Sjeff mad_decode_field(data, IB_NODE_LOCAL_PORT_F, &peerlocalportnum); 418219820Sjeff 419219820Sjeff printf("Peer PortInfo:\n"); 420219820Sjeff /* Get peer port characteristics */ 421219820Sjeff err = get_port_info(&peerportid, data, peerlocalportnum, port_op); 422219820Sjeff if (err < 0) 423219820Sjeff IBERROR("smp query peer portinfofailed"); 424219820Sjeff 425219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F, &peerlwe ); 426219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F, &peerlws); 427219820Sjeff mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F, &peerlwa); 428219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F, &peerlss); 429219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F, &peerlsa); 430219820Sjeff mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, &peerlse); 431219820Sjeff 432219820Sjeff /* Now validate peer port characteristics */ 433219820Sjeff /* Examine Link Width */ 434219820Sjeff width = get_link_width(lwe, lws); 435219820Sjeff peerwidth = get_link_width(peerlwe, peerlws); 436219820Sjeff validate_width(width, peerwidth, lwa); 437219820Sjeff 438219820Sjeff /* Examine Link Speed */ 439219820Sjeff speed = get_link_speed(lse, lss); 440219820Sjeff peerspeed = get_link_speed(peerlse, peerlss); 441219820Sjeff validate_speed(speed, peerspeed, lsa); 442219820Sjeff } 443219820Sjeff } 444219820Sjeff } 445219820Sjeff } 446219820Sjeff 447219820Sjeff exit(0); 448219820Sjeff} 449