162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/* Copyright 2014 Cisco Systems, Inc.  All rights reserved. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _VNIC_CQ_FW_H_
562306a36Sopenharmony_ci#define _VNIC_CQ_FW_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "snic_fwint.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic inline unsigned int
1062306a36Sopenharmony_civnic_cq_fw_service(struct vnic_cq *cq,
1162306a36Sopenharmony_ci		   int (*q_service)(struct vnic_dev *vdev,
1262306a36Sopenharmony_ci				    unsigned int index,
1362306a36Sopenharmony_ci				    struct snic_fw_req *desc),
1462306a36Sopenharmony_ci		   unsigned int work_to_do)
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	struct snic_fw_req *desc;
1862306a36Sopenharmony_ci	unsigned int work_done = 0;
1962306a36Sopenharmony_ci	u8 color;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	desc = (struct snic_fw_req *)((u8 *)cq->ring.descs +
2262306a36Sopenharmony_ci		cq->ring.desc_size * cq->to_clean);
2362306a36Sopenharmony_ci	snic_color_dec(desc, &color);
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	while (color != cq->last_color) {
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci		if ((*q_service)(cq->vdev, cq->index, desc))
2862306a36Sopenharmony_ci			break;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci		cq->to_clean++;
3162306a36Sopenharmony_ci		if (cq->to_clean == cq->ring.desc_count) {
3262306a36Sopenharmony_ci			cq->to_clean = 0;
3362306a36Sopenharmony_ci			cq->last_color = cq->last_color ? 0 : 1;
3462306a36Sopenharmony_ci		}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci		desc = (struct snic_fw_req *)((u8 *)cq->ring.descs +
3762306a36Sopenharmony_ci			cq->ring.desc_size * cq->to_clean);
3862306a36Sopenharmony_ci		snic_color_dec(desc, &color);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci		work_done++;
4162306a36Sopenharmony_ci		if (work_done >= work_to_do)
4262306a36Sopenharmony_ci			break;
4362306a36Sopenharmony_ci	}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	return work_done;
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#endif /* _VNIC_CQ_FW_H_ */
49