Skip to contentSkip to conversation

ath5k: properly free rx dma descriptors

PATCH In review Felix Fietkau 2 participants 2 messages Jan 30, 2009 Networking drivers (wireless)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

drivers/net/wireless/ath5k/base.c +14 -1
@@ -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 on v1 1/1
#1 lore raw

2009/1/30 Felix Fietkau <[email protected]>:

Quoted 30 lines

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.

drivers/net/wireless/ath5k/base.c +13 -0
@@ -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);

drivers/net/wireless/ath5k/base.c ath5k_desc_free(struct ath5k_softc *sc, · line 1360

Quoted 8 lines
drivers/net/wireless/ath5k/base.c +1 -1
@@ -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);
Signature · 3 lines
GPG ID: 0xD21DB2DB
As you read this post global entropy rises. Have Fun ;-)
Nick