devif: remove all devif_timer

Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
This commit is contained in:
zhanghongyu
2022-05-29 21:47:28 +08:00
committed by Alan Carvalho de Assis
parent 406e1effed
commit 035d925864
61 changed files with 98 additions and 4953 deletions
+2 -84
View File
@@ -111,10 +111,6 @@
/* Timing values ************************************************************/
/* TX poll deley = 1 seconds. CLK_TCK=number of clock ticks per second */
#define C5471_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define C5471_TXTIMEOUT (60*CLK_TCK)
@@ -297,7 +293,6 @@ static uint8_t g_pktbuf[MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE];
struct c5471_driver_s
{
bool c_bifup; /* true:ifup false:ifdown */
struct wdog_s c_txpoll; /* TX poll timer */
struct wdog_s c_txtimeout; /* TX timeout timer */
struct work_s c_irqwork; /* For deferring interrupt work to the work queue */
struct work_s c_pollwork; /* For deferring poll work to the work queue */
@@ -397,9 +392,6 @@ static int c5471_interrupt(int irq, void *context, void *arg);
static void c5471_txtimeout_work(void *arg);
static void c5471_txtimeout_expiry(wdparm_t arg);
static void c5471_poll_work(void *arg);
static void c5471_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int c5471_ifup(struct net_driver_s *dev);
@@ -1771,74 +1763,6 @@ static void c5471_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->c_irqwork, c5471_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: c5471_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void c5471_poll_work(void *arg)
{
struct c5471_driver_s *priv = (struct c5471_driver_s *)arg;
/* Check if the ESM has let go of the RX descriptor giving us access rights
* to submit another Ethernet frame.
*/
net_lock();
if ((EIM_TXDESC_OWN_HOST & getreg32(priv->c_rxcpudesc)) == 0)
{
/* If so, update TCP timing states and
* poll the network for new XMIT data
*/
devif_timer(&priv->c_dev, C5471_WDDELAY, c5471_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->c_txpoll, C5471_WDDELAY,
c5471_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: c5471_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void c5471_poll_expiry(wdparm_t arg)
{
struct c5471_driver_s *priv = (struct c5471_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->c_pollwork, c5471_poll_work, priv, 0);
}
/****************************************************************************
* Function: c5471_ifup
*
@@ -1894,11 +1818,6 @@ static int c5471_ifup(struct net_driver_s *dev)
putreg32((getreg32(ENET0_MODE) | ENET_MODE_ENABLE), ENET0_MODE); /* enable ENET */
up_mdelay(100);
/* Set and activate a timer process */
wd_start(&priv->c_txpoll, C5471_WDDELAY,
c5471_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->c_bifup = true;
@@ -1947,9 +1866,8 @@ static int c5471_ifdown(struct net_driver_s *dev)
putreg32((getreg32(EIM_CTRL) & ~EIM_CTRL_ESM_EN), EIM_CTRL); /* disable ESM */
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->c_txpoll);
wd_cancel(&priv->c_txtimeout);
/* Reset the device */
@@ -1995,7 +1913,7 @@ static void c5471_txavail_work(void *arg)
{
/* If so, then poll the network for new XMIT data */
devif_timer(&priv->c_dev, 0, c5471_txpoll);
devif_poll(&priv->c_dev, c5471_txpoll);
}
}
+2 -88
View File
@@ -136,12 +136,6 @@
#endif
#endif
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per
* second.
*/
#define IMX_WDDELAY (1 * CLK_TCK)
/* Align assuming that the D-Cache is enabled (probably 32-bytes).
*
* REVISIT: The size of descriptors and buffers must also be in even units
@@ -282,7 +276,6 @@ struct imx_driver_s
uint8_t txhead; /* The next TX descriptor to use */
uint8_t rxtail; /* The next RX descriptor to use */
uint8_t phyaddr; /* Selected PHY address */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -355,9 +348,6 @@ static int imx_enet_interrupt(int irq, void *context, void *arg);
static void imx_txtimeout_work(void *arg);
static void imx_txtimeout_expiry(wdparm_t arg);
static void imx_poll_work(void *arg);
static void imx_polltimer_expiry(wdparm_t arg);
/* NuttX callback functions */
static int imx_ifup(struct net_driver_s *dev);
@@ -1244,76 +1234,6 @@ static void imx_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, imx_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: imx_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void imx_poll_work(void *arg)
{
struct imx_driver_s *priv = (struct imx_driver_s *)arg;
/* Check if there is there is a transmission in progress.
* We cannot perform the TX poll if he are unable to accept
* another packet for transmission.
*/
net_lock();
if (!imx_txringfull(priv))
{
/* If so, update TCP timing states and poll the network for new XMIT
* data. Hmmm.. might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
devif_timer(&priv->dev, IMX_WDDELAY, imx_txpoll);
}
/* Setup the watchdog poll timer again in any case */
wd_start(&priv->txpoll, IMX_WDDELAY,
imx_polltimer_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: imx_polltimer_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void imx_polltimer_expiry(wdparm_t arg)
{
struct imx_driver_s *priv = (struct imx_driver_s *)arg;
/* Schedule to perform the poll processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, imx_poll_work, priv, 0);
}
/****************************************************************************
* Function: imx_ifup_action
*
@@ -1414,11 +1334,6 @@ static int imx_ifup_action(struct net_driver_s *dev, bool resetphy)
putreg32(ENET_RDAR, IMX_ENET_RDAR);
/* Set and activate a timer process */
wd_start(&priv->txpoll, IMX_WDDELAY,
imx_polltimer_expiry, (wdparm_t)priv);
/* Clear all pending ENET interrupt */
putreg32(RX_INTERRUPTS | ERROR_INTERRUPTS | TX_INTERRUPTS, IMX_ENET_EIR);
@@ -1500,9 +1415,8 @@ static int imx_ifdown(struct net_driver_s *dev)
up_disable_irq(IMX_IRQ_ENET0);
putreg32(0, IMX_ENET_EIMR);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
@@ -1555,7 +1469,7 @@ static void imx_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, imx_txpoll);
devif_poll(&priv->dev, imx_txpoll);
}
}
+2 -88
View File
@@ -125,12 +125,6 @@
# error Write back D-Cache not yet supported
#endif
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per
* second.
*/
#define IMXRT_WDDELAY (1 * CLK_TCK)
/* Align assuming that the D-Cache is enabled (probably 32-bytes).
*
* REVISIT: The size of descriptors and buffers must also be in even units
@@ -264,7 +258,6 @@ struct imxrt_driver_s
uint8_t txhead; /* The next TX descriptor to use */
uint8_t rxtail; /* The next RX descriptor to use */
uint8_t phyaddr; /* Selected PHY address */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -337,9 +330,6 @@ static int imxrt_enet_interrupt(int irq, void *context, void *arg);
static void imxrt_txtimeout_work(void *arg);
static void imxrt_txtimeout_expiry(wdparm_t arg);
static void imxrt_poll_work(void *arg);
static void imxrt_polltimer_expiry(wdparm_t arg);
/* NuttX callback functions */
static int imxrt_ifup(struct net_driver_s *dev);
@@ -1198,76 +1188,6 @@ static void imxrt_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, imxrt_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: imxrt_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void imxrt_poll_work(void *arg)
{
struct imxrt_driver_s *priv = (struct imxrt_driver_s *)arg;
/* Check if there is there is a transmission in progress.
* We cannot perform the TX poll if he are unable to accept
* another packet for transmission.
*/
net_lock();
if (!imxrt_txringfull(priv))
{
/* If so, update TCP timing states and poll the network for new XMIT
* data. Hmmm.. might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
devif_timer(&priv->dev, IMXRT_WDDELAY, imxrt_txpoll);
}
/* Setup the watchdog poll timer again in any case */
wd_start(&priv->txpoll, IMXRT_WDDELAY,
imxrt_polltimer_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: imxrt_polltimer_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void imxrt_polltimer_expiry(wdparm_t arg)
{
struct imxrt_driver_s *priv = (struct imxrt_driver_s *)arg;
/* Schedule to perform the poll processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, imxrt_poll_work, priv, 0);
}
/****************************************************************************
* Function: imxrt_ifup_action
*
@@ -1368,11 +1288,6 @@ static int imxrt_ifup_action(struct net_driver_s *dev, bool resetphy)
putreg32(ENET_RDAR, IMXRT_ENET_RDAR);
/* Set and activate a timer process */
wd_start(&priv->txpoll, IMXRT_WDDELAY,
imxrt_polltimer_expiry, (wdparm_t)priv);
/* Clear all pending ENET interrupt */
putreg32(RX_INTERRUPTS | ERROR_INTERRUPTS | TX_INTERRUPTS, IMXRT_ENET_EIR);
@@ -1455,9 +1370,8 @@ static int imxrt_ifdown(struct net_driver_s *dev)
up_disable_irq(IMXRT_IRQ_ENET);
putreg32(0, IMXRT_ENET_EIMR);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
@@ -1510,7 +1424,7 @@ static void imxrt_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, imxrt_txpoll);
devif_poll(&priv->dev, imxrt_txpoll);
}
}
+2 -3
View File
@@ -34,7 +34,6 @@
#include <errno.h>
#include <nuttx/can.h>
#include <nuttx/wdog.h>
#include <nuttx/irq.h>
#include <nuttx/arch.h>
#include <nuttx/wqueue.h>
@@ -1045,7 +1044,7 @@ static void imxrt_txdone_work(void *arg)
*/
net_lock();
devif_timer(&priv->dev, 0, imxrt_txpoll);
devif_poll(&priv->dev, imxrt_txpoll);
net_unlock();
}
@@ -1383,7 +1382,7 @@ static void imxrt_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, imxrt_txpoll);
devif_poll(&priv->dev, imxrt_txpoll);
}
}
+2 -88
View File
@@ -103,12 +103,6 @@
#define NENET_NBUFFERS \
(CONFIG_KINETIS_ENETNTXBUFFERS+CONFIG_KINETIS_ENETNRXBUFFERS)
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per
* second.
*/
#define KINETIS_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define KINETIS_TXTIMEOUT (60*CLK_TCK)
@@ -223,7 +217,6 @@ struct kinetis_driver_s
uint8_t txhead; /* The next TX descriptor to use */
uint8_t rxtail; /* The next RX descriptor to use */
uint8_t phyaddr; /* Selected PHY address */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
uint32_t ints; /* Enabled interrupts */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
@@ -294,9 +287,6 @@ static int kinetis_interrupt(int irq, void *context, void *arg);
static void kinetis_txtimeout_work(void *arg);
static void kinetis_txtimeout_expiry(wdparm_t arg);
static void kinetis_poll_work(void *arg);
static void kinetis_polltimer_expiry(wdparm_t arg);
/* NuttX callback functions */
static int kinetis_ifup(struct net_driver_s *dev);
@@ -1046,76 +1036,6 @@ static void kinetis_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, kinetis_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: kinetis_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void kinetis_poll_work(void *arg)
{
struct kinetis_driver_s *priv = (struct kinetis_driver_s *)arg;
/* Check if there is there is a transmission in progress. We cannot
* perform the TX poll if he are unable to accept another packet for
* transmission.
*/
net_lock();
if (!kinetis_txringfull(priv))
{
/* If so, update TCP timing states and poll the network for new XMIT
* data. Hmmm..might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
devif_timer(&priv->dev, KINETIS_WDDELAY, kinetis_txpoll);
}
/* Setup the watchdog poll timer again in any case */
wd_start(&priv->txpoll, KINETIS_WDDELAY,
kinetis_polltimer_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: kinetis_polltimer_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void kinetis_polltimer_expiry(wdparm_t arg)
{
struct kinetis_driver_s *priv = (struct kinetis_driver_s *)arg;
/* Schedule to perform the poll processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, kinetis_poll_work, priv, 0);
}
/****************************************************************************
* Function: kinetis_ifup
*
@@ -1227,11 +1147,6 @@ static int kinetis_ifup(struct net_driver_s *dev)
putreg32(ENET_RDAR, KINETIS_ENET_RDAR);
/* Set and activate a timer process */
wd_start(&priv->txpoll, KINETIS_WDDELAY,
kinetis_polltimer_expiry, (wdparm_t)priv);
putreg32(0, KINETIS_ENET_EIMR);
/* Clear all pending ENET interrupt */
@@ -1293,9 +1208,8 @@ static int kinetis_ifdown(struct net_driver_s *dev)
up_disable_irq(KINETIS_IRQ_EMACRX);
up_disable_irq(KINETIS_IRQ_EMACMISC);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
@@ -1352,7 +1266,7 @@ static void kinetis_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, kinetis_txpoll);
devif_poll(&priv->dev, kinetis_txpoll);
}
}
+2 -2
View File
@@ -1048,7 +1048,7 @@ static void kinetis_txdone_work(void *arg)
*/
net_lock();
devif_timer(&priv->dev, 0, kinetis_txpoll);
devif_poll(&priv->dev, kinetis_txpoll);
net_unlock();
}
@@ -1404,7 +1404,7 @@ static void kinetis_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, kinetis_txpoll);
devif_poll(&priv->dev, kinetis_txpoll);
}
}
+2 -106
View File
@@ -144,12 +144,6 @@
/* Timing *******************************************************************/
/* TX poll deley = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define LPC17_40_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define LPC17_40_TXTIMEOUT (60*CLK_TCK)
@@ -296,7 +290,6 @@ struct lpc17_40_driver_s
uint8_t lp_phyaddr; /* PHY device address */
#endif
uint32_t lp_inten; /* Shadow copy of INTEN register */
struct wdog_s lp_txpoll; /* TX poll timer */
struct wdog_s lp_txtimeout; /* TX timeout timer */
struct work_s lp_txwork; /* TX work continuation */
@@ -371,9 +364,6 @@ static int lpc17_40_interrupt(int irq, void *context, void *arg);
static void lpc17_40_txtimeout_work(void *arg);
static void lpc17_40_txtimeout_expiry(wdparm_t arg);
static void lpc17_40_poll_work(void *arg);
static void lpc17_40_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
#ifdef CONFIG_NET_ICMPv6
@@ -1440,94 +1430,6 @@ static void lpc17_40_txtimeout_expiry(wdparm_t arg)
}
}
/****************************************************************************
* Function: lpc17_40_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void lpc17_40_poll_work(void *arg)
{
struct lpc17_40_driver_s *priv = (struct lpc17_40_driver_s *)arg;
unsigned int prodidx;
unsigned int considx;
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
net_lock();
if (lpc17_40_txdesc(priv) == OK)
{
/* If so, update TCP timing states and poll the network layer for new
* XMIT data. Hmmm.. might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
devif_timer(&priv->lp_dev, LPC17_40_WDDELAY, lpc17_40_txpoll);
}
/* Simulate a fake receive to relaunch the data exchanges when a receive
* interrupt has been lost and all the receive buffers are used.
*/
/* Get the current producer and consumer indices */
considx = lpc17_40_getreg(LPC17_40_ETH_RXCONSIDX) & ETH_RXCONSIDX_MASK;
prodidx = lpc17_40_getreg(LPC17_40_ETH_RXPRODIDX) & ETH_RXPRODIDX_MASK;
if (considx != prodidx)
{
work_queue(ETHWORK, &priv->lp_rxwork, lpc17_40_rxdone_work,
priv, 0);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->lp_txpoll, LPC17_40_WDDELAY,
lpc17_40_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: lpc17_40_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void lpc17_40_poll_expiry(wdparm_t arg)
{
struct lpc17_40_driver_s *priv = (struct lpc17_40_driver_s *)arg;
DEBUGASSERT(arg);
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->lp_pollwork, lpc17_40_poll_work, priv, 0);
}
/****************************************************************************
* Function: lpc17_40_ipv6multicast
*
@@ -1749,11 +1651,6 @@ static int lpc17_40_ifup(struct net_driver_s *dev)
regval |= ETH_CMD_TXEN;
lpc17_40_putreg(regval, LPC17_40_ETH_CMD);
/* Set and activate a timer process */
wd_start(&priv->lp_txpoll, LPC17_40_WDDELAY,
lpc17_40_poll_expiry, (wdparm_t)priv);
/* Finally, make the interface up and enable the Ethernet interrupt at
* the interrupt controller
*/
@@ -1794,9 +1691,8 @@ static int lpc17_40_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(LPC17_40_IRQ_ETH);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->lp_txpoll);
wd_cancel(&priv->lp_txtimeout);
/* Reset the device and mark it as down. */
@@ -1839,7 +1735,7 @@ static void lpc17_40_txavail_work(void *arg)
{
/* If so, then poll the network layer for new XMIT data */
devif_timer(&priv->lp_dev, 0, lpc17_40_txpoll);
devif_poll(&priv->lp_dev, lpc17_40_txpoll);
}
}
+2 -116
View File
@@ -210,12 +210,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define LPC43_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define LPC43_TXTIMEOUT (60*CLK_TCK)
@@ -512,7 +506,6 @@ struct lpc43_ethmac_s
uint8_t ifup : 1; /* true:ifup false:ifdown */
uint8_t mbps100 : 1; /* 100MBps operation (vs 10 MBps) */
uint8_t fduplex : 1; /* Full (vs. half) duplex */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring work to the work queue */
struct work_s pollwork; /* For deferring work to the work queue */
@@ -601,9 +594,6 @@ static int lpc43_interrupt(int irq, void *context, void *arg);
static void lpc43_txtimeout_work(void *arg);
static void lpc43_txtimeout_expiry(wdparm_t arg);
static void lpc43_poll_work(void *arg);
static void lpc43_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int lpc43_ifup(struct net_driver_s *dev);
@@ -1270,7 +1260,7 @@ static void lpc43_dopoll(struct lpc43_ethmac_s *priv)
if (dev->d_buf)
{
devif_timer(dev, 0, lpc43_txpoll);
devif_poll(dev, lpc43_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
@@ -2129,104 +2119,6 @@ static void lpc43_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, lpc43_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: lpc43_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void lpc43_poll_work(void *arg)
{
struct lpc43_ethmac_s *priv = (struct lpc43_ethmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if the next TX descriptor is owned by the Ethernet DMA or
* CPU. We cannot perform the TX poll if we are unable to accept
* another packet for transmission.
*
* In a race condition, ETH_TDES0_OWN may be cleared BUT still
* not available because lpc43_freeframe() has not yet run. If
* lpc43_freeframe() has run, the buffer1 pointer (tdes2) will be
* nullified (and inflight should be < CONFIG_LPC43_ETH_NTXDESC).
*/
net_lock();
if ((priv->txhead->tdes0 & ETH_TDES0_OWN) == 0 &&
priv->txhead->tdes2 == 0)
{
/* If we have the descriptor, then perform the timer poll. Allocate a
* buffer for the poll.
*/
DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL);
dev->d_buf = lpc43_allocbuffer(priv);
/* We can't poll if we have no buffers */
if (dev->d_buf)
{
/* Update TCP timing states and poll for new XMIT data.
*/
devif_timer(dev, LPC43_WDDELAY, lpc43_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
*/
if (dev->d_buf)
{
DEBUGASSERT(dev->d_len == 0);
lpc43_freebuffer(priv, dev->d_buf);
dev->d_buf = NULL;
}
}
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, LPC43_WDDELAY,
lpc43_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: lpc43_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void lpc43_poll_expiry(wdparm_t arg)
{
struct lpc43_ethmac_s *priv = (struct lpc43_ethmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, lpc43_poll_work, priv, 0);
}
/****************************************************************************
* Function: lpc43_ifup
*
@@ -2272,11 +2164,6 @@ static int lpc43_ifup(struct net_driver_s *dev)
return ret;
}
/* Set and activate a timer process */
wd_start(&priv->txpoll, LPC43_WDDELAY,
lpc43_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->ifup = true;
@@ -2315,9 +2202,8 @@ static int lpc43_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(LPC43M4_IRQ_ETHERNET);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -153
View File
@@ -132,12 +132,6 @@
#define ETHWORK LPWORK
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define LPC54_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define LPC54_TXTIMEOUT (60*CLK_TCK)
@@ -296,7 +290,6 @@ struct lpc54_ethdriver_s
uint8_t eth_fullduplex : 1; /* 1:Full duplex 0:Half duplex mode */
uint8_t eth_100mbps : 1; /* 1:100mbps 0:10mbps */
uint8_t eth_rxdiscard : 1; /* 1:Discarding Rx data */
struct wdog_s eth_txpoll; /* TX poll timer */
struct wdog_s eth_txtimeout; /* TX timeout timer */
struct work_s eth_irqwork; /* For deferring interrupt work to the work queue */
struct work_s eth_pollwork; /* For deferring poll work to the work queue */
@@ -404,15 +397,11 @@ static int lpc54_mac_interrupt(int irq, void *context, void *arg);
/* Watchdog timer expirations */
static void lpc54_eth_dotimer(struct lpc54_ethdriver_s *priv);
static void lpc54_eth_dopoll(struct lpc54_ethdriver_s *priv);
static void lpc54_eth_txtimeout_work(void *arg);
static void lpc54_eth_txtimeout_expiry(wdparm_t arg);
static void lpc54_eth_poll_work(void *arg);
static void lpc54_eth_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int lpc54_eth_ifup(struct net_driver_s *dev);
@@ -1688,73 +1677,6 @@ static void lpc54_eth_txtimeout_expiry(wdparm_t arg)
priv, 0);
}
/****************************************************************************
* Name: lpc54_eth_dotimer
*
* Description:
* Check if there are Tx descriptors available and, if so, allocate a Tx
* then perform the normal Tx poll
*
* Input Parameters:
* priv - Reference to the driver state structure
*
* Returned Value:
* None
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void lpc54_eth_dotimer(struct lpc54_ethdriver_s *priv)
{
struct lpc54_txring_s *txring0;
#ifdef CONFIG_LPC54_ETH_MULTIQUEUE
struct lpc54_txring_s *txring1;
#endif
DEBUGASSERT(priv->eth_dev.d_buf == NULL);
txring0 = &priv->eth_txring[0];
#ifdef CONFIG_LPC54_ETH_MULTIQUEUE
txring1 = &priv->eth_txring[1];
/* We cannot perform the Tx poll now if all of the Tx descriptors for both
* channels are in-use.
*/
if (txring0->tr_inuse < txring0->tr_ndesc &&
txring1->tr_inuse < txring1->tr_ndesc)
#else
/* We cannot perform the Tx poll now if all of the Tx descriptors for this
* channel 0 are in-use.
*/
if (txring0->tr_inuse < txring0->tr_ndesc)
#endif
{
/* There is a free descriptor in the ring, allocate a new Tx buffer
* to perform the poll.
*/
priv->eth_dev.d_buf = (uint8_t *)lpc54_pktbuf_alloc(priv);
if (priv->eth_dev.d_buf != NULL)
{
devif_timer(&priv->eth_dev, LPC54_WDDELAY, lpc54_eth_txpoll);
/* Make sure that the Tx buffer remaining after the poll is
* freed.
*/
if (priv->eth_dev.d_buf != NULL)
{
lpc54_pktbuf_free(priv, (uint32_t *)priv->eth_dev.d_buf);
priv->eth_dev.d_buf = NULL;
}
}
}
}
/****************************************************************************
* Name: lpc54_eth_dopoll
*
@@ -1807,7 +1729,7 @@ static void lpc54_eth_dopoll(struct lpc54_ethdriver_s *priv)
priv->eth_dev.d_buf = (uint8_t *)lpc54_pktbuf_alloc(priv);
if (priv->eth_dev.d_buf != NULL)
{
devif_timer(&priv->eth_dev, 0, lpc54_eth_txpoll);
devif_poll(&priv->eth_dev, lpc54_eth_txpoll);
/* Make sure that the Tx buffer remaining after the poll is
* freed.
@@ -1822,73 +1744,6 @@ static void lpc54_eth_dopoll(struct lpc54_ethdriver_s *priv)
}
}
/****************************************************************************
* Name: lpc54_eth_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Run on a work queue thread.
*
****************************************************************************/
static void lpc54_eth_poll_work(void *arg)
{
struct lpc54_ethdriver_s *priv = (struct lpc54_ethdriver_s *)arg;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
* is performed on an LP worker thread and where more than one LP worker
* thread has been configured.
*/
net_lock();
/* Perform the timer poll */
lpc54_eth_dotimer(priv);
/* Setup the watchdog poll timer again */
wd_start(&priv->eth_txpoll, LPC54_WDDELAY,
lpc54_eth_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Name: lpc54_eth_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Runs in the context of a the timer interrupt handler. Local
* interrupts are disabled by the interrupt logic.
*
****************************************************************************/
static void lpc54_eth_poll_expiry(wdparm_t arg)
{
struct lpc54_ethdriver_s *priv = (struct lpc54_ethdriver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->eth_pollwork, lpc54_eth_poll_work, priv, 0);
}
/****************************************************************************
* Name: lpc54_eth_ifup
*
@@ -2167,11 +2022,6 @@ static int lpc54_eth_ifup(struct net_driver_s *dev)
regval |= ETH_MAC_CONFIG_TE;
lpc54_putreg(regval, LPC54_ETH_MAC_CONFIG);
/* Set and activate a timer process */
wd_start(&priv->eth_txpoll, LPC54_WDDELAY,
lpc54_eth_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->eth_bifup = 1;
@@ -2209,9 +2059,8 @@ static int lpc54_eth_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(LPC54_IRQ_ETHERNET);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->eth_txpoll);
wd_cancel(&priv->eth_txtimeout);
/* Put the EMAC in its post-reset, non-operational state. This should be
+2 -44
View File
@@ -30,20 +30,13 @@
#include <nuttx/kmalloc.h>
#include "amebaz_netdev.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define WDDELAY (1 * CLK_TCK / 2)
/****************************************************************************
* Public Functions
****************************************************************************/
static void amebaz_poll_work(void *arg);
static void amebaz_netdev_notify_tx_done(struct amebaz_dev_s *priv)
{
work_queue(LPWORK, &priv->pollwork, amebaz_poll_work, priv, 0);
work_queue(LPWORK, &priv->pollwork, amebaz_txavail_work, priv, 0);
}
static int amebaz_txpoll(struct net_driver_s *dev)
@@ -222,12 +215,6 @@ void amebaz_netdev_notify_receive(struct amebaz_dev_s *priv,
net_unlock();
}
static void amebaz_poll_expiry(wdparm_t arg)
{
struct amebaz_dev_s *priv = (struct amebaz_dev_s *)arg;
work_queue(LPWORK, &priv->pollwork, amebaz_poll_work, priv, 0);
}
static void amebaz_txavail_work(void *arg)
{
struct amebaz_dev_s *priv = (struct amebaz_dev_s *)arg;
@@ -247,40 +234,13 @@ static void amebaz_txavail_work(void *arg)
if (priv->dev.d_buf)
{
devif_timer(&priv->dev, 0, amebaz_txpoll);
devif_poll(&priv->dev, amebaz_txpoll);
}
}
net_unlock();
}
static void amebaz_poll_work(void *arg)
{
struct amebaz_dev_s *priv = (struct amebaz_dev_s *)arg;
struct net_driver_s *dev = &priv->dev;
net_lock();
if (IFF_IS_UP(dev->d_flags))
{
if (!priv->curr && rltk_wlan_check_isup(priv->devnum))
{
priv->curr = rltk_wlan_alloc_skb(MAX_NETDEV_PKTSIZE);
if (priv->curr)
{
priv->dev.d_buf = priv->curr->tail;
priv->dev.d_len = 0;
}
}
if (priv->dev.d_buf)
{
devif_timer(&priv->dev, WDDELAY, amebaz_txpoll);
}
}
wd_start(&priv->txpoll, WDDELAY, amebaz_poll_expiry, (wdparm_t)priv);
net_unlock();
}
static int amebaz_txavail(struct net_driver_s *dev)
{
struct amebaz_dev_s *priv = (struct amebaz_dev_s *)dev->d_private;
@@ -365,7 +325,6 @@ static int amebaz_ifup(struct net_driver_s *dev)
{
priv->mode = RTW_MODE_NONE;
priv->conn.status = AMEBAZ_STATUS_DISABLED;
wd_start(&priv->txpoll, WDDELAY, amebaz_poll_expiry, (wdparm_t)dev);
}
return OK;
@@ -393,7 +352,6 @@ static int amebaz_ifdown(struct net_driver_s *dev)
priv->curr = NULL;
}
wd_cancel(&priv->txpoll);
if (priv->devnum == 0)
{
rltk_wlan_deinit();
+2 -88
View File
@@ -123,12 +123,6 @@
# error Write back D-Cache not yet supported
#endif
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per
* second.
*/
#define S32K1XX_WDDELAY (1*CLK_TCK)
/* Align assuming that the D-Cache is enabled (probably 32-bytes).
*
* REVISIT: The size of descriptors and buffers must also be in even units
@@ -258,7 +252,6 @@ struct s32k1xx_driver_s
uint8_t txhead; /* The next TX descriptor to use */
uint8_t rxtail; /* The next RX descriptor to use */
uint8_t phyaddr; /* Selected PHY address */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -332,9 +325,6 @@ static int s32k1xx_enet_interrupt(int irq, void *context,
static void s32k1xx_txtimeout_work(void *arg);
static void s32k1xx_txtimeout_expiry(wdparm_t arg);
static void s32k1xx_poll_work(void *arg);
static void s32k1xx_polltimer_expiry(wdparm_t arg);
/* NuttX callback functions */
static int s32k1xx_ifup(struct net_driver_s *dev);
@@ -1196,76 +1186,6 @@ static void s32k1xx_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, s32k1xx_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: s32k1xx_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void s32k1xx_poll_work(void *arg)
{
struct s32k1xx_driver_s *priv = (struct s32k1xx_driver_s *)arg;
/* Check if there is there is a transmission in progress. We cannot
* perform the TX poll if he are unable to accept another packet for
* transmission.
*/
net_lock();
if (!s32k1xx_txringfull(priv))
{
/* If so, update TCP timing states and poll the network for new XMIT
* data. Hmmm.. might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
devif_timer(&priv->dev, S32K1XX_WDDELAY, s32k1xx_txpoll);
}
/* Setup the watchdog poll timer again in any case */
wd_start(&priv->txpoll, S32K1XX_WDDELAY,
s32k1xx_polltimer_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: s32k1xx_polltimer_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void s32k1xx_polltimer_expiry(wdparm_t arg)
{
struct s32k1xx_driver_s *priv = (struct s32k1xx_driver_s *)arg;
/* Schedule to perform the poll processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, s32k1xx_poll_work, priv, 0);
}
/****************************************************************************
* Function: s32k1xx_ifup_action
*
@@ -1364,11 +1284,6 @@ static int s32k1xx_ifup_action(struct net_driver_s *dev, bool resetphy)
putreg32(ENET_RDAR, S32K1XX_ENET_RDAR);
/* Set and activate a timer process */
wd_start(&priv->txpoll, S32K1XX_WDDELAY,
s32k1xx_polltimer_expiry, (wdparm_t)priv);
/* Clear all pending ENET interrupt */
putreg32(RX_INTERRUPTS | ERROR_INTERRUPTS | TX_INTERRUPTS,
@@ -1452,9 +1367,8 @@ static int s32k1xx_ifdown(struct net_driver_s *dev)
up_disable_irq(S32K1XX_IRQ_ENET_RXDONE);
putreg32(0, S32K1XX_ENET_EIMR);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
@@ -1507,7 +1421,7 @@ static void s32k1xx_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, s32k1xx_txpoll);
devif_poll(&priv->dev, s32k1xx_txpoll);
}
}
+2 -2
View File
@@ -1049,7 +1049,7 @@ static void s32k1xx_txdone_work(void *arg)
*/
net_lock();
devif_timer(&priv->dev, 0, s32k1xx_txpoll);
devif_poll(&priv->dev, s32k1xx_txpoll);
net_unlock();
}
@@ -1406,7 +1406,7 @@ static void s32k1xx_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, s32k1xx_txpoll);
devif_poll(&priv->dev, s32k1xx_txpoll);
}
}
+2 -83
View File
@@ -214,12 +214,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define SAM_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define SAM_TXTIMEOUT (60*CLK_TCK)
@@ -245,7 +239,6 @@
struct sam_emac_s
{
uint8_t ifup : 1; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -369,9 +362,6 @@ static int sam_emac_interrupt(int irq, void *context, void *arg);
static void sam_txtimeout_work(void *arg);
static void sam_txtimeout_expiry(wdparm_t arg);
static void sam_poll_work(void *arg);
static void sam_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int sam_ifup(struct net_driver_s *dev);
@@ -935,7 +925,7 @@ static void sam_dopoll(struct sam_emac_s *priv)
* then poll the network for new XMIT data.
*/
devif_timer(dev, 0, sam_txpoll);
devif_poll(dev, sam_txpoll);
}
}
@@ -1731,72 +1721,6 @@ static void sam_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, sam_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: sam_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void sam_poll_work(void *arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if there are any free TX descriptors. We cannot perform the
* TX poll if we do not have buffering for another packet.
*/
net_lock();
if (sam_txfree(priv) > 0)
{
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(dev, SAM_WDDELAY, sam_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: sam_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void sam_poll_expiry(wdparm_t arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, sam_poll_work, priv, 0);
}
/****************************************************************************
* Function: sam_ifup
*
@@ -1865,10 +1789,6 @@ static int sam_ifup(struct net_driver_s *dev)
ninfo("Enable normal operation\n");
/* Set and activate a timer process */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
/* Enable the EMAC interrupt */
priv->ifup = true;
@@ -1904,9 +1824,8 @@ static int sam_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(SAM_IRQ_EMAC);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -83
View File
@@ -245,12 +245,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define SAM_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define SAM_TXTIMEOUT (60*CLK_TCK)
@@ -276,7 +270,6 @@
struct sam_emac_s
{
uint8_t ifup : 1; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -400,9 +393,6 @@ static int sam_emac_interrupt(int irq, void *context, void *arg);
static void sam_txtimeout_work(void *arg);
static void sam_txtimeout_expiry(wdparm_t arg);
static void sam_poll_work(void *arg);
static void sam_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int sam_ifup(struct net_driver_s *dev);
@@ -970,7 +960,7 @@ static void sam_dopoll(struct sam_emac_s *priv)
* then poll the network for new XMIT data.
*/
devif_timer(dev, 0, sam_txpoll);
devif_poll(dev, sam_txpoll);
}
}
@@ -1792,72 +1782,6 @@ static void sam_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, sam_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: sam_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void sam_poll_work(void *arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if there are any free TX descriptors. We cannot perform the
* TX poll if we do not have buffering for another packet.
*/
net_lock();
if (sam_txfree(priv) > 0)
{
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(dev, SAM_WDDELAY, sam_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: sam_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void sam_poll_expiry(wdparm_t arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, sam_poll_work, priv, 0);
}
/****************************************************************************
* Function: sam_ifup
*
@@ -1926,10 +1850,6 @@ static int sam_ifup(struct net_driver_s *dev)
ninfo("Enable normal operation\n");
/* Set and activate a timer process */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
/* Enable the EMAC interrupt */
priv->ifup = true;
@@ -1965,9 +1885,8 @@ static int sam_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(SAM_IRQ_EMAC);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -83
View File
@@ -292,12 +292,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define SAM_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define SAM_TXTIMEOUT (60*CLK_TCK)
@@ -386,7 +380,6 @@ struct sam_emacattr_s
struct sam_emac_s
{
uint8_t ifup : 1; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -466,9 +459,6 @@ static int sam_emac_interrupt(int irq, void *context, void *arg);
static void sam_txtimeout_work(void *arg);
static void sam_txtimeout_expiry(wdparm_t arg);
static void sam_poll_work(void *arg);
static void sam_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int sam_ifup(struct net_driver_s *dev);
@@ -1283,7 +1273,7 @@ static void sam_dopoll(struct sam_emac_s *priv)
* then poll the network for new XMIT data.
*/
devif_timer(dev, 0, sam_txpoll);
devif_poll(dev, sam_txpoll);
}
}
@@ -2129,72 +2119,6 @@ static void sam_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, sam_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: sam_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void sam_poll_work(void *arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if there are any free TX descriptors. We cannot perform the
* TX poll if we do not have buffering for another packet.
*/
net_lock();
if (sam_txfree(priv) > 0)
{
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(dev, SAM_WDDELAY, sam_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: sam_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void sam_poll_expiry(wdparm_t arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, sam_poll_work, priv, 0);
}
/****************************************************************************
* Function: sam_ifup
*
@@ -2271,10 +2195,6 @@ static int sam_ifup(struct net_driver_s *dev)
ninfo("Enable normal operation\n");
/* Set and activate a timer process */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
/* Enable the EMAC interrupt */
priv->ifup = true;
@@ -2310,9 +2230,8 @@ static int sam_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(priv->attr->irq);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -83
View File
@@ -171,12 +171,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define SAM_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define SAM_TXTIMEOUT (60*CLK_TCK)
@@ -202,7 +196,6 @@
struct sam_gmac_s
{
uint8_t ifup : 1; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -325,9 +318,6 @@ static int sam_gmac_interrupt(int irq, void *context, void *arg);
static void sam_txtimeout_work(void *arg);
static void sam_txtimeout_expiry(wdparm_t arg);
static void sam_poll_work(void *arg);
static void sam_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int sam_ifup(struct net_driver_s *dev);
@@ -912,7 +902,7 @@ static void sam_dopoll(struct sam_gmac_s *priv)
* then poll the network for new XMIT data.
*/
devif_timer(dev, 0, sam_txpoll);
devif_poll(dev, sam_txpoll);
}
}
@@ -1776,72 +1766,6 @@ static void sam_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, sam_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: sam_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void sam_poll_work(void *arg)
{
struct sam_gmac_s *priv = (struct sam_gmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if there are any free TX descriptors. We cannot perform the
* TX poll if we do not have buffering for another packet.
*/
net_lock();
if (sam_txfree(priv) > 0)
{
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(dev, SAM_WDDELAY, sam_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: sam_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void sam_poll_expiry(wdparm_t arg)
{
struct sam_gmac_s *priv = (struct sam_gmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, sam_poll_work, priv, 0);
}
/****************************************************************************
* Function: sam_ifup
*
@@ -1913,10 +1837,6 @@ static int sam_ifup(struct net_driver_s *dev)
ninfo("Enable normal operation\n");
/* Set and activate a timer process */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
/* Enable the GMAC interrupt */
priv->ifup = true;
@@ -1952,9 +1872,8 @@ static int sam_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(SAM_IRQ_GMAC);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the GMAC in its reset, non-operational state. This should be
+2 -83
View File
@@ -168,12 +168,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define SAM_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define SAM_TXTIMEOUT (60*CLK_TCK)
@@ -199,7 +193,6 @@
struct sam_gmac_s
{
uint8_t ifup : 1; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -322,9 +315,6 @@ static int sam_gmac_interrupt(int irq, void *context, void *arg);
static void sam_txtimeout_work(void *arg);
static void sam_txtimeout_expiry(wdparm_t arg);
static void sam_poll_work(void *arg);
static void sam_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int sam_ifup(struct net_driver_s *dev);
@@ -900,7 +890,7 @@ static void sam_dopoll(struct sam_gmac_s *priv)
* then poll the network for new XMIT data.
*/
devif_timer(dev, 0, sam_txpoll);
devif_poll(dev, sam_txpoll);
}
}
@@ -1741,72 +1731,6 @@ static void sam_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, sam_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: sam_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void sam_poll_work(void *arg)
{
struct sam_gmac_s *priv = (struct sam_gmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if there are any free TX descriptors. We cannot perform the
* TX poll if we do not have buffering for another packet.
*/
net_lock();
if (sam_txfree(priv) > 0)
{
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(dev, sam_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: sam_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void sam_poll_expiry(wdparm_t arg)
{
struct sam_gmac_s *priv = (struct sam_gmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, sam_poll_work, priv, 0);
}
/****************************************************************************
* Function: sam_ifup
*
@@ -1876,10 +1800,6 @@ static int sam_ifup(struct net_driver_s *dev)
ninfo("Enable normal operation\n");
/* Set and activate a timer process */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
/* Enable the GMAC interrupt */
priv->ifup = true;
@@ -1915,9 +1835,8 @@ static int sam_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(SAM_IRQ_GMAL);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the GMAC in its reset, non-operational state. This should be
+2 -83
View File
@@ -388,12 +388,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define SAM_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define SAM_TXTIMEOUT (60*CLK_TCK)
@@ -505,7 +499,6 @@ struct sam_queue_s
struct sam_emac_s
{
uint8_t ifup : 1; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring work to the work queue */
struct work_s pollwork; /* For deferring work to the work queue */
@@ -582,9 +575,6 @@ static int sam_emac_interrupt(int irq, void *context, void *arg);
static void sam_txtimeout_work(void *arg);
static void sam_txtimeout_expiry(wdparm_t arg);
static void sam_poll_work(void *arg);
static void sam_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int sam_ifup(struct net_driver_s *dev);
@@ -1593,7 +1583,7 @@ static void sam_dopoll(struct sam_emac_s *priv, int qid)
* then poll the network for new XMIT data.
*/
devif_timer(dev, 0, sam_txpoll);
devif_poll(dev, sam_txpoll);
}
}
@@ -2594,72 +2584,6 @@ static void sam_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, sam_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: sam_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void sam_poll_work(void *arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if there are any free TX descriptors. We cannot perform the
* TX poll if we do not have buffering for another packet.
*/
net_lock();
if (sam_txfree(priv, EMAC_QUEUE_0) > 0)
{
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(dev, SAM_WDDELAY, sam_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: sam_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void sam_poll_expiry(wdparm_t arg)
{
struct sam_emac_s *priv = (struct sam_emac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, sam_poll_work, priv, 0);
}
/****************************************************************************
* Function: sam_ifup
*
@@ -2747,10 +2671,6 @@ static int sam_ifup(struct net_driver_s *dev)
ninfo("Enable normal operation\n");
/* Set and activate a timer process */
wd_start(&priv->txpoll, SAM_WDDELAY, sam_poll_expiry, (wdparm_t)priv);
/* Enable the EMAC interrupt */
priv->ifup = true;
@@ -2786,9 +2706,8 @@ static int sam_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(priv->attr->irq);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -2
View File
@@ -1083,7 +1083,7 @@ static void stm32can_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, stm32can_txpoll);
devif_poll(&priv->dev, stm32can_txpoll);
}
}
@@ -1511,7 +1511,7 @@ static void stm32can_txdone_work(void *arg)
*/
net_lock();
devif_timer(&priv->dev, 0, stm32can_txpoll);
devif_poll(&priv->dev, stm32can_txpoll);
net_unlock();
}
+2 -116
View File
@@ -292,12 +292,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define STM32_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define STM32_TXTIMEOUT (60*CLK_TCK)
@@ -623,7 +617,6 @@ struct stm32_ethmac_s
uint8_t ifup : 1; /* true:ifup false:ifdown */
uint8_t mbps100 : 1; /* 100MBps operation (vs 10 MBps) */
uint8_t fduplex : 1; /* Full (vs. half) duplex */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -712,9 +705,6 @@ static int stm32_interrupt(int irq, void *context, void *arg);
static void stm32_txtimeout_work(void *arg);
static void stm32_txtimeout_expiry(wdparm_t arg);
static void stm32_poll_work(void *arg);
static void stm32_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int stm32_ifup(struct net_driver_s *dev);
@@ -1386,7 +1376,7 @@ static void stm32_dopoll(struct stm32_ethmac_s *priv)
if (dev->d_buf)
{
devif_timer(dev, 0, stm32_txpoll);
devif_poll(dev, stm32_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
@@ -2255,104 +2245,6 @@ static void stm32_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, stm32_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: stm32_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void stm32_poll_work(void *arg)
{
struct stm32_ethmac_s *priv = (struct stm32_ethmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if the next TX descriptor is owned by the Ethernet DMA or
* CPU. We cannot perform the TX poll if we are unable to accept
* another packet for transmission.
*
* In a race condition, ETH_TDES0_OWN may be cleared BUT still
* not available because stm32_freeframe() has not yet run. If
* stm32_freeframe() has run, the buffer1 pointer (tdes2) will be
* nullified (and inflight should be < CONFIG_STM32_ETH_NTXDESC).
*/
net_lock();
if ((priv->txhead->tdes0 & ETH_TDES0_OWN) == 0 &&
priv->txhead->tdes2 == 0)
{
/* If we have the descriptor, then perform the timer poll. Allocate a
* buffer for the poll.
*/
DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL);
dev->d_buf = stm32_allocbuffer(priv);
/* We can't poll if we have no buffers */
if (dev->d_buf)
{
/* Update TCP timing states and poll the network for new XMIT data.
*/
devif_timer(dev, STM32_WDDELAY, stm32_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
*/
if (dev->d_buf)
{
DEBUGASSERT(dev->d_len == 0);
stm32_freebuffer(priv, dev->d_buf);
dev->d_buf = NULL;
}
}
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: stm32_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void stm32_poll_expiry(wdparm_t arg)
{
struct stm32_ethmac_s *priv = (struct stm32_ethmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, stm32_poll_work, priv, 0);
}
/****************************************************************************
* Function: stm32_ifup
*
@@ -2399,11 +2291,6 @@ static int stm32_ifup(struct net_driver_s *dev)
return ret;
}
/* Set and activate a timer process */
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->ifup = true;
@@ -2444,9 +2331,8 @@ static int stm32_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(STM32_IRQ_ETH);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -2
View File
@@ -1981,7 +1981,7 @@ static void fdcan_txdone_work(void *arg)
*/
net_lock();
devif_timer(&priv->dev, 0, fdcan_txpoll);
devif_poll(&priv->dev, fdcan_txpoll);
net_unlock();
}
@@ -3105,7 +3105,7 @@ static void fdcan_txavail_work(void *arg)
* new XMIT data.
*/
devif_timer(&priv->dev, 0, fdcan_txpoll);
devif_poll(&priv->dev, fdcan_txpoll);
}
}
+2 -124
View File
@@ -289,12 +289,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define STM32_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define STM32_TXTIMEOUT (60*CLK_TCK)
@@ -626,7 +620,6 @@ struct stm32_ethmac_s
uint8_t mbps100 : 1; /* 100MBps operation (vs 10 MBps) */
uint8_t fduplex : 1; /* Full (vs. half) duplex */
uint8_t intf; /* Ethernet interface number */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -732,9 +725,6 @@ static int stm32_interrupt(int irq, void *context, void *arg);
static void stm32_txtimeout_work(void *arg);
static void stm32_txtimeout_expiry(wdparm_t arg);
static void stm32_poll_work(void *arg);
static void stm32_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int stm32_ifup(struct net_driver_s *dev);
@@ -1428,7 +1418,7 @@ static void stm32_dopoll(struct stm32_ethmac_s *priv)
if (dev->d_buf)
{
devif_timer(dev, 0, stm32_txpoll);
devif_poll(dev, stm32_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
@@ -2352,112 +2342,6 @@ static void stm32_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, stm32_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: stm32_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void stm32_poll_work(void *arg)
{
struct stm32_ethmac_s *priv = (struct stm32_ethmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if the next TX descriptor is owned by the Ethernet DMA or
* CPU. We cannot perform the TX poll if we are unable to accept
* another packet for transmission.
*
* In a race condition, ETH_TDES0_OWN may be cleared BUT still
* not available because stm32_freeframe() has not yet run. If
* stm32_freeframe() has run, the buffer1 pointer (tdes2) will be
* nullified (and inflight should be < CONFIG_STM32F7_ETH_NTXDESC).
*/
net_lock();
if ((priv->txhead->tdes0 & ETH_TDES0_OWN) == 0 &&
priv->txhead->tdes2 == 0)
{
/* If we have the descriptor, then perform the timer poll. Allocate a
* buffer for the poll.
*/
DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL);
dev->d_buf = stm32_allocbuffer(priv);
/* We can't poll if we have no buffers */
if (dev->d_buf)
{
/* Update TCP timing states and poll the network for new XMIT data.
*/
devif_timer(dev, STM32_WDDELAY, stm32_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
*/
if (dev->d_buf)
{
DEBUGASSERT(dev->d_len == 0);
stm32_freebuffer(priv, dev->d_buf);
dev->d_buf = NULL;
}
}
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: stm32_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void stm32_poll_expiry(wdparm_t arg)
{
struct stm32_ethmac_s *priv = (struct stm32_ethmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
if (work_available(&priv->pollwork))
{
work_queue(ETHWORK, &priv->pollwork, stm32_poll_work, priv, 0);
}
else
{
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
}
}
/****************************************************************************
* Function: stm32_ifup
*
@@ -2502,11 +2386,6 @@ static int stm32_ifup(struct net_driver_s *dev)
return ret;
}
/* Set and activate a timer process */
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->ifup = true;
@@ -2544,9 +2423,8 @@ static int stm32_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(STM32_IRQ_ETH);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -127
View File
@@ -277,12 +277,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define STM32_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define STM32_TXTIMEOUT (60*CLK_TCK)
@@ -625,7 +619,6 @@ struct stm32_ethmac_s
uint8_t mbps100 : 1; /* 100MBps operation (vs 10 MBps) */
uint8_t fduplex : 1; /* Full (vs. half) duplex */
uint8_t intf; /* Ethernet interface number */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -734,9 +727,6 @@ static int stm32_interrupt(int irq, void *context, void *arg);
static void stm32_txtimeout_work(void *arg);
static void stm32_txtimeout_expiry(wdparm_t arg);
static void stm32_poll_work(void *arg);
static void stm32_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int stm32_ifup(struct net_driver_s *dev);
@@ -1464,7 +1454,7 @@ static void stm32_dopoll(struct stm32_ethmac_s *priv)
if (dev->d_buf)
{
devif_timer(dev, 0, stm32_txpoll);
devif_poll(dev, stm32_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
@@ -2462,115 +2452,6 @@ static void stm32_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, stm32_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: stm32_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void stm32_poll_work(void *arg)
{
struct stm32_ethmac_s *priv = (struct stm32_ethmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if the next TX descriptor is owned by the Ethernet DMA or
* CPU. We cannot perform the timer poll if we are unable to accept
* another packet for transmission. Hmmm.. might be bug here.
* Does this mean if there is a transmit in progress, we will miss
* TCP time state updates?
*
* In a race condition, ETH_TDES3_OWN may be cleared BUT still
* not available because stm32_freeframe() has not yet run. If
* stm32_freeframe() has run, the buffer1 pointer (des2) will be
* nullified (and inflight should be < CONFIG_STM32H7_ETH_NTXDESC).
*/
net_lock();
if ((priv->txhead->des3 & ETH_TDES3_RD_OWN) == 0 &&
priv->txhead->des0 == 0)
{
/* If we have the descriptor, then perform the timer poll. Allocate a
* buffer for the poll.
*/
DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL);
dev->d_buf = stm32_allocbuffer(priv);
/* We can't poll if we have no buffers */
if (dev->d_buf)
{
/* Update TCP timing states and poll the network for new XMIT
* data.
*/
devif_timer(dev, STM32_WDDELAY, stm32_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
*/
if (dev->d_buf)
{
DEBUGASSERT(dev->d_len == 0);
stm32_freebuffer(priv, dev->d_buf);
dev->d_buf = NULL;
}
}
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: stm32_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void stm32_poll_expiry(wdparm_t arg)
{
struct stm32_ethmac_s *priv = (struct stm32_ethmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
if (work_available(&priv->pollwork))
{
work_queue(ETHWORK, &priv->pollwork, stm32_poll_work, priv, 0);
}
else
{
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
}
}
/****************************************************************************
* Function: stm32_ifup
*
@@ -2613,11 +2494,6 @@ static int stm32_ifup(struct net_driver_s *dev)
return ret;
}
/* Set and activate a timer process */
wd_start(&priv->txpoll, STM32_WDDELAY,
stm32_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->ifup = true;
@@ -2655,9 +2531,8 @@ static int stm32_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(STM32_IRQ_ETH);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -91
View File
@@ -154,12 +154,6 @@
# define tiva_dumppacket(m,a,n)
#endif
/* TX poll deley = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define TIVA_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define TIVA_TXTIMEOUT (60*CLK_TCK)
@@ -190,7 +184,6 @@ struct tiva_driver_s
#endif
bool ld_bifup; /* true:ifup false:ifdown */
struct wdog_s ld_txpoll; /* TX poll timer */
struct wdog_s ld_txtimeout; /* TX timeout timer */
struct work_s ld_irqwork; /* For deferring interrupt work to the work queue */
struct work_s ld_pollwork; /* For deferring poll work to the work queue */
@@ -254,9 +247,6 @@ static int tiva_interrupt(int irq, void *context, void *arg);
static void tiva_txtimeout_work(void *arg);
static void tiva_txtimeout_expiry(wdparm_t arg);
static void tiva_poll_work(void *arg);
static void tiva_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int tiva_ifup(struct net_driver_s *dev);
@@ -1187,79 +1177,6 @@ static void tiva_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->ld_irqwork, tiva_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: tiva_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void tiva_poll_work(void *arg)
{
struct tiva_driver_s *priv = (struct tiva_driver_s *)arg;
/* Check if we can send another Tx packet now. The NEWTX bit initiates an
* Ethernet transmission once the packet has been placed in the TX FIFO.
* This bit is cleared once the transmission has been completed.
*
* NOTE: This can cause missing poll cycles and, hence, some timing
* inaccuracies.
*/
net_lock();
if ((tiva_ethin(priv, TIVA_MAC_TR_OFFSET) & MAC_TR_NEWTX) == 0)
{
/* If so, update TCP timing states and poll the network for new XMIT
* data.
*/
devif_timer(&priv->ld_dev, TIVA_WDDELAY, tiva_txpoll);
/* Setup the watchdog poll timer again */
wd_start(&priv->ld_txpoll, TIVA_WDDELAY,
tiva_poll_expiry, (wdparm_t)priv);
}
net_unlock();
}
/****************************************************************************
* Function: tiva_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void tiva_poll_expiry(wdparm_t arg)
{
struct tiva_driver_s *priv = (struct tiva_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->ld_pollwork, tiva_poll_work, priv, 0);
}
/****************************************************************************
* Function: tiva_ifup
*
@@ -1413,11 +1330,6 @@ static int tiva_ifup(struct net_driver_s *dev)
(uint32_t)priv->ld_dev.d_mac.ether.ether_addr_octet[4];
tiva_ethout(priv, TIVA_MAC_IA1_OFFSET, regval);
/* Set and activate a timer process */
wd_start(&priv->ld_txpoll, TIVA_WDDELAY,
tiva_poll_expiry, (wdparm_t)priv);
priv->ld_bifup = true;
leave_critical_section(flags);
return OK;
@@ -1452,10 +1364,9 @@ static int tiva_ifdown(struct net_driver_s *dev)
(int)((dev->d_ipaddr >> 16) & 0xff),
(int)(dev->d_ipaddr >> 24));
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
flags = enter_critical_section();
wd_cancel(&priv->ld_txpoll);
wd_cancel(&priv->ld_txtimeout);
/* Disable the Ethernet interrupt */
@@ -1545,7 +1456,7 @@ static void tiva_txavail_work(void *arg)
* network for new Tx data
*/
devif_timer(&priv->ld_dev, 0, tiva_txpoll);
devif_poll(&priv->ld_dev, tiva_txpoll);
}
net_unlock();
+2 -116
View File
@@ -261,12 +261,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define TIVA_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define TIVA_TXTIMEOUT (60*CLK_TCK)
@@ -629,7 +623,6 @@ struct tiva_ethmac_s
uint8_t ifup : 1; /* true:ifup false:ifdown */
uint8_t mbps100 : 1; /* 100MBps operation (vs 10 MBps) */
uint8_t fduplex : 1; /* Full (vs. half) duplex */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -722,9 +715,6 @@ static int tiva_interrupt(int irq, void *context, void *arg);
static void tiva_txtimeout_work(void *arg);
static void tiva_txtimeout_expiry(wdparm_t arg);
static void tiva_poll_work(void *arg);
static void tiva_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int tiva_ifup(struct net_driver_s *dev);
@@ -1386,7 +1376,7 @@ static void tiva_dopoll(struct tiva_ethmac_s *priv)
if (dev->d_buf)
{
devif_timer(dev, 0, tiva_txpoll);
devif_poll(dev, tiva_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
@@ -2248,104 +2238,6 @@ static void tiva_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, tiva_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: tiva_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void tiva_poll_work(void *arg)
{
struct tiva_ethmac_s *priv = (struct tiva_ethmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if the next TX descriptor is owned by the Ethernet DMA or
* CPU. We cannot perform the TX poll if we are unable to accept
* another packet for transmission.
*
* In a race condition, EMAC_TDES0_OWN may be cleared BUT still
* not available because tiva_freeframe() has not yet run. If
* tiva_freeframe() has run, the buffer1 pointer (tdes2) will be
* nullified (and inflight should be < CONFIG_TIVA_EMAC_NTXDESC).
*/
net_lock();
if ((priv->txhead->tdes0 & EMAC_TDES0_OWN) == 0 &&
priv->txhead->tdes2 == 0)
{
/* If we have the descriptor, then perform the timer poll. Allocate a
* buffer for the poll.
*/
DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL);
dev->d_buf = tiva_allocbuffer(priv);
/* We can't poll if we have no buffers */
if (dev->d_buf)
{
/* Update TCP timing states and poll the network for new XMIT data.
*/
devif_timer(dev, TIVA_WDDELAY, tiva_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
*/
if (dev->d_buf)
{
DEBUGASSERT(dev->d_len == 0);
tiva_freebuffer(priv, dev->d_buf);
dev->d_buf = NULL;
}
}
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, TIVA_WDDELAY,
tiva_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: tiva_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void tiva_poll_expiry(wdparm_t arg)
{
struct tiva_ethmac_s *priv = (struct tiva_ethmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, tiva_poll_work, priv, 0);
}
/****************************************************************************
* Function: tiva_ifup
*
@@ -2391,11 +2283,6 @@ static int tiva_ifup(struct net_driver_s *dev)
return ret;
}
/* Set and activate a timer process */
wd_start(&priv->txpoll, TIVA_WDDELAY,
tiva_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->ifup = true;
@@ -2434,9 +2321,8 @@ static int tiva_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(TIVA_IRQ_ETHCON);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
+2 -53
View File
@@ -57,12 +57,6 @@
# define CONFIG_HCS12_NINTERFACES 1
#endif
/* TX poll deley = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define HCS12_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define HCS12_TXTIMEOUT (60*CLK_TCK)
@@ -82,7 +76,6 @@
struct emac_driver_s
{
bool d_bifup; /* true:ifup false:ifdown */
struct wdog_s d_txpoll; /* TX poll timer */
struct wdog_s d_txtimeout; /* TX timeout timer */
/* This holds the information visible to the NuttX network */
@@ -119,7 +112,6 @@ static int emac_interrupt(int irq, FAR void *context, FAR void *arg);
/* Watchdog timer expirations */
static void emac_polltimer(wdparm_t arg);
static void emac_txtimeout(wdparm_t arg);
/* NuttX callback functions */
@@ -490,43 +482,6 @@ static void emac_txtimeout(wdparm_t arg)
devif_poll(&priv->d_dev, emac_txpoll);
}
/****************************************************************************
* Function: emac_polltimer
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void emac_polltimer(wdparm_t arg)
{
FAR struct emac_driver_s *priv = (FAR struct emac_driver_s *)arg;
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
/* If so, update TCP timing states and poll the network for new XMIT data.
* Hmmm.. might be bug here. Does this mean if there is a transmit in
* progress, we will missing TCP time state updates?
*/
devif_timer(&priv->d_dev, HCS12_WDDELAY, emac_txpoll);
/* Setup the watchdog poll timer again */
wd_start(&priv->d_txpoll, HCS12_WDDELAY, emac_polltimer, (wdparm_t)arg);
}
/****************************************************************************
* Function: emac_ifup
*
@@ -555,11 +510,6 @@ static int emac_ifup(struct net_driver_s *dev)
/* Initialize PHYs, Ethernet interface, and setup up Ethernet interrupts */
/* Set and activate a timer process */
wd_start(&priv->d_txpoll, HCS12_WDDELAY,
emac_polltimer, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->d_bifup = true;
@@ -594,9 +544,8 @@ static int emac_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(CONFIG_HCS12_IRQ);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->d_txpoll);
wd_cancel(&priv->d_txtimeout);
/* Put the EMAC is its reset, non-operational state. This should be
@@ -650,7 +599,7 @@ static int emac_txavail(struct net_driver_s *dev)
/* If so, then poll the network for new XMIT data */
devif_timer(&priv->d_dev, 0, emac_txpoll);
devif_poll(&priv->d_dev, emac_txpoll);
}
leave_critical_section(flags);
+2 -135
View File
@@ -161,12 +161,6 @@
/* Timing *******************************************************************/
/* TX poll deley = 1 seconds. CLK_TCK is the number of clock ticks per
* second
*/
#define PIC32MX_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define PIC32MX_TXTIMEOUT (60*CLK_TCK)
@@ -314,7 +308,6 @@ struct pic32mx_driver_s
#endif
uint8_t pd_txnext; /* Index to the next Tx descriptor */
uint32_t pd_inten; /* Shadow copy of INTEN register */
struct wdog_s pd_txpoll; /* TX poll timer */
struct wdog_s pd_txtimeout; /* TX timeout timer */
struct work_s pd_irqwork; /* For deferring interrupt work to the work queue */
struct work_s pd_pollwork; /* For deferring poll work to the work queue */
@@ -387,7 +380,6 @@ pic32mx_rxdesc(struct pic32mx_driver_s *priv);
static int pic32mx_transmit(struct pic32mx_driver_s *priv);
static int pic32mx_txpoll(struct net_driver_s *dev);
static void pic32mx_poll(struct pic32mx_driver_s *priv);
static void pic32mx_timerpoll(struct pic32mx_driver_s *priv);
/* Interrupt handling */
@@ -403,9 +395,6 @@ static int pic32mx_interrupt(int irq, void *context, void *arg);
static void pic32mx_txtimeout_work(void *arg);
static void pic32mx_txtimeout_expiry(wdparm_t arg);
static void pic32mx_poll_work(void *arg);
static void pic32mx_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int pic32mx_ifup(struct net_driver_s *dev);
@@ -1235,53 +1224,7 @@ static void pic32mx_poll(struct pic32mx_driver_s *priv)
/* And perform the poll */
priv->pd_polling = true;
devif_timer(&priv->pd_dev, 0, pic32mx_txpoll);
/* Free any buffer left attached after the poll */
if (priv->pd_dev.d_buf != NULL)
{
pic32mx_freebuffer(priv, priv->pd_dev.d_buf);
priv->pd_dev.d_buf = NULL;
}
priv->pd_polling = false;
}
}
}
/****************************************************************************
* Function: pic32mx_timerpoll
*
* Description:
* Perform the network timer poll.
*
* Input Parameters:
* priv - Reference to the driver state structure
*
* Returned Value:
* None
*
****************************************************************************/
static void pic32mx_timerpoll(struct pic32mx_driver_s *priv)
{
/* Is there already a poll in progress. This happens, for example, when
* debugging output is enabled. Interrupts may be re-enabled while debug
* output is performed and a timer expiration could attempt a concurrent
* poll.
*/
if (!priv->pd_polling)
{
DEBUGASSERT(priv->pd_dev.d_buf == NULL);
priv->pd_dev.d_buf = pic32mx_allocbuffer(priv);
if (priv->pd_dev.d_buf != NULL)
{
/* And perform the poll */
priv->pd_polling = true;
devif_timer(&priv->pd_dev, PIC32MX_WDDELAY, pic32mx_txpoll);
devif_poll(&priv->pd_dev, pic32mx_txpoll);
/* Free any buffer left attached after the poll */
@@ -2014,76 +1957,6 @@ static void pic32mx_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->pd_irqwork, pic32mx_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: pic32mx_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void pic32mx_poll_work(void *arg)
{
struct pic32mx_driver_s *priv = (struct pic32mx_driver_s *)arg;
/* Check if the next Tx descriptor is available. We cannot perform the Tx
* poll if we are unable to accept another packet for transmission.
*/
net_lock();
if (pic32mx_txdesc(priv) != NULL)
{
/* If so, update TCP timing states and poll the network for new XMIT
* data.
* Hmmm... might be bug here. Does this mean if there is a transmit
* in progress we will missing TCP time state updates?
*/
pic32mx_timerpoll(priv);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->pd_txpoll, PIC32MX_WDDELAY,
pic32mx_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: pic32mx_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void pic32mx_poll_expiry(wdparm_t arg)
{
struct pic32mx_driver_s *priv = (struct pic32mx_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pd_pollwork, pic32mx_poll_work, priv, 0);
}
/****************************************************************************
* Function: pic32mx_ifup
*
@@ -2384,11 +2257,6 @@ static int pic32mx_ifup(struct net_driver_s *dev)
priv->pd_inten = ETH_RXINTS;
pic32mx_putreg(ETH_RXINTS, PIC32MX_ETH_IENSET);
/* Set and activate a timer process */
wd_start(&priv->pd_txpoll, PIC32MX_WDDELAY,
pic32mx_poll_expiry, (wdparm_t)priv);
/* Finally, enable the Ethernet interrupt at the interrupt controller */
priv->pd_ifup = true;
@@ -2431,9 +2299,8 @@ static int pic32mx_ifdown(struct net_driver_s *dev)
up_disable_irq(PIC32MX_IRQSRC_ETH);
#endif
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->pd_txpoll);
wd_cancel(&priv->pd_txtimeout);
/* Reset the device and mark it as down. */
+2 -134
View File
@@ -189,12 +189,6 @@
/* Timing *******************************************************************/
/* TX poll deley = 1 seconds. CLK_TCK is the number of clock ticks per
* second
*/
#define PIC32MZ_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define PIC32MZ_TXTIMEOUT (60*CLK_TCK)
@@ -367,7 +361,6 @@ struct pic32mz_driver_s
#endif
uint8_t pd_txnext; /* Index to the next Tx descriptor */
uint32_t pd_inten; /* Shadow copy of INTEN register */
struct wdog_s pd_txpoll; /* TX poll timer */
struct wdog_s pd_txtimeout; /* TX timeout timer */
struct work_s pd_irqwork; /* For deferring interrupt work to the work queue */
struct work_s pd_pollwork; /* For deferring poll work to the work queue */
@@ -445,7 +438,6 @@ static struct pic32mz_rxdesc_s *pic32mz_rxdesc(
static int pic32mz_transmit(struct pic32mz_driver_s *priv);
static int pic32mz_txpoll(struct net_driver_s *dev);
static void pic32mz_poll(struct pic32mz_driver_s *priv);
static void pic32mz_timerpoll(struct pic32mz_driver_s *priv);
/* Interrupt handling */
@@ -461,9 +453,6 @@ static int pic32mz_interrupt(int irq, void *context, void *arg);
static void pic32mz_txtimeout_work(void *arg);
static void pic32mz_txtimeout_expiry(wdparm_t arg);
static void pic32mz_poll_work(void *arg);
static void pic32mz_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int pic32mz_ifup(struct net_driver_s *dev);
@@ -1337,53 +1326,7 @@ static void pic32mz_poll(struct pic32mz_driver_s *priv)
/* And perform the poll */
priv->pd_polling = true;
devif_timer(&priv->pd_dev, 0, pic32mz_txpoll);
/* Free any buffer left attached after the poll */
if (priv->pd_dev.d_buf != NULL)
{
pic32mz_freebuffer(priv, priv->pd_dev.d_buf);
priv->pd_dev.d_buf = NULL;
}
priv->pd_polling = false;
}
}
}
/****************************************************************************
* Function: pic32mz_timerpoll
*
* Description:
* Perform the network timer poll.
*
* Input Parameters:
* priv - Reference to the driver state structure
*
* Returned Value:
* None
*
****************************************************************************/
static void pic32mz_timerpoll(struct pic32mz_driver_s *priv)
{
/* Is there already a poll in progress. This happens, for example, when
* debugging output is enabled. Interrupts may be re-enabled while debug
* output is performed and a timer expiration could attempt a concurrent
* poll.
*/
if (!priv->pd_polling)
{
DEBUGASSERT(priv->pd_dev.d_buf == NULL);
priv->pd_dev.d_buf = pic32mz_allocbuffer(priv);
if (priv->pd_dev.d_buf != NULL)
{
/* And perform the poll */
priv->pd_polling = true;
devif_timer(&priv->pd_dev, PIC32MZ_WDDELAY, pic32mz_txpoll);
devif_poll(&priv->pd_dev, pic32mz_txpoll);
/* Free any buffer left attached after the poll */
@@ -2144,75 +2087,6 @@ static void pic32mz_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->pd_irqwork, pic32mz_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: pic32mz_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void pic32mz_poll_work(void *arg)
{
struct pic32mz_driver_s *priv = (struct pic32mz_driver_s *)arg;
/* Check if the next Tx descriptor is available. We cannot perform the Tx
* poll if we are unable to accept another packet for transmission.
*/
net_lock();
if (pic32mz_txdesc(priv) != NULL)
{
/* If so, update TCP timing states and poll the network for new XMIT
* data. Hmmm.. might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
pic32mz_timerpoll(priv);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->pd_txpoll, PIC32MZ_WDDELAY,
pic32mz_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: pic32mz_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void pic32mz_poll_expiry(wdparm_t arg)
{
struct pic32mz_driver_s *priv = (struct pic32mz_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pd_pollwork, pic32mz_poll_work, priv, 0);
}
/****************************************************************************
* Function: pic32mz_ifup
*
@@ -2522,11 +2396,6 @@ static int pic32mz_ifup(struct net_driver_s *dev)
priv->pd_inten = ETH_RXINTS;
pic32mz_putreg(ETH_RXINTS, PIC32MZ_ETH_IENSET);
/* Set and activate a timer process */
wd_start(&priv->pd_txpoll, PIC32MZ_WDDELAY,
pic32mz_poll_expiry, (wdparm_t)priv);
/* Finally, enable the Ethernet interrupt at the interrupt controller */
priv->pd_ifup = true;
@@ -2570,9 +2439,8 @@ static int pic32mz_ifdown(struct net_driver_s *dev)
up_disable_irq(PIC32MZ_IRQ_ETH);
#endif
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->pd_txpoll);
wd_cancel(&priv->pd_txtimeout);
/* Reset the device and mark it as down. */
+2 -89
View File
@@ -76,12 +76,6 @@
# define CONFIG_MISOC_NET_NINTERFACES 1
#endif
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define MISOC_NET_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define MISOC_NET_TXTIMEOUT (60*CLK_TCK)
@@ -101,7 +95,6 @@
struct misoc_net_driver_s
{
bool misoc_net_bifup; /* true:ifup false:ifdown */
struct wdog_s misoc_net_txpoll; /* TX poll timer */
struct wdog_s misoc_net_txtimeout; /* TX timeout timer */
struct work_s misoc_net_irqwork; /* For deferring interrupt work to the work queue */
struct work_s misoc_net_pollwork; /* For deferring poll work to the work queue */
@@ -151,9 +144,6 @@ static int misoc_net_interrupt(int irq, void *context, void *arg);
static void misoc_net_txtimeout_work(void *arg);
static void misoc_net_txtimeout_expiry(wdparm_t arg);
static void misoc_net_poll_work(void *arg);
static void misoc_net_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int misoc_net_ifup(struct net_driver_s *dev);
@@ -726,77 +716,6 @@ static void misoc_net_txtimeout_expiry(wdparm_t arg)
misoc_net_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: misoc_net_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void misoc_net_poll_work(void *arg)
{
struct misoc_net_driver_s *priv = (struct misoc_net_driver_s *)arg;
/* Perform the poll */
net_lock();
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
/* If so, update TCP timing states and poll the network for new XMIT data.
* Hmmm.. might be bug here. Does this mean if there is a transmit in
* progress, we will missing TCP time state updates?
*/
devif_timer(&priv->misoc_net_dev, MISOC_NET_WDDELAY, misoc_net_txpoll);
/* Setup the watchdog poll timer again */
wd_start(&priv->misoc_net_txpoll, MISOC_NET_WDDELAY,
misoc_net_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: misoc_net_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void misoc_net_poll_expiry(wdparm_t arg)
{
struct misoc_net_driver_s *priv = (struct misoc_net_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(HPWORK, &priv->misoc_net_pollwork,
misoc_net_poll_work, priv, 0);
}
/****************************************************************************
* Function: misoc_net_ifup
*
@@ -846,11 +765,6 @@ static int misoc_net_ifup(struct net_driver_s *dev)
flags = enter_critical_section();
/* Set and activate a timer process */
wd_start(&priv->misoc_net_txpoll, MISOC_NET_WDDELAY,
misoc_net_poll_expiry, (wdparm_t)priv);
priv->misoc_net_bifup = true;
up_enable_irq(ETHMAC_INTERRUPT);
@@ -891,9 +805,8 @@ static int misoc_net_ifdown(struct net_driver_s *dev)
ethmac_sram_reader_ev_enable_write(0);
ethmac_sram_writer_ev_enable_write(0);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->misoc_net_txpoll);
wd_cancel(&priv->misoc_net_txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
@@ -941,7 +854,7 @@ static void misoc_net_txavail_work(void *arg)
{
/* If so, then poll the network for new XMIT data */
devif_timer(&priv->misoc_net_dev, 0, misoc_net_txpoll);
devif_poll(&priv->misoc_net_dev, misoc_net_txpoll);
}
}
-4
View File
@@ -124,10 +124,6 @@ void rx65n_cmtw0_create(uint32_t txpoll_time, uint32_t txtimeout_time)
MPC.PE7PFS.BYTE = 0x1du;
PORTE.PMR.BYTE |= 0x80u;
/* Attach the IRQ for poll expiry */
irq_attach(RX65N_INTB170_IRQ, (xcpt_t)rx65n_poll_expiry, NULL);
/* Attach the IRQ for tx timeout */
irq_attach(RX65N_INTB171_IRQ, (xcpt_t)rx65n_txtimeout_expiry, NULL);
+2 -117
View File
@@ -40,7 +40,6 @@
#include <nuttx/arch.h>
#include <nuttx/irq.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#include <nuttx/net/phy.h>
#include <nuttx/net/mii.h>
@@ -484,8 +483,6 @@ static int rx65n_interrupt(int irq, FAR void *context, FAR void *arg);
static void rx65n_txtimeout_work(FAR void *arg);
static void rx65n_poll_work(FAR void *arg);
/* NuttX callback functions */
static int rx65n_ifup(struct net_driver_s *dev);
@@ -1180,7 +1177,7 @@ static void rx65n_dopoll(FAR struct rx65n_ethmac_s *priv)
if (dev->d_buf)
{
devif_timer(dev, 0, rx65n_txpoll);
devif_poll(dev, rx65n_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
@@ -2087,114 +2084,6 @@ void rx65n_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->irqwork, rx65n_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: rx65n_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void rx65n_poll_work(FAR void *arg)
{
FAR struct rx65n_ethmac_s *priv = (FAR struct rx65n_ethmac_s *)arg;
FAR struct net_driver_s *dev = &priv->dev;
/* Check if the next TX descriptor is owned by the Ethernet DMA or
* CPU. We cannot perform the TX poll if we are unable to accept
* another packet for transmission.
*
* In a race condition, TACT may be cleared BUT still not available
* because rx65n_freeframe() has not yet run. If rx65n_freeframe()
* has run, the buffer1 pointer (tdes2) will be nullified (and
* inflight should be < CONFIG_RX65N_ETH_NTXDESC).
*/
net_lock();
if ((priv->txhead->tdes0 & TACT) == 0 &&
priv->txhead->tdes2 == 0)
{
/* If we have the descriptor, then perform the timer poll. Allocate a
* buffer for the poll.
*/
DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL);
dev->d_buf = rx65n_allocbuffer(priv);
/* We can't poll if we have no buffers */
if (dev->d_buf)
{
/* Update TCP timing states and poll the network for new XMIT data.
*/
devif_timer(dev, CLK_TCK, rx65n_txpoll);
/* We will, most likely end up with a buffer to be freed. But it
* might not be the same one that we allocated above.
*/
if (dev->d_buf)
{
DEBUGASSERT(dev->d_len == 0);
rx65n_freebuffer(priv, dev->d_buf);
dev->d_buf = NULL;
}
}
}
/* Setup the poll timer again */
rx65n_cmtw0_start(rx65n_cmtw0_txpoll, RX65N_CMTW0_COUNT_VALUE_FOR_TXPOLL);
net_unlock();
}
/****************************************************************************
* Function: rx65n_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
void rx65n_poll_expiry(wdparm_t arg)
{
FAR struct rx65n_ethmac_s *priv = (FAR struct rx65n_ethmac_s *)arg;
rx65n_cmtw0_stop(rx65n_cmtw0_txpoll);
if (work_available(&priv->pollwork))
{
/* Schedule to perform the interrupt processing
* on the worker thread.
*/
work_queue(ETHWORK, &priv->pollwork, rx65n_poll_work, priv, 0);
}
else
{
rx65n_cmtw0_start(rx65n_cmtw0_txpoll,
RX65N_CMTW0_COUNT_VALUE_FOR_TXPOLL);
}
}
/****************************************************************************
* Function: rx65n_ifup
*
@@ -2241,9 +2130,6 @@ static int rx65n_ifup(struct net_driver_s *dev)
return ret;
}
/* Set and activate a timer process */
rx65n_cmtw0_start(rx65n_cmtw0_txpoll, RX65N_CMTW0_COUNT_VALUE_FOR_TXPOLL);
priv->ifup = true;
/* Enable the Ethernet interrupt */
@@ -2285,9 +2171,8 @@ static int rx65n_ifdown(struct net_driver_s *dev)
up_disable_irq(RX65N_ETH_IRQ);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
rx65n_cmtw0_stop(rx65n_cmtw0_txpoll);
rx65n_cmtw0_stop(rx65n_cmtw0_timeout);
/* Put the EMAC in its reset, non-operational state.
-16
View File
@@ -73,22 +73,6 @@ extern "C"
#ifdef CONFIG_RX65N_EMAC0
int rx65n_ethinitialize(int intf);
/****************************************************************************
* Function: rx65n_poll_expiry
*
* Description:
* Poll Expiry timer
*
* Input Parameters:
* arg - Input argument
*
* Returned Value:
* None
*
****************************************************************************/
void rx65n_poll_expiry(wdparm_t arg);
/****************************************************************************
* Function: rx65n_txtimeout_expiry
*
+3 -111
View File
@@ -44,7 +44,6 @@
#include <nuttx/arch.h>
#include <nuttx/irq.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#include <nuttx/net/arp.h>
#include <nuttx/net/net.h>
@@ -101,12 +100,6 @@
#define BL602_NET_NINTERFACES 2
#endif
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define BL602_NET_WDDELAY (1 * CLOCKS_PER_SEC)
#define WIFI_MTU_SIZE 1516
#define BL602_NET_TXBUFF_NUM 12
@@ -140,8 +133,6 @@
struct bl602_net_driver_s
{
struct wdog_s txpoll; /* TX poll timer */
struct work_s pollwork; /* For deferring poll work to the work queue */
struct work_s availwork;
/* wifi manager */
@@ -261,11 +252,6 @@ static int bl602_net_txpoll(struct net_driver_s *dev);
static void bl602_net_reply(struct bl602_net_driver_s *priv);
static void bl602_net_receive(struct bl602_net_driver_s *priv);
/* Watchdog timer expirations */
static void bl602_net_poll_work(void *arg);
static void bl602_net_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int bl602_net_ifup(struct net_driver_s *dev);
@@ -834,95 +820,6 @@ int bl602_net_notify(uint32_t event, uint8_t *data, int len, void *opaque)
return OK;
}
/****************************************************************************
* Name: bl602_net_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Run on a work queue thread.
*
****************************************************************************/
static void bl602_net_poll_work(void *arg)
{
struct bl602_net_driver_s *priv = (struct bl602_net_driver_s *)arg;
net_lock();
DEBUGASSERT(priv->net_dev.d_buf == NULL);
DEBUGASSERT(priv->push_cnt == 0);
priv->net_dev.d_buf = bl602_netdev_alloc_txbuf();
if (priv->net_dev.d_buf)
{
priv->net_dev.d_buf += PRESERVE_80211_HEADER_LEN;
priv->net_dev.d_len = 0;
}
if (priv->net_dev.d_buf)
{
devif_timer(&priv->net_dev, BL602_NET_WDDELAY, bl602_net_txpoll);
if (priv->push_cnt != 0)
{
/* notify to tx now */
bl_irq_handler();
priv->push_cnt = 0;
}
if (priv->net_dev.d_buf != NULL)
{
bl602_netdev_free_txbuf(priv->net_dev.d_buf -
PRESERVE_80211_HEADER_LEN);
priv->net_dev.d_buf = NULL;
}
}
wd_start(
&priv->txpoll, BL602_NET_WDDELAY, bl602_net_poll_expiry, (wdparm_t)priv);
DEBUGASSERT(priv->net_dev.d_buf == NULL);
net_unlock();
}
/****************************************************************************
* Name: bl602_net_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Runs in the context of a the timer interrupt handler. Local
* interrupts are disabled by the interrupt logic.
*
****************************************************************************/
static void bl602_net_poll_expiry(wdparm_t arg)
{
struct bl602_net_driver_s *priv = (struct bl602_net_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
if (work_available(&priv->pollwork))
{
work_queue(ETHWORK, &priv->pollwork, bl602_net_poll_work, priv, 0);
}
}
/****************************************************************************
* Name: bl602_net_ifup
*
@@ -943,8 +840,10 @@ static void bl602_net_poll_expiry(wdparm_t arg)
static int bl602_net_ifup(struct net_driver_s *dev)
{
#ifdef CONFIG_NET_ICMPv6
struct bl602_net_driver_s *priv =
(struct bl602_net_driver_s *)dev->d_private;
#endif
#ifdef CONFIG_NET_IPv4
ninfo("Bringing up: %ld.%ld.%ld.%ld\n",
@@ -971,11 +870,6 @@ static int bl602_net_ifup(struct net_driver_s *dev)
bl602_net_ipv6multicast(priv);
#endif
/* Set and activate a timer process */
wd_start(
&priv->txpoll, BL602_NET_WDDELAY, bl602_net_poll_expiry, (wdparm_t)priv);
return OK;
}
@@ -1025,8 +919,6 @@ static int bl602_net_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
wd_cancel(&priv->txpoll);
leave_critical_section(flags);
if (priv == &g_bl602_net[0])
@@ -1082,7 +974,7 @@ static void bl602_net_txavail_work(void *arg)
if (priv->net_dev.d_buf)
{
devif_timer(&priv->net_dev, 0, bl602_net_txpoll);
devif_poll(&priv->net_dev, bl602_net_txpoll);
if (priv->push_cnt != 0)
{
+1 -118
View File
@@ -54,12 +54,6 @@
* Pre-processor Definitions
****************************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define WLAN_WDDELAY (1 * CLK_TCK)
/* TX timeout = 1 minute */
#define WLAN_TXTOUT (60 * CLK_TCK)
@@ -146,7 +140,6 @@ struct wlan_priv_s
bool ifup; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s rxwork; /* Send packet work */
@@ -249,9 +242,6 @@ static void wlan_dopoll(struct wlan_priv_s *priv);
static void wlan_txtimeout_work(void *arg);
static void wlan_txtimeout_expiry(wdparm_t arg);
static void wlan_poll_work(void *arg);
static void wlan_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int wlan_ifup(struct net_driver_s *dev);
@@ -1060,108 +1050,6 @@ static void wlan_txtimeout_expiry(wdparm_t arg)
}
}
/****************************************************************************
* Name: wlan_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void wlan_poll_work(void *arg)
{
int32_t delay_tick = WLAN_WDDELAY;
struct wlan_priv_s *priv = (struct wlan_priv_s *)arg;
struct net_driver_s *dev = &priv->dev;
struct wlan_pktbuf_s *pktbuf;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
* is performed on an LP worker thread and where more than one LP worker
* thread has been configured.
*/
net_lock();
pktbuf = wlan_alloc_buffer(priv);
if (pktbuf == NULL)
{
/* Delay 10ms */
delay_tick = MSEC2TICK(10);
if (delay_tick == 0)
{
delay_tick = 1;
}
goto exit;
}
dev->d_buf = pktbuf->buffer;
dev->d_len = WLAN_BUF_SIZE;
/* Check if there is room in the send another TX packets. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*
* If there is no room, we should reset the timeout value to be 1 to
* trigger the timer as soon as possible.
*/
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(&priv->dev, delay_tick, wlan_txpoll);
if (dev->d_buf != NULL)
{
wlan_free_buffer(priv, dev->d_buf);
dev->d_buf = NULL;
dev->d_len = 0;
}
/* Try to send all cached TX packets */
wlan_transmit(priv);
exit:
wd_start(&priv->txpoll, delay_tick, wlan_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Name: wlan_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer callback handler.
*
* Input Parameters:
* argc - The number of available arguments
* arg - The first argument
*
* Returned Value:
* None
*
****************************************************************************/
static void wlan_poll_expiry(wdparm_t arg)
{
struct wlan_priv_s *priv = (struct wlan_priv_s *)arg;
if (priv->ifup)
{
work_queue(WLAN_WORK, &priv->pollwork, wlan_poll_work, priv, 0);
}
}
/****************************************************************************
* Name: wlan_txavail_work
*
@@ -1264,10 +1152,6 @@ static int wlan_ifup(struct net_driver_s *dev)
wlan_init_buffer(priv);
/* Set and activate a timer process */
wd_start(&priv->txpoll, WLAN_WDDELAY, wlan_poll_expiry, (wdparm_t)priv);
priv->ifup = true;
if (g_callback_register_ref == 0)
{
@@ -1311,9 +1195,8 @@ static int wlan_ifdown(struct net_driver_s *dev)
return OK;
}
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Mark the device "down" */
+2 -92
View File
@@ -156,12 +156,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define MPFS_WDDELAY (1 * CLK_TCK)
/* TX timeout = 1 minute */
#define MPFS_TXTIMEOUT (60 * CLK_TCK)
@@ -259,7 +253,6 @@ struct mpfs_ethmac_s
uint8_t ifup : 1; /* true:ifup false:ifdown */
uint8_t intf; /* Ethernet interface number */
uint8_t phyaddr; /* PHY address */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
@@ -312,9 +305,6 @@ static int mpfs_buffer_initialize(struct mpfs_ethmac_s *priv,
unsigned int queue);
static void mpfs_buffer_free(struct mpfs_ethmac_s *priv, unsigned int queue);
static void mpfs_poll_expiry(wdparm_t arg);
static void mpfs_poll_work(void *arg);
static int mpfs_transmit(struct mpfs_ethmac_s *priv, unsigned int queue);
static int mpfs_txpoll(struct net_driver_s *dev);
static void mpfs_dopoll(struct mpfs_ethmac_s *priv);
@@ -1514,84 +1504,10 @@ static void mpfs_dopoll(struct mpfs_ethmac_s *priv)
* then poll the network for new XMIT data.
*/
devif_timer(dev, 0, mpfs_txpoll);
devif_poll(dev, mpfs_txpoll);
}
}
/****************************************************************************
* Function: mpfs_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void mpfs_poll_expiry(wdparm_t arg)
{
struct mpfs_ethmac_s *priv = (struct mpfs_ethmac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
if (work_available(&priv->pollwork))
{
work_queue(ETHWORK, &priv->pollwork, mpfs_poll_work, priv, 0);
}
else
{
wd_start(&priv->txpoll, MPFS_WDDELAY,
mpfs_poll_expiry, (wdparm_t)priv);
}
}
/****************************************************************************
* Function: mpfs_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void mpfs_poll_work(void *arg)
{
struct mpfs_ethmac_s *priv = (struct mpfs_ethmac_s *)arg;
struct net_driver_s *dev = &priv->dev;
/* Check if there are any free TX descriptors. We cannot perform the
* TX poll if we do not have buffering for another packet.
*/
net_lock();
if (mpfs_txfree(priv, 0) > 0)
{
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(dev, MPFS_WDDELAY, mpfs_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, MPFS_WDDELAY, mpfs_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: mpfs_ifup
*
@@ -1671,11 +1587,6 @@ static int mpfs_ifup(struct net_driver_s *dev)
ninfo("Enable normal operation\n");
/* Set and activate a timer process */
wd_start(&priv->txpoll, MPFS_WDDELAY,
mpfs_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupts */
priv->ifup = true;
@@ -1723,9 +1634,8 @@ static int mpfs_ifdown(struct net_driver_s *dev)
*priv->queue[2].int_disable = 0xffffffff;
*priv->queue[3].int_disable = 0xffffffff;
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Put the MAC in its reset, non-operational state. This should be
+1 -18
View File
@@ -77,7 +77,6 @@
/* Net driver worker */
static struct work_s g_timer_work;
static struct work_s g_avail_work;
static struct work_s g_recv_work;
@@ -287,24 +286,9 @@ static int netdriver_txpoll(struct net_driver_s *dev)
return 0;
}
static void netdriver_timer_work(void *arg)
{
struct net_driver_s *dev = arg;
net_lock();
if (IFF_IS_UP(dev->d_flags))
{
work_queue(LPWORK, &g_timer_work, netdriver_timer_work, dev, CLK_TCK);
devif_timer(dev, CLK_TCK, netdriver_txpoll);
}
net_unlock();
}
static int netdriver_ifup(struct net_driver_s *dev)
{
netdev_ifup(dev->d_ipaddr);
work_queue(LPWORK, &g_timer_work, netdriver_timer_work, dev, CLK_TCK);
netdev_carrier_on(dev);
return OK;
}
@@ -312,7 +296,6 @@ static int netdriver_ifup(struct net_driver_s *dev)
static int netdriver_ifdown(struct net_driver_s *dev)
{
netdev_carrier_off(dev);
work_cancel(LPWORK, &g_timer_work);
netdev_ifdown();
return OK;
}
@@ -324,7 +307,7 @@ static void netdriver_txavail_work(void *arg)
net_lock();
if (IFF_IS_UP(dev->d_flags))
{
devif_timer(dev, 0, netdriver_txpoll);
devif_poll(dev, netdriver_txpoll);
}
net_unlock();
+2 -110
View File
@@ -113,10 +113,6 @@
#define EMAC_TX_TO (60 * CLK_TCK)
/* TCP/IP periodic poll process = 1 seconds */
#define EMAC_WDDELAY (1 * CLK_TCK)
/* Ethernet control frame pause timeout */
#define EMAC_PAUSE_TIME (0x1648)
@@ -201,7 +197,6 @@ struct esp32_emac_s
uint8_t mbps100 : 1; /* 100MBps operation (vs 10 MBps) */
uint8_t fduplex : 1; /* Full (vs. half) duplex */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s txwork; /* For deferring TX work to the work queue */
@@ -252,7 +247,6 @@ static int emac_ifdown(struct net_driver_s *dev);
static int emac_ifup(struct net_driver_s *dev);
static void emac_dopoll(struct esp32_emac_s *priv);
static void emac_txtimeout_expiry(wdparm_t arg);
static void emac_poll_expiry(wdparm_t arg);
/****************************************************************************
* External Function Prototypes
@@ -1698,7 +1692,7 @@ static void emac_dopoll(struct esp32_emac_s *priv)
dev->d_len = EMAC_BUF_LEN;
devif_timer(dev, 0, emac_txpoll);
devif_poll(dev, emac_txpoll);
if (dev->d_buf)
{
@@ -1746,102 +1740,6 @@ static void emac_txavail_work(void *arg)
net_unlock();
}
/****************************************************************************
* Function: emac_txavail_work
*
* Description:
* Perform an out-of-cycle poll on the worker thread.
*
* Input Parameters:
* arg - Reference to the NuttX driver state structure (cast to void*)
*
* Returned Value:
* None
*
* Assumptions:
* Called on the higher priority worker thread.
*
****************************************************************************/
static void emac_poll_work(void *arg)
{
int ret;
struct esp32_emac_s *priv = (struct esp32_emac_s *)arg;
struct net_driver_s *dev = &priv->dev;
ninfo("ifup: %d\n", priv->ifup);
/* Ignore the notification if the interface is not yet up */
net_lock();
/* Poll the network for new XMIT data */
if (!TX_IS_BUSY(priv))
{
DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL);
dev->d_buf = (uint8_t *)emac_alloc_buffer(priv);
if (!dev->d_buf)
{
/* never reach */
net_unlock();
return ;
}
dev->d_len = EMAC_BUF_LEN;
devif_timer(dev, EMAC_WDDELAY , emac_txpoll);
if (dev->d_buf)
{
emac_free_buffer(priv, dev->d_buf);
dev->d_buf = NULL;
dev->d_len = 0;
}
}
ret = wd_start(&priv->txpoll, EMAC_WDDELAY,
emac_poll_expiry, (wdparm_t)priv);
if (ret)
{
nerr("ERROR: Failed to start TX poll timer");
}
net_unlock();
}
/****************************************************************************
* Function: emac_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void emac_poll_expiry(wdparm_t arg)
{
struct esp32_emac_s *priv = (struct esp32_emac_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
if (priv->ifup)
{
work_queue(ETHWORK, &priv->pollwork, emac_poll_work, priv, 0);
}
}
/****************************************************************************
* Function: emac_ifup
*
@@ -1903,11 +1801,6 @@ static int emac_ifup(struct net_driver_s *dev)
emac_start();
/* Set and activate a timer process */
wd_start(&priv->txpoll, EMAC_WDDELAY,
emac_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
up_enable_irq(ESP32_IRQ_EMAC);
@@ -1951,9 +1844,8 @@ static int emac_ifdown(struct net_driver_s *dev)
up_disable_irq(priv->cpuint);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Reset ethernet MAC and disable clock */
-117
View File
@@ -54,12 +54,6 @@
* Pre-processor Definitions
****************************************************************************/
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define WLAN_WDDELAY (1 * CLK_TCK)
/* TX timeout = 1 minute */
#define WLAN_TXTOUT (60 * CLK_TCK)
@@ -144,7 +138,6 @@ struct wlan_priv_s
bool ifup; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s rxwork; /* Send packet work */
@@ -251,9 +244,6 @@ static void wlan_dopoll(struct wlan_priv_s *priv);
static void wlan_txtimeout_work(void *arg);
static void wlan_txtimeout_expiry(wdparm_t arg);
static void wlan_poll_work(void *arg);
static void wlan_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int wlan_ifup(struct net_driver_s *dev);
@@ -1057,108 +1047,6 @@ static void wlan_txtimeout_expiry(wdparm_t arg)
}
}
/****************************************************************************
* Name: wlan_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void wlan_poll_work(void *arg)
{
int32_t delay_tick = WLAN_WDDELAY;
struct wlan_priv_s *priv = (struct wlan_priv_s *)arg;
struct net_driver_s *dev = &priv->dev;
struct wlan_pktbuf *pktbuf;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
* is performed on an LP worker thread and where more than one LP worker
* thread has been configured.
*/
net_lock();
pktbuf = wlan_alloc_buffer(priv);
if (!pktbuf)
{
/* Delay 10ms */
delay_tick = MSEC2TICK(10);
if (delay_tick == 0)
{
delay_tick = 1;
}
goto exit;
}
dev->d_buf = pktbuf->buffer;
dev->d_len = WLAN_BUF_SIZE;
/* Check if there is room in the send another TX packets. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*
* If there is no room, we should reset the timeout value to be 1 to
* trigger the timer as soon as possible.
*/
/* Update TCP timing states and poll the network for new XMIT data. */
devif_timer(&priv->dev, delay_tick, wlan_txpoll);
if (dev->d_buf)
{
wlan_free_buffer(priv, dev->d_buf);
dev->d_buf = NULL;
dev->d_len = 0;
}
/* Try to send all cached TX packets */
wlan_transmit(priv);
exit:
wd_start(&priv->txpoll, delay_tick, wlan_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Name: wlan_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer callback handler.
*
* Input Parameters:
* argc - The number of available arguments
* arg - The first argument
*
* Returned Value:
* None
*
****************************************************************************/
static void wlan_poll_expiry(wdparm_t arg)
{
struct wlan_priv_s *priv = (struct wlan_priv_s *)arg;
if (priv->ifup)
{
work_queue(WLAN_WORK, &priv->pollwork, wlan_poll_work, priv, 0);
}
}
/****************************************************************************
* Name: wlan_txavail_work
*
@@ -1261,10 +1149,6 @@ static int wlan_ifup(struct net_driver_s *dev)
wlan_init_buffer(priv);
/* Set and activate a timer process */
wd_start(&priv->txpoll, WLAN_WDDELAY, wlan_poll_expiry, (wdparm_t)priv);
priv->ifup = true;
if (g_callback_register_ref == 0)
{
@@ -1310,7 +1194,6 @@ static int wlan_ifdown(struct net_driver_s *dev)
/* Cancel the TX poll timer and TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Mark the device "down" */
+1 -92
View File
@@ -243,12 +243,6 @@ extern uintptr_t _RAM_ADDR_U_INIT_PARAM;
#define EMAC_EIN_HANDLED \
(EMAC_ISTAT_RXEVENTS | EMAC_ISTAT_TXEVENTS | EMAC_ISTAT_SYSEVENTS)
/* TX poll deley = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define EMAC_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define EMAC_TXTIMEOUT (60*CLK_TCK)
@@ -337,7 +331,6 @@ struct ez80emac_driver_s
bool bfullduplex; /* true:full duplex */
bool b100mbs; /* true:100Mbp */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
struct work_s txwork; /* For deferring Tx-related work to the work queue */
@@ -416,9 +409,6 @@ static int ez80emac_sysinterrupt(int irq, FAR void *context,
static void ez80emac_txtimeout_work(FAR void *arg);
static void ez80emac_txtimeout_expiry(wdparm_t arg);
static void ez80emac_poll_work(FAR void *arg);
static void ez80emac_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int ez80emac_ifup(struct net_driver_s *dev);
@@ -1979,81 +1969,6 @@ static void ez80emac_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->txwork, ez80emac_txtimeout_work, priv, 0);
}
/****************************************************************************
* Function: ez80emac_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void ez80emac_poll_work(FAR void *arg)
{
FAR struct ez80emac_driver_s *priv = (FAR struct ez80emac_driver_s *)arg;
/* Poll the network for new XMIT data */
net_lock();
devif_timer(&priv->dev, EMAC_WDDELAY, ez80emac_txpoll);
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, EMAC_WDDELAY,
ez80emac_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Function: ez80emac_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void ez80emac_poll_expiry(wdparm_t arg)
{
FAR struct ez80emac_driver_s *priv = (FAR struct ez80emac_driver_s *)arg;
/* Is our single work structure available? It may not be if there are
* pending interrupt actions.
*/
if (work_available(&priv->syswork))
{
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->syswork, ez80emac_poll_work, priv, 0);
}
else
{
/* No.. Just re-start the watchdog poll timer, missing one polling
* cycle.
*/
wd_start(&priv->txpoll, EMAC_WDDELAY,
ez80emac_poll_expiry, (wdparm_t)arg);
}
}
/****************************************************************************
* Function: ez80emac_ifup
*
@@ -2139,11 +2054,6 @@ static int ez80emac_ifup(FAR struct net_driver_s *dev)
outp(EZ80_EMAC_ISTAT, 0xff); /* Clear all pending interrupts */
outp(EZ80_EMAC_IEN, EMAC_EIN_HANDLED); /* Enable all interrupts */
/* Set and activate a timer process */
wd_start(&priv->txpoll, EMAC_WDDELAY,
ez80emac_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupts */
priv->bifup = true;
@@ -2184,7 +2094,6 @@ static int ez80emac_ifdown(struct net_driver_s *dev)
/* Cancel the TX poll timer and TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Disable Rx */
@@ -2232,7 +2141,7 @@ static void ez80emac_txavail_work(FAR void *arg)
/* If so, then poll the network for new XMIT data */
devif_timer(&priv->dev, 0, ez80emac_txpoll);
devif_poll(&priv->dev, ez80emac_txpoll);
}
net_unlock();
+3 -99
View File
@@ -269,12 +269,6 @@
# define CONFIG_DM9X_MODE_AUTO 1
#endif
/* TX poll deley = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define DM9X_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define DM6X_TXTIMEOUT (60*CLK_TCK)
@@ -308,7 +302,6 @@ struct dm9x_driver_s
bool dm_b100m; /* true:speed == 100M; false:speed == 10M */
uint8_t dm_ntxpending; /* Count of packets pending transmission */
uint8_t ncrxpackets; /* Number of continuous rx packets */
struct wdog_s dm_txpoll; /* TX poll timer */
struct wdog_s dm_txtimeout; /* TX timeout timer */
struct work_s dm_irqwork; /* For deferring interrupt work to the work queue */
struct work_s dm_pollwork; /* For deferring poll work to the work queue */
@@ -385,9 +378,6 @@ static int dm9x_interrupt(int irq, FAR void *context, FAR void *arg);
static void dm9x_txtimeout_work(FAR void *arg);
static void dm9x_txtimeout_expiry(wdparm_t arg);
static void dm9x_poll_work(FAR void *arg);
static void dm9x_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int dm9x_ifup(FAR struct net_driver_s *dev);
@@ -1363,85 +1353,6 @@ static void dm9x_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->dm_irqwork, dm9x_txtimeout_work, priv, 0);
}
/****************************************************************************
* Name: dm9x_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void dm9x_poll_work(FAR void *arg)
{
FAR struct dm9x_driver_s *priv = (FAR struct dm9x_driver_s *)arg;
/* Perform the poll */
net_lock();
/* If the number of contiguous RX packets exceeds a threshold, reset the
* counter and re-enable RX interrupts
*/
if (priv->ncrxpackets >= DM9X_CRXTHRES)
{
priv->ncrxpackets = 0;
putreg(DM9X_IMR, DM9X_IMRENABLE);
}
/* Check if there is room in the DM90x0 to hold another packet. In 100M
* mode, that can be 2 packets, otherwise it is a single packet.
*/
if (priv->dm_ntxpending < 1 || (priv->dm_b100m && priv->dm_ntxpending < 2))
{
/* Update TCP timing states and poll the network for new XMIT data */
devif_timer(&priv->dm_dev, DM9X_WDDELAY, dm9x_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->dm_txpoll, DM9X_WDDELAY,
dm9x_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Name: dm9x_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void dm9x_poll_expiry(wdparm_t arg)
{
FAR struct dm9x_driver_s *priv = (FAR struct dm9x_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->dm_pollwork, dm9x_poll_work, priv, 0);
}
/****************************************************************************
* Name: dm9x_phymode
*
@@ -1546,11 +1457,6 @@ static int dm9x_ifup(FAR struct net_driver_s *dev)
ninfo("delay: %dmS speed: %s\n", i, priv->dm_b100m ? "100M" : "10M");
/* Set and activate a timer process */
wd_start(&priv->dm_txpoll, DM9X_WDDELAY,
dm9x_poll_expiry, (wdparm_t)priv);
/* Enable the DM9X interrupt */
priv->dm_bifup = true;
@@ -1587,9 +1493,8 @@ static int dm9x_ifdown(FAR struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(CONFIG_DM9X_IRQ);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->dm_txpoll);
wd_cancel(&priv->dm_txtimeout);
/* Reset the device */
@@ -1643,7 +1548,7 @@ static void dm9x_txavail_work(FAR void *arg)
{
/* If so, then poll the network for new XMIT data */
devif_timer(&priv->dm_dev, 0, dm9x_txpoll);
devif_poll(&priv->dm_dev, dm9x_txpoll);
}
}
@@ -1870,9 +1775,8 @@ static void dm9x_reset(FAR struct dm9x_driver_s *priv)
uint8_t save;
int i;
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->dm_txpoll);
wd_cancel(&priv->dm_txtimeout);
/* Save previous register address */
+2 -109
View File
@@ -133,10 +133,6 @@
/* Timing *******************************************************************/
/* TX poll deley = 1 seconds. CLK_TCK is the number of ticks per second */
#define ENC_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define ENC_TXTIMEOUT (60*CLK_TCK)
@@ -229,7 +225,6 @@ struct enc_driver_s
/* Timing */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
/* If we don't own the SPI bus, then we cannot do SPI accesses from the
@@ -323,8 +318,6 @@ static int enc_interrupt(int irq, FAR void *context, FAR void *arg);
static void enc_toworker(FAR void *arg);
static void enc_txtimeout(wdparm_t arg);
static void enc_pollworker(FAR void *arg);
static void enc_polltimer(wdparm_t arg);
/* NuttX callback functions */
@@ -1951,100 +1944,6 @@ static void enc_txtimeout(wdparm_t arg)
UNUSED(ret);
}
/****************************************************************************
* Name: enc_pollworker
*
* Description:
* Periodic timer handler continuation.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
*
****************************************************************************/
static void enc_pollworker(FAR void *arg)
{
FAR struct enc_driver_s *priv = (FAR struct enc_driver_s *)arg;
DEBUGASSERT(priv);
/* Get exclusive access to both the network and the SPI bus. */
net_lock();
enc_lock(priv);
/* Verify that the hardware is ready to send another packet. The driver
* start a transmission process by setting ECON1.TXRTS. When the packet is
* finished transmitting or is aborted due to an error/cancellation, the
* ECON1.TXRTS bit will be cleared.
*/
if ((enc_rdgreg(priv, ENC_ECON1) & ECON1_TXRTS) == 0)
{
/* Yes.. update TCP timing states and poll the network for new XMIT
* data. Hmmm.. looks like a bug here to me. Does this mean if there
* is a transmit in progress, we will missing TCP time state updates?
*/
devif_timer(&priv->dev, ENC_WDDELAY, enc_txpoll);
}
/* Release lock on the SPI bus and the network */
enc_unlock(priv);
net_unlock();
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, ENC_WDDELAY,
enc_polltimer, (wdparm_t)arg);
}
/****************************************************************************
* Name: enc_polltimer
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
*
****************************************************************************/
static void enc_polltimer(wdparm_t arg)
{
FAR struct enc_driver_s *priv = (FAR struct enc_driver_s *)arg;
int ret;
/* In complex environments, we cannot do SPI transfers from the timeout
* handler because semaphores are probably used to lock the SPI bus. In
* this case, we will defer processing to the worker thread. This is also
* much kinder in the use of system resources and is, therefore, probably
* a good thing to do in any event.
*/
DEBUGASSERT(priv && work_available(&priv->pollwork));
/* Notice that poll watchdog is not active so further poll timeouts can
* occur until we restart the poll timeout watchdog.
*/
ret = work_queue(ENCWORK, &priv->pollwork, enc_pollworker,
(FAR void *)priv, 0);
DEBUGASSERT(ret == OK);
UNUSED(ret);
}
/****************************************************************************
* Name: enc_ifup
*
@@ -2100,11 +1999,6 @@ static int enc_ifup(struct net_driver_s *dev)
enc_bfsgreg(priv, ENC_ECON1, ECON1_RXEN);
/* Set and activate a timer process */
wd_start(&priv->txpoll, ENC_WDDELAY,
enc_polltimer, (wdparm_t)priv);
/* Mark the interface up and enable the Ethernet interrupt at the
* controller
*/
@@ -2156,9 +2050,8 @@ static int enc_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
priv->lower->disable(priv->lower);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Reset the device and leave in the power save state */
@@ -2220,7 +2113,7 @@ static int enc_txavail(struct net_driver_s *dev)
* poll the network for new XMIT data
*/
devif_timer(&priv->dev, 0, enc_txpoll);
devif_poll(&priv->dev, enc_txpoll);
}
}
+2 -108
View File
@@ -133,10 +133,6 @@
/* Timing *******************************************************************/
/* TX poll delay = 1 seconds. CLK_TCK is the number of ticks per second */
#define ENC_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define ENC_TXTIMEOUT (60*CLK_TCK)
@@ -226,7 +222,6 @@ struct enc_driver_s
/* Timing */
struct wdog_s txpoll; /* TX poll timer */
struct wdog_s txtimeout; /* TX timeout timer */
/* Avoid SPI accesses from the interrupt handler by using the work queue */
@@ -335,8 +330,6 @@ static int enc_interrupt(int irq, FAR void *context, FAR void *arg);
static void enc_toworker(FAR void *arg);
static void enc_txtimeout(wdparm_t arg);
static void enc_pollworker(FAR void *arg);
static void enc_polltimer(wdparm_t arg);
/* NuttX callback functions */
@@ -2099,99 +2092,6 @@ static void enc_txtimeout(wdparm_t arg)
DEBUGASSERT(ret == OK);
}
/****************************************************************************
* Name: enc_pollworker
*
* Description:
* Periodic timer handler continuation.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
*
****************************************************************************/
static void enc_pollworker(FAR void *arg)
{
FAR struct enc_driver_s *priv = (FAR struct enc_driver_s *)arg;
DEBUGASSERT(priv);
/* Get exclusive access to both the network and the SPI bus. */
net_lock();
enc_lock(priv);
/* Verify that the hardware is ready to send another packet. The driver
* start a transmission process by setting ECON1.TXRTS. When the packet is
* finished transmitting or is aborted due to an error/cancellation, the
* ECON1.TXRTS bit will be cleared.
*/
if ((enc_rdreg(priv, ENC_ECON1) & ECON1_TXRTS) == 0)
{
/* Yes.. update TCP timing states and poll the network for new XMIT
* data. Hmmm.. looks like a bug here to me. Does this mean if there
* is a transmit in progress, we will missing TCP time state updates?
*/
devif_timer(&priv->dev, ENC_WDDELAY, enc_txpoll);
}
/* Release lock on the SPI bus and the network */
enc_unlock(priv);
net_unlock();
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, ENC_WDDELAY, enc_polltimer, (wdparm_t)arg);
}
/****************************************************************************
* Name: enc_polltimer
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
*
****************************************************************************/
static void enc_polltimer(wdparm_t arg)
{
FAR struct enc_driver_s *priv = (FAR struct enc_driver_s *)arg;
int ret;
/* In complex environments, we cannot do SPI transfers from the timeout
* handler because semaphores are probably used to lock the SPI bus. In
* this case, we will defer processing to the worker thread. This is also
* much kinder in the use of system resources and is, therefore, probably
* a good thing to do in any event.
*/
DEBUGASSERT(priv && work_available(&priv->pollwork));
/* Notice that poll watchdog is not active so further poll timeouts can
* occur until we restart the poll timeout watchdog.
*/
ret = work_queue(ENCWORK, &priv->pollwork, enc_pollworker,
(FAR void *)priv, 0);
DEBUGASSERT(ret == OK);
UNUSED(ret);
}
/****************************************************************************
* Name: enc_ifup
*
@@ -2248,11 +2148,6 @@ static int enc_ifup(struct net_driver_s *dev)
enc_bfs(priv, ENC_ECON1, ECON1_RXEN);
/* Set and activate a timer process */
wd_start(&priv->txpoll, ENC_WDDELAY,
enc_polltimer, (wdparm_t)priv);
/* Enable the Ethernet interrupt at the controller */
priv->lower->enable(priv->lower);
@@ -2300,9 +2195,8 @@ static int enc_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
priv->lower->disable(priv->lower);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
/* Reset the device and leave in the power save state */
@@ -2365,7 +2259,7 @@ static int enc_txavail(struct net_driver_s *dev)
* poll the network for new XMIT data
*/
devif_timer(&priv->dev, 0, enc_txpoll);
devif_poll(&priv->dev, enc_txpoll);
}
}
+2 -87
View File
@@ -81,12 +81,6 @@
# define CONFIG_FTMAC100_NINTERFACES 1
#endif
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per
* second.
*/
#define FTMAC100_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define FTMAC100_TXTIMEOUT (60*CLK_TCK)
@@ -161,7 +155,6 @@ struct ftmac100_driver_s
/* NuttX net data */
bool ft_bifup; /* true:ifup false:ifdown */
struct wdog_s ft_txpoll; /* TX poll timer */
struct wdog_s ft_txtimeout; /* TX timeout timer */
unsigned int status; /* Last ISR status */
struct work_s ft_irqwork; /* For deferring work to the work queue */
@@ -208,9 +201,6 @@ static int ftmac100_interrupt(int irq, FAR void *context, FAR void *arg);
static void ftmac100_txtimeout_work(FAR void *arg);
static void ftmac100_txtimeout_expiry(wdparm_t arg);
static void ftmac100_poll_work(FAR void *arg);
static void ftmac100_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int ftmac100_ifup(FAR struct net_driver_s *dev);
@@ -1089,75 +1079,6 @@ static void ftmac100_txtimeout_expiry(wdparm_t arg)
work_queue(FTMAWORK, &priv->ft_irqwork, ftmac100_txtimeout_work, priv, 0);
}
/****************************************************************************
* Name: ftmac100_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void ftmac100_poll_work(FAR void *arg)
{
FAR struct ftmac100_driver_s *priv = (FAR struct ftmac100_driver_s *)arg;
/* Perform the poll */
net_lock();
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
/* If so, update TCP timing states and poll the network for new XMIT data.
* Hmmm.. might be bug here. Does this mean if there is a transmit in
* progress, we will missing TCP time state updates?
*/
devif_timer(&priv->ft_dev, FTMAC100_WDDELAY, ftmac100_txpoll);
/* Setup the watchdog poll timer again */
wd_start(&priv->ft_txpoll, FTMAC100_WDDELAY,
ftmac100_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Name: ftmac100_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void ftmac100_poll_expiry(wdparm_t arg)
{
FAR struct ftmac100_driver_s *priv = (FAR struct ftmac100_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(FTMAWORK, &priv->ft_pollwork, ftmac100_poll_work, priv, 0);
}
/****************************************************************************
* Name: ftmac100_ifup
*
@@ -1210,11 +1131,6 @@ static int ftmac100_ifup(struct net_driver_s *dev)
ftmac100_ipv6multicast(priv);
#endif
/* Set and activate a timer process */
wd_start(&priv->ft_txpoll, FTMAC100_WDDELAY,
ftmac100_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->ft_bifup = true;
@@ -1251,9 +1167,8 @@ static int ftmac100_ifdown(struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(CONFIG_FTMAC100_IRQ);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->ft_txpoll);
wd_cancel(&priv->ft_txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
@@ -1305,7 +1220,7 @@ static void ftmac100_txavail_work(FAR void *arg)
/* If so, then poll the network for new XMIT data */
devif_timer(&priv->ft_dev, 0, ftmac100_txpoll);
devif_poll(&priv->ft_dev, ftmac100_txpoll);
}
net_unlock();
+1 -103
View File
@@ -31,7 +31,6 @@
#include <nuttx/arch.h>
#include <nuttx/irq.h>
#include <nuttx/kmalloc.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#include <nuttx/net/arp.h>
@@ -68,12 +67,6 @@
# define lan91c111_dumppacket(m, b, l)
#endif
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define LAN91C111_WDDELAY (1*CLK_TCK)
/* MII busy delay = 1 microsecond */
#define LAN91C111_MIIDELAY 1
@@ -91,7 +84,6 @@ struct lan91c111_driver_s
uintptr_t base; /* Base address */
int irq; /* IRQ number */
uint16_t bank; /* Current bank */
struct wdog_s txpoll; /* TX poll timer */
struct work_s irqwork; /* For deferring interrupt work to the work queue */
struct work_s pollwork; /* For deferring poll work to the work queue */
uint8_t pktbuf[MAX_NETDEV_PKTSIZE + 4]; /* +4 due to getregs32/putregs32 */
@@ -119,11 +111,6 @@ static void lan91c111_txdone(FAR struct net_driver_s *dev);
static void lan91c111_interrupt_work(FAR void *arg);
static int lan91c111_interrupt(int irq, FAR void *context, FAR void *arg);
/* Watchdog timer expirations */
static void lan91c111_poll_work(FAR void *arg);
static void lan91c111_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int lan91c111_ifup(FAR struct net_driver_s *dev);
@@ -978,87 +965,6 @@ static int lan91c111_interrupt(int irq, FAR void *context, FAR void *arg)
return OK;
}
/****************************************************************************
* Name: lan91c111_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Run on a work queue thread.
*
****************************************************************************/
static void lan91c111_poll_work(FAR void *arg)
{
FAR struct net_driver_s *dev = arg;
FAR struct lan91c111_driver_s *priv = dev->d_private;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
* is performed on an LP worker thread and where more than one LP worker
* thread has been configured.
*/
net_lock();
/* Perform the poll */
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
if (getreg16(priv, MIR_REG) & MIR_FREE_MASK)
{
/* If so, update TCP timing states and poll the network for new XMIT
* data. Hmmm.. might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
devif_timer(dev, LAN91C111_WDDELAY, lan91c111_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, LAN91C111_WDDELAY,
lan91c111_poll_expiry, (wdparm_t)dev);
net_unlock();
}
/****************************************************************************
* Name: lan91c111_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Runs in the context of a the timer interrupt handler. Local
* interrupts are disabled by the interrupt logic.
*
****************************************************************************/
static void lan91c111_poll_expiry(wdparm_t arg)
{
FAR struct net_driver_s *dev = (FAR struct net_driver_s *)arg;
FAR struct lan91c111_driver_s *priv = dev->d_private;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(LAN91C111_WORK, &priv->pollwork, lan91c111_poll_work, dev, 0);
}
/****************************************************************************
* Name: lan91c111_ifup
*
@@ -1124,10 +1030,6 @@ static int lan91c111_ifup(FAR struct net_driver_s *dev)
lan91c111_ipv6multicast(dev);
#endif
/* Set and activate a timer process */
wd_start(&priv->txpoll, LAN91C111_WDDELAY,
lan91c111_poll_expiry, (wdparm_t)dev);
net_unlock();
/* Enable the Ethernet interrupt */
@@ -1163,10 +1065,6 @@ static int lan91c111_ifdown(FAR struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(priv->irq);
/* Cancel the TX poll timer and work */
wd_cancel(&priv->txpoll);
work_cancel(LAN91C111_WORK, &priv->irqwork);
work_cancel(LAN91C111_WORK, &priv->pollwork);
@@ -1228,7 +1126,7 @@ static void lan91c111_txavail_work(FAR void *arg)
{
/* If so, then poll the network for new XMIT data */
devif_timer(dev, 0, lan91c111_txpoll);
devif_poll(dev, lan91c111_txpoll);
}
}
+3 -91
View File
@@ -37,7 +37,6 @@
#include <nuttx/arch.h>
#include <nuttx/irq.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#include <nuttx/net/netconfig.h>
#include <nuttx/net/netdev.h>
@@ -60,12 +59,6 @@
# error Worker thread support is required (CONFIG_SCHED_WORKQUEUE)
#endif
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define LO_WDDELAY (1*CLK_TCK)
/* This is a helper pointer for accessing the contents of the IP header */
#define IPv4BUF ((FAR struct ipv4_hdr_s *)priv->lo_dev.d_buf)
@@ -83,7 +76,6 @@ struct lo_driver_s
{
bool lo_bifup; /* true:ifup false:ifdown */
bool lo_txdone; /* One RX packet was looped back */
struct wdog_s lo_polldog; /* TX poll timer */
struct work_s lo_work; /* For deferring poll work to the work queue */
/* This holds the information visible to the NuttX network */
@@ -105,8 +97,6 @@ static uint8_t g_iobuffer[NET_LO_PKTSIZE + CONFIG_NET_GUARDSIZE];
/* Polling logic */
static int lo_txpoll(FAR struct net_driver_s *dev);
static void lo_poll_work(FAR void *arg);
static void lo_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
@@ -128,8 +118,8 @@ static int lo_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac);
*
* Description:
* Check if the network has any outgoing packets ready to send. This is
* a callback from devif_poll() or devif_timer(). devif_poll() will be
* called only during normal TX polling.
* a callback from devif_poll(). devif_poll() will be called only during
* normal TX polling.
*
* Input Parameters:
* dev - Reference to the NuttX driver state structure
@@ -197,75 +187,6 @@ static int lo_txpoll(FAR struct net_driver_s *dev)
return 0;
}
/****************************************************************************
* Name: lo_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* The network is locked
*
****************************************************************************/
static void lo_poll_work(FAR void *arg)
{
FAR struct lo_driver_s *priv = (FAR struct lo_driver_s *)arg;
/* Perform the poll */
net_lock();
priv->lo_txdone = false;
devif_timer(&priv->lo_dev, LO_WDDELAY, lo_txpoll);
/* Was something received and looped back? */
while (priv->lo_txdone)
{
/* Yes, poll again for more TX data */
priv->lo_txdone = false;
devif_poll(&priv->lo_dev, lo_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->lo_polldog, LO_WDDELAY, lo_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Name: lo_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* The network is locked.
*
****************************************************************************/
static void lo_poll_expiry(wdparm_t arg)
{
FAR struct lo_driver_s *priv = (FAR struct lo_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(LPWORK, &priv->lo_work, lo_poll_work, priv, 0);
}
/****************************************************************************
* Name: lo_ifup
*
@@ -300,11 +221,6 @@ static int lo_ifup(FAR struct net_driver_s *dev)
NTOHS(dev->d_ipv6addr[6]), NTOHS(dev->d_ipv6addr[7]));
#endif
/* Set and activate a timer process */
wd_start(&priv->lo_polldog, LO_WDDELAY,
lo_poll_expiry, (wdparm_t)priv);
priv->lo_bifup = true;
netdev_carrier_on(dev);
return OK;
@@ -332,10 +248,6 @@ static int lo_ifdown(FAR struct net_driver_s *dev)
netdev_carrier_off(dev);
/* Cancel the TX poll timer and TX timeout timers */
wd_cancel(&priv->lo_polldog);
/* Mark the device "down" */
priv->lo_bifup = false;
@@ -373,7 +285,7 @@ static void lo_txavail_work(FAR void *arg)
/* If so, then poll the network for new XMIT data */
priv->lo_txdone = false;
devif_timer(&priv->lo_dev, 0, lo_txpoll);
devif_poll(&priv->lo_dev, lo_txpoll);
}
while (priv->lo_txdone);
}
+1 -117
View File
@@ -32,7 +32,6 @@
#include <nuttx/kmalloc.h>
#include <nuttx/kthread.h>
#include <nuttx/semaphore.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#include <nuttx/net/arp.h>
@@ -58,12 +57,6 @@
# define net_rpmsg_drv_dumppacket(m, b, l)
#endif
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per
* second.
*/
#define NET_RPMSG_DRV_WDDELAY (1*CLK_TCK)
/****************************************************************************
* Private Types
****************************************************************************/
@@ -83,7 +76,6 @@ struct net_rpmsg_drv_s
FAR const char *cpuname;
FAR const char *devname;
struct rpmsg_endpoint ept;
struct wdog_s txpoll; /* TX poll timer */
struct work_s pollwork; /* For deferring poll work to the work queue */
/* This holds the information visible to the NuttX network */
@@ -124,11 +116,6 @@ static int net_rpmsg_drv_ept_cb(FAR struct rpmsg_endpoint *ept, void *data,
static int net_rpmsg_drv_send_recv(struct net_driver_s *dev,
void *header_, uint32_t command, int len);
/* Watchdog timer expirations */
static void net_rpmsg_drv_poll_work(FAR void *arg);
static void net_rpmsg_drv_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int net_rpmsg_drv_ifup(FAR struct net_driver_s *dev);
@@ -699,100 +686,6 @@ out:
return ret;
}
/****************************************************************************
* Name: net_rpmsg_drv_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Run on a work queue thread.
*
****************************************************************************/
static void net_rpmsg_drv_poll_work(FAR void *arg)
{
FAR struct net_driver_s *dev = arg;
FAR struct net_rpmsg_drv_s *priv = dev->d_private;
uint32_t size;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
* is performed on an LP worker thread and where more than one LP worker
* thread has been configured.
*/
net_lock();
/* Perform the poll */
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
if (dev->d_buf == NULL)
{
/* Try to get the payload buffer if not yet */
dev->d_buf = rpmsg_get_tx_payload_buffer(&priv->ept, &size, false);
if (dev->d_buf)
{
dev->d_buf += sizeof(struct net_rpmsg_transfer_s);
dev->d_pktsize = size - sizeof(struct net_rpmsg_transfer_s);
}
}
if (dev->d_buf)
{
/* If so, update TCP timing states and poll the network for new XMIT
* data. Hmmm.. might be bug here. Does this mean if there is a
* transmit in progress, we will missing TCP time state updates?
*/
devif_timer(dev, NET_RPMSG_DRV_WDDELAY, net_rpmsg_drv_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, NET_RPMSG_DRV_WDDELAY,
net_rpmsg_drv_poll_expiry, (wdparm_t)dev);
net_unlock();
}
/****************************************************************************
* Name: net_rpmsg_drv_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Runs in the context of a the timer interrupt handler. Local
* interrupts are disabled by the interrupt logic.
*
****************************************************************************/
static void net_rpmsg_drv_poll_expiry(wdparm_t arg)
{
FAR struct net_driver_s *dev = (FAR struct net_driver_s *)arg;
FAR struct net_rpmsg_drv_s *priv = dev->d_private;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(LPWORK, &priv->pollwork, net_rpmsg_drv_poll_work, dev, 0);
}
/****************************************************************************
* Name: net_rpmsg_drv_ifup
*
@@ -813,7 +706,6 @@ static void net_rpmsg_drv_poll_expiry(wdparm_t arg)
static int net_rpmsg_drv_ifup(FAR struct net_driver_s *dev)
{
FAR struct net_rpmsg_drv_s *priv = dev->d_private;
struct net_rpmsg_ifup_s msg =
{
};
@@ -882,11 +774,6 @@ static int net_rpmsg_drv_ifup(FAR struct net_driver_s *dev)
net_rpmsg_drv_ipv6multicast(dev);
#endif
/* Set and activate a timer process */
wd_start(&priv->txpoll, NET_RPMSG_DRV_WDDELAY,
net_rpmsg_drv_poll_expiry, (wdparm_t)dev);
net_unlock();
#ifdef CONFIG_NETDB_DNSCLIENT
@@ -953,9 +840,6 @@ static int net_rpmsg_drv_ifdown(FAR struct net_driver_s *dev)
flags = enter_critical_section();
/* Cancel the TX poll timer and work */
wd_cancel(&priv->txpoll);
work_cancel(LPWORK, &priv->pollwork);
leave_critical_section(flags);
@@ -1023,7 +907,7 @@ static void net_rpmsg_drv_txavail_work(FAR void *arg)
{
/* If so, then poll the network for new XMIT data */
devif_timer(dev, 0, net_rpmsg_drv_txpoll);
devif_poll(dev, net_rpmsg_drv_txpoll);
}
}
+2 -94
View File
@@ -76,12 +76,6 @@
# define CONFIG_SKELETON_NINTERFACES 1
#endif
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define SKELETON_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define SKELETON_TXTIMEOUT (60*CLK_TCK)
@@ -101,7 +95,6 @@
struct skel_driver_s
{
bool sk_bifup; /* true:ifup false:ifdown */
struct wdog_s sk_txpoll; /* TX poll timer */
struct wdog_s sk_txtimeout; /* TX timeout timer */
struct work_s sk_irqwork; /* For deferring interrupt work to the work queue */
struct work_s sk_pollwork; /* For deferring poll work to the work queue */
@@ -160,9 +153,6 @@ static int skel_interrupt(int irq, FAR void *context, FAR void *arg);
static void skel_txtimeout_work(FAR void *arg);
static void skel_txtimeout_expiry(wdparm_t arg);
static void skel_poll_work(FAR void *arg);
static void skel_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int skel_ifup(FAR struct net_driver_s *dev);
@@ -687,82 +677,6 @@ static void skel_txtimeout_expiry(wdparm_t arg)
work_queue(ETHWORK, &priv->sk_irqwork, skel_txtimeout_work, priv, 0);
}
/****************************************************************************
* Name: skel_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Run on a work queue thread.
*
****************************************************************************/
static void skel_poll_work(FAR void *arg)
{
FAR struct skel_driver_s *priv = (FAR struct skel_driver_s *)arg;
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
* is performed on an LP worker thread and where more than one LP worker
* thread has been configured.
*/
net_lock();
/* Perform the poll */
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
/* If so, update TCP timing states and poll the network for new XMIT data.
* Hmmm.. might be bug here. Does this mean if there is a transmit in
* progress, we will missing TCP time state updates?
*/
devif_timer(&priv->sk_dev, SKELETON_WDDELAY, skel_txpoll);
/* Setup the watchdog poll timer again */
wd_start(&priv->sk_txpoll, SKELETON_WDDELAY,
skel_poll_expiry, (wdparm_t)priv);
net_unlock();
}
/****************************************************************************
* Name: skel_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Runs in the context of a the timer interrupt handler. Local
* interrupts are disabled by the interrupt logic.
*
****************************************************************************/
static void skel_poll_expiry(wdparm_t arg)
{
FAR struct skel_driver_s *priv = (FAR struct skel_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->sk_pollwork, skel_poll_work, priv, 0);
}
/****************************************************************************
* Name: skel_ifup
*
@@ -808,11 +722,6 @@ static int skel_ifup(FAR struct net_driver_s *dev)
skel_ipv6multicast(priv);
#endif
/* Set and activate a timer process */
wd_start(&priv->sk_txpoll, SKELETON_WDDELAY,
skel_poll_expiry, (wdparm_t)priv);
/* Enable the Ethernet interrupt */
priv->sk_bifup = true;
@@ -848,9 +757,8 @@ static int skel_ifdown(FAR struct net_driver_s *dev)
flags = enter_critical_section();
up_disable_irq(CONFIG_SKELETON_IRQ);
/* Cancel the TX poll timer and TX timeout timers */
/* Cancel the TX timeout timers */
wd_cancel(&priv->sk_txpoll);
wd_cancel(&priv->sk_txtimeout);
/* Put the EMAC in its reset, non-operational state. This should be
@@ -902,7 +810,7 @@ static void skel_txavail_work(FAR void *arg)
/* If so, then poll the network for new XMIT data */
devif_timer(&priv->sk_dev, 0, skel_txpoll);
devif_poll(&priv->sk_dev, skel_txpoll);
}
net_unlock();
+2 -20
View File
@@ -439,9 +439,6 @@ static int slip_txtask(int argc, FAR char *argv[])
{
FAR struct slip_driver_s *priv;
unsigned int index = *(argv[1]) - '0';
clock_t start_ticks;
clock_t now_ticks;
unsigned int hsec;
int ret;
nerr("index: %d\n", index);
@@ -456,7 +453,6 @@ static int slip_txtask(int argc, FAR char *argv[])
/* Loop forever */
start_ticks = clock_systime_ticks();
for (; ; )
{
/* Wait for the timeout to expire (or until we are signaled by */
@@ -488,23 +484,9 @@ static int slip_txtask(int argc, FAR char *argv[])
net_lock();
priv->dev.d_buf = priv->txbuf;
/* Has a half second elapsed since the last timer poll? */
/* perform the normal TX poll */
now_ticks = clock_systime_ticks();
hsec = (unsigned int)((now_ticks - start_ticks) / TICK_PER_HSEC);
if (hsec > 0)
{
/* Yes, perform the timer poll */
devif_timer(&priv->dev, hsec * TICK_PER_HSEC, slip_txpoll);
start_ticks += hsec * TICK_PER_HSEC;
}
else
{
/* No, perform the normal TX poll */
devif_timer(&priv->dev, 0, slip_txpoll);
}
devif_poll(&priv->dev, slip_txpoll);
net_unlock();
}
+1 -105
View File
@@ -59,7 +59,6 @@
#include <nuttx/arch.h>
#include <nuttx/irq.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#include <nuttx/net/arp.h>
#include <nuttx/net/netdev.h>
@@ -105,12 +104,6 @@
#define NET_TUN_PKTSIZE ((CONFIG_NET_TUN_PKTSIZE + CONFIG_NET_GUARDSIZE + 1) & ~1)
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define TUN_WDDELAY (1 * CLK_TCK)
/* This is a helper pointer for accessing the contents of the Ethernet
* header.
*/
@@ -137,7 +130,6 @@ struct tun_device_s
bool bifup; /* true:ifup false:ifdown */
bool read_wait;
bool write_wait;
struct wdog_s txpoll; /* TX poll timer */
struct work_s work; /* For deferring poll work to the work queue */
FAR struct pollfd *poll_fds;
sem_t waitsem;
@@ -190,11 +182,6 @@ static void tun_net_receive_tun(FAR struct tun_device_s *priv);
static void tun_txdone(FAR struct tun_device_s *priv);
/* Watchdog timer expirations */
static void tun_poll_work(FAR void *arg);
static void tun_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int tun_ifup(FAR struct net_driver_s *dev);
@@ -759,89 +746,6 @@ static void tun_txdone(FAR struct tun_device_s *priv)
devif_poll(&priv->dev, tun_txpoll);
}
/****************************************************************************
* Name: tun_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Ethernet interrupts are disabled
*
****************************************************************************/
static void tun_poll_work(FAR void *arg)
{
FAR struct tun_device_s *priv = (FAR struct tun_device_s *)arg;
int ret;
/* Perform the poll */
ret = tun_lock(priv);
if (ret < 0)
{
/* This would indicate that the worker thread was canceled.. not a
* likely event.
*/
DEBUGASSERT(ret == -ECANCELED);
return;
}
net_lock();
/* Check if there is room in the send another TX packet. We cannot perform
* the TX poll if he are unable to accept another packet for transmission.
*/
if (priv->read_d_len == 0)
{
/* If so, poll the network for new XMIT data. */
priv->dev.d_buf = priv->read_buf;
devif_timer(&priv->dev, TUN_WDDELAY, tun_txpoll);
}
/* Setup the watchdog poll timer again */
wd_start(&priv->txpoll, TUN_WDDELAY, tun_poll_expiry, (wdparm_t)priv);
net_unlock();
tun_unlock(priv);
}
/****************************************************************************
* Name: tun_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Global interrupts are disabled by the watchdog logic.
*
****************************************************************************/
static void tun_poll_expiry(wdparm_t arg)
{
FAR struct tun_device_s *priv = (FAR struct tun_device_s *)arg;
/* Schedule to perform the timer expiration on the worker thread. */
work_queue(TUNWORK, &priv->work, tun_poll_work, priv, 0);
}
/****************************************************************************
* Name: tun_ifup
*
@@ -877,10 +781,6 @@ static int tun_ifup(FAR struct net_driver_s *dev)
dev->d_ipv6addr[6], dev->d_ipv6addr[7]);
#endif
/* Set and activate a timer process */
wd_start(&priv->txpoll, TUN_WDDELAY, tun_poll_expiry, (wdparm_t)priv);
priv->bifup = true;
netdev_carrier_on(dev);
return OK;
@@ -911,10 +811,6 @@ static int tun_ifdown(FAR struct net_driver_s *dev)
flags = enter_critical_section();
/* Cancel the TX poll timer */
wd_cancel(&priv->txpoll);
/* Mark the device "down" */
priv->bifup = false;
@@ -969,7 +865,7 @@ static void tun_txavail_work(FAR void *arg)
/* Poll the network for new XMIT data */
priv->dev.d_buf = priv->read_buf;
devif_timer(&priv->dev, 0, tun_txpoll);
devif_poll(&priv->dev, tun_txpoll);
}
net_unlock();
+1 -96
View File
@@ -43,7 +43,6 @@
#include <nuttx/arch.h>
#include <nuttx/kmalloc.h>
#include <nuttx/irq.h>
#include <nuttx/wdog.h>
#include <nuttx/wqueue.h>
#include <nuttx/semaphore.h>
#include <nuttx/net/arp.h>
@@ -90,12 +89,6 @@
# define CONFIG_CDCECM_NINTERFACES 1
#endif
/* TX poll delay = 1 seconds.
* CLK_TCK is the number of clock ticks per second
*/
#define CDCECM_WDDELAY (1*CLK_TCK)
/* TX timeout = 1 minute */
#define CDCECM_TXTIMEOUT (60*CLK_TCK)
@@ -137,7 +130,6 @@ struct cdcecm_driver_s
/* Network device */
bool bifup; /* true:ifup false:ifdown */
struct wdog_s txpoll; /* TX poll timer */
struct work_s irqwork; /* For deferring interrupt work
* to the work queue */
struct work_s pollwork; /* For deferring poll work to
@@ -169,11 +161,6 @@ static void cdcecm_txdone(FAR struct cdcecm_driver_s *priv);
static void cdcecm_interrupt_work(FAR void *arg);
/* Watchdog timer expirations */
static void cdcecm_poll_work(FAR void *arg);
static void cdcecm_poll_expiry(wdparm_t arg);
/* NuttX callback functions */
static int cdcecm_ifup(FAR struct net_driver_s *dev);
@@ -646,79 +633,6 @@ static void cdcecm_interrupt_work(FAR void *arg)
net_unlock();
}
/****************************************************************************
* Name: cdcecm_poll_work
*
* Description:
* Perform periodic polling from the worker thread
*
* Input Parameters:
* arg - The argument passed when work_queue() as called.
*
* Returned Value:
* OK on success
*
* Assumptions:
* Run on a work queue thread.
*
****************************************************************************/
static void cdcecm_poll_work(FAR void *arg)
{
FAR struct cdcecm_driver_s *self = (FAR struct cdcecm_driver_s *)arg;
ninfo("rxpending: %d, txdone: %d\n", self->rxpending, self->txdone);
/* Lock the network and serialize driver operations if necessary.
* NOTE: Serialization is only required in the case where the driver work
* is performed on an LP worker thread and where more than one LP worker
* thread has been configured.
*/
net_lock();
/* Perform the poll. We are always able to accept another packet, since
* cdcecm_transmit will just wait until the USB device write request will
* become available.
*/
devif_timer(&self->dev, CDCECM_WDDELAY, cdcecm_txpoll);
/* Setup the watchdog poll timer again */
wd_start(&self->txpoll, CDCECM_WDDELAY,
cdcecm_poll_expiry, (wdparm_t)self);
net_unlock();
}
/****************************************************************************
* Name: cdcecm_poll_expiry
*
* Description:
* Periodic timer handler. Called from the timer interrupt handler.
*
* Input Parameters:
* arg - The argument
*
* Returned Value:
* None
*
* Assumptions:
* Runs in the context of a the timer interrupt handler. Local
* interrupts are disabled by the interrupt logic.
*
****************************************************************************/
static void cdcecm_poll_expiry(wdparm_t arg)
{
FAR struct cdcecm_driver_s *priv = (FAR struct cdcecm_driver_s *)arg;
/* Schedule to perform the interrupt processing on the worker thread. */
work_queue(ETHWORK, &priv->pollwork, cdcecm_poll_work, priv, 0);
}
/****************************************************************************
* Name: cdcecm_ifup
*
@@ -766,11 +680,6 @@ static int cdcecm_ifup(FAR struct net_driver_s *dev)
cdcecm_ipv6multicast(priv);
#endif
/* Set and activate a timer process */
wd_start(&priv->txpoll, CDCECM_WDDELAY,
cdcecm_poll_expiry, (wdparm_t)priv);
priv->bifup = true;
return OK;
}
@@ -802,10 +711,6 @@ static int cdcecm_ifdown(FAR struct net_driver_s *dev)
flags = enter_critical_section();
/* Cancel the TX poll timer and TX timeout timers */
wd_cancel(&priv->txpoll);
/* Put the EMAC in its reset, non-operational state. This should be
* a known configuration that will guarantee the cdcecm_ifup() always
* successfully brings the interface back up.
@@ -851,7 +756,7 @@ static void cdcecm_txavail_work(FAR void *arg)
if (self->bifup)
{
devif_timer(&self->dev, 0, cdcecm_txpoll);
devif_poll(&self->dev, cdcecm_txpoll);
}
net_unlock();

Some files were not shown because too many files have changed in this diff Show More