diff options
Diffstat (limited to 'drivers/infiniband/hw/nes/nes_utils.c')
-rw-r--r-- | drivers/infiniband/hw/nes/nes_utils.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/drivers/infiniband/hw/nes/nes_utils.c b/drivers/infiniband/hw/nes/nes_utils.c index fe83d1b2b177..fb8cbd71a2ef 100644 --- a/drivers/infiniband/hw/nes/nes_utils.c +++ b/drivers/infiniband/hw/nes/nes_utils.c | |||
@@ -567,12 +567,36 @@ struct nes_cqp_request *nes_get_cqp_request(struct nes_device *nesdev) | |||
567 | return cqp_request; | 567 | return cqp_request; |
568 | } | 568 | } |
569 | 569 | ||
570 | void nes_free_cqp_request(struct nes_device *nesdev, | ||
571 | struct nes_cqp_request *cqp_request) | ||
572 | { | ||
573 | unsigned long flags; | ||
574 | |||
575 | nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n", | ||
576 | cqp_request, | ||
577 | le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX]) & 0x3f); | ||
578 | |||
579 | if (cqp_request->dynamic) { | ||
580 | kfree(cqp_request); | ||
581 | } else { | ||
582 | spin_lock_irqsave(&nesdev->cqp.lock, flags); | ||
583 | list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs); | ||
584 | spin_unlock_irqrestore(&nesdev->cqp.lock, flags); | ||
585 | } | ||
586 | } | ||
587 | |||
588 | void nes_put_cqp_request(struct nes_device *nesdev, | ||
589 | struct nes_cqp_request *cqp_request) | ||
590 | { | ||
591 | if (atomic_dec_and_test(&cqp_request->refcount)) | ||
592 | nes_free_cqp_request(nesdev, cqp_request); | ||
593 | } | ||
570 | 594 | ||
571 | /** | 595 | /** |
572 | * nes_post_cqp_request | 596 | * nes_post_cqp_request |
573 | */ | 597 | */ |
574 | void nes_post_cqp_request(struct nes_device *nesdev, | 598 | void nes_post_cqp_request(struct nes_device *nesdev, |
575 | struct nes_cqp_request *cqp_request, int ring_doorbell) | 599 | struct nes_cqp_request *cqp_request) |
576 | { | 600 | { |
577 | struct nes_hw_cqp_wqe *cqp_wqe; | 601 | struct nes_hw_cqp_wqe *cqp_wqe; |
578 | unsigned long flags; | 602 | unsigned long flags; |
@@ -600,10 +624,9 @@ void nes_post_cqp_request(struct nes_device *nesdev, | |||
600 | nesdev->cqp.sq_head, nesdev->cqp.sq_tail, nesdev->cqp.sq_size, | 624 | nesdev->cqp.sq_head, nesdev->cqp.sq_tail, nesdev->cqp.sq_size, |
601 | cqp_request->waiting, atomic_read(&cqp_request->refcount)); | 625 | cqp_request->waiting, atomic_read(&cqp_request->refcount)); |
602 | barrier(); | 626 | barrier(); |
603 | if (ring_doorbell) { | 627 | |
604 | /* Ring doorbell (1 WQEs) */ | 628 | /* Ring doorbell (1 WQEs) */ |
605 | nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x01800000 | nesdev->cqp.qp_id); | 629 | nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x01800000 | nesdev->cqp.qp_id); |
606 | } | ||
607 | 630 | ||
608 | barrier(); | 631 | barrier(); |
609 | } else { | 632 | } else { |