@@ -182,7 +182,7 @@ static ib_api_status_t sl2vl_update_table(osm_sm_t * sm, osm_physp_t * p,
tbl.raw_vl_by_sl[i] = (vl1 << 4) | vl2;
}
- if (!force_update && (p_tbl = osm_physp_get_slvl_tbl(p, in_port)) &&
+ if (!force_update && in_port && (p_tbl = osm_physp_get_slvl_tbl(p, in_port)) &&
!memcmp(p_tbl, &tbl, sizeof(tbl)))
return IB_SUCCESS;
@@ -209,6 +209,7 @@ static int qos_extports_setup(osm_sm_t * sm, osm_node_t *node,
unsigned num_ports = osm_node_get_num_physp(node);
int ret = 0;
unsigned i, j;
+ uint8_t op_vl1;
for (i = 1; i < num_ports; i++) {
p = osm_node_get_physp_ptr(node, i);
@@ -225,17 +226,31 @@ static int qos_extports_setup(osm_sm_t * sm, osm_node_t *node,
if (ib_switch_info_get_opt_sl2vlmapping(&node->sw->switch_info) &&
sm->p_subn->opt.use_optimized_slvl) {
p = osm_node_get_physp_ptr(node, 1);
+ op_vl1 = ib_port_info_get_op_vls(&p->port_info);
force_update = p->need_update || sm->p_subn->need_update;
- return sl2vl_update_table(sm, p, 1, 0x30000, force_update,
- &qcfg->sl2vl);
+ if (sl2vl_update_table(sm, p, 0, 0x30000, force_update,
+ &qcfg->sl2vl))
+ ret = -1;
+ /* overwrite default ALL configuration if port's
+ op_vl is different */
+ for (i = 2; i < num_ports; i++) {
+ p = osm_node_get_physp_ptr(node, i);
+ if (ib_port_info_get_op_vls(&p->port_info) != op_vl1 &&
+ sl2vl_update_table(sm, p, 0, 0x20000 | i, force_update,
+ &qcfg->sl2vl))
+ ret = -1;
+ }
+ return ret;
}
- for (i = 0; i < num_ports; i++) {
+ /* non optimized sl2vl configuration */
+ i = ib_switch_info_is_enhanced_port0(&node->sw->switch_info) ? 0 : 1;
+ for (; i < num_ports; i++) {
p = osm_node_get_physp_ptr(node, i);
force_update = p->need_update || sm->p_subn->need_update;
j = ib_switch_info_is_enhanced_port0(&node->sw->switch_info) ? 0 : 1;
for (; j < num_ports; j++)
- if (sl2vl_update_table(sm, p, i, i << 8 | j,
+ if (sl2vl_update_table(sm, p, j, j << 8 | i,
force_update, &qcfg->sl2vl))
ret = -1;
}