Handles Rearm Queue completions in periodic service. */
| 645 | |
| 646 | /* Handles Rearm Queue completions in periodic service. */ |
| 647 | static __rte_always_inline void |
| 648 | mlx5_txpp_handle_rearm_queue(struct mlx5_dev_ctx_shared *sh) |
| 649 | { |
| 650 | struct mlx5_txpp_wq *wq = &sh->txpp.rearm_queue; |
| 651 | uint32_t cq_ci = wq->cq_ci; |
| 652 | bool error = false; |
| 653 | int ret; |
| 654 | |
| 655 | do { |
| 656 | volatile struct mlx5_cqe *cqe; |
| 657 | |
| 658 | cqe = &wq->cq_obj.cqes[cq_ci & (MLX5_TXPP_REARM_CQ_SIZE - 1)]; |
| 659 | ret = check_cqe(cqe, MLX5_TXPP_REARM_CQ_SIZE, cq_ci); |
| 660 | switch (ret) { |
| 661 | case MLX5_CQE_STATUS_ERR: |
| 662 | error = true; |
| 663 | ++cq_ci; |
| 664 | break; |
| 665 | case MLX5_CQE_STATUS_SW_OWN: |
| 666 | wq->sq_ci += 2; |
| 667 | ++cq_ci; |
| 668 | break; |
| 669 | case MLX5_CQE_STATUS_HW_OWN: |
| 670 | break; |
| 671 | default: |
| 672 | MLX5_ASSERT(false); |
| 673 | break; |
| 674 | } |
| 675 | } while (ret != MLX5_CQE_STATUS_HW_OWN); |
| 676 | if (likely(cq_ci != wq->cq_ci)) { |
| 677 | /* Check whether we have missed interrupts. */ |
| 678 | if (cq_ci - wq->cq_ci != 1) { |
| 679 | DRV_LOG(DEBUG, "Rearm Queue missed interrupt."); |
| 680 | __atomic_fetch_add(&sh->txpp.err_miss_int, |
| 681 | 1, __ATOMIC_RELAXED); |
| 682 | /* Check sync lost on wqe index. */ |
| 683 | if (cq_ci - wq->cq_ci >= |
| 684 | (((1UL << MLX5_WQ_INDEX_WIDTH) / |
| 685 | MLX5_TXPP_REARM) - 1)) |
| 686 | error = 1; |
| 687 | } |
| 688 | /* Update doorbell record to notify hardware. */ |
| 689 | rte_compiler_barrier(); |
| 690 | *wq->cq_obj.db_rec = rte_cpu_to_be_32(cq_ci); |
| 691 | rte_wmb(); |
| 692 | wq->cq_ci = cq_ci; |
| 693 | /* Fire new requests to Rearm Queue. */ |
| 694 | if (error) { |
| 695 | DRV_LOG(DEBUG, "Rearm Queue error sync lost."); |
| 696 | __atomic_fetch_add(&sh->txpp.err_rearm_queue, |
| 697 | 1, __ATOMIC_RELAXED); |
| 698 | sh->txpp.sync_lost = 1; |
| 699 | } |
| 700 | } |
| 701 | } |
| 702 | |
| 703 | /* Handles Clock Queue completions in periodic service. */ |
| 704 | static __rte_always_inline void |
no test coverage detected