summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorBogdan Hamciuc <bogdan.hamciuc@freescale.com>2013-06-04 23:01:51 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-06-06 17:55:28 (GMT)
commit429d9f28709eb7c916d4c6da4cccfae33906c510 (patch)
tree88663e749228fca23628ed2bee25ec944bf53ed1 /drivers/net
parent50e8dde3f146bf6955459c96be9794f999dc0015 (diff)
downloadlinux-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.c8
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;
}
}