[rtems-libbsd commit] if_ffec_mpc8xx: Use M_NOWAIT for incoming frames

Sebastian Huber sebh at rtems.org
Fri Sep 21 08:39:34 UTC 2018


Module:    rtems-libbsd
Branch:    master
Commit:    1b70957bd12d043f9d6632efb6c98f7c42aa9cbf
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=1b70957bd12d043f9d6632efb6c98f7c42aa9cbf

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Sep 14 10:21:52 2018 +0200

if_ffec_mpc8xx: Use M_NOWAIT for incoming frames

Update #3523.

---

 rtemsbsd/sys/dev/ffec/if_ffec_mpc8xx.c | 54 ++++++++++++++++++++--------------
 1 file 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 8629c42..a9d5eb4 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



More information about the vc mailing list