From 1b67c6eecf62379b3b7062e4a43ba02a7a5ff458 Mon Sep 17 00:00:00 2001 From: nbd Date: Mon, 14 Jan 2013 09:51:53 +0000 Subject: ath9k: remove a lock to fix a deadlock on hw reset git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35147 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/mac80211/patches/300-pending_work.patch | 82 +++++++++++++++++++++---- 1 file changed, 71 insertions(+), 11 deletions(-) (limited to 'package/mac80211/patches/300-pending_work.patch') diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index 4d288bf602..f7b2540272 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -237,7 +237,15 @@ WLAN_STA_BLOCK_BA, --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -324,7 +324,6 @@ struct ath_rx { +@@ -314,7 +314,6 @@ struct ath_rx { + u32 *rxlink; + u32 num_pkts; + unsigned int rxfilter; +- spinlock_t rxbuflock; + struct list_head rxbuf; + struct ath_descdma rxdma; + struct ath_rx_edma rx_edma[ATH9K_RX_QUEUE_MAX]; +@@ -324,7 +323,6 @@ struct ath_rx { int ath_startrecv(struct ath_softc *sc); bool ath_stoprecv(struct ath_softc *sc); @@ -245,7 +253,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc); int ath_rx_init(struct ath_softc *sc, int nbufs); void ath_rx_cleanup(struct ath_softc *sc); -@@ -641,7 +640,6 @@ void ath_ant_comb_update(struct ath_soft +@@ -641,7 +639,6 @@ void ath_ant_comb_update(struct ath_soft enum sc_op_flags { SC_OP_INVALID, SC_OP_BEACONS, @@ -365,15 +373,47 @@ dev_kfree_skb_any(sc->rx.frag); --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c -@@ -280,7 +280,6 @@ int ath_rx_init(struct ath_softc *sc, in +@@ -248,8 +248,6 @@ rx_init_fail: + + static void ath_edma_start_recv(struct ath_softc *sc) + { +- spin_lock_bh(&sc->rx.rxbuflock); +- + ath9k_hw_rxena(sc->sc_ah); + + ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_HP, +@@ -261,8 +259,6 @@ static void ath_edma_start_recv(struct a + ath_opmode_init(sc); + + ath9k_hw_startpcureceive(sc->sc_ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)); +- +- spin_unlock_bh(&sc->rx.rxbuflock); + } + + static void ath_edma_stop_recv(struct ath_softc *sc) +@@ -279,8 +275,6 @@ int ath_rx_init(struct ath_softc *sc, in + int error = 0; spin_lock_init(&sc->sc_pcu_lock); - spin_lock_init(&sc->rx.rxbuflock); +- spin_lock_init(&sc->rx.rxbuflock); - clear_bit(SC_OP_RXFLUSH, &sc->sc_flags); common->rx_bufsize = IEEE80211_MAX_MPDU_LEN / 2 + sc->sc_ah->caps.rx_status_len; -@@ -464,6 +463,13 @@ start_recv: +@@ -438,7 +432,6 @@ int ath_startrecv(struct ath_softc *sc) + return 0; + } + +- spin_lock_bh(&sc->rx.rxbuflock); + if (list_empty(&sc->rx.rxbuf)) + goto start_recv; + +@@ -459,26 +452,31 @@ start_recv: + ath_opmode_init(sc); + ath9k_hw_startpcureceive(ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)); + +- spin_unlock_bh(&sc->rx.rxbuflock); +- return 0; } @@ -387,7 +427,10 @@ bool ath_stoprecv(struct ath_softc *sc) { struct ath_hw *ah = sc->sc_ah; -@@ -474,6 +480,8 @@ bool ath_stoprecv(struct ath_softc *sc) + bool stopped, reset = false; + +- spin_lock_bh(&sc->rx.rxbuflock); + ath9k_hw_abortpcurecv(ah); ath9k_hw_setrxfilter(ah, 0); stopped = ath9k_hw_stopdmarecv(ah, &reset); @@ -396,7 +439,12 @@ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) ath_edma_stop_recv(sc); else -@@ -490,15 +498,6 @@ bool ath_stoprecv(struct ath_softc *sc) + sc->rx.rxlink = NULL; +- spin_unlock_bh(&sc->rx.rxbuflock); + + if (!(ah->ah_flags & AH_UNPLUGGED) && + unlikely(!stopped)) { +@@ -490,15 +488,6 @@ bool ath_stoprecv(struct ath_softc *sc) return stopped && !reset; } @@ -412,7 +460,7 @@ static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb) { /* Check whether the Beacon frame has DTIM indicating buffered bc/mc */ -@@ -735,6 +734,7 @@ static struct ath_buf *ath_get_next_rx_b +@@ -735,6 +724,7 @@ static struct ath_buf *ath_get_next_rx_b return NULL; } @@ -420,7 +468,14 @@ if (!bf->bf_mpdu) return bf; -@@ -1057,9 +1057,6 @@ int ath_rx_tasklet(struct ath_softc *sc, +@@ -1050,16 +1040,12 @@ int ath_rx_tasklet(struct ath_softc *sc, + dma_type = DMA_FROM_DEVICE; + + qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP; +- spin_lock_bh(&sc->rx.rxbuflock); + + tsf = ath9k_hw_gettsf64(ah); + tsf_lower = tsf & 0xffffffff; do { bool decrypt_error = false; @@ -430,7 +485,7 @@ memset(&rs, 0, sizeof(rs)); if (edma) -@@ -1102,15 +1099,6 @@ int ath_rx_tasklet(struct ath_softc *sc, +@@ -1102,15 +1088,6 @@ int ath_rx_tasklet(struct ath_softc *sc, ath_debug_stat_rx(sc, &rs); @@ -446,7 +501,7 @@ memset(rxs, 0, sizeof(struct ieee80211_rx_status)); rxs->mactime = (tsf & ~0xffffffffULL) | rs.rs_tstamp; -@@ -1245,14 +1233,15 @@ requeue_drop_frag: +@@ -1245,19 +1222,18 @@ requeue_drop_frag: sc->rx.frag = NULL; } requeue: @@ -466,6 +521,11 @@ } } while (1); +- spin_unlock_bh(&sc->rx.rxbuflock); +- + if (!(ah->imask & ATH9K_INT_RXEOL)) { + ah->imask |= (ATH9K_INT_RXEOL | ATH9K_INT_RXORN); + ath9k_hw_set_interrupts(ah); --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c @@ -4586,14 +4586,14 @@ static int ar9003_hw_cal_pier_get(struct -- cgit v1.2.3