> +static void mana_gd_deregiser_irq(struct gdma_queue *queue) > +{ > + struct gdma_dev *gd = queue->gdma_dev; > + struct gdma_irq_context *gic; > + struct gdma_context *gc; > + struct gdma_resource *r; > + unsigned int msix_index; > + unsigned long flags; > + > + /* At most num_online_cpus() + 1 interrupts are used. */ > + msix_index = queue->eq.msix_index; > + if (WARN_ON(msix_index > num_online_cpus())) > + return; Do you handle hot{un}plug of CPUs? > +static void mana_hwc_init_event_handler(void *ctx, struct gdma_queue *q_self, > + struct gdma_event *event) > +{ > + struct hw_channel_context *hwc = ctx; > + struct gdma_dev *gd = hwc->gdma_dev; > + union hwc_init_type_data type_data; > + union hwc_init_eq_id_db eq_db; > + u32 type, val; > + > + switch (event->type) { > + case GDMA_EQE_HWC_INIT_EQ_ID_DB: > + eq_db.as_uint32 = event->details[0]; > + hwc->cq->gdma_eq->id = eq_db.eq_id; > + gd->doorbell = eq_db.doorbell; > + break; > + > + case GDMA_EQE_HWC_INIT_DATA: > + > + type_data.as_uint32 = event->details[0]; > + > + case GDMA_EQE_HWC_INIT_DONE: > + complete(&hwc->hwc_init_eqe_comp); > + break; ... > + default: > + WARN_ON(1); > + break; > + } Are these events from the firmware? If you have newer firmware with an older driver, are you going to spam the kernel log with WARN_ON dumps? > +static int mana_move_wq_tail(struct gdma_queue *wq, u32 num_units) > +{ > + u32 used_space_old; > + u32 used_space_new; > + > + used_space_old = wq->head - wq->tail; > + used_space_new = wq->head - (wq->tail + num_units); > + > + if (used_space_new > used_space_old) { > + WARN_ON(1); > + return -ERANGE; > + } You could replace the 1 by the condition. There are a couple of these. Andrew