Skip to content

Commit 0c6807a

Browse files
authored
Merge pull request #1359 from gregoryl-mlnx/init_xdr
XDR speed decoding support
2 parents ea21e31 + 908a366 commit 0c6807a

15 files changed

+335
-97
lines changed

debian/libibnetdisc5.symbols

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,11 @@ libibnetdisc.so.5 libibnetdisc5 #MINVER#
1919
ibnd_iter_nodes_type@IBNETDISC_1.0 1.6.1
2020
ibnd_iter_ports@IBNETDISC_1.0 1.6.1
2121
ibnd_load_fabric@IBNETDISC_1.0 1.6.1
22+
ibnd_get_agg_linkspeedext_field@IBNETDISC_1.1 1.6.1
23+
ibnd_get_agg_linkspeedext@IBNETDISC_1.1 1.6.1
24+
ibnd_get_agg_linkspeedexten@IBNETDISC_1.1 1.6.1
25+
ibnd_get_agg_linkspeedextsup@IBNETDISC_1.1 1.6.1
26+
ibnd_dump_agg_linkspeedext_bits@IBNETDISC_1.1 1.6.1
27+
ibnd_dump_agg_linkspeedext@IBNETDISC_1.1 1.6.1
28+
ibnd_dump_agg_linkspeedexten@IBNETDISC_1.1 1.6.1
29+
ibnd_dump_agg_linkspeedextsup@IBNETDISC_1.1 1.6.1

infiniband-diags/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ add_library(ibdiags_tools STATIC
1313
ibdiag_sa.c
1414
)
1515

16+
target_link_libraries(ibdiags_tools LINK_PRIVATE ibnetdisc
17+
)
18+
1619
function(ibdiag_programs)
1720
foreach(I ${ARGN})
1821
rdma_sbin_executable(${I} "${I}.c")

infiniband-diags/ibdiag_common.c

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,7 @@ void get_max_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t * p
781781
{
782782
char buf[64];
783783
uint32_t max_speed = 0;
784+
uint32_t espeed = 0, e2speed = 0;
784785
uint32_t cap_mask, rem_cap_mask, fdr10;
785786
uint8_t *info = NULL;
786787

@@ -844,22 +845,21 @@ void get_max_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t * p
844845
return;
845846

846847
check_ext_speed:
847-
if (mad_get_field(port->info, 0,
848-
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F) == 0 ||
849-
mad_get_field(port->remoteport->info, 0,
850-
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F) == 0)
848+
espeed = ibnd_get_agg_linkspeedextsup(port->info, port->info);
849+
e2speed = ibnd_get_agg_linkspeedextsup(port->remoteport->info,
850+
port->remoteport->info);
851+
852+
if (!espeed || !e2speed)
851853
goto check_fdr10_supp;
852-
max_speed = get_max(mad_get_field(port->info, 0,
853-
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F)
854-
& mad_get_field(port->remoteport->info, 0,
855-
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F));
856-
if ((max_speed & mad_get_field(port->info, 0,
857-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F)) == 0)
854+
855+
max_speed = get_max(espeed & e2speed);
856+
espeed = ibnd_get_agg_linkspeedext(port->info, port->info);
857+
858+
if ((max_speed & espeed) == 0)
858859
// we are not at the max supported extended speed
859860
// print what we could be at.
860861
snprintf(speed_msg, msg_size, "Could be %s",
861-
mad_dump_val(IB_PORT_LINK_SPEED_EXT_ACTIVE_F,
862-
buf, 64, &max_speed));
862+
ibnd_dump_agg_linkspeedext(buf, 64, max_speed));
863863
return;
864864

865865
check_fdr10_active:
@@ -937,6 +937,16 @@ void dump_portinfo(void *pi, int tabs)
937937
return;
938938
printf("%s\n", buf);
939939
}
940+
941+
for (field = IB_PORT_LINK_SPEED_EXT_ACTIVE_2_F;
942+
field < IB_PORT_LINK_SPEED_EXT_2_LAST_F; field++) {
943+
for (i = 0; i < tabs; i++)
944+
printf("\t");
945+
mad_decode_field(pi, field, val);
946+
if (!mad_dump_field(field, buf, 1024, val))
947+
return;
948+
printf("%s\n", buf);
949+
}
940950
}
941951

942952
op_fn_t *match_op(const match_rec_t match_tbl[], char *name)

infiniband-diags/iblinkinfo.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static void print_port(ibnd_node_t *node, ibnd_port_t *port,
111111
char width_msg[256];
112112
char speed_msg[256];
113113
char ext_port_str[256];
114-
int iwidth, ispeed, fdr10, espeed, istate, iphystate, cap_mask;
114+
int iwidth, ispeed, fdr10, espeed, istate, iphystate;
115115
int n = 0;
116116
uint8_t *info = NULL;
117117
int rc;
@@ -132,12 +132,7 @@ static void print_port(ibnd_node_t *node, ibnd_port_t *port,
132132
info = (uint8_t *)&port->info;
133133

134134
if (info) {
135-
cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F);
136-
if (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS))
137-
espeed = mad_get_field(port->info, 0,
138-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
139-
else
140-
espeed = 0;
135+
espeed = ibnd_get_agg_linkspeedext(info, port->info);
141136
} else {
142137
ispeed = 0;
143138
iwidth = 0;
@@ -169,8 +164,7 @@ static void print_port(ibnd_node_t *node, ibnd_port_t *port,
169164
mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed,
170165
64, &ispeed);
171166
} else
172-
mad_dump_val(IB_PORT_LINK_SPEED_EXT_ACTIVE_F, speed,
173-
64, &espeed);
167+
ibnd_dump_agg_linkspeedext(speed, 64, espeed);
174168

175169
n = snprintf(link_str, 256, "(%3s %18s %6s/%8s)",
176170
mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64,

infiniband-diags/ibnetdiscover.c

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ static const char *dump_linkspeedext_compat(uint32_t espeed, uint32_t speed,
116116
break;
117117
case 8:
118118
return ("NDR");
119+
/* case 16: non used value */
120+
case 32:
121+
return ("XDR");
119122
}
120123
return ("???");
121124
}
@@ -371,7 +374,7 @@ static void out_switch_port(ibnd_port_t *port, int group,
371374
IB_PORT_VL_CAP_F);
372375
uint32_t fdr10 = mad_get_field(port->ext_info, 0,
373376
IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F);
374-
uint32_t cap_mask, espeed;
377+
uint32_t espeed;
375378

376379
DEBUG("port %p:%d remoteport %p\n", port, port->portnum,
377380
port->remoteport);
@@ -388,18 +391,12 @@ static void out_switch_port(ibnd_port_t *port, int group,
388391
ext_port_str = out_ext_port(port->remoteport, group);
389392

390393
if (!port->node->ports[0]) {
391-
cap_mask = 0;
392394
ispeed = 0;
393395
espeed = 0;
394-
} else {
395-
cap_mask = mad_get_field(port->node->ports[0]->info, 0,
396-
IB_PORT_CAPMASK_F);
397-
if (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS))
398-
espeed = mad_get_field(port->info, 0,
399-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
400-
else
401-
espeed = 0;
402-
}
396+
} else
397+
espeed = ibnd_get_agg_linkspeedext(port->node->ports[0]->info,
398+
port->info);
399+
403400
fprintf(f, "\t%s[%d]%s",
404401
node_name(port->remoteport->node), port->remoteport->portnum,
405402
ext_port_str ? ext_port_str : "");
@@ -439,7 +436,7 @@ static void out_ca_port(ibnd_port_t *port, int group, const char *out_prefix)
439436
IB_PORT_VL_CAP_F);
440437
uint32_t fdr10 = mad_get_field(port->ext_info, 0,
441438
IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F);
442-
uint32_t cap_mask, espeed;
439+
uint32_t espeed;
443440

444441
fprintf(f, "%s[%d]", out_prefix ? out_prefix : "", port->portnum);
445442
if (port->node->type != IB_NODE_SWITCH)
@@ -456,12 +453,7 @@ static void out_ca_port(ibnd_port_t *port, int group, const char *out_prefix)
456453
port->remoteport->node->guid,
457454
port->remoteport->node->nodedesc);
458455

459-
cap_mask = mad_get_field(port->info, 0, IB_PORT_CAPMASK_F);
460-
if (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS))
461-
espeed = mad_get_field(port->info, 0,
462-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
463-
else
464-
espeed = 0;
456+
espeed = ibnd_get_agg_linkspeedext(port->info, port->info);
465457

466458
fprintf(f, "\t\t# lid %d lmc %d \"%s\" lid %d %s%s",
467459
port->base_lid, port->lmc, rem_nodename,
@@ -691,11 +683,12 @@ static void dump_ports_report(ibnd_node_t *node, void *user_data)
691683
ibnd_port_t *port = NULL;
692684
char *nodename = NULL;
693685
char *rem_nodename = NULL;
686+
uint32_t espeed;
694687

695688
/* for each port */
696689
for (p = node->numports, port = node->ports[p]; p > 0;
697690
port = node->ports[--p]) {
698-
uint32_t iwidth, ispeed, fdr10, espeed, cap_mask;
691+
uint32_t iwidth, ispeed, fdr10;
699692
uint8_t *info = NULL;
700693
if (port == NULL)
701694
continue;
@@ -710,12 +703,7 @@ static void dump_ports_report(ibnd_node_t *node, void *user_data)
710703
else
711704
info = (uint8_t *)&port->info;
712705
if (info) {
713-
cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F);
714-
if (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS))
715-
espeed = mad_get_field(port->info, 0,
716-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
717-
else
718-
espeed = 0;
706+
espeed = ibnd_get_agg_linkspeedext(info, port->info);
719707
} else {
720708
ispeed = 0;
721709
iwidth = 0;

infiniband-diags/ibportstate.c

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static int get_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
138138
{
139139
uint8_t smp[IB_SMP_DATA_SIZE];
140140
uint8_t *info;
141-
int cap_mask;
141+
int cap_mask, cap_mask2;
142142

143143
if (is_switch) {
144144
if (!smp_query_via(smp, dest, IB_ATTR_PORT_INFO, 0, 0, srcport))
@@ -149,8 +149,19 @@ static int get_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
149149

150150
if (!smp_query_via(data, dest, IB_ATTR_PORT_INFO, portnum, 0, srcport))
151151
IBEXIT("smp query portinfo failed");
152+
152153
cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F);
153-
return (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS));
154+
155+
if (cap_mask & be32toh(IB_PORT_CAP_HAS_CAP_MASK2)) {
156+
cap_mask2 =
157+
(mad_get_field(info, 0, IB_PORT_CAPMASK2_F)
158+
& be16toh(IB_PORT_CAP2_IS_EXT_SPEEDS_2_SUPPORTED)) ?
159+
0x02 : 0x00;
160+
} else
161+
cap_mask2 = 0;
162+
163+
return cap_mask2
164+
| ((cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS)) ? 0x01 : 0x00);
154165
}
155166

156167
static void show_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
@@ -196,7 +207,7 @@ static void show_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
196207
mad_dump_field(IB_PORT_LINK_SPEED_ACTIVE_F, buf + strlen(buf),
197208
sizeof buf - strlen(buf), val);
198209
sprintf(buf + strlen(buf), "%s", "\n");
199-
if (espeed_cap) {
210+
if (espeed_cap & 0x01) {
200211
mad_decode_field(data, IB_PORT_LINK_SPEED_EXT_SUPPORTED_F, val);
201212
mad_dump_field(IB_PORT_LINK_SPEED_EXT_SUPPORTED_F,
202213
buf + strlen(buf), sizeof buf - strlen(buf),
@@ -213,6 +224,23 @@ static void show_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
213224
val);
214225
sprintf(buf + strlen(buf), "%s", "\n");
215226
}
227+
if (espeed_cap & 0x02) {
228+
mad_decode_field(data, IB_PORT_LINK_SPEED_EXT_SUPPORTED_2_F, val);
229+
mad_dump_field(IB_PORT_LINK_SPEED_EXT_SUPPORTED_2_F,
230+
buf + strlen(buf), sizeof(buf) - strlen(buf),
231+
val);
232+
sprintf(buf + strlen(buf), "%s", "\n");
233+
mad_decode_field(data, IB_PORT_LINK_SPEED_EXT_ENABLED_2_F, val);
234+
mad_dump_field(IB_PORT_LINK_SPEED_EXT_ENABLED_2_F,
235+
buf + strlen(buf), sizeof(buf) - strlen(buf),
236+
val);
237+
sprintf(buf + strlen(buf), "%s", "\n");
238+
mad_decode_field(data, IB_PORT_LINK_SPEED_EXT_ACTIVE_2_F, val);
239+
mad_dump_field(IB_PORT_LINK_SPEED_EXT_ACTIVE_2_F,
240+
buf + strlen(buf), sizeof(buf) - strlen(buf),
241+
val);
242+
sprintf(buf + strlen(buf), "%s", "\n");
243+
}
216244
if (!is_switch || portnum == 0) {
217245
if (show_keys) {
218246
mad_decode_field(data, IB_PORT_MKEY_F, val);
@@ -295,6 +323,9 @@ static int get_link_speed(int lse, int lss)
295323

296324
static int get_link_speed_ext(int lsee, int lses)
297325
{
326+
if (lsee & 0x20)
327+
return lsee;
328+
298329
if (lsee == 31)
299330
return lses;
300331
else
@@ -353,8 +384,12 @@ static void validate_speed(int peerspeed, int lsa)
353384

354385
static void validate_extended_speed(int peerespeed, int lsea)
355386
{
356-
357-
if ((espeed & peerespeed & 0x8)) {
387+
if ((espeed & peerespeed & 0x20)) {
388+
if (lsea != 32)
389+
IBWARN
390+
("Peer ports operating at active extended speed %d rather than 32 (212.5 Gbps)",
391+
lsea);
392+
} else if ((espeed & peerespeed & 0x8)) {
358393
if (lsea != 8)
359394
IBWARN
360395
("Peer ports operating at active extended speed %d rather than 8 (106.25 Gbps)",
@@ -387,7 +422,7 @@ int main(int argc, char **argv)
387422
int state, physstate, lwe, lws, lwa, lse, lss, lsa, lsee, lses, lsea,
388423
fdr10s, fdr10e, fdr10a;
389424
int peerlocalportnum, peerlwe, peerlws, peerlwa, peerlse, peerlss,
390-
peerlsa, peerlsee, peerlses, peerlsea, peerfdr10s, peerfdr10e,
425+
peerlsa, peerlsee, peerlses, peerfdr10s, peerfdr10e,
391426
peerfdr10a;
392427
int peerwidth, peerspeed, peerespeed;
393428
uint8_t data[IB_SMP_DATA_SIZE] = { 0 };
@@ -606,7 +641,8 @@ int main(int argc, char **argv)
606641

607642
/* always set enabled speeds/width - defaults to NOP */
608643
mad_set_field(data, 0, IB_PORT_LINK_SPEED_ENABLED_F, speed);
609-
mad_set_field(data, 0, IB_PORT_LINK_SPEED_EXT_ENABLED_F, espeed);
644+
mad_set_field(data, 0, IB_PORT_LINK_SPEED_EXT_ENABLED_F, espeed & 0x1f);
645+
mad_set_field(data, 0, IB_PORT_LINK_SPEED_EXT_ENABLED_2_F, espeed >> 5);
610646
mad_set_field(data, 0, IB_PORT_LINK_WIDTH_ENABLED_F, width);
611647

612648
if (port_args[VLS].set)
@@ -669,15 +705,13 @@ int main(int argc, char **argv)
669705
IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F,
670706
&fdr10a);
671707
if (espeed_cap) {
672-
mad_decode_field(data,
673-
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F,
674-
&lses);
675-
mad_decode_field(data,
676-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F,
677-
&lsea);
678-
mad_decode_field(data,
679-
IB_PORT_LINK_SPEED_EXT_ENABLED_F,
680-
&lsee);
708+
lsea = ibnd_get_agg_linkspeedext(data, data);
709+
lsee = ibnd_get_agg_linkspeedexten(data, data);
710+
lses = ibnd_get_agg_linkspeedextsup(data, data);
711+
} else {
712+
lsea = 0;
713+
lsee = 0;
714+
lses = 0;
681715
}
682716

683717
/* Setup portid for peer port */
@@ -743,15 +777,11 @@ int main(int argc, char **argv)
743777
IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F,
744778
&peerfdr10a);
745779
if (peer_espeed_cap) {
746-
mad_decode_field(data,
747-
IB_PORT_LINK_SPEED_EXT_SUPPORTED_F,
748-
&peerlses);
749-
mad_decode_field(data,
750-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F,
751-
&peerlsea);
752-
mad_decode_field(data,
753-
IB_PORT_LINK_SPEED_EXT_ENABLED_F,
754-
&peerlsee);
780+
peerlsee = ibnd_get_agg_linkspeedexten(data, data);
781+
peerlses = ibnd_get_agg_linkspeedextsup(data, data);
782+
} else {
783+
peerlsee = 0;
784+
peerlses = 0;
755785
}
756786

757787
/* Now validate peer port characteristics */

infiniband-diags/ibqueryerrors.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ static void print_port_config(ibnd_node_t * node, int portnum)
178178
char width_msg[256];
179179
char speed_msg[256];
180180
char ext_port_str[256];
181-
int iwidth, ispeed, fdr10, espeed, istate, iphystate, cap_mask;
181+
int iwidth, ispeed, fdr10, espeed, istate, iphystate;
182182
uint8_t *info;
183183
int rc;
184184

@@ -196,12 +196,9 @@ static void print_port_config(ibnd_node_t * node, int portnum)
196196
info = (uint8_t *)&port->node->ports[0]->info;
197197
else
198198
info = (uint8_t *)&port->info;
199-
cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F);
200-
if (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS))
201-
espeed = mad_get_field(port->info, 0,
202-
IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
203-
else
204-
espeed = 0;
199+
200+
espeed = ibnd_get_agg_linkspeedext(info, port->info);
201+
205202
istate = mad_get_field(port->info, 0, IB_PORT_STATE_F);
206203
iphystate = mad_get_field(port->info, 0, IB_PORT_PHYS_STATE_F);
207204

@@ -218,11 +215,9 @@ static void print_port_config(ibnd_node_t * node, int portnum)
218215
if (fdr10)
219216
sprintf(speed, "10.0 Gbps (FDR10)");
220217
else
221-
mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed,
222-
64, &ispeed);
218+
mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed, 64, &ispeed);
223219
} else
224-
mad_dump_val(IB_PORT_LINK_SPEED_EXT_ACTIVE_F, speed,
225-
64, &espeed);
220+
ibnd_dump_agg_linkspeedext(speed, 64, espeed);
226221

227222
snprintf(link_str, 256, "(%3s %18s %6s/%8s)",
228223
mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64, &iwidth),

0 commit comments

Comments
 (0)