|
@@ -95,7 +95,8 @@ static int mlx4_MGID_HASH(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox
|
|
|
* entry in hash chain and *mgm holds end of hash chain.
|
|
|
*/
|
|
|
static int find_mgm(struct mlx4_dev *dev,
|
|
|
- u8 *gid, struct mlx4_cmd_mailbox *mgm_mailbox,
|
|
|
+ u8 *gid, enum mlx4_protocol protocol,
|
|
|
+ struct mlx4_cmd_mailbox *mgm_mailbox,
|
|
|
u16 *hash, int *prev, int *index)
|
|
|
{
|
|
|
struct mlx4_cmd_mailbox *mailbox;
|
|
@@ -134,7 +135,8 @@ static int find_mgm(struct mlx4_dev *dev,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
- if (!memcmp(mgm->gid, gid, 16))
|
|
|
+ if (!memcmp(mgm->gid, gid, 16) &&
|
|
|
+ be32_to_cpu(mgm->members_count) >> 30 == protocol)
|
|
|
return err;
|
|
|
|
|
|
*prev = *index;
|
|
@@ -146,7 +148,7 @@ static int find_mgm(struct mlx4_dev *dev,
|
|
|
}
|
|
|
|
|
|
int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
|
|
|
- int block_mcast_loopback)
|
|
|
+ int block_mcast_loopback, enum mlx4_protocol protocol)
|
|
|
{
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
struct mlx4_cmd_mailbox *mailbox;
|
|
@@ -165,7 +167,7 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
|
|
|
|
|
|
mutex_lock(&priv->mcg_table.mutex);
|
|
|
|
|
|
- err = find_mgm(dev, gid, mailbox, &hash, &prev, &index);
|
|
|
+ err = find_mgm(dev, gid, protocol, mailbox, &hash, &prev, &index);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
@@ -187,7 +189,7 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
|
|
|
memcpy(mgm->gid, gid, 16);
|
|
|
}
|
|
|
|
|
|
- members_count = be32_to_cpu(mgm->members_count);
|
|
|
+ members_count = be32_to_cpu(mgm->members_count) & 0xffffff;
|
|
|
if (members_count == MLX4_QP_PER_MGM) {
|
|
|
mlx4_err(dev, "MGM at index %x is full.\n", index);
|
|
|
err = -ENOMEM;
|
|
@@ -207,7 +209,7 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
|
|
|
else
|
|
|
mgm->qp[members_count++] = cpu_to_be32(qp->qpn & MGM_QPN_MASK);
|
|
|
|
|
|
- mgm->members_count = cpu_to_be32(members_count);
|
|
|
+ mgm->members_count = cpu_to_be32(members_count | (u32) protocol << 30);
|
|
|
|
|
|
err = mlx4_WRITE_MCG(dev, index, mailbox);
|
|
|
if (err)
|
|
@@ -242,7 +244,8 @@ out:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(mlx4_multicast_attach);
|
|
|
|
|
|
-int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16])
|
|
|
+int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
|
|
|
+ enum mlx4_protocol protocol)
|
|
|
{
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
struct mlx4_cmd_mailbox *mailbox;
|
|
@@ -260,7 +263,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16])
|
|
|
|
|
|
mutex_lock(&priv->mcg_table.mutex);
|
|
|
|
|
|
- err = find_mgm(dev, gid, mailbox, &hash, &prev, &index);
|
|
|
+ err = find_mgm(dev, gid, protocol, mailbox, &hash, &prev, &index);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
@@ -270,7 +273,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16])
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- members_count = be32_to_cpu(mgm->members_count);
|
|
|
+ members_count = be32_to_cpu(mgm->members_count) & 0xffffff;
|
|
|
for (loc = -1, i = 0; i < members_count; ++i)
|
|
|
if ((be32_to_cpu(mgm->qp[i]) & MGM_QPN_MASK) == qp->qpn)
|
|
|
loc = i;
|
|
@@ -282,7 +285,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16])
|
|
|
}
|
|
|
|
|
|
|
|
|
- mgm->members_count = cpu_to_be32(--members_count);
|
|
|
+ mgm->members_count = cpu_to_be32(--members_count | (u32) protocol << 30);
|
|
|
mgm->qp[loc] = mgm->qp[i - 1];
|
|
|
mgm->qp[i - 1] = 0;
|
|
|
|