| @@ -95,7 +95,8 @@ static int mlx4_MGID_HASH(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox · 94 unmodified lines |
| 95 | * entry in hash chain and *mgm holds end of hash chain. | 95 | * entry in hash chain and *mgm holds end of hash chain. |
| 96 | */ | 96 | */ |
| 97 | static int find_mgm(struct mlx4_dev *dev, | 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 | u16 *hash, int *prev, int *index) | 100 | u16 *hash, int *prev, int *index) |
| 100 | { | 101 | { |
| 101 | struct mlx4_cmd_mailbox *mailbox; | 102 | struct mlx4_cmd_mailbox *mailbox; |
| @@ -134,7 +135,8 @@ static int find_mgm(struct mlx4_dev *dev, · 32 unmodified lines |
| 134 | return err; | 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 | return err; | 140 | return err; |
| 139 | | 141 | |
| 140 | *prev = *index; | 142 | *prev = *index; |
| @@ -146,7 +148,7 @@ static int find_mgm(struct mlx4_dev *dev, · 5 unmodified lines |
| 146 | } | 148 | } |
| 147 | | 149 | |
| 148 | int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16], | 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 | struct mlx4_priv *priv = mlx4_priv(dev); | 153 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 152 | struct mlx4_cmd_mailbox *mailbox; | 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 | mutex_lock(&priv->mcg_table.mutex); | 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 | if (err) | 171 | if (err) |
| 170 | goto out; | 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 | memcpy(mgm->gid, gid, 16); | 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 | if (members_count == MLX4_QP_PER_MGM) { | 193 | if (members_count == MLX4_QP_PER_MGM) { |
| 192 | mlx4_err(dev, "MGM at index %x is full.\n", index); | 194 | mlx4_err(dev, "MGM at index %x is full.\n", index); |
| 193 | err = -ENOMEM; | 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 | else | 209 | else |
| 208 | mgm->qp[members_count++] = cpu_to_be32(qp->qpn & MGM_QPN_MASK); | 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 | err = mlx4_WRITE_MCG(dev, index, mailbox); | 214 | err = mlx4_WRITE_MCG(dev, index, mailbox); |
| 213 | if (err) | 215 | if (err) |
| @@ -242,7 +244,8 @@ out: · 28 unmodified lines |
| 242 | } | 244 | } |
| 243 | EXPORT_SYMBOL_GPL(mlx4_multicast_attach); | 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 | struct mlx4_priv *priv = mlx4_priv(dev); | 250 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 248 | struct mlx4_cmd_mailbox *mailbox; | 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 | mutex_lock(&priv->mcg_table.mutex); | 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 | if (err) | 267 | if (err) |
| 265 | goto out; | 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 | goto out; | 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 | for (loc = -1, i = 0; i < members_count; ++i) | 277 | for (loc = -1, i = 0; i < members_count; ++i) |
| 275 | if ((be32_to_cpu(mgm->qp[i]) & MGM_QPN_MASK) == qp->qpn) | 278 | if ((be32_to_cpu(mgm->qp[i]) & MGM_QPN_MASK) == qp->qpn) |
| 276 | loc = i; | 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 | mgm->qp[loc] = mgm->qp[i - 1]; | 289 | mgm->qp[loc] = mgm->qp[i - 1]; |
| 287 | mgm->qp[i - 1] = 0; | 290 | mgm->qp[i - 1] = 0; |
| 288 | | 291 | |