add some work-in-progress patches for ath5k stability and performance
[openwrt-10.03/.git] / package / mac80211 / patches / 320-rx_dma_unmap.patch
diff --git a/package/mac80211/patches/320-rx_dma_unmap.patch b/package/mac80211/patches/320-rx_dma_unmap.patch
new file mode 100644 (file)
index 0000000..f7cd62a
--- /dev/null
@@ -0,0 +1,37 @@
+When freeing rx dma descriptors, use the right buffer size.
+Fixes kernel oopses on module unload on ixp4xx and most likely
+other platforms as well.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+
+--- a/drivers/net/wireless/ath5k/base.c
++++ b/drivers/net/wireless/ath5k/base.c
+@@ -308,6 +308,19 @@ static inline void ath5k_txbuf_free(stru
+       bf->skb = NULL;
+ }
++static inline void ath5k_rxbuf_free(struct ath5k_softc *sc,
++                              struct ath5k_buf *bf)
++{
++      BUG_ON(!bf);
++      if (!bf->skb)
++              return;
++      pci_unmap_single(sc->pdev, bf->skbaddr, sc->rxbufsize,
++                      PCI_DMA_FROMDEVICE);
++      dev_kfree_skb_any(bf->skb);
++      bf->skb = NULL;
++}
++
++
+ /* Queues setup */
+ static struct         ath5k_txq *ath5k_txq_setup(struct ath5k_softc *sc,
+                               int qtype, int subtype);
+@@ -1341,7 +1354,7 @@ ath5k_desc_free(struct ath5k_softc *sc, 
+       list_for_each_entry(bf, &sc->txbuf, list)
+               ath5k_txbuf_free(sc, bf);
+       list_for_each_entry(bf, &sc->rxbuf, list)
+-              ath5k_txbuf_free(sc, bf);
++              ath5k_rxbuf_free(sc, bf);
+       /* Free memory associated with all descriptors */
+       pci_free_consistent(pdev, sc->desc_len, sc->desc, sc->desc_daddr);