diff options
Diffstat (limited to 'package/mac80211/patches/320-rx_dma_unmap.patch')
-rw-r--r-- | package/mac80211/patches/320-rx_dma_unmap.patch | 37 |
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 0000000..f7cd62a --- /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); |