PERFORCE change 200018 for review
Jakub Wojciech Klama
jceel at FreeBSD.org
Mon Oct 10 18:36:35 UTC 2011
http://p4web.freebsd.org/@@200018?ac=10
Change 200018 by jceel at 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);
More information about the p4-projects
mailing list