2009-01-30 00:36:53

by Felix Fietkau

[permalink] [raw]
Subject: [PATCH] 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 <[email protected]>

--- 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);


2009-01-30 08:03:09

by Nick Kossifidis

[permalink] [raw]
Subject: Re: [PATCH] ath5k: properly free rx dma descriptors

2009/1/30 Felix Fietkau <[email protected]>:
> 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 <[email protected]>
>
> --- 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);
>

Acked-by: Nick Kossifidis <[email protected]>


--
GPG ID: 0xD21DB2DB
As you read this post global entropy rises. Have Fun ;-)
Nick