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

> 
>> +}
> 
> 

Reply via email to