On Thu, Oct 21, 2010 at 04:37:05AM +0530, Luis R. Rodriguez wrote: > The real way to lock RX is to contend on the PCU > and reset, this will be fixed in the next patch but for > now just do the renames so that the next patch which changes > the locking order is crystal clear. > > This is part of a series that will help resolve the bug: > > https://bugzilla.kernel.org/show_bug.cgi?id=14624 > > For more details about this issue refer to: > > http://marc.info/?l=linux-wireless&m=128629803703756&w=2 > > Cc: stable@xxxxxxxxxx > Cc: Ben Greear <greearb@xxxxxxxxxxxxxxx> > Cc: Kyungwan Nam <kyungwan.nam@xxxxxxxxxxx> > Signed-off-by: Luis R. Rodriguez <lrodriguez@xxxxxxxxxxx> > --- > drivers/net/wireless/ath/ath9k/ath9k.h | 2 +- > drivers/net/wireless/ath/ath9k/main.c | 4 ++-- > drivers/net/wireless/ath/ath9k/recv.c | 6 +++--- > 3 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h > index 0f0bc54..81fed83 100644 > --- a/drivers/net/wireless/ath/ath9k/ath9k.h > +++ b/drivers/net/wireless/ath/ath9k/ath9k.h > @@ -309,7 +309,7 @@ struct ath_rx { > u8 rxotherant; > u32 *rxlink; > unsigned int rxfilter; > - spinlock_t rxflushlock; > + spinlock_t pcu_lock; > spinlock_t rxbuflock; > struct list_head rxbuf; > struct ath_descdma rxdma; > diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c > index dcd94ba..37f18ef 100644 > --- a/drivers/net/wireless/ath/ath9k/main.c > +++ b/drivers/net/wireless/ath/ath9k/main.c > @@ -609,7 +609,7 @@ void ath9k_tasklet(unsigned long data) > rxmask = (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN); > > if (status & rxmask) { > - spin_lock_bh(&sc->rx.rxflushlock); > + spin_lock_bh(&sc->rx.pcu_lock); no need to disable bh as you are already in tasklet. I understand that the existing code itself was doing this and I thought of fixing that anyway. Can you plese fix this as well with this patch? > > /* Check for high priority Rx first */ > if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) && > @@ -617,7 +617,7 @@ void ath9k_tasklet(unsigned long data) > ath_rx_tasklet(sc, 0, true); > > ath_rx_tasklet(sc, 0, false); > - spin_unlock_bh(&sc->rx.rxflushlock); > + spin_unlock_bh(&sc->rx.pcu_lock); here also. spin_lock() is sufficient. > } > > if (status & ATH9K_INT_TX) { > diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c > index 944fb59..b099827 100644 > --- a/drivers/net/wireless/ath/ath9k/recv.c > +++ b/drivers/net/wireless/ath/ath9k/recv.c > @@ -317,7 +317,7 @@ int ath_rx_init(struct ath_softc *sc, int nbufs) > struct ath_buf *bf; > int error = 0; > > - spin_lock_init(&sc->rx.rxflushlock); > + spin_lock_init(&sc->rx.pcu_lock); > sc->sc_flags &= ~SC_OP_RXFLUSH; > spin_lock_init(&sc->rx.rxbuflock); > > @@ -533,13 +533,13 @@ bool ath_stoprecv(struct ath_softc *sc) > > void ath_flushrecv(struct ath_softc *sc) > { > - spin_lock_bh(&sc->rx.rxflushlock); > + spin_lock_bh(&sc->rx.pcu_lock); > sc->sc_flags |= SC_OP_RXFLUSH; > if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) > ath_rx_tasklet(sc, 1, true); > ath_rx_tasklet(sc, 1, false); > sc->sc_flags &= ~SC_OP_RXFLUSH; > - spin_unlock_bh(&sc->rx.rxflushlock); > + spin_unlock_bh(&sc->rx.pcu_lock); > } > > static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb) > -- > 1.7.0.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html