diff options
author | Bogdan Hamciuc <bogdan.hamciuc@freescale.com> | 2013-06-04 23:01:51 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-06-06 17:55:28 (GMT) |
commit | 429d9f28709eb7c916d4c6da4cccfae33906c510 (patch) | |
tree | 88663e749228fca23628ed2bee25ec944bf53ed1 /drivers/net | |
parent | 50e8dde3f146bf6955459c96be9794f999dc0015 (diff) | |
download | linux-fsl-qoriq-429d9f28709eb7c916d4c6da4cccfae33906c510.tar.xz |
dpaa_eth: Fix Tx/TxConfirm initialization bug
Due to a bad iterator, the Txq initialization logic mangled the Tx
queues settings and their respective Tx Confirmation FQs assignments.
Aside from the obvious structural problem, this created a nasty
imbalance in transmit and confirmation FD processing, resulting in
sustained degradation of termination use-cases.
Signed-off-by: Bogdan Hamciuc <bogdan.hamciuc@freescale.com>
Change-Id: Id28a8499c16405d7d4df5d2e66f1ece241409144
Reviewed-on: http://git.am.freescale.net:8181/2861
Reviewed-by: Bucur Madalin-Cristian-B32716 <madalin.bucur@freescale.com>
Reviewed-by: Sovaiala Cristian-Constantin-B39531 <Cristian.Sovaiala@freescale.com>
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c index 2d47c8a..68d70f7 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c @@ -3553,12 +3553,16 @@ static void dpa_setup_egress(struct dpa_priv_s *priv, /* Allocate frame queues to all available CPUs no matter the number of * queues specified in device tree. */ - for (i = 0; i < DPAA_ETH_TX_QUEUES; i++) { + for (i = 0, ptr = &fq->list; i < DPAA_ETH_TX_QUEUES; i++) { iter = list_entry(ptr, struct dpa_fq, list); priv->egress_fqs[i] = &iter->fq_base; - if (list_is_last(ptr, head)) + if (list_is_last(ptr, head)) { ptr = &fq->list; + continue; + } + + ptr = ptr->next; } } |