From patchwork Tue Aug 9 14:30:45 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hal Rosenstock X-Patchwork-Id: 1049942 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p79EV6iw007192 for ; Tue, 9 Aug 2011 14:31:06 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752245Ab1HIOaz (ORCPT ); Tue, 9 Aug 2011 10:30:55 -0400 Received: from mail-ew0-f46.google.com ([209.85.215.46]:45380 "EHLO mail-ew0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752142Ab1HIOaw (ORCPT ); Tue, 9 Aug 2011 10:30:52 -0400 Received: by ewy4 with SMTP id 4so28374ewy.19 for ; Tue, 09 Aug 2011 07:30:50 -0700 (PDT) Received: by 10.204.152.140 with SMTP id g12mr907699bkw.374.1312900249714; Tue, 09 Aug 2011 07:30:49 -0700 (PDT) Received: from [172.25.5.30] (fwil.voltaire.com [193.47.165.2]) by mx.google.com with ESMTPS id q1sm3055773faa.1.2011.08.09.07.30.46 (version=SSLv3 cipher=OTHER); Tue, 09 Aug 2011 07:30:47 -0700 (PDT) Message-ID: <4E414495.70004@dev.mellanox.co.il> Date: Tue, 09 Aug 2011 10:30:45 -0400 From: Hal Rosenstock User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.18) Gecko/20110616 Thunderbird/3.1.11 MIME-Version: 1.0 To: Alex Netes CC: "linux-rdma@vger.kernel.org" Subject: [PATCHv2] opensm: Add extended link speeds support Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Tue, 09 Aug 2011 14:31:06 +0000 (UTC) Signed-off-by: Hal Rosenstock --- Changes since v1: Used defines rather than hard coded constants in a number of places In osm_link_mgr.c, renamed portnum to be attr_mod for better clarity Fixed copyright year change in osm_base.h In osm_helper.c:ib_get_lsa_str, removed DOWN check (separate patch later) In osm_link_mgr.c:link_mgr_set_physp_pi, use [rem_]cap_mask rather than [r]pi0 In osm_sa_portinfo_record.c: Change p_pi_mask to cap_mask and really use it -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/iba/ib_types.h b/include/iba/ib_types.h index 3dc8a7c..c6a09e2 100644 --- a/include/iba/ib_types.h +++ b/include/iba/ib_types.h @@ -2720,6 +2720,11 @@ typedef struct _ib_path_rec { #define IB_PIR_COMPMASK_MAXCREDHINT (CL_HTON64(((uint64_t)1)<<50)) #define IB_PIR_COMPMASK_RESV5 (CL_HTON64(((uint64_t)1)<<51)) #define IB_PIR_COMPMASK_LINKRTLAT (CL_HTON64(((uint64_t)1)<<52)) +#define IB_PIR_COMPMASK_RESV6 (CL_HTON64(((uint64_t)1)<<53)) +#define IB_PIR_COMPMASK_LINKSPDEXTACT (CL_HTON64(((uint64_t)1)<<54)) +#define IB_PIR_COMPMASK_LINKSPDEXTSUPP (CL_HTON64(((uint64_t)1)<<55)) +#define IB_PIR_COMPMASK_RESV7 (CL_HTON64(((uint64_t)1)<<56)) +#define IB_PIR_COMPMASK_LINKSPDEXTENAB (CL_HTON64(((uint64_t)1)<<57)) /* Multicast Member Record Component Masks */ #define IB_MCR_COMPMASK_GID (CL_HTON64(((uint64_t)1)<<0)) @@ -5073,6 +5078,8 @@ ib_port_info_get_link_speed_active(IN const ib_port_info_t * const p_pi) #define IB_LINK_SPEED_EXT_ACTIVE_NONE 0 #define IB_LINK_SPEED_EXT_ACTIVE_14 1 #define IB_LINK_SPEED_EXT_ACTIVE_25 2 +#define IB_LINK_SPEED_EXT_DISABLE 30 +#define IB_LINK_SPEED_EXT_SET_LSES 31 /* following v1 ver1.2 p901 */ #define IB_PATH_RECORD_RATE_2_5_GBS 2 diff --git a/include/opensm/osm_base.h b/include/opensm/osm_base.h index 9a20890..e558c55 100644 --- a/include/opensm/osm_base.h +++ b/include/opensm/osm_base.h @@ -843,6 +843,18 @@ typedef enum _osm_thread_state { #define OSM_CAP2_IS_FULL_PORTINFO_REC_SUPPORTED (1 << 6) /***********/ +/****d* OpenSM: Base/OSM_CAP2_IS_EXTENDED_SPEEDS_SUPPORTED +* Name +* OSM_CAP2_IS_EXTENDED_SPEEDS_SUPPORTED +* +* DESCRIPTION +* Extended Link Speeds supported +* +* SYNOPSIS +*/ +#define OSM_CAP2_IS_EXTENDED_SPEEDS_SUPPORTED (1 << 7) +/***********/ + /****d* OpenSM: Base/osm_signal_t * NAME * osm_signal_t diff --git a/include/opensm/osm_helper.h b/include/opensm/osm_helper.h index a2c1dea..263bbcc 100644 --- a/include/opensm/osm_helper.h +++ b/include/opensm/osm_helper.h @@ -534,7 +534,7 @@ const char *osm_get_mtu_str(IN uint8_t mtu); const char *osm_get_lwa_str(IN uint8_t lwa); -const char *osm_get_lsa_str(IN uint8_t lsa); +const char *osm_get_lsa_str(IN uint8_t lsa, IN uint8_t lsea, IN uint8_t state); /****f* IBA Base: Types/osm_get_sm_mgr_signal_str * NAME diff --git a/include/opensm/osm_subnet.h b/include/opensm/osm_subnet.h index 6d17c31..57b08a7 100644 --- a/include/opensm/osm_subnet.h +++ b/include/opensm/osm_subnet.h @@ -158,6 +158,7 @@ typedef struct osm_subn_opt { boolean_t lmc_esp0; uint8_t max_op_vls; uint8_t force_link_speed; + uint8_t force_link_speed_ext; boolean_t reassign_lids; boolean_t ignore_other_sm; boolean_t single_thread; diff --git a/opensm/osm_console.c b/opensm/osm_console.c index 82a9b48..925fb72 100644 --- a/opensm/osm_console.c +++ b/opensm/osm_console.c @@ -1,7 +1,7 @@ /* * Copyright (c) 2005-2009 Voltaire, Inc. All rights reserved. * Copyright (c) 2009,2010 HNR Consulting. All rights reserved. - * Copyright (c) 2010 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2010,2011 Mellanox Technologies LTD. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU @@ -650,6 +650,8 @@ typedef struct { uint64_t ports_sdr; uint64_t ports_ddr; uint64_t ports_qdr; + uint64_t ports_fdr; + uint64_t ports_edr; uint64_t ports_unknown_speed; uint64_t ports_reduced_speed; port_report_t *reduced_speed_ports; @@ -662,6 +664,8 @@ static void __get_stats(cl_map_item_t * const p_map_item, void *context) { fabric_stats_t *fs = (fabric_stats_t *) context; osm_node_t *node = (osm_node_t *) p_map_item; + osm_physp_t *physp0; + ib_port_info_t *pi0; uint8_t num_ports = osm_node_get_num_physp(node); uint8_t port = 0; @@ -672,6 +676,12 @@ static void __get_stats(cl_map_item_t * const p_map_item, void *context) fs->total_nodes++; + if (osm_node_get_type(node) == IB_NODE_TYPE_SWITCH) { + physp0 = osm_node_get_physp_ptr(node, 0); + pi0 = &physp0->port_info; + } else + pi0 = NULL; + for (port = 1; port < num_ports; port++) { osm_physp_t *phys = osm_node_get_physp_ptr(node, port); ib_port_info_t *pi = NULL; @@ -685,7 +695,9 @@ static void __get_stats(cl_map_item_t * const p_map_item, void *context) if (!phys) continue; - pi = &(phys->port_info); + pi = &phys->port_info; + if (!pi0) + pi0 = pi; active_speed = ib_port_info_get_link_speed_active(pi); enabled_speed = ib_port_info_get_link_speed_enabled(pi); active_width = pi->link_width_active; @@ -715,12 +727,38 @@ static void __get_stats(cl_map_item_t * const p_map_item, void *context) fs->ports_ddr++; break; case IB_LINK_SPEED_ACTIVE_10: - fs->ports_qdr++; + if (!(pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) || + ((pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) && + !ib_port_info_get_link_speed_ext_active(pi))) + fs->ports_qdr++; break; default: fs->ports_unknown_speed++; break; } + if (pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS && + ib_port_info_get_link_speed_ext_sup(pi) && + (enabled_speed = pi->link_speed_ext_enabled) != IB_LINK_SPEED_EXT_DISABLE && + active_speed == IB_LINK_SPEED_ACTIVE_10) { + active_speed = ib_port_info_get_link_speed_ext_active(pi); + if ((enabled_speed ^ active_speed) > active_speed) { + __tag_port_report(&(fs->reduced_speed_ports), + cl_ntoh64(node->node_info.node_guid), + port, node->print_desc); + fs->ports_reduced_speed++; + } + switch (active_speed) { + case IB_LINK_SPEED_EXT_ACTIVE_14: + fs->ports_fdr++; + break; + case IB_LINK_SPEED_EXT_ACTIVE_25: + fs->ports_edr++; + break; + default: + fs->ports_unknown_speed++; + break; + } + } switch (active_width) { case IB_LINK_WIDTH_ACTIVE_1X: fs->ports_1X++; @@ -814,6 +852,10 @@ static void portstatus_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) fprintf(out, " %" PRIu64 " at 5.0 Gbps\n", fs.ports_ddr); if (fs.ports_qdr) fprintf(out, " %" PRIu64 " at 10.0 Gbps\n", fs.ports_qdr); + if (fs.ports_fdr) + fprintf(out, " %" PRIu64 " at 14.0625 Gbps\n", fs.ports_fdr); + if (fs.ports_edr) + fprintf(out, " %" PRIu64 " at 25.78125 Gbps\n", fs.ports_edr); if (fs.ports_disabled + fs.ports_reduced_speed + fs.ports_reduced_width > 0) { diff --git a/opensm/osm_dump.c b/opensm/osm_dump.c index adcab2f..685f74c 100644 --- a/opensm/osm_dump.c +++ b/opensm/osm_dump.c @@ -368,6 +368,7 @@ static void dump_topology_node(cl_map_item_t * item, FILE * file, void *cxt) osm_node_t *p_nbnode; osm_physp_t *p_physp, *p_default_physp, *p_rphysp; uint8_t link_speed_act; + char *link_speed_act_str; if (!p_node->node_info.num_ports) return; @@ -444,6 +445,25 @@ static void dump_topology_node(cl_map_item_t * item, FILE * file, void *cxt) port_state = ib_port_info_get_port_state(&p_physp->port_info); link_speed_act = ib_port_info_get_link_speed_active(&p_physp->port_info); + if (link_speed_act == IB_LINK_SPEED_ACTIVE_2_5) + link_speed_act_str = "2.5"; + else if (link_speed_act == IB_LINK_SPEED_ACTIVE_5) + link_speed_act_str = "5"; + else if (link_speed_act == IB_LINK_SPEED_ACTIVE_10) + link_speed_act_str = "10"; + else + link_speed_act_str = "??"; + + if (p_default_physp->port_info.capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) { + link_speed_act = + ib_port_info_get_link_speed_ext_active(&p_physp->port_info); + if (link_speed_act == IB_LINK_SPEED_EXT_ACTIVE_14) + link_speed_act_str = "14"; + else if (link_speed_act == IB_LINK_SPEED_EXT_ACTIVE_25) + link_speed_act_str = "25"; + else if (link_speed_act != IB_LINK_SPEED_EXT_ACTIVE_NONE) + link_speed_act_str = "??"; + } fprintf(file, "PHY=%s LOG=%s SPD=%s\n", p_physp->port_info.link_width_active == 1 ? "1x" : @@ -453,9 +473,7 @@ static void dump_topology_node(cl_map_item_t * item, FILE * file, void *cxt) port_state == IB_LINK_ACTIVE ? "ACT" : port_state == IB_LINK_ARMED ? "ARM" : port_state == IB_LINK_INIT ? "INI" : "DWN", - link_speed_act == 1 ? "2.5" : - link_speed_act == 2 ? "5" : - link_speed_act == 4 ? "10" : "??"); + link_speed_act_str); } } @@ -514,7 +532,9 @@ static void print_node_report(cl_map_item_t * item, FILE * file, void *cxt) (ib_port_info_get_neighbor_mtu(p_pi)), osm_get_lwa_str(p_pi->link_width_active), osm_get_lsa_str - (ib_port_info_get_link_speed_active(p_pi))); + (ib_port_info_get_link_speed_active(p_pi), + ib_port_info_get_link_speed_ext_active(p_pi), + ib_port_info_get_port_state(p_pi))); else fprintf(file, " : : "); diff --git a/opensm/osm_helper.c b/opensm/osm_helper.c index e8e54e1..c754ca0 100644 --- a/opensm/osm_helper.c +++ b/opensm/osm_helper.c @@ -795,45 +795,45 @@ void osm_dump_port_info(IN osm_log_t * p_log, IN ib_net64_t node_guid, osm_log(p_log, log_level, "PortInfo dump:\n" - "\t\t\t\tport number.............%u\n" - "\t\t\t\tnode_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tport_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tm_key...................0x%016" PRIx64 "\n" - "\t\t\t\tsubnet_prefix...........0x%016" PRIx64 "\n" - "\t\t\t\tbase_lid................%u\n" - "\t\t\t\tmaster_sm_base_lid......%u\n" - "\t\t\t\tcapability_mask.........0x%X\n" - "\t\t\t\tdiag_code...............0x%X\n" - "\t\t\t\tm_key_lease_period......0x%X\n" - "\t\t\t\tlocal_port_num..........%u\n" - "\t\t\t\tlink_width_enabled......0x%X\n" - "\t\t\t\tlink_width_supported....0x%X\n" - "\t\t\t\tlink_width_active.......0x%X\n" - "\t\t\t\tlink_speed_supported....0x%X\n" - "\t\t\t\tport_state..............%s\n" - "\t\t\t\tstate_info2.............0x%X\n" - "\t\t\t\tm_key_protect_bits......0x%X\n" - "\t\t\t\tlmc.....................0x%X\n" - "\t\t\t\tlink_speed..............0x%X\n" - "\t\t\t\tmtu_smsl................0x%X\n" - "\t\t\t\tvl_cap_init_type........0x%X\n" - "\t\t\t\tvl_high_limit...........0x%X\n" - "\t\t\t\tvl_arb_high_cap.........0x%X\n" - "\t\t\t\tvl_arb_low_cap..........0x%X\n" - "\t\t\t\tinit_rep_mtu_cap........0x%X\n" - "\t\t\t\tvl_stall_life...........0x%X\n" - "\t\t\t\tvl_enforce..............0x%X\n" - "\t\t\t\tm_key_violations........0x%X\n" - "\t\t\t\tp_key_violations........0x%X\n" - "\t\t\t\tq_key_violations........0x%X\n" - "\t\t\t\tguid_cap................0x%X\n" - "\t\t\t\tclient_reregister.......0x%X\n" - "\t\t\t\tmcast_pkey_trap_suppr...0x%X\n" - "\t\t\t\tsubnet_timeout..........0x%X\n" - "\t\t\t\tresp_time_value.........0x%X\n" - "\t\t\t\terror_threshold.........0x%X\n" - "\t\t\t\tmax_credit_hint.........0x%X\n" - "\t\t\t\tlink_round_trip_latency.0x%X\n" + "\t\t\t\tport number..............%u\n" + "\t\t\t\tnode_guid................0x%016" PRIx64 "\n" + "\t\t\t\tport_guid................0x%016" PRIx64 "\n" + "\t\t\t\tm_key....................0x%016" PRIx64 "\n" + "\t\t\t\tsubnet_prefix............0x%016" PRIx64 "\n" + "\t\t\t\tbase_lid.................%u\n" + "\t\t\t\tmaster_sm_base_lid.......%u\n" + "\t\t\t\tcapability_mask..........0x%X\n" + "\t\t\t\tdiag_code................0x%X\n" + "\t\t\t\tm_key_lease_period.......0x%X\n" + "\t\t\t\tlocal_port_num...........%u\n" + "\t\t\t\tlink_width_enabled.......0x%X\n" + "\t\t\t\tlink_width_supported.....0x%X\n" + "\t\t\t\tlink_width_active........0x%X\n" + "\t\t\t\tlink_speed_supported.....0x%X\n" + "\t\t\t\tport_state...............%s\n" + "\t\t\t\tstate_info2..............0x%X\n" + "\t\t\t\tm_key_protect_bits.......0x%X\n" + "\t\t\t\tlmc......................0x%X\n" + "\t\t\t\tlink_speed...............0x%X\n" + "\t\t\t\tmtu_smsl.................0x%X\n" + "\t\t\t\tvl_cap_init_type.........0x%X\n" + "\t\t\t\tvl_high_limit............0x%X\n" + "\t\t\t\tvl_arb_high_cap..........0x%X\n" + "\t\t\t\tvl_arb_low_cap...........0x%X\n" + "\t\t\t\tinit_rep_mtu_cap.........0x%X\n" + "\t\t\t\tvl_stall_life............0x%X\n" + "\t\t\t\tvl_enforce...............0x%X\n" + "\t\t\t\tm_key_violations.........0x%X\n" + "\t\t\t\tp_key_violations.........0x%X\n" + "\t\t\t\tq_key_violations.........0x%X\n" + "\t\t\t\tguid_cap.................0x%X\n" + "\t\t\t\tclient_reregister........0x%X\n" + "\t\t\t\tmcast_pkey_trap_suppr....0x%X\n" + "\t\t\t\tsubnet_timeout...........0x%X\n" + "\t\t\t\tresp_time_value..........0x%X\n" + "\t\t\t\terror_threshold..........0x%X\n" + "\t\t\t\tmax_credit_hint..........0x%X\n" + "\t\t\t\tlink_round_trip_latency..0x%X\n" "\t\t\t\tlink_speed_ext_active....0x%X\n" "\t\t\t\tlink_speed_ext_supported.0x%X\n" "\t\t\t\tlink_speed_ext_enabled...0x%X\n", @@ -859,7 +859,8 @@ void osm_dump_port_info(IN osm_log_t * p_log, IN ib_net64_t node_guid, cl_ntoh16(p_pi->q_key_violations), p_pi->guid_cap, ib_port_info_get_client_rereg(p_pi), ib_port_info_get_mcast_pkey_trap_suppress(p_pi), - ib_port_info_get_timeout(p_pi), p_pi->resp_time_value, + ib_port_info_get_timeout(p_pi), + ib_port_info_get_resp_time_value(p_pi), p_pi->error_threshold, cl_ntoh16(p_pi->max_credit_hint), cl_ntoh32(p_pi->link_rt_latency), ib_port_info_get_link_speed_ext_active(p_pi), @@ -886,46 +887,46 @@ void osm_dump_portinfo_record(IN osm_log_t * p_log, osm_log(p_log, log_level, "PortInfo Record dump:\n" "\t\t\t\tRID\n" - "\t\t\t\tEndPortLid..............%u\n" - "\t\t\t\tPortNum.................%u\n" - "\t\t\t\tOptions.................0x%X\n" + "\t\t\t\tEndPortLid...............%u\n" + "\t\t\t\tPortNum..................%u\n" + "\t\t\t\tOptions..................0x%X\n" "\t\t\t\tPortInfo dump:\n" - "\t\t\t\tm_key...................0x%016" PRIx64 "\n" - "\t\t\t\tsubnet_prefix...........0x%016" PRIx64 "\n" - "\t\t\t\tbase_lid................%u\n" - "\t\t\t\tmaster_sm_base_lid......%u\n" - "\t\t\t\tcapability_mask.........0x%X\n" - "\t\t\t\tdiag_code...............0x%X\n" - "\t\t\t\tm_key_lease_period......0x%X\n" - "\t\t\t\tlocal_port_num..........%u\n" - "\t\t\t\tlink_width_enabled......0x%X\n" - "\t\t\t\tlink_width_supported....0x%X\n" - "\t\t\t\tlink_width_active.......0x%X\n" - "\t\t\t\tlink_speed_supported....0x%X\n" - "\t\t\t\tport_state..............%s\n" - "\t\t\t\tstate_info2.............0x%X\n" - "\t\t\t\tm_key_protect_bits......0x%X\n" - "\t\t\t\tlmc.....................0x%X\n" - "\t\t\t\tlink_speed..............0x%X\n" - "\t\t\t\tmtu_smsl................0x%X\n" - "\t\t\t\tvl_cap_init_type........0x%X\n" - "\t\t\t\tvl_high_limit...........0x%X\n" - "\t\t\t\tvl_arb_high_cap.........0x%X\n" - "\t\t\t\tvl_arb_low_cap..........0x%X\n" - "\t\t\t\tinit_rep_mtu_cap........0x%X\n" - "\t\t\t\tvl_stall_life...........0x%X\n" - "\t\t\t\tvl_enforce..............0x%X\n" - "\t\t\t\tm_key_violations........0x%X\n" - "\t\t\t\tp_key_violations........0x%X\n" - "\t\t\t\tq_key_violations........0x%X\n" - "\t\t\t\tguid_cap................0x%X\n" - "\t\t\t\tclient_reregister.......0x%X\n" - "\t\t\t\tmcast_pkey_trap_suppr...0x%X\n" - "\t\t\t\tsubnet_timeout..........0x%X\n" - "\t\t\t\tresp_time_value.........0x%X\n" - "\t\t\t\terror_threshold.........0x%X\n" - "\t\t\t\tmax_credit_hint.........0x%X\n" - "\t\t\t\tlink_round_trip_latency.0x%X\n" + "\t\t\t\tm_key....................0x%016" PRIx64 "\n" + "\t\t\t\tsubnet_prefix............0x%016" PRIx64 "\n" + "\t\t\t\tbase_lid.................%u\n" + "\t\t\t\tmaster_sm_base_lid.......%u\n" + "\t\t\t\tcapability_mask..........0x%X\n" + "\t\t\t\tdiag_code................0x%X\n" + "\t\t\t\tm_key_lease_period.......0x%X\n" + "\t\t\t\tlocal_port_num...........%u\n" + "\t\t\t\tlink_width_enabled.......0x%X\n" + "\t\t\t\tlink_width_supported.....0x%X\n" + "\t\t\t\tlink_width_active........0x%X\n" + "\t\t\t\tlink_speed_supported.....0x%X\n" + "\t\t\t\tport_state...............%s\n" + "\t\t\t\tstate_info2..............0x%X\n" + "\t\t\t\tm_key_protect_bits.......0x%X\n" + "\t\t\t\tlmc......................0x%X\n" + "\t\t\t\tlink_speed...............0x%X\n" + "\t\t\t\tmtu_smsl.................0x%X\n" + "\t\t\t\tvl_cap_init_type.........0x%X\n" + "\t\t\t\tvl_high_limit............0x%X\n" + "\t\t\t\tvl_arb_high_cap..........0x%X\n" + "\t\t\t\tvl_arb_low_cap...........0x%X\n" + "\t\t\t\tinit_rep_mtu_cap.........0x%X\n" + "\t\t\t\tvl_stall_life............0x%X\n" + "\t\t\t\tvl_enforce...............0x%X\n" + "\t\t\t\tm_key_violations.........0x%X\n" + "\t\t\t\tp_key_violations.........0x%X\n" + "\t\t\t\tq_key_violations.........0x%X\n" + "\t\t\t\tguid_cap.................0x%X\n" + "\t\t\t\tclient_reregister........0x%X\n" + "\t\t\t\tmcast_pkey_trap_suppr....0x%X\n" + "\t\t\t\tsubnet_timeout...........0x%X\n" + "\t\t\t\tresp_time_value..........0x%X\n" + "\t\t\t\terror_threshold..........0x%X\n" + "\t\t\t\tmax_credit_hint..........0x%X\n" + "\t\t\t\tlink_round_trip_latency..0x%X\n" "\t\t\t\tlink_speed_ext_active....0x%X\n" "\t\t\t\tlink_speed_ext_supported.0x%X\n" "\t\t\t\tlink_speed_ext_enabled...0x%X\n", @@ -951,7 +952,8 @@ void osm_dump_portinfo_record(IN osm_log_t * p_log, cl_ntoh16(p_pi->q_key_violations), p_pi->guid_cap, ib_port_info_get_client_rereg(p_pi), ib_port_info_get_mcast_pkey_trap_suppress(p_pi), - ib_port_info_get_timeout(p_pi), p_pi->resp_time_value, + ib_port_info_get_timeout(p_pi), + ib_port_info_get_resp_time_value(p_pi), p_pi->error_threshold, cl_ntoh16(p_pi->max_credit_hint), cl_ntoh32(p_pi->link_rt_latency), ib_port_info_get_link_speed_ext_active(p_pi), @@ -975,9 +977,9 @@ void osm_dump_guid_info(IN osm_log_t * p_log, IN ib_net64_t node_guid, if (osm_log_is_active(p_log, log_level)) { osm_log(p_log, log_level, "GUIDInfo dump:\n" - "\t\t\t\tblock number............%u\n" - "\t\t\t\tnode_guid...............0x%016" PRIx64 "\n" - "\t\t\t\tport_guid...............0x%016" PRIx64 "\n" + "\t\t\t\tblock number............%u\n" + "\t\t\t\tnode_guid...............0x%016" PRIx64 "\n" + "\t\t\t\tport_guid...............0x%016" PRIx64 "\n" "\t\t\t\tGUID 0..................0x%016" PRIx64 "\n" "\t\t\t\tGUID 1..................0x%016" PRIx64 "\n" "\t\t\t\tGUID 2..................0x%016" PRIx64 "\n" @@ -2265,19 +2267,28 @@ const char *osm_get_lwa_str(IN uint8_t lwa) } static const char *lsa_str_fixed_width[] = { - "???", + "Ext", "2.5", "5 ", "???", "10 " }; -const char *osm_get_lsa_str(IN uint8_t lsa) +static const char *lsea_str_fixed_width[] = { + "Std", + "14 ", + "25 " +}; + +const char *osm_get_lsa_str(IN uint8_t lsa, IN uint8_t lsea, IN uint8_t state) { - if (lsa > 4) - return lsa_str_fixed_width[0]; - else + if (lsa > IB_LINK_SPEED_ACTIVE_10) + return lsa_str_fixed_width[3]; + if (lsea == IB_LINK_SPEED_EXT_ACTIVE_NONE) return lsa_str_fixed_width[lsa]; + if (lsea > IB_LINK_SPEED_EXT_ACTIVE_25) + return lsa_str_fixed_width[3]; + return lsea_str_fixed_width[lsea]; } static const char *sm_mgr_signal_str[] = { diff --git a/opensm/osm_link_mgr.c b/opensm/osm_link_mgr.c index dd37eee..1495448 100644 --- a/opensm/osm_link_mgr.c +++ b/opensm/osm_link_mgr.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. * @@ -99,8 +99,10 @@ static int link_mgr_set_physp_pi(osm_sm_t * sm, IN osm_physp_t * p_physp, ib_api_status_t status; uint8_t port_num, mtu, op_vls, smsl = OSM_DEFAULT_SL; boolean_t esp0 = FALSE, send_set = FALSE; - osm_physp_t *p_remote_physp; + osm_physp_t *p_remote_physp, *physp0; + int qdr_change = 0; int ret = 0; + ib_net32_t attr_mod, cap_mask; OSM_LOG_ENTER(sm->p_log); @@ -329,8 +331,54 @@ static int link_mgr_set_physp_pi(osm_sm_t * sm, IN osm_physp_t * p_physp, sm->p_subn->opt. force_link_speed); if (memcmp(&p_pi->link_speed, &p_old_pi->link_speed, - sizeof(p_pi->link_speed))) + sizeof(p_pi->link_speed))) { send_set = TRUE; + /* Determine whether QDR in LSE is being changed */ + if ((ib_port_info_get_link_speed_enabled(p_pi) & + IB_LINK_SPEED_ACTIVE_10 && + !(ib_port_info_get_link_speed_enabled(p_old_pi) & + IB_LINK_SPEED_ACTIVE_10)) || + ((!(ib_port_info_get_link_speed_enabled(p_pi) & + IB_LINK_SPEED_ACTIVE_10) && + ib_port_info_get_link_speed_enabled(p_old_pi) & + IB_LINK_SPEED_ACTIVE_10))) + qdr_change = 1; + } + } + + if (osm_node_get_type(p_physp->p_node) == IB_NODE_TYPE_SWITCH) { + physp0 = osm_node_get_physp_ptr(p_physp->p_node, 0); + cap_mask = physp0->port_info.capability_mask; + } else + cap_mask = p_pi->capability_mask; + if (!(cap_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)) + qdr_change = 0; + + /* Do peer ports support extended link speeds ? */ + if (port_num != 0 && p_remote_physp) { + osm_physp_t *rphysp0; + ib_net32_t rem_cap_mask; + + if (osm_node_get_type(p_remote_physp->p_node) == + IB_NODE_TYPE_SWITCH) { + rphysp0 = osm_node_get_physp_ptr(p_remote_physp->p_node, 0); + rem_cap_mask = rphysp0->port_info.capability_mask; + } else + rem_cap_mask = p_remote_physp->port_info.capability_mask; + + if (cap_mask & IB_PORT_CAP_HAS_EXT_SPEEDS && + rem_cap_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) { + if (sm->p_subn->opt.force_link_speed_ext && + (sm->p_subn->opt.force_link_speed_ext != IB_LINK_SPEED_EXT_SET_LSES || + p_pi->link_speed_ext_enabled != + ib_port_info_get_link_speed_sup(p_pi))) { + p_pi->link_speed_ext_enabled = sm->p_subn->opt.force_link_speed_ext; + if (memcmp(&p_pi->link_speed_ext_enabled, + &p_old_pi->link_speed_ext_enabled, + sizeof(p_pi->link_speed_ext_enabled))) + send_set = TRUE; + } + } } /* calc new op_vls and mtu */ @@ -386,9 +434,12 @@ Send: if (!send_set) goto Exit; + attr_mod = cl_hton32(port_num); + if (qdr_change) + attr_mod |= cl_hton32(1 << 31); /* AM SMSupportExtendedSpeeds */ status = osm_req_set(sm, osm_physp_get_dr_path_ptr(p_physp), payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO, - cl_hton32(port_num), CL_DISP_MSGID_NONE, &context); + attr_mod, CL_DISP_MSGID_NONE, &context); if (status) ret = -1; diff --git a/opensm/osm_port_info_rcv.c b/opensm/osm_port_info_rcv.c index b4f64d5..a4f81a8 100644 --- a/opensm/osm_port_info_rcv.c +++ b/opensm/osm_port_info_rcv.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * Copyright (c) 2009 HNR Consulting. All rights reserved. * @@ -102,7 +102,8 @@ static void pi_rcv_process_endport(IN osm_sm_t * sm, IN osm_physp_t * p_physp, sm->p_subn->min_ca_mtu = mtu; } - rate = ib_port_info_compute_rate(p_pi, 0); + rate = ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); if (rate < sm->p_subn->min_ca_rate) { OSM_LOG(sm->p_log, OSM_LOG_VERBOSE, "Setting endport minimal rate to:%u defined by port:0x%" diff --git a/opensm/osm_sa_class_port_info.c b/opensm/osm_sa_class_port_info.c index a5d17a8..64e3f33 100644 --- a/opensm/osm_sa_class_port_info.c +++ b/opensm/osm_sa_class_port_info.c @@ -158,7 +158,8 @@ static void cpi_rcv_respond(IN osm_sa_t * sa, IN const osm_madw_t * p_madw) OSM_CAP_IS_PORT_INFO_CAPMASK_MATCH_SUPPORTED; #endif cap_mask2 = OSM_CAP2_IS_MCAST_TOP_SUPPORTED | - OSM_CAP2_IS_FULL_PORTINFO_REC_SUPPORTED; + OSM_CAP2_IS_FULL_PORTINFO_REC_SUPPORTED | + OSM_CAP2_IS_EXTENDED_SPEEDS_SUPPORTED; if (sa->p_subn->opt.qos) cap_mask2 |= OSM_CAP2_IS_QOS_SUPPORTED; ib_class_set_cap_mask2(p_resp_cpi, cap_mask2); diff --git a/opensm/osm_sa_mcmember_record.c b/opensm/osm_sa_mcmember_record.c index 0b6b973..81d752a 100644 --- a/opensm/osm_sa_mcmember_record.c +++ b/opensm/osm_sa_mcmember_record.c @@ -327,6 +327,7 @@ static boolean_t validate_port_caps(osm_log_t * p_log, const osm_mgrp_t * p_mgrp, const osm_physp_t * p_physp) { + const ib_port_info_t *p_pi; uint8_t mtu_required; uint8_t mtu_mgrp; uint8_t rate_required; @@ -341,7 +342,9 @@ static boolean_t validate_port_caps(osm_log_t * p_log, return FALSE; } - rate_required = ib_port_info_compute_rate(&p_physp->port_info, 0); + p_pi = &p_physp->port_info; + rate_required = ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); rate_mgrp = (uint8_t) (p_mgrp->mcmember_rec.rate & 0x3F); if (ib_path_compare_rates(rate_required, rate_mgrp) < 0) { OSM_LOG(p_log, OSM_LOG_VERBOSE, @@ -635,6 +638,7 @@ static boolean_t mgrp_request_is_realizable(IN osm_sa_t * sa, uint8_t mtu_required, mtu, port_mtu; uint8_t rate_sel = 2; /* exactly */ uint8_t rate_required, rate, port_rate; + const ib_port_info_t *p_pi; osm_log_t *p_log = sa->p_log; OSM_LOG_ENTER(sa->p_log); @@ -652,7 +656,8 @@ static boolean_t mgrp_request_is_realizable(IN osm_sa_t * sa, * masked in. */ - port_mtu = p_physp ? ib_port_info_get_mtu_cap(&p_physp->port_info) : 0; + p_pi = &p_physp->port_info; + port_mtu = p_physp ? ib_port_info_get_mtu_cap(p_pi) : 0; if (!(comp_mask & IB_MCR_COMPMASK_MTU) || !(comp_mask & IB_MCR_COMPMASK_MTU_SEL) || (mtu_sel = (p_mcm_rec->mtu >> 6)) == 3) @@ -699,7 +704,8 @@ static boolean_t mgrp_request_is_realizable(IN osm_sa_t * sa, p_mcm_rec->mtu = (mtu_sel << 6) | mtu; port_rate = - p_physp ? ib_port_info_compute_rate(&p_physp->port_info, 0) : 0; + p_physp ? ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) : 0; if (!(comp_mask & IB_MCR_COMPMASK_RATE) || !(comp_mask & IB_MCR_COMPMASK_RATE_SEL) || (rate_sel = (p_mcm_rec->rate >> 6)) == 3) diff --git a/opensm/osm_sa_multipath_record.c b/opensm/osm_sa_multipath_record.c index cec12ed..33cf130 100644 --- a/opensm/osm_sa_multipath_record.c +++ b/opensm/osm_sa_multipath_record.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two @@ -157,11 +157,11 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, OUT osm_path_parms_t * p_parms) { const osm_node_t *p_node; - const osm_physp_t *p_physp; + const osm_physp_t *p_physp, *p_physp0; const osm_physp_t *p_src_physp; const osm_physp_t *p_dest_physp; const osm_prtn_t *p_prtn = NULL; - const ib_port_info_t *p_pi; + const ib_port_info_t *p_pi, *p_pi0; ib_slvl_table_t *p_slvl_tbl; ib_api_status_t status = IB_SUCCESS; uint8_t mtu; @@ -189,7 +189,8 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, p_pi = &p_physp->port_info; mtu = ib_port_info_get_mtu_cap(p_pi); - rate = ib_port_info_compute_rate(p_pi, 0); + rate = ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); /* Mellanox Tavor device performance is better using 1K MTU. @@ -361,9 +362,13 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, if (mtu > ib_port_info_get_mtu_cap(p_pi)) mtu = ib_port_info_get_mtu_cap(p_pi); + p_physp0 = osm_node_get_physp_ptr((osm_node_t *)p_node, 0); + p_pi0 = &p_physp0->port_info; if (ib_path_compare_rates(rate, - ib_port_info_compute_rate(p_pi, 0)) > 0) - rate = ib_port_info_compute_rate(p_pi, 0); + ib_port_info_compute_rate(p_pi, + p_pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)) > 0) + rate = ib_port_info_compute_rate(p_pi, + p_pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); /* Continue with the egress port on this switch. @@ -385,9 +390,13 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, if (mtu > ib_port_info_get_mtu_cap(p_pi)) mtu = ib_port_info_get_mtu_cap(p_pi); + p_physp0 = osm_node_get_physp_ptr((osm_node_t *)p_node, 0); + p_pi0 = &p_physp0->port_info; if (ib_path_compare_rates(rate, - ib_port_info_compute_rate(p_pi, 0)) > 0) - rate = ib_port_info_compute_rate(p_pi, 0); + ib_port_info_compute_rate(p_pi, + p_pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)) > 0) + rate = ib_port_info_compute_rate(p_pi, + p_pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); if (sa->p_subn->opt.qos) { /* @@ -420,8 +429,10 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, mtu = ib_port_info_get_mtu_cap(p_pi); if (ib_path_compare_rates(rate, - ib_port_info_compute_rate(p_pi, 0)) > 0) - rate = ib_port_info_compute_rate(p_pi, 0); + ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)) > 0) + rate = ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Path min MTU = %u, min rate = %u\n", mtu, rate); diff --git a/opensm/osm_sa_path_record.c b/opensm/osm_sa_path_record.c index f3b25f6..266c5c5 100644 --- a/opensm/osm_sa_path_record.c +++ b/opensm/osm_sa_path_record.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. * Copyright (c) 2009 HNR Consulting. All rights reserved. @@ -159,13 +159,13 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, OUT osm_path_parms_t * p_parms) { const osm_node_t *p_node; - const osm_physp_t *p_physp; + const osm_physp_t *p_physp, *p_physp0; const osm_physp_t *p_src_physp; const osm_physp_t *p_dest_physp; const osm_prtn_t *p_prtn = NULL; osm_opensm_t *p_osm; struct osm_routing_engine *p_re; - const ib_port_info_t *p_pi; + const ib_port_info_t *p_pi, *p_pi0; ib_api_status_t status = IB_SUCCESS; ib_net16_t pkey; uint8_t mtu; @@ -195,7 +195,8 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, p_re = p_osm->routing_engine_used; mtu = ib_port_info_get_mtu_cap(p_pi); - rate = ib_port_info_compute_rate(p_pi, 0); + rate = ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); /* Mellanox Tavor device performance is better using 1K MTU. @@ -349,9 +350,13 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, if (mtu > ib_port_info_get_mtu_cap(p_pi)) mtu = ib_port_info_get_mtu_cap(p_pi); + p_physp0 = osm_node_get_physp_ptr((osm_node_t *)p_node, 0); + p_pi0 = &p_physp0->port_info; if (ib_path_compare_rates(rate, - ib_port_info_compute_rate(p_pi, 0)) > 0) - rate = ib_port_info_compute_rate(p_pi, 0); + ib_port_info_compute_rate(p_pi, + p_pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)) > 0) + rate = ib_port_info_compute_rate(p_pi, + p_pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); /* Continue with the egress port on this switch. @@ -373,9 +378,13 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, if (mtu > ib_port_info_get_mtu_cap(p_pi)) mtu = ib_port_info_get_mtu_cap(p_pi); + p_physp0 = osm_node_get_physp_ptr((osm_node_t *)p_node, 0); + p_pi0 = &p_physp0->port_info; if (ib_path_compare_rates(rate, - ib_port_info_compute_rate(p_pi, 0)) > 0) - rate = ib_port_info_compute_rate(p_pi, 0); + ib_port_info_compute_rate(p_pi, + p_pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)) > 0) + rate = ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); if (sa->p_subn->opt.qos) { /* @@ -428,8 +437,10 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, mtu = ib_port_info_get_mtu_cap(p_pi); if (ib_path_compare_rates(rate, - ib_port_info_compute_rate(p_pi, 0)) > 0) - rate = ib_port_info_compute_rate(p_pi, 0); + ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS)) > 0) + rate = ib_port_info_compute_rate(p_pi, + p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS); OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Path min MTU = %u, min rate = %u\n", mtu, rate); diff --git a/opensm/osm_sa_portinfo_record.c b/opensm/osm_sa_portinfo_record.c index 0836c3c..e8631a1 100644 --- a/opensm/osm_sa_portinfo_record.c +++ b/opensm/osm_sa_portinfo_record.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two @@ -74,10 +74,12 @@ typedef struct osm_pir_search_ctxt { static ib_api_status_t pir_rcv_new_pir(IN osm_sa_t * sa, IN const osm_physp_t * p_physp, - IN cl_qlist_t * p_list, + IN osm_pir_search_ctxt_t * p_ctxt, IN ib_net16_t const lid) { osm_pir_item_t *p_rec_item; + ib_port_info_t *p_pi; + osm_physp_t *p_physp0; ib_api_status_t status = IB_SUCCESS; OSM_LOG_ENTER(sa->p_log); @@ -100,9 +102,35 @@ static ib_api_status_t pir_rcv_new_pir(IN osm_sa_t * sa, p_rec_item->rec.lid = lid; p_rec_item->rec.port_info = p_physp->port_info; + if (p_ctxt->comp_mask & IB_PIR_COMPMASK_OPTIONS) + p_rec_item->rec.options = p_ctxt->p_rcvd_rec->options; + if ((p_ctxt->comp_mask & IB_PIR_COMPMASK_OPTIONS) == 0 || + (p_ctxt->p_rcvd_rec->options & 0x80) == 0) { + /* Does requested port have an extended link speed active ? */ + if (osm_node_get_type(p_physp->p_node) == + IB_NODE_TYPE_SWITCH) { + p_physp0 = osm_node_get_physp_ptr(p_ctxt->p_req_physp->p_node, 0); + p_pi = &p_physp0->port_info; + } else + p_pi = (ib_port_info_t *) &p_physp->port_info; + if ((p_pi->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) > 0) { + if (ib_port_info_get_link_speed_ext_active(&p_physp->port_info)) { + /* Add QDR bits to original link speed components */ + p_pi = &p_rec_item->rec.port_info; + ib_port_info_set_link_speed_enabled(p_pi, + ib_port_info_get_link_speed_enabled(p_pi) | IB_LINK_SPEED_ACTIVE_10); + p_pi->state_info1 = + (uint8_t) ((p_pi->state_info1 & IB_PORT_STATE_MASK) | + (ib_port_info_get_link_speed_sup(p_pi) | IB_LINK_SPEED_ACTIVE_10) << IB_PORT_LINK_SPEED_SHIFT); + p_pi->link_speed = + (uint8_t) ((p_pi->link_speed & IB_PORT_LINK_SPEED_ENABLED_MASK) | + (ib_port_info_get_link_speed_active(p_pi) | IB_LINK_SPEED_ACTIVE_10) << IB_PORT_LINK_SPEED_SHIFT); + } + } + } p_rec_item->rec.port_num = osm_physp_get_port_num(p_physp); - cl_qlist_insert_tail(p_list, &p_rec_item->list_item); + cl_qlist_insert_tail(p_ctxt->p_list, &p_rec_item->list_item); Exit: OSM_LOG_EXIT(sa->p_log); @@ -147,7 +175,7 @@ static void sa_pir_create(IN osm_sa_t * sa, IN const osm_physp_t * p_physp, goto Exit; } - pir_rcv_new_pir(sa, p_physp, p_ctxt->p_list, cl_hton16(base_lid_ho)); + pir_rcv_new_pir(sa, p_physp, p_ctxt, cl_hton16(base_lid_ho)); Exit: OSM_LOG_EXIT(sa->p_log); @@ -160,6 +188,8 @@ static void sa_pir_check_physp(IN osm_sa_t * sa, IN const osm_physp_t * p_physp, ib_net64_t comp_mask; const ib_port_info_t *p_comp_pi; const ib_port_info_t *p_pi; + const osm_physp_t * p_physp0; + ib_net32_t cap_mask; OSM_LOG_ENTER(sa->p_log); @@ -372,7 +402,29 @@ static void sa_pir_check_physp(IN osm_sa_t * sa, IN const osm_physp_t * p_physp, ib_port_info_get_overrun_err_thd(p_pi)) goto Exit; } - + if (osm_node_get_type(p_physp->p_node) == IB_NODE_TYPE_SWITCH) { + p_physp0 = osm_node_get_physp_ptr(p_physp->p_node, 0); + cap_mask = p_physp0->port_info.capability_mask; + } else + cap_mask = p_pi->capability_mask; + if (comp_mask & IB_PIR_COMPMASK_LINKSPDEXTACT) { + if (((cap_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) > 0) && + (ib_port_info_get_link_speed_ext_active(p_comp_pi) != + ib_port_info_get_link_speed_ext_active(p_pi))) + goto Exit; + } + if (comp_mask & IB_PIR_COMPMASK_LINKSPDEXTSUPP) { + if (((cap_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) > 0) && + (ib_port_info_get_link_speed_ext_sup(p_comp_pi) != + ib_port_info_get_link_speed_ext_sup(p_pi))) + goto Exit; + } + if (comp_mask & IB_PIR_COMPMASK_LINKSPDEXTENAB) { + if (((cap_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) > 0) && + (ib_port_info_get_link_speed_ext_enabled(p_comp_pi) != + ib_port_info_get_link_speed_ext_enabled(p_pi))) + goto Exit; + } sa_pir_create(sa, p_physp, p_ctxt); Exit: diff --git a/opensm/osm_subnet.c b/opensm/osm_subnet.c index 3ba1f81..1c73bc4 100644 --- a/opensm/osm_subnet.c +++ b/opensm/osm_subnet.c @@ -310,6 +310,7 @@ static const opt_rec_t opt_tbl[] = { { "lmc_esp0", OPT_OFFSET(lmc_esp0), opts_parse_boolean, NULL, 1 }, { "max_op_vls", OPT_OFFSET(max_op_vls), opts_parse_uint8, NULL, 1 }, { "force_link_speed", OPT_OFFSET(force_link_speed), opts_parse_uint8, NULL, 1 }, + { "force_link_speed_ext", OPT_OFFSET(force_link_speed_ext), opts_parse_uint8, NULL, 1 }, { "reassign_lids", OPT_OFFSET(reassign_lids), opts_parse_boolean, NULL, 1 }, { "ignore_other_sm", OPT_OFFSET(ignore_other_sm), opts_parse_boolean, NULL, 1 }, { "single_thread", OPT_OFFSET(single_thread), opts_parse_boolean, NULL, 0 }, @@ -715,6 +716,7 @@ void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt) p_opt->lmc_esp0 = FALSE; p_opt->max_op_vls = OSM_DEFAULT_MAX_OP_VLS; p_opt->force_link_speed = 15; + p_opt->force_link_speed_ext = 31; p_opt->reassign_lids = FALSE; p_opt->ignore_other_sm = FALSE; p_opt->single_thread = FALSE; @@ -1100,6 +1102,14 @@ int osm_subn_verify_config(IN osm_subn_opt_t * p_opts) p_opts->force_link_speed = IB_PORT_LINK_SPEED_ENABLED_MASK; } + if ((31 < p_opts->force_link_speed_ext) || + (p_opts->force_link_speed_ext > 3 && p_opts->force_link_speed_ext < 30)) { + log_report(" Invalid Cached Option Value:force_link_speed_ext = %u:" + "Using Default:%u\n", p_opts->force_link_speed_ext, + 31); + p_opts->force_link_speed_ext = 31; + } + if (p_opts->max_wire_smps == 0) p_opts->max_wire_smps = 0x7FFFFFFF; else if (p_opts->max_wire_smps > 0x7FFFFFFF) { @@ -1339,6 +1349,16 @@ int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opts) "# 2,4,6,8-14 Reserved\n" "# Default 15: set to PortInfo:LinkSpeedSupported\n" "force_link_speed %u\n\n" + "# Force PortInfo:LinkSpeedExtEnabled on ports\n" + "# If 0, don't modify PortInfo:LinkSpeedExtEnabled on port\n" + "# Otherwise, use value for PortInfo:LinkSpeedExtEnabled on port\n" + "# Values are (MgtWG RefID #4722)\n" + "# 1: 14.0625 Gbps\n" + "# 2: 25.78125 Gbps\n" + "# 3: 14.0625 Gbps or 25.78125 Gbps\n" + "# 30: Disable extended link speeds\n" + "# Default 31: set to PortInfo:LinkSpeedExtSupported\n" + "force_link_speed_ext %u\n\n" "# The subnet_timeout code that will be set for all the ports\n" "# The actual timeout is 4.096usec * 2^\n" "subnet_timeout %u\n\n" @@ -1364,6 +1384,7 @@ int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opts) p_opts->leaf_head_of_queue_lifetime, p_opts->max_op_vls, p_opts->force_link_speed, + p_opts->force_link_speed_ext, p_opts->subnet_timeout, p_opts->local_phy_errors_threshold, p_opts->overrun_errors_threshold,