summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/320-rx_dma_unmap.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/320-rx_dma_unmap.patch')
-rw-r--r--package/mac80211/patches/320-rx_dma_unmap.patch37
1 files changed, 37 insertions, 0 deletions
diff --git a/package/mac80211/patches/320-rx_dma_unmap.patch b/package/mac80211/patches/320-rx_dma_unmap.patch
new file mode 100644
index 000000000..f7cd62a7c
--- /dev/null
+++ b/package/mac80211/patches/320-rx_dma_unmap.patch
@@ -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);