| @@ -95,7 +95,8 @@ static int mlx4_MGID_HASH(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox · 94 unmodified lines |
| 95 | 95 | * entry in hash chain and *mgm holds end of hash chain. |
| 96 | 96 | */ |
| 97 | 97 | static int find_mgm(struct mlx4_dev *dev, |
| 98 | | − u8 *gid, struct mlx4_cmd_mailbox *mgm_mailbox, |
| 98 | + u8 *gid, enum mlx4_protocol protocol, |
| 99 | + struct mlx4_cmd_mailbox *mgm_mailbox, |
| 99 | 100 | u16 *hash, int *prev, int *index) |
| 100 | 101 | { |
| 101 | 102 | struct mlx4_cmd_mailbox *mailbox; |
| @@ -134,7 +135,8 @@ static int find_mgm(struct mlx4_dev *dev, · 32 unmodified lines |
| 134 | 135 | return err; |
| 135 | 136 | } |
| 136 | 137 | |
| 137 | | − if (!memcmp(mgm->gid, gid, 16)) |
| 138 | + if (!memcmp(mgm->gid, gid, 16) && |
| 139 | + be32_to_cpu(mgm->members_count) >> 30 == protocol) |
| 138 | 140 | return err; |
| 139 | 141 | |
| 140 | 142 | *prev = *index; |
| @@ -146,7 +148,7 @@ static int find_mgm(struct mlx4_dev *dev, · 5 unmodified lines |
| 146 | 148 | } |
| 147 | 149 | |
| 148 | 150 | int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], |
| 149 | | − int block_mcast_loopback) |
| 151 | + int block_mcast_loopback, enum mlx4_protocol protocol) |
| 150 | 152 | { |
| 151 | 153 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 152 | 154 | struct mlx4_cmd_mailbox *mailbox; |
| @@ -165,7 +167,7 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], · 12 unmodified lines |
| 165 | 167 | |
| 166 | 168 | mutex_lock(&priv->mcg_table.mutex); |
| 167 | 169 | |
| 168 | | − err = find_mgm(dev, gid, mailbox, &hash, &prev, &index); |
| 170 | + err = find_mgm(dev, gid, protocol, mailbox, &hash, &prev, &index); |
| 169 | 171 | if (err) |
| 170 | 172 | goto out; |
| 171 | 173 | |
| @@ -187,7 +189,7 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], · 15 unmodified lines |
| 187 | 189 | memcpy(mgm->gid, gid, 16); |
| 188 | 190 | } |
| 189 | 191 | |
| 190 | | − members_count = be32_to_cpu(mgm->members_count); |
| 192 | + members_count = be32_to_cpu(mgm->members_count) & 0xffffff; |
| 191 | 193 | if (members_count == MLX4_QP_PER_MGM) { |
| 192 | 194 | mlx4_err(dev, "MGM at index %x is full.\n", index); |
| 193 | 195 | err = -ENOMEM; |
| @@ -207,7 +209,7 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], · 13 unmodified lines |
| 207 | 209 | else |
| 208 | 210 | mgm->qp[members_count++] = cpu_to_be32(qp->qpn & MGM_QPN_MASK); |
| 209 | 211 | |
| 210 | | − mgm->members_count = cpu_to_be32(members_count); |
| 212 | + mgm->members_count = cpu_to_be32(members_count | (u32) protocol << 30); |
| 211 | 213 | |
| 212 | 214 | err = mlx4_WRITE_MCG(dev, index, mailbox); |
| 213 | 215 | if (err) |
| @@ -242,7 +244,8 @@ out: · 28 unmodified lines |
| 242 | 244 | } |
| 243 | 245 | EXPORT_SYMBOL_GPL(mlx4_multicast_attach); |
| 244 | 246 | |
| 245 | | −int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) |
| 247 | +int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], |
| 248 | + enum mlx4_protocol protocol) |
| 246 | 249 | { |
| 247 | 250 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 248 | 251 | struct mlx4_cmd_mailbox *mailbox; |
| @@ -260,7 +263,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) · 11 unmodified lines |
| 260 | 263 | |
| 261 | 264 | mutex_lock(&priv->mcg_table.mutex); |
| 262 | 265 | |
| 263 | | − err = find_mgm(dev, gid, mailbox, &hash, &prev, &index); |
| 266 | + err = find_mgm(dev, gid, protocol, mailbox, &hash, &prev, &index); |
| 264 | 267 | if (err) |
| 265 | 268 | goto out; |
| 266 | 269 | |
| @@ -270,7 +273,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) · 3 unmodified lines |
| 270 | 273 | goto out; |
| 271 | 274 | } |
| 272 | 275 | |
| 273 | | − members_count = be32_to_cpu(mgm->members_count); |
| 276 | + members_count = be32_to_cpu(mgm->members_count) & 0xffffff; |
| 274 | 277 | for (loc = -1, i = 0; i < members_count; ++i) |
| 275 | 278 | if ((be32_to_cpu(mgm->qp[i]) & MGM_QPN_MASK) == qp->qpn) |
| 276 | 279 | loc = i; |
| @@ -282,7 +285,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) · 5 unmodified lines |
| 282 | 285 | } |
| 283 | 286 | |
| 284 | 287 | |
| 285 | | − mgm->members_count = cpu_to_be32(--members_count); |
| 288 | + mgm->members_count = cpu_to_be32(--members_count | (u32) protocol << 30); |
| 286 | 289 | mgm->qp[loc] = mgm->qp[i - 1]; |
| 287 | 290 | mgm->qp[i - 1] = 0; |
| 288 | 291 | |