ENCX24J600: Use separate pools for RX and TX descriptors. From Max Holtzberg
This commit is contained in:
parent
cc0128183a
commit
f3a7625fca
@ -5661,4 +5661,6 @@
|
|||||||
(Compal E86) phone. From Craig Comstock (2013-9-27).
|
(Compal E86) phone. From Craig Comstock (2013-9-27).
|
||||||
* configs/compal_e86: Converted to use the kconfig-frontends
|
* configs/compal_e86: Converted to use the kconfig-frontends
|
||||||
tools (2013-9-27).
|
tools (2013-9-27).
|
||||||
|
* drivers/net/encx24j500.c: Use separate pools for RX and TX
|
||||||
|
descriptors. From Max Holtzberg (2013-9-28).
|
||||||
|
|
||||||
|
@ -171,6 +171,10 @@
|
|||||||
#define PKTMEM_RX_START (PKTMEM_START + PKTMEM_SIZE / 2) /* Followed by RX buffer */
|
#define PKTMEM_RX_START (PKTMEM_START + PKTMEM_SIZE / 2) /* Followed by RX buffer */
|
||||||
#define PKTMEM_RX_END (PKTMEM_START + PKTMEM_SIZE - 2) /* RX buffer goes to the end of SRAM */
|
#define PKTMEM_RX_END (PKTMEM_START + PKTMEM_SIZE - 2) /* RX buffer goes to the end of SRAM */
|
||||||
|
|
||||||
|
/* We use preinitialized TX descriptors */
|
||||||
|
|
||||||
|
#define ENC_NTXDESCR ((PKTMEM_RX_START - PKTMEM_START) / PKTMEM_ALIGNED_BUFSIZE)
|
||||||
|
|
||||||
/* This is a helper pointer for accessing the contents of the Ethernet header */
|
/* This is a helper pointer for accessing the contents of the Ethernet header */
|
||||||
|
|
||||||
#define BUF ((struct uip_eth_hdr *)priv->dev.d_buf)
|
#define BUF ((struct uip_eth_hdr *)priv->dev.d_buf)
|
||||||
@ -240,8 +244,11 @@ struct enc_driver_s
|
|||||||
struct work_s towork; /* Tx timeout work queue support */
|
struct work_s towork; /* Tx timeout work queue support */
|
||||||
struct work_s pollwork; /* Poll timeout work queue support */
|
struct work_s pollwork; /* Poll timeout work queue support */
|
||||||
|
|
||||||
struct enc_descr_s descralloc[CONFIG_ENCX24J600_NDESCR];
|
struct enc_descr_s txdescralloc[ENC_NTXDESCR];
|
||||||
sq_queue_t freedescr; /* The free descriptor list */
|
struct enc_descr_s rxdescralloc[CONFIG_ENCX24J600_NRXDESCR];
|
||||||
|
|
||||||
|
sq_queue_t txfreedescr; /* Free inititialized TX descriptors */
|
||||||
|
sq_queue_t rxfreedescr; /* Free RX descriptors */
|
||||||
sq_queue_t txqueue; /* Enqueued descriptors waiting for transmition */
|
sq_queue_t txqueue; /* Enqueued descriptors waiting for transmition */
|
||||||
sq_queue_t rxqueue; /* Unhandled incoming packets waiting for reception */
|
sq_queue_t rxqueue; /* Unhandled incoming packets waiting for reception */
|
||||||
|
|
||||||
@ -1088,7 +1095,7 @@ static int enc_transmit(FAR struct enc_driver_s *priv)
|
|||||||
|
|
||||||
/* free the descriptor */
|
/* free the descriptor */
|
||||||
|
|
||||||
sq_addlast((sq_entry_t*)descr, &priv->freedescr);
|
sq_addlast((sq_entry_t*)descr, &priv->txfreedescr);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -1125,7 +1132,7 @@ static int enc_txenqueue(FAR struct enc_driver_s *priv)
|
|||||||
priv->stats.txrequests++;
|
priv->stats.txrequests++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
descr = (struct enc_descr_s*)sq_remfirst(&priv->freedescr);
|
descr = (struct enc_descr_s*)sq_remfirst(&priv->txfreedescr);
|
||||||
|
|
||||||
if (descr != NULL)
|
if (descr != NULL)
|
||||||
{
|
{
|
||||||
@ -1282,6 +1289,10 @@ static void enc_txif(FAR struct enc_driver_s *priv)
|
|||||||
/* If no further xmits are pending, then cancel the TX timeout */
|
/* If no further xmits are pending, then cancel the TX timeout */
|
||||||
|
|
||||||
wd_cancel(priv->txtimeout);
|
wd_cancel(priv->txtimeout);
|
||||||
|
|
||||||
|
/* Poll for uip packets */
|
||||||
|
|
||||||
|
uip_poll(&priv->dev, enc_uiptxpoll);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1382,7 +1393,7 @@ static void enc_rxrmpkt(FAR struct enc_driver_s *priv, struct enc_descr_s *descr
|
|||||||
sq_rem((sq_entry_t*)descr, &priv->rxqueue);
|
sq_rem((sq_entry_t*)descr, &priv->rxqueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
sq_addlast((sq_entry_t*)descr, &priv->freedescr);
|
sq_addlast((sq_entry_t*)descr, &priv->rxfreedescr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -1580,7 +1591,7 @@ static void enc_pktif(FAR struct enc_driver_s *priv)
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
descr = (struct enc_descr_s*)sq_remfirst(&priv->freedescr);
|
descr = (struct enc_descr_s*)sq_remfirst(&priv->rxfreedescr);
|
||||||
|
|
||||||
if (descr != NULL)
|
if (descr != NULL)
|
||||||
{
|
{
|
||||||
@ -2583,16 +2594,27 @@ static int enc_reset(FAR struct enc_driver_s *priv)
|
|||||||
|
|
||||||
enc_wrreg(priv, ENC_ERXTAIL, PKTMEM_RX_END);
|
enc_wrreg(priv, ENC_ERXTAIL, PKTMEM_RX_END);
|
||||||
|
|
||||||
sq_init(&priv->freedescr);
|
sq_init(&priv->txfreedescr);
|
||||||
|
sq_init(&priv->rxfreedescr);
|
||||||
sq_init(&priv->txqueue);
|
sq_init(&priv->txqueue);
|
||||||
sq_init(&priv->rxqueue);
|
sq_init(&priv->rxqueue);
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_ENCX24J600_NDESCR; i++)
|
/* For transmition we preinitialize the descriptors to aligned NET_BUFFSIZE */
|
||||||
|
|
||||||
|
for (i = 0; i < ENC_NTXDESCR; i++)
|
||||||
{
|
{
|
||||||
priv->descralloc[i].addr = PKTMEM_START + PKTMEM_ALIGNED_BUFSIZE * i;
|
priv->txdescralloc[i].addr = PKTMEM_START + PKTMEM_ALIGNED_BUFSIZE * i;
|
||||||
sq_addlast((sq_entry_t*)&priv->descralloc[i], &priv->freedescr);
|
sq_addlast((sq_entry_t*)&priv->txdescralloc[i], &priv->txfreedescr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Receive descriptors addresses are set on reception */
|
||||||
|
|
||||||
|
for (i = 0; i < CONFIG_ENCX24J600_NRXDESCR; i++)
|
||||||
|
{
|
||||||
|
sq_addlast((sq_entry_t*)&priv->rxdescralloc[i], &priv->rxfreedescr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* When restarting auto-negotiation, the ESTAT_PHYLINK gets set but the link
|
/* When restarting auto-negotiation, the ESTAT_PHYLINK gets set but the link
|
||||||
* seems not to be ready. Because auto-negotiation is enabled by default
|
* seems not to be ready. Because auto-negotiation is enabled by default
|
||||||
@ -2624,7 +2646,7 @@ static int enc_reset(FAR struct enc_driver_s *priv)
|
|||||||
|
|
||||||
/* Set the maximum packet size which the controller will accept */
|
/* Set the maximum packet size which the controller will accept */
|
||||||
|
|
||||||
enc_wrreg(priv, ENC_MAMXFL, CONFIG_NET_BUFSIZE);
|
enc_wrreg(priv, ENC_MAMXFL, CONFIG_NET_BUFSIZE + 4);
|
||||||
|
|
||||||
ret = enc_waitreg(priv, ENC_ESTAT, ESTAT_PHYLNK, ESTAT_PHYLNK);
|
ret = enc_waitreg(priv, ENC_ESTAT, ESTAT_PHYLNK, ESTAT_PHYLNK);
|
||||||
if (ret != OK)
|
if (ret != OK)
|
||||||
|
Loading…
Reference in New Issue
Block a user