From: shawn.guo@linaro.org (Shawn Guo)
To: linux-arm-kernel@lists.infradead.org
Subject: [Patch net-next 4/4] net: fec: Workaround for imx6sx enet tx hang when enable three queues
Date: Tue, 16 Sep 2014 08:52:06 +0800 [thread overview]
Message-ID: <20140916005204.GA23482@dragon> (raw)
In-Reply-To: <1410801177-15872-5-git-send-email-Frank.Li@freescale.com>
On Tue, Sep 16, 2014 at 01:12:57AM +0800, Frank.Li at freescale.com wrote:
> From: Fugang Duan <B38611@freescale.com>
>
> When enable three queues on imx6sx enet, and then do tx performance
> test with iperf tool, after some time running, tx hang.
>
> Found that:
> If uDMA is running, software set TDAR may cause tx hang.
> If uDMA is in idle, software set TDAR don't cause tx hang.
>
> There is a TDAR race condition for mutliQ when the software sets TDAR
> and the UDMA clears TDAR simultaneously or in a small window (2-4 cycles).
> This will cause the udma_tx and udma_tx_arbiter state machines to hang.
> The issue exist at i.MX6SX enet IP.
>
> So, the Workaround is checking TDAR status four time, if TDAR cleared by
> hardware and then write TDAR, otherwise don't set TDAR.
>
> The patch is only one Workaround for the issue TKT210582.
>
> Signed-off-by: Fugang Duan <B38611@freescale.com>
> Signed-off-by: Frank Li <Frank.Li@freescale.com>
> ---
> drivers/net/ethernet/freescale/fec_main.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index 524ddbe..452e576 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -111,6 +111,13 @@ static void fec_enet_itr_coal_init(struct net_device *ndev);
> * independent rings
> */
> #define FEC_QUIRK_HAS_AVB (1 << 8)
> +/*
> + * There is a TDAR race condition for mutliQ when the software sets TDAR
> + * and the UDMA clears TDAR simultaneously or in a small window (2-4 cycles).
> + * This will cause the udma_tx and udma_tx_arbiter state machines to hang.
> + * The issue exist at i.MX6SX enet IP.
> + */
> +#define FEC_QUIRK_TKT210582 (1 << 9)
I think TKTxxx number is used by Freescale design team to track issues
internally, and there should be a corresponding errata number like
ERRxxx which should be accessible by external people in errata document?
Shawn
>
> static struct platform_device_id fec_devtype[] = {
> {
> @@ -139,7 +146,7 @@ static struct platform_device_id fec_devtype[] = {
> .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
> FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
> FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR006358 |
> - FEC_QUIRK_HAS_AVB,
> + FEC_QUIRK_HAS_AVB | FEC_QUIRK_TKT210582,
> }, {
> /* sentinel */
> }
> @@ -709,6 +716,8 @@ static int fec_enet_txq_submit_tso(struct fec_enet_priv_tx_q *txq,
> struct tso_t tso;
> unsigned int index = 0;
> int ret;
> + const struct platform_device_id *id_entry =
> + platform_get_device_id(fep->pdev);
>
> if (tso_count_descs(skb) >= fec_enet_get_free_txdesc_num(fep, txq)) {
> dev_kfree_skb_any(skb);
> @@ -770,7 +779,12 @@ static int fec_enet_txq_submit_tso(struct fec_enet_priv_tx_q *txq,
> txq->cur_tx = bdp;
>
> /* Trigger transmission start */
> - writel(0, fep->hwp + FEC_X_DES_ACTIVE(queue));
> + if (!(id_entry->driver_data & FEC_QUIRK_TKT210582) ||
> + !readl(fep->hwp + FEC_X_DES_ACTIVE(queue)) ||
> + !readl(fep->hwp + FEC_X_DES_ACTIVE(queue)) ||
> + !readl(fep->hwp + FEC_X_DES_ACTIVE(queue)) ||
> + !readl(fep->hwp + FEC_X_DES_ACTIVE(queue)))
> + writel(0, fep->hwp + FEC_X_DES_ACTIVE(queue));
>
> return 0;
>
> --
> 1.9.1
>
next prev parent reply other threads:[~2014-09-16 0:52 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-15 17:12 [Patch net-next 0/4] net: fec: add interrupt coalescence Frank.Li at freescale.com
2014-09-15 17:12 ` [Patch net-next 1/4] net: fec: refine error handle of parser queue number from DT Frank.Li at freescale.com
2014-09-15 21:32 ` David Miller
2014-09-15 17:12 ` [Patch net-next 2/4] net: fec: add interrupt coalescence feature support Frank.Li at freescale.com
2014-09-15 21:34 ` David Miller
2014-09-15 17:12 ` [Patch net-next 3/4] net:fec: increase DMA queue number Frank.Li at freescale.com
2014-09-15 17:12 ` [Patch net-next 4/4] net: fec: Workaround for imx6sx enet tx hang when enable three queues Frank.Li at freescale.com
2014-09-15 21:35 ` David Miller
2014-09-16 0:52 ` Shawn Guo [this message]
2014-09-16 3:09 ` fugang.duan at freescale.com
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140916005204.GA23482@dragon \
--to=shawn.guo@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).