IB/mlx4: Handle protocol field in multicast table
The newest device firmware stores IB vs. Ethernet protocol in two bits in members_count field of multicast group table (0: Infiniband, 1: Ethernet). When changing the QP members count for a multicast group, it important not to reset this information. When calling multicast attach first time, the protocol type should be specified. In this patch we always set it IB, but in the future we will handle Ethernet too. When looking for a QP, the protocol type shoud be checked too. Signed-off-by: Aleksey Senin <alekseys@voltaire.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
committed by
Roland Dreier
parent
4979d18fe1
commit
da995a8aee
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user