From 1b70957bd12d043f9d6632efb6c98f7c42aa9cbf Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 14 Sep 2018 10:21:52 +0200 Subject: 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 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,30 +571,34 @@ 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 */ @@ -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 -- cgit v1.2.3