Date: Mon, 10 Oct 2011 18:36:34 GMT From: Jakub Wojciech Klama <jceel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 200018 for review Message-ID: <201110101836.p9AIaYTg052996@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@200018?ac=10 Change 200018 by jceel@jceel_cyclone on 2011/10/10 18:36:03 Fix locking in lpe_rxintr() - release mutex before calling if_input() and then reacuire it back. Affected files ... .. //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpe.c#9 edit Differences ... ==== //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpe.c#9 (text+ko) ==== @@ -84,6 +84,7 @@ }; struct lpe_txdesc { + int lpe_txdesc_first; struct mbuf * lpe_txdesc_mbuf; bus_dmamap_t lpe_txdesc_dmamap; }; @@ -559,6 +560,9 @@ bus_dmamap_sync(sc->lpe_cdata.lpe_tx_ring_tag, sc->lpe_cdata.lpe_tx_ring_map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + txd->lpe_txdesc_first = 1; + txd->lpe_txdesc_mbuf = *m_head; + for (i = 0; i < nsegs; i++) { hwd = &sc->lpe_rdata.lpe_tx_ring[prod]; hwd->lhr_data = segs[i].ds_addr; @@ -569,9 +573,6 @@ hwd->lhr_control |= LPE_HWDESC_INTERRUPT; hwd->lhr_control |= LPE_HWDESC_CRC; hwd->lhr_control |= LPE_HWDESC_PAD; - - txd = &sc->lpe_cdata.lpe_tx_desc[prod]; - txd->lpe_txdesc_mbuf = *m_head; } LPE_INC(prod, LPE_TXDESC_NUM); @@ -629,6 +630,8 @@ debugf("status=0x%08x\n", lpe_read_4(sc, LPE_INTSTATUS)); + lpe_lock(sc); + while ((intstatus = lpe_read_4(sc, LPE_INTSTATUS))) { if (intstatus & LPE_INT_RXDONE) lpe_rxintr(sc); @@ -639,7 +642,7 @@ lpe_write_4(sc, LPE_INTCLEAR, 0xffff); } - + lpe_unlock(sc); } static void @@ -667,7 +670,9 @@ m->m_pkthdr.rcvif = ifp; m->m_data += 2; + lpe_unlock(sc); (*ifp->if_input)(ifp, m); + lpe_lock(sc); lpe_init_rxbuf(sc, cons); @@ -700,12 +705,13 @@ bus_dmamap_sync(sc->lpe_cdata.lpe_tx_buf_tag, txd->lpe_txdesc_dmamap, BUS_DMASYNC_POSTWRITE); - if (txd->lpe_txdesc_mbuf != NULL) { + if (txd->lpe_txdesc_first) { bus_dmamap_unload(sc->lpe_cdata.lpe_tx_buf_tag, txd->lpe_txdesc_dmamap); m_freem(txd->lpe_txdesc_mbuf); txd->lpe_txdesc_mbuf = NULL; + txd->lpe_txdesc_first = 0; } LPE_INC(sc->lpe_cdata.lpe_tx_last, LPE_TXDESC_NUM); @@ -946,6 +952,7 @@ txd = &sc->lpe_cdata.lpe_tx_desc[i]; txd->lpe_txdesc_mbuf = NULL; txd->lpe_txdesc_dmamap = NULL; + txd->lpe_txdesc_first = 0; err = bus_dmamap_create(sc->lpe_cdata.lpe_tx_buf_tag, 0, &txd->lpe_txdesc_dmamap);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110101836.p9AIaYTg052996>