From: Troy Kisky <troy.kisky@boundarydevices.com> To: netdev@vger.kernel.org, davem@davemloft.net, B38611@freescale.com Cc: fabio.estevam@freescale.com, l.stach@pengutronix.de, andrew@lunn.ch, tremyfr@gmail.com, linux@arm.linux.org.uk, linux-arm-kernel@lists.infradead.org, laci@boundarydevices.com, shawnguo@kernel.org, Troy Kisky <troy.kisky@boundarydevices.com> Subject: [PATCH net-next 38/40] net: fec: recover from lost rxf_0 interrupt Date: Thu, 28 Jan 2016 14:26:02 -0700 [thread overview] Message-ID: <1454016364-30985-39-git-send-email-troy.kisky@boundarydevices.com> (raw) In-Reply-To: <1454016364-30985-1-git-send-email-troy.kisky@boundarydevices.com> The following is true of linux-3.14. I have not been able to verify on mainline, because I cannot get the cpuidle driver to work. If gpio6 workaround is not used for interrupts, then it is possible for the entire receive queue to become full without an interrupt. If that happens, and the last rxf_0 interrupt is lost, then the FEC can no longer receive packets. However packet transmission is still fine, so the tx watchdog will never fire. The only way to recover before this is a ifconfig down/up. Skipping the FEC_ENET_RXF_0 check will allow the rx queue to recover from the condition when the next packet is transmitted. This patch also has the advantage of increasing iperf speed. Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> --- drivers/net/ethernet/freescale/fec_main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 00c9b7e..8372d9b 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1608,9 +1608,10 @@ static int fec_enet_napi_q1(struct napi_struct *napi, int budget) } writel(events, fep->hwp + FEC_IEVENT); - if (events & FEC_ENET_RXF_0) - pkts += fec_rxq(ndev, fep, fep->rx_queue[0], - budget - pkts); + /* don't check FEC_ENET_RXF_0, to recover from a full queue + * but bit clear condition + */ + pkts += fec_rxq(ndev, fep, fep->rx_queue[0], budget - pkts); if (events & FEC_ENET_TXF_0) fec_txq(ndev, fep, fep->tx_queue[0]); } while (pkts < budget); -- 2.5.0
WARNING: multiple messages have this Message-ID (diff)
From: troy.kisky@boundarydevices.com (Troy Kisky) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH net-next 38/40] net: fec: recover from lost rxf_0 interrupt Date: Thu, 28 Jan 2016 14:26:02 -0700 [thread overview] Message-ID: <1454016364-30985-39-git-send-email-troy.kisky@boundarydevices.com> (raw) In-Reply-To: <1454016364-30985-1-git-send-email-troy.kisky@boundarydevices.com> The following is true of linux-3.14. I have not been able to verify on mainline, because I cannot get the cpuidle driver to work. If gpio6 workaround is not used for interrupts, then it is possible for the entire receive queue to become full without an interrupt. If that happens, and the last rxf_0 interrupt is lost, then the FEC can no longer receive packets. However packet transmission is still fine, so the tx watchdog will never fire. The only way to recover before this is a ifconfig down/up. Skipping the FEC_ENET_RXF_0 check will allow the rx queue to recover from the condition when the next packet is transmitted. This patch also has the advantage of increasing iperf speed. Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> --- drivers/net/ethernet/freescale/fec_main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 00c9b7e..8372d9b 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1608,9 +1608,10 @@ static int fec_enet_napi_q1(struct napi_struct *napi, int budget) } writel(events, fep->hwp + FEC_IEVENT); - if (events & FEC_ENET_RXF_0) - pkts += fec_rxq(ndev, fep, fep->rx_queue[0], - budget - pkts); + /* don't check FEC_ENET_RXF_0, to recover from a full queue + * but bit clear condition + */ + pkts += fec_rxq(ndev, fep, fep->rx_queue[0], budget - pkts); if (events & FEC_ENET_TXF_0) fec_txq(ndev, fep, fep->tx_queue[0]); } while (pkts < budget); -- 2.5.0
next prev parent reply other threads:[~2016-01-28 21:29 UTC|newest] Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-01-28 21:25 [PATCH net-next 00/40] net: fec: cleanup/fixes Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 01/40] net: fec: stop the "rcv is not +last, " error messages Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 02/40] net: fec: fix rx error counts Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 03/40] net: fec: fix fec_enet_get_free_txdesc_num Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 04/40] net: fec: add struct bufdesc_prop Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 05/40] net: fec: add variable reg_desc_active to speed things up Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 06/40] net: fec: don't disable FEC_ENET_TS_TIMER interrupt Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 07/40] net: fec: don't transfer ownership until descriptor write is complete Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 08/40] net: fec: move cbd_bufaddr assignment closer to the mapping function Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 22:02 ` Arnd Bergmann 2016-01-28 22:02 ` Arnd Bergmann 2016-01-28 22:14 ` Johannes Berg 2016-01-28 22:14 ` Johannes Berg 2016-01-29 17:49 ` Troy Kisky 2016-01-29 17:49 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 09/40] net: fec: only check queue 0 if RXF_0/TXF_0 interrupt is set Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 10/40] net: fec: pass rxq to fec_enet_rx_queue instead of queue_id Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 11/40] net: fec: pass txq to fec_enet_tx_queue " Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 12/40] net: fec: reduce interrupts Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 13/40] net: fec: split off napi routine with 3 queues Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 14/40] net: fec: don't clear all rx queue bits when just one is being checked Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 15/40] net: fec: set cbd_sc without relying on previous value Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 16/40] net: fec: eliminate calls to fec_enet_get_prevdesc Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 17/40] net: fec: move restart test for efficiency Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 18/40] net: fec: clear cbd_sc after transmission to help with debugging Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 19/40] net: fec: dump all tx queues in fec_dump Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 20/40] net: fec: detect tx int lost Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 21/40] net: fec: print more debug info in fec_timeout Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 22/40] net: fec: call dma_unmap_single on mapped tx buffers at restart Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 23/40] net: fec: don't set cbd_bufaddr unless no mapping error Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 24/40] net: fec: return NETDEV_TX_BUSY, when not enough space in ring Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 25/40] net: fec: don't free skb until it has been unmapped Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 26/40] net: fec: set cbd_esc only once Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 27/40] net: fec: enable interrupt on very last descriptor only Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 28/40] net: fec: unmap initial buffer on error Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 29/40] net: fec: don't free skb when returning busy Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 30/40] net: fec: move last_bdp assignment for symmetry Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 31/40] net: fec: don't transfer ownership until entire tso is queued Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 32/40] net: fec: fix err_release in fec_enet_txq_submit_tso Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 33/40] net: fec: shrink the window for 'tx int lost' Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 34/40] net: fec: update dirty_tx even if no skb Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:25 ` [PATCH net-next 35/40] net: fec: rename dirty_tx to pending_tx Troy Kisky 2016-01-28 21:25 ` Troy Kisky 2016-01-28 21:26 ` [PATCH net-next 36/40] net: fec: use mac set by bootloader before fuses Troy Kisky 2016-01-28 21:26 ` Troy Kisky 2016-01-28 21:26 ` [PATCH net-next 37/40] net: fec: add events device file Troy Kisky 2016-01-28 21:26 ` Troy Kisky 2016-01-28 21:26 ` Troy Kisky [this message] 2016-01-28 21:26 ` [PATCH net-next 38/40] net: fec: recover from lost rxf_0 interrupt Troy Kisky 2016-01-28 21:26 ` [PATCH net-next 39/40] ARM: dts: imx6qdl-nitrogen6x: add phy interrupt to eliminate polling Troy Kisky 2016-01-28 21:26 ` Troy Kisky 2016-02-01 14:03 ` Shawn Guo 2016-02-01 14:03 ` Shawn Guo 2016-01-28 21:26 ` [PATCH net-next 40/40] ARM: dts: imx6qdl-nitrogen6_max: " Troy Kisky 2016-01-28 21:26 ` Troy Kisky 2016-02-01 14:04 ` Shawn Guo 2016-02-01 14:04 ` Shawn Guo 2016-01-28 22:39 ` [PATCH net-next 00/40] net: fec: cleanup/fixes David Miller 2016-01-28 22:39 ` David Miller [not found] ` <CAGB=+3Sip-+2Qf-KTZfoCCBcO9=9tb=pVCaEs=+eNJ1sWSRgXw@mail.gmail.com> 2016-01-29 0:19 ` David Miller 2016-01-29 0:19 ` David Miller
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=1454016364-30985-39-git-send-email-troy.kisky@boundarydevices.com \ --to=troy.kisky@boundarydevices.com \ --cc=B38611@freescale.com \ --cc=andrew@lunn.ch \ --cc=davem@davemloft.net \ --cc=fabio.estevam@freescale.com \ --cc=l.stach@pengutronix.de \ --cc=laci@boundarydevices.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux@arm.linux.org.uk \ --cc=netdev@vger.kernel.org \ --cc=shawnguo@kernel.org \ --cc=tremyfr@gmail.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.