Duplicate Manuel's EMAC driver fix to every other driver that supports CONFIG_NET_NOINTS

This commit is contained in:
Gregory Nutt 2016-02-03 10:34:10 -06:00
parent 8fa9b99e7c
commit 42c365aab1
5 changed files with 33 additions and 9 deletions

2
arch

@ -1 +1 @@
Subproject commit 403b4e70ebbca5c938ed0bd4531a0972ec736c7e
Subproject commit be6af64502d5520799fcba3ed20b6fff13f88ca0

View File

@ -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))

View File

@ -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);

View File

@ -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);

View File

@ -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);
}