}
static bool
-ionic_adminq_service(struct ionic_cq *cq, uint32_t cq_desc_index,
+ionic_adminq_service(struct ionic_cq *cq, uint16_t cq_desc_index,
void *cb_arg __rte_unused)
{
struct ionic_admin_comp *cq_desc_base = cq->base;
struct ionic_qcq *qcq = IONIC_CQ_TO_QCQ(cq);
struct ionic_queue *q = &qcq->q;
struct ionic_admin_ctx *ctx;
- struct ionic_desc_info *desc_info;
uint16_t curr_q_tail_idx;
uint16_t stop_index;
+ void **info;
if (!color_match(cq_desc->color, cq->done_color))
return false;
stop_index = rte_le_to_cpu_16(cq_desc->comp_index);
do {
- desc_info = &q->info[q->tail_idx];
+ info = IONIC_INFO_PTR(q, q->tail_idx);
- ctx = desc_info->cb_arg;
+ ctx = info[0];
if (ctx) {
memcpy(&ctx->comp, cq_desc, sizeof(*cq_desc));
}
curr_q_tail_idx = q->tail_idx;
- q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1);
+ q->tail_idx = Q_NEXT_TO_SRVC(q, 1);
} while (curr_q_tail_idx != stop_index);
return true;
static int
ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
{
- struct ionic_queue *q = &lif->adminqcq->q;
+ struct ionic_queue *q = &lif->adminqcq->qcq.q;
struct ionic_admin_cmd *q_desc_base = q->base;
struct ionic_admin_cmd *q_desc;
+ void **info;
int err = 0;
rte_spinlock_lock(&lif->adminq_lock);
memcpy(q_desc, &ctx->cmd, sizeof(ctx->cmd));
- ionic_q_post(q, true, NULL, ctx);
+ info = IONIC_INFO_PTR(q, q->head_idx);
+ info[0] = ctx;
+
+ q->head_idx = Q_NEXT_TO_POST(q, 1);
+
+ /* Ring doorbell */
+ rte_wmb();
+ ionic_q_flush(q);
err_out:
rte_spinlock_unlock(&lif->adminq_lock);
*/
rte_spinlock_lock(&lif->adminq_service_lock);
- ionic_qcq_service(lif->adminqcq, budget,
+ ionic_qcq_service(&lif->adminqcq->qcq, budget,
ionic_adminq_service, NULL);
rte_spinlock_unlock(&lif->adminq_service_lock);
if (idev->port_info)
return 0;
- idev->port_info_sz = RTE_ALIGN(sizeof(*idev->port_info), PAGE_SIZE);
+ idev->port_info_sz = RTE_ALIGN(sizeof(*idev->port_info),
+ rte_mem_page_size());
snprintf(z_name, sizeof(z_name), "%s_port_%s_info",
IONIC_DRV_NAME, adapter->name);