ath9k: Use lockless variants for the RX fifo queue
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Tue, 23 Apr 2013 06:52:18 +0000 (12:22 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 23 Apr 2013 18:14:54 +0000 (14:14 -0400)
The RX fifo can be accessed from the common tasklet or it can
be reaped/cleaned when RX is stopped, which is done when doing
a reset or channel change - this happens in process context.

Since it is ensured that there are no pending tasklets when
stopping RX and cleaning the FIFO, there is no need to use
SKB queue functions which take internal locks.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Acked-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/recv.c

index c8265a74d2f9bd2f27a5390c38b9dffbbc397023..9c0045e3e5c2c0048efa98771b6735c75ec5a37c 100644 (file)
@@ -124,7 +124,7 @@ static bool ath_rx_edma_buf_link(struct ath_softc *sc,
 
        SKB_CB_ATHBUF(skb) = bf;
        ath9k_hw_addrxbuf_edma(ah, bf->bf_buf_addr, qtype);
-       skb_queue_tail(&rx_edma->rx_fifo, skb);
+       __skb_queue_tail(&rx_edma->rx_fifo, skb);
 
        return true;
 }
@@ -155,7 +155,7 @@ static void ath_rx_remove_buffer(struct ath_softc *sc,
 
        rx_edma = &sc->rx.rx_edma[qtype];
 
-       while ((skb = skb_dequeue(&rx_edma->rx_fifo)) != NULL) {
+       while ((skb = __skb_dequeue(&rx_edma->rx_fifo)) != NULL) {
                bf = SKB_CB_ATHBUF(skb);
                BUG_ON(!bf);
                list_add_tail(&bf->list, &sc->rx.rxbuf);