summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-14 10:21:52 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:43 +0200
commit1b70957bd12d043f9d6632efb6c98f7c42aa9cbf (patch)
tree69df89aea96b5f01e6654cf7f313d6a433b79bba
parentif_ffec_mpc8xx: New MDIO driver support (diff)
downloadrtems-libbsd-1b70957bd12d043f9d6632efb6c98f7c42aa9cbf.tar.bz2
if_ffec_mpc8xx: Use M_NOWAIT for incoming frames
Update #3523.
-rw-r--r--rtemsbsd/sys/dev/ffec/if_ffec_mpc8xx.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/rtemsbsd/sys/dev/ffec/if_ffec_mpc8xx.c b/rtemsbsd/sys/dev/ffec/if_ffec_mpc8xx.c
index 8629c423..a9d5eb46 100644
--- a/rtemsbsd/sys/dev/ffec/if_ffec_mpc8xx.c
+++ b/rtemsbsd/sys/dev/ffec/if_ffec_mpc8xx.c
@@ -536,6 +536,8 @@ static void fec_rxDaemon (void *arg)
*/
rxBdIndex = 0;
for (;;) {
+ struct mbuf *n;
+
rxBd = sc->rxBdBase + rxBdIndex;
/*
@@ -569,31 +571,35 @@ static void fec_rxDaemon (void *arg)
*/
if (status & M8xx_BD_LAST) {
/*
- * Pass the packet up the chain.
- * FIXME: Packet filtering hook could be done here.
+ * Allocate a new mbuf
*/
+ n = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
- /*
- * Invalidate the buffer for this descriptor
- */
- rtems_cache_invalidate_multiple_data_lines((const void *)rxBd->buffer, rxBd->length);
+ if (n != NULL) {
+ /*
+ * Pass the packet up the chain.
+ * FIXME: Packet filtering hook could be done here.
+ */
- m = sc->rxMbuf[rxBdIndex];
- m->m_len = m->m_pkthdr.len = rxBd->length - sizeof(uint32_t);
- FEC_UNLOCK(sc);
- (*sc->ifp->if_input)(sc->ifp, m);
- FEC_LOCK(sc);
+ /*
+ * Invalidate the buffer for this descriptor
+ */
+ rtems_cache_invalidate_multiple_data_lines(rxBd->buffer, rxBd->length);
+
+ m = sc->rxMbuf[rxBdIndex];
+ m->m_len = m->m_pkthdr.len = rxBd->length - ETHER_CRC_LEN;
+ FEC_UNLOCK(sc);
+ (*sc->ifp->if_input)(sc->ifp, m);
+ FEC_LOCK(sc);
+ } else {
+ /* Drop incoming frame if no new mbuf is available */
+ n = m;
+ }
+ } else {
+ /* Reuse mbuf */
+ n = m;
/*
- * Allocate a new mbuf
- */
- m = m_getcl(M_WAITOK, MT_DATA, M_PKTHDR);
- m->m_pkthdr.rcvif = ifp;
- sc->rxMbuf[rxBdIndex] = m;
- rxBd->buffer = mtod (m, void *);
- }
- else {
- /*
* Something went wrong with the reception
*/
if (!(status & M8xx_BD_LAST))
@@ -611,11 +617,15 @@ static void fec_rxDaemon (void *arg)
if (status & M8xx_BD_COLLISION)
sc->rxCollision++;
}
+
+ n->m_pkthdr.rcvif = ifp;
+ sc->rxMbuf[rxBdIndex] = n;
+ rxBd->buffer = mtod (n, void *);
+
/*
* Reenable the buffer descriptor
*/
- rxBd->status = (status & M8xx_BD_WRAP) |
- M8xx_BD_EMPTY;
+ rxBd->status = (status & M8xx_BD_WRAP) | M8xx_BD_EMPTY;
m8xx.fec.r_des_active = 0x1000000;
/*
* Move to next buffer descriptor