On 10/15/19 10:36 PM, Jakub Kicinski wrote: > 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.
Will add in v3. > >> + 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 > metho Good point. Without setting enqueue back to dpaa2_eth_enqueue_fq querying the fqids would be for nothing. Will send an update fixing both of these things. Thanks, Ioana > >> +} > >
