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; }
/** * dpaa2_io_service_pull_fq() - pull dequeue functions from a fq. * @d: the given DPIO service. * @fqid: the given frame queue id. * @s: the dpaa2_io_store object for the result. * * Return 0 for success, or error code for failure. */ int dpaa2_io_service_pull_fq(struct dpaa2_io *d, u32 fqid, struct dpaa2_io_store *s) { struct qbman_pull_desc pd; int err; qbman_pull_desc_clear(&pd); qbman_pull_desc_set_storage(&pd, s->vaddr, s->paddr, 1); qbman_pull_desc_set_numframes(&pd, (u8)s->max); qbman_pull_desc_set_fq(&pd, fqid); d = service_select(d); if (!d) return -ENODEV; s->swp = d->swp; err = qbman_swp_pull(d->swp, &pd); if (err) s->swp = NULL; return err; }