From a8484449ac6b55602207c3ef02aa030a133f9ae4 Mon Sep 17 00:00:00 2001 From: Asaf Mazor Date: Wed, 29 Jan 2025 11:42:48 +0200 Subject: [PATCH] rdma-core/infiniband-diags: use correct port info to get cap_mask for ibnd_get_agg_linkspeedextsup To get the right cap_mask, In case of Switch, we need to get the info from port 0. get_port_info_for_cap_mask was added to get the right port, then used with the 'ibnd_get_agg_linkspeedext' methods in ibdiag_common parent: 4275037 issue: 4276746 Signed-off-by: Asaf Mazor --- infiniband-diags/ibdiag_common.c | 33 +++++++++++++++++--------------- libibnetdisc/ibnetdisc.c | 4 ++-- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/infiniband-diags/ibdiag_common.c b/infiniband-diags/ibdiag_common.c index 9604dd984..89f955e70 100644 --- a/infiniband-diags/ibdiag_common.c +++ b/infiniband-diags/ibdiag_common.c @@ -777,6 +777,19 @@ static unsigned int get_max(unsigned int num) return (1 << r); } +static uint8_t *get_port_info_for_cap_mask(ibnd_port_t *port) +{ + uint8_t *info = NULL; + + if (port->node->type == IB_NODE_SWITCH) { + if (port->node->ports[0]) + info = (uint8_t *)&port->node->ports[0]->info; + } else + info = (uint8_t *)&port->info; + + return info; +} + void get_max_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t * port) { char buf[64]; @@ -797,24 +810,14 @@ void get_max_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t * p mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, buf, 64, &max_width)); - if (port->node->type == IB_NODE_SWITCH) { - if (port->node->ports[0]) - info = (uint8_t *)&port->node->ports[0]->info; - } - else - info = (uint8_t *)&port->info; + info = get_port_info_for_cap_mask(port); if (info) cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F); else cap_mask = 0; - info = NULL; - if (port->remoteport->node->type == IB_NODE_SWITCH) { - if (port->remoteport->node->ports[0]) - info = (uint8_t *)&port->remoteport->node->ports[0]->info; - } else - info = (uint8_t *)&port->remoteport->info; + info = get_port_info_for_cap_mask(port->remoteport); if (info) rem_cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F); @@ -845,15 +848,15 @@ void get_max_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t * p return; check_ext_speed: - espeed = ibnd_get_agg_linkspeedextsup(port->info, port->info); - e2speed = ibnd_get_agg_linkspeedextsup(port->remoteport->info, + espeed = ibnd_get_agg_linkspeedextsup(get_port_info_for_cap_mask(port), port->info); + e2speed = ibnd_get_agg_linkspeedextsup(get_port_info_for_cap_mask(port->remoteport), port->remoteport->info); if (!espeed || !e2speed) goto check_fdr10_supp; max_speed = get_max(espeed & e2speed); - espeed = ibnd_get_agg_linkspeedext(port->info, port->info); + espeed = ibnd_get_agg_linkspeedext(get_port_info_for_cap_mask(port), port->info); if ((max_speed & espeed) == 0) // we are not at the max supported extended speed diff --git a/libibnetdisc/ibnetdisc.c b/libibnetdisc/ibnetdisc.c index 5827fbe37..c20967456 100644 --- a/libibnetdisc/ibnetdisc.c +++ b/libibnetdisc/ibnetdisc.c @@ -1024,7 +1024,7 @@ int ibnd_get_agg_linkspeedext_field(void *cap_info, void *info, enum MAD_FIELDS efield, enum MAD_FIELDS e2field) { int espeed = 0, e2speed = 0; - int cap_mask = mad_get_field(cap_info, 0, IB_PORT_CAPMASK_F); + int cap_mask = cap_info ? mad_get_field(cap_info, 0, IB_PORT_CAPMASK_F) : 0; int cap_mask2 = 0; if (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS)) { @@ -1035,7 +1035,7 @@ int ibnd_get_agg_linkspeedext_field(void *cap_info, void *info, espeed = 0; if (cap_mask & be32toh(IB_PORT_CAP_HAS_CAP_MASK2)) - cap_mask2 = mad_get_field(cap_info, 0, IB_PORT_CAPMASK2_F); + cap_mask2 = cap_info ? mad_get_field(cap_info, 0, IB_PORT_CAPMASK2_F) : 0; if (cap_mask2 & be16toh(IB_PORT_CAP2_IS_EXT_SPEEDS_2_SUPPORTED)) { e2speed = (mad_get_field(info, 0, e2field) << 5);