/** * dpaa2_io_irq() - ISR for DPIO interrupts * * @obj: the given DPIO object. * * Return IRQ_HANDLED for success or IRQ_NONE if there * were no pending interrupts. */ irqreturn_t dpaa2_io_irq(struct dpaa2_io *obj) { const struct dpaa2_dq *dq; int max = 0; struct qbman_swp *swp; u32 status; swp = obj->swp; status = qbman_swp_interrupt_read_status(swp); if (!status) return IRQ_NONE; dq = qbman_swp_dqrr_next(swp); while (dq) { if (qbman_result_is_SCN(dq)) { struct dpaa2_io_notification_ctx *ctx; u64 q64; q64 = qbman_result_SCN_ctx(dq); ctx = (void *)q64; ctx->cb(ctx); } else { pr_crit("fsl-mc-dpio: Unrecognised/ignored DQRR entry\n"); } qbman_swp_dqrr_consume(swp, dq); ++max; if (max > DPAA_POLL_MAX) goto done; dq = qbman_swp_dqrr_next(swp); } done: qbman_swp_interrupt_clear_status(swp, status); qbman_swp_interrupt_set_inhibit(swp, 0); return IRQ_HANDLED; }
static int ldpaa_eth_pull_dequeue_rx(struct eth_device *dev) { struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)dev->priv; const struct ldpaa_dq *dq; const struct dpaa_fd *fd; int i = 5, err = 0, status; u32 timeo = (CONFIG_SYS_HZ * 2) / 1000; u32 time_start; static struct qbman_pull_desc pulldesc; struct qbman_swp *swp = dflt_dpio->sw_portal; while (--i) { qbman_pull_desc_clear(&pulldesc); qbman_pull_desc_set_numframes(&pulldesc, 1); qbman_pull_desc_set_fq(&pulldesc, priv->rx_dflt_fqid); err = qbman_swp_pull(swp, &pulldesc); if (err < 0) { printf("Dequeue frames error:0x%08x\n", err); continue; } time_start = get_timer(0); do { dq = qbman_swp_dqrr_next(swp); } while (get_timer(time_start) < timeo && !dq); if (dq) { /* Check for valid frame. If not sent a consume * confirmation to QBMAN otherwise give it to NADK * application and then send consume confirmation to * QBMAN. */ status = (uint8_t)ldpaa_dq_flags(dq); if ((status & LDPAA_DQ_STAT_VALIDFRAME) == 0) { debug("Dequeue RX frames:"); debug("No frame delivered\n"); qbman_swp_dqrr_consume(swp, dq); continue; } fd = ldpaa_dq_fd(dq); /* Obtain FD and process it */ ldpaa_eth_rx(priv, fd); qbman_swp_dqrr_consume(swp, dq); break; } else { err = -ENODATA; debug("No DQRR entries\n"); break; } } return err; }