On Mon, 14 Oct 2019 12:25:17 +0300, Ioana Ciornei wrote: > From: Ioana Radulescu <[email protected]> > > Depending on when MC connects the DPNI to a MAC, Tx FQIDs may > not be available during probe time. > > Read the FQIDs each time the link goes up to avoid using invalid > values. In case an error occurs or an invalid value is retrieved, > fall back to QDID-based enqueueing. > > Fixes: 1fa0f68c9255 ("dpaa2-eth: Use FQ-based DPIO enqueue API") > Signed-off-by: Ioana Radulescu <[email protected]> > Signed-off-by: Ioana Ciornei <[email protected]> > --- > Changes in v2: > - used reverse christmas tree ordering in update_tx_fqids > > drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 42 > ++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > index 5acd734a216b..c3c2c06195ae 100644 > --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > @@ -1235,6 +1235,8 @@ static void dpaa2_eth_set_rx_taildrop(struct > dpaa2_eth_priv *priv, bool enable) > priv->rx_td_enabled = enable; > } > > +static void update_tx_fqids(struct dpaa2_eth_priv *priv); > > static int link_state_update(struct dpaa2_eth_priv *priv) > { > struct dpni_link_state state = {0}; > @@ -1261,6 +1263,7 @@ static int link_state_update(struct dpaa2_eth_priv > *priv) > goto out; > > if (state.up) { > + update_tx_fqids(priv); > netif_carrier_on(priv->net_dev); > netif_tx_start_all_queues(priv->net_dev); > } else { > @@ -2533,6 +2536,45 @@ static int set_pause(struct dpaa2_eth_priv *priv) > return 0; > } > > +static void update_tx_fqids(struct dpaa2_eth_priv *priv) > +{ > + struct dpni_queue_id qid = {0}; > + struct dpaa2_eth_fq *fq; > + struct dpni_queue queue; > + int i, j, err; > + > + /* We only use Tx FQIDs for FQID-based enqueue, so check > + * if DPNI version supports it before updating FQIDs > + */ > + if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_ENQUEUE_FQID_VER_MAJOR, > + DPNI_ENQUEUE_FQID_VER_MINOR) < 0) > + return; > + > + for (i = 0; i < priv->num_fqs; i++) { > + fq = &priv->fq[i]; > + if (fq->type != DPAA2_TX_CONF_FQ) > + continue; > + for (j = 0; j < dpaa2_eth_tc_count(priv); j++) { > + err = dpni_get_queue(priv->mc_io, 0, priv->mc_token, > + DPNI_QUEUE_TX, j, fq->flowid, > + &queue, &qid); > + if (err) > + goto out_err; > + > + fq->tx_fqid[j] = qid.fqid; > + if (fq->tx_fqid[j] == 0) > + goto out_err; > + } > + } > + > + return; > + > +out_err: > + netdev_info(priv->net_dev, > + "Error reading Tx FQID, fallback to QDID-based enqueue");
Missing new line at the end of this message, I think. > + priv->enqueue = dpaa2_eth_enqueue_qd; Should the enqueue be set to dpaa2_eth_enqueue_fq config was successful? IOW if there is a transient error we should go back to the preferred method? > +}
