Skip to content

Commit

Permalink
rdma-core/infiniband-diags: use correct port info to get cap_mask for…
Browse files Browse the repository at this point in the history
… 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 <[email protected]>
  • Loading branch information
mazorasaf committed Jan 30, 2025
1 parent b30c36d commit a848444
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 17 deletions.
33 changes: 18 additions & 15 deletions infiniband-diags/ibdiag_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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);
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions libibnetdisc/ibnetdisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand All @@ -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);
Expand Down

0 comments on commit a848444

Please sign in to comment.