[PATCH 19/20] sdk_dpaa: What to do with tail queue drop?

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Jan 19 13:54:09 UTC 2018


The issue is this:

static int dpaa_eth_macless_probe(struct platform_device *_of_dev)
{
[...]
    INIT_LIST_HEAD(&priv->dpa_fq_list);

    err = dpa_fq_probe_macless(dev, &priv->dpa_fq_list, RX);
    if (!err)
        err = dpa_fq_probe_macless(dev, &priv->dpa_fq_list,
                       TX);
    if (err < 0)
        goto fq_probe_failed;
[...]
    /* Add the FQs to the interface, and make them active */
    /* For MAC-less devices we only get here for RX frame queues
     * initialization, which are the TX queues of the other
     * partition.
     * It is safe to rely on one partition to set the FQ taildrop
     * threshold for the TX queues of the other partition
     * because the ERN notifications will be received by the
     * partition doing qman_enqueue.
     */
    err = dpa_fqs_init(dev,  &priv->dpa_fq_list, true);
    if (err < 0)
        goto fq_alloc_failed;
[...]

The priv->dpa_fq_list contains a list of FQ_TYPE_RX_PCD  and FQ_TYPE_TX
items.  I don't understand what the "For MAC-less devices we only get
here for RX frame queues initialization" means in this context.  The
td_enable == true in dpa_fqs_init().  So, we have:

int dpa_fq_init(struct dpa_fq *dpa_fq, bool td_enable)
{
[...]
        if (dpa_fq->fq_type == FQ_TYPE_TX ||
                dpa_fq->fq_type == FQ_TYPE_TX_CONFIRM ||
                dpa_fq->fq_type == FQ_TYPE_TX_CONF_MQ) {
[...]
            initfq.we_mask |= QM_INITFQ_WE_OAC;
[...]
        }

        if (td_enable) {
            initfq.we_mask |= QM_INITFQ_WE_TDTHRESH;
            qm_fqd_taildrop_set(&initfq.fqd.td,
                    DPA_FQ_TD, 1);
            initfq.fqd.fq_ctrl = QM_FQCTRL_TDE;
        }

The td_enable == true && dpa_fq->fq_type == FQ_TYPE_TX causes later:

int qman_init_fq(struct qman_fq *fq, u32 flags, struct qm_mcc_initfq *opts)
{
[...]
    if (opts && (opts->we_mask & QM_INITFQ_WE_OAC)) {
        /* And can't be set at the same time as TDTHRESH */
        if (opts->we_mask & QM_INITFQ_WE_TDTHRESH)
            return -EINVAL;
    }

This aborts the  initialization of the MAC-less driver.  I don't
understand why this path doesn't happen on the SDK Linux system.
---
 linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_macless.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_macless.c b/linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_macless.c
index d14e2456b..ef1c9b3d6 100644
--- a/linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_macless.c
+++ b/linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_macless.c
@@ -477,7 +477,7 @@ static int dpaa_eth_macless_probe(struct platform_device *_of_dev)
 		goto fq_alloc_failed;
 #else /* __rtems__ */
 	list_for_each_entry_safe(dpaa_fq, tmp, &priv->dpaa_fq_list, list) {
-		err = dpaa_fq_init(dpaa_fq, true);
+		err = dpaa_fq_init(dpaa_fq, false);
 		if (err < 0)
 			goto fq_alloc_failed;
 	}
-- 
2.12.3



More information about the devel mailing list