|
@@ -770,9 +770,12 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /* preserve IF_COUNTER flag */
|
|
|
+ qpc->pri_path.vlan_control &=
|
|
|
+ MLX4_CTRL_ETH_SRC_CHECK_IF_COUNTER;
|
|
|
if (vp_oper->state.link_state == IFLA_VF_LINK_STATE_DISABLE &&
|
|
|
dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_UPDATE_QP) {
|
|
|
- qpc->pri_path.vlan_control =
|
|
|
+ qpc->pri_path.vlan_control |=
|
|
|
MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED |
|
|
|
MLX4_VLAN_CTRL_ETH_TX_BLOCK_PRIO_TAGGED |
|
|
|
MLX4_VLAN_CTRL_ETH_TX_BLOCK_UNTAGGED |
|
|
@@ -780,12 +783,12 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
|
|
|
MLX4_VLAN_CTRL_ETH_RX_BLOCK_UNTAGGED |
|
|
|
MLX4_VLAN_CTRL_ETH_RX_BLOCK_TAGGED;
|
|
|
} else if (0 != vp_oper->state.default_vlan) {
|
|
|
- qpc->pri_path.vlan_control =
|
|
|
+ qpc->pri_path.vlan_control |=
|
|
|
MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED |
|
|
|
MLX4_VLAN_CTRL_ETH_RX_BLOCK_PRIO_TAGGED |
|
|
|
MLX4_VLAN_CTRL_ETH_RX_BLOCK_UNTAGGED;
|
|
|
} else { /* priority tagged */
|
|
|
- qpc->pri_path.vlan_control =
|
|
|
+ qpc->pri_path.vlan_control |=
|
|
|
MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED |
|
|
|
MLX4_VLAN_CTRL_ETH_RX_BLOCK_TAGGED;
|
|
|
}
|
|
@@ -3762,9 +3765,6 @@ int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
update_gid(dev, inbox, (u8)slave);
|
|
|
adjust_proxy_tun_qkey(dev, vhcr, qpc);
|
|
|
orig_sched_queue = qpc->pri_path.sched_queue;
|
|
|
- err = update_vport_qp_param(dev, inbox, slave, qpn);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
|
|
|
err = get_res(dev, slave, qpn, RES_QP, &qp);
|
|
|
if (err)
|
|
@@ -3774,6 +3774,10 @@ int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ err = update_vport_qp_param(dev, inbox, slave, qpn);
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
+
|
|
|
err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
|
|
|
out:
|
|
|
/* if no error, save sched queue value passed in by VF. This is
|
|
@@ -4208,7 +4212,9 @@ static int add_eth_header(struct mlx4_dev *dev, int slave,
|
|
|
|
|
|
}
|
|
|
|
|
|
-#define MLX4_UPD_QP_PATH_MASK_SUPPORTED (1ULL << MLX4_UPD_QP_PATH_MASK_MAC_INDEX)
|
|
|
+#define MLX4_UPD_QP_PATH_MASK_SUPPORTED ( \
|
|
|
+ 1ULL << MLX4_UPD_QP_PATH_MASK_MAC_INDEX |\
|
|
|
+ 1ULL << MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_MC_LB)
|
|
|
int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
struct mlx4_vhcr *vhcr,
|
|
|
struct mlx4_cmd_mailbox *inbox,
|
|
@@ -4231,6 +4237,16 @@ int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
(pri_addr_path_mask & ~MLX4_UPD_QP_PATH_MASK_SUPPORTED))
|
|
|
return -EPERM;
|
|
|
|
|
|
+ if ((pri_addr_path_mask &
|
|
|
+ (1ULL << MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_MC_LB)) &&
|
|
|
+ !(dev->caps.flags2 &
|
|
|
+ MLX4_DEV_CAP_FLAG2_UPDATE_QP_SRC_CHECK_LB)) {
|
|
|
+ mlx4_warn(dev,
|
|
|
+ "Src check LB for slave %d isn't supported\n",
|
|
|
+ slave);
|
|
|
+ return -ENOTSUPP;
|
|
|
+ }
|
|
|
+
|
|
|
/* Just change the smac for the QP */
|
|
|
err = get_res(dev, slave, qpn, RES_QP, &rqp);
|
|
|
if (err) {
|