From 42c365aab1aa030e9147e5d2e85a2a7193bd58fc Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 3 Feb 2016 10:34:10 -0600 Subject: [PATCH] Duplicate Manuel's EMAC driver fix to every other driver that supports CONFIG_NET_NOINTS --- arch | 2 +- drivers/net/e1000.c | 6 ------ drivers/net/encx24j600.c | 8 ++++++++ drivers/net/ftmac100.c | 9 +++++++++ drivers/net/skeleton.c | 17 +++++++++++++++-- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/arch b/arch index 403b4e70ebb..be6af64502d 160000 --- a/arch +++ b/arch @@ -1 +1 @@ -Subproject commit 403b4e70ebbca5c938ed0bd4531a0972ec736c7e +Subproject commit be6af64502d5520799fcba3ed20b6fff13f88ca0 diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c index e0b063af1a5..cbed8d5656b 100644 --- a/drivers/net/e1000.c +++ b/drivers/net/e1000.c @@ -1018,11 +1018,6 @@ static irqreturn_t e1000_interrupt_handler(int irq, void *dev_id) wd_cancel(e1000->txtimeout); } - /* Check is a packet transmission just completed. If so, call skel_txdone. - * This may disable further Tx interrupts if there are no pending - * tansmissions. - */ - /* Tx-descriptor Written back */ if (intr_cause & (1 << 0)) @@ -1030,7 +1025,6 @@ static irqreturn_t e1000_interrupt_handler(int irq, void *dev_id) devif_poll(&e1000->netdev, e1000_txpoll); } - /* Rx-Descriptors Low */ if (intr_cause & (1 << 4)) diff --git a/drivers/net/encx24j600.c b/drivers/net/encx24j600.c index 9a94ac005d9..d5846c752be 100644 --- a/drivers/net/encx24j600.c +++ b/drivers/net/encx24j600.c @@ -1288,6 +1288,14 @@ static void enc_txif(FAR struct enc_driver_s *priv) wd_cancel(priv->txtimeout); + /* Then make sure that the TX poll timer is running (if it is already + * running, the following would restart it). This is necessary to + * avoid certain race conditions where the polling sequence can be + * interrupted. + */ + + (void)wd_start(priv->txpoll, ENC_WDDELAY, enc_polltimer, 1, arg); + /* Poll for TX packets from the networking layer */ devif_poll(&priv->dev, enc_txpoll); diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c index eecc4c96150..9e2ada57ff8 100644 --- a/drivers/net/ftmac100.c +++ b/drivers/net/ftmac100.c @@ -838,8 +838,17 @@ static void ftmac100_txdone(FAR struct ftmac100_driver_s *priv) nvdbg("txpending=%d\n", priv->tx_pending); + /* Cancel the TX timeout */ + wd_cancel(priv->ft_txtimeout); + /* Then make sure that the TX poll timer is running (if it is already + * running, the following would restart it). This is necessary to avoid + * certain race conditions where the polling sequence can be interrupted. + */ + + (void)wd_start(priv->ft_txpoll, FTMAC100_WDDELAY, ftmac100_poll_expiry, 1, priv); + /* Then poll uIP for new XMIT data */ (void)devif_poll(&priv->ft_dev, ftmac100_txpoll); diff --git a/drivers/net/skeleton.c b/drivers/net/skeleton.c index a395b2eda1b..516b6f0e8c8 100644 --- a/drivers/net/skeleton.c +++ b/drivers/net/skeleton.c @@ -458,13 +458,26 @@ static void skel_txdone(FAR struct skel_driver_s *priv) NETDEV_TXDONE(priv->sk_dev); - /* If no further xmits are pending, then cancel the TX timeout and + /* Check if there are pending transmissions */ + + /* If no further transmissions are pending, then cancel the TX timeout and * disable further Tx interrupts. */ wd_cancel(priv->sk_txtimeout); - /* Then poll the network for new XMIT data */ + /* Then make sure that the TX poll timer is running (if it is already + * running, the following would restart it). This is necessary to + * avoid certain race conditions where the polling sequence can be + * interrupted. + */ + + (void)wd_start(priv->sk_txpoll, skeleton_WDDELAY, skel_poll_expiry, 1, + (wdparm_t)priv); + + /* And disable further TX interrupts. */ + + /* In any event, poll the network for new TX data */ (void)devif_poll(&priv->sk_dev, skel_txpoll); }