diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx4/cq.c')
-rw-r--r-- | drivers/infiniband/hw/mlx4/cq.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index b2a290c6703a..660b27aecae5 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -354,8 +354,8 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq, | |||
354 | if (is_send) { | 354 | if (is_send) { |
355 | wq = &(*cur_qp)->sq; | 355 | wq = &(*cur_qp)->sq; |
356 | wqe_ctr = be16_to_cpu(cqe->wqe_index); | 356 | wqe_ctr = be16_to_cpu(cqe->wqe_index); |
357 | wq->tail += wqe_ctr - (u16) wq->tail; | 357 | wq->tail += (u16) (wqe_ctr - (u16) wq->tail); |
358 | wc->wr_id = wq->wrid[wq->tail & (wq->max - 1)]; | 358 | wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)]; |
359 | ++wq->tail; | 359 | ++wq->tail; |
360 | } else if ((*cur_qp)->ibqp.srq) { | 360 | } else if ((*cur_qp)->ibqp.srq) { |
361 | srq = to_msrq((*cur_qp)->ibqp.srq); | 361 | srq = to_msrq((*cur_qp)->ibqp.srq); |
@@ -364,7 +364,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq, | |||
364 | mlx4_ib_free_srq_wqe(srq, wqe_ctr); | 364 | mlx4_ib_free_srq_wqe(srq, wqe_ctr); |
365 | } else { | 365 | } else { |
366 | wq = &(*cur_qp)->rq; | 366 | wq = &(*cur_qp)->rq; |
367 | wc->wr_id = wq->wrid[wq->tail & (wq->max - 1)]; | 367 | wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)]; |
368 | ++wq->tail; | 368 | ++wq->tail; |
369 | } | 369 | } |
370 | 370 | ||
@@ -478,7 +478,8 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq) | |||
478 | { | 478 | { |
479 | u32 prod_index; | 479 | u32 prod_index; |
480 | int nfreed = 0; | 480 | int nfreed = 0; |
481 | struct mlx4_cqe *cqe; | 481 | struct mlx4_cqe *cqe, *dest; |
482 | u8 owner_bit; | ||
482 | 483 | ||
483 | /* | 484 | /* |
484 | * First we need to find the current producer index, so we | 485 | * First we need to find the current producer index, so we |
@@ -501,9 +502,13 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq) | |||
501 | if (srq && !(cqe->owner_sr_opcode & MLX4_CQE_IS_SEND_MASK)) | 502 | if (srq && !(cqe->owner_sr_opcode & MLX4_CQE_IS_SEND_MASK)) |
502 | mlx4_ib_free_srq_wqe(srq, be16_to_cpu(cqe->wqe_index)); | 503 | mlx4_ib_free_srq_wqe(srq, be16_to_cpu(cqe->wqe_index)); |
503 | ++nfreed; | 504 | ++nfreed; |
504 | } else if (nfreed) | 505 | } else if (nfreed) { |
505 | memcpy(get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe), | 506 | dest = get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe); |
506 | cqe, sizeof *cqe); | 507 | owner_bit = dest->owner_sr_opcode & MLX4_CQE_OWNER_MASK; |
508 | memcpy(dest, cqe, sizeof *cqe); | ||
509 | dest->owner_sr_opcode = owner_bit | | ||
510 | (dest->owner_sr_opcode & ~MLX4_CQE_OWNER_MASK); | ||
511 | } | ||
507 | } | 512 | } |
508 | 513 | ||
509 | if (nfreed) { | 514 | if (nfreed) { |