aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath5k/base.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2009-01-29 19:36:48 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-02-09 15:03:43 -0500
commita6c8d375f539d450bf8d45e8ccbb7c9e26dffbef (patch)
tree896240623ef03c97ee710ce83febdb22804df7fe /drivers/net/wireless/ath5k/base.c
parentc1b4aa3fb619782213af2af6652663c8f9cef373 (diff)
ath5k: properly free rx dma descriptors
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> Acked-by: Nick Kossifidis <mickflemm@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath5k/base.c')
-rw-r--r--drivers/net/wireless/ath5k/base.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index bd2c580d1f19..f9d486ff04f2 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -310,6 +310,19 @@ static inline void ath5k_txbuf_free(struct ath5k_softc *sc,
310 bf->skb = NULL; 310 bf->skb = NULL;
311} 311}
312 312
313static inline void ath5k_rxbuf_free(struct ath5k_softc *sc,
314 struct ath5k_buf *bf)
315{
316 BUG_ON(!bf);
317 if (!bf->skb)
318 return;
319 pci_unmap_single(sc->pdev, bf->skbaddr, sc->rxbufsize,
320 PCI_DMA_FROMDEVICE);
321 dev_kfree_skb_any(bf->skb);
322 bf->skb = NULL;
323}
324
325
313/* Queues setup */ 326/* Queues setup */
314static struct ath5k_txq *ath5k_txq_setup(struct ath5k_softc *sc, 327static struct ath5k_txq *ath5k_txq_setup(struct ath5k_softc *sc,
315 int qtype, int subtype); 328 int qtype, int subtype);
@@ -1343,7 +1356,7 @@ ath5k_desc_free(struct ath5k_softc *sc, struct pci_dev *pdev)
1343 list_for_each_entry(bf, &sc->txbuf, list) 1356 list_for_each_entry(bf, &sc->txbuf, list)
1344 ath5k_txbuf_free(sc, bf); 1357 ath5k_txbuf_free(sc, bf);
1345 list_for_each_entry(bf, &sc->rxbuf, list) 1358 list_for_each_entry(bf, &sc->rxbuf, list)
1346 ath5k_txbuf_free(sc, bf); 1359 ath5k_rxbuf_free(sc, bf);
1347 1360
1348 /* Free memory associated with all descriptors */ 1361 /* Free memory associated with all descriptors */
1349 pci_free_consistent(pdev, sc->desc_len, sc->desc, sc->desc_daddr); 1362 pci_free_consistent(pdev, sc->desc_len, sc->desc, sc->desc_daddr);