rtlwifi: Avoid modifying skbs that are resubmitted
PATCH 1/1 rtlwifi: Avoid modifying skbs that are resubmitted
In the case we fail to allocate a new skb, the old skb should be resubmitted unmodified.
Fixes bug introduced in a9e12869758430424804.
Signed-off-by Mike McCormack <[email protected]>
--- drivers/net/wireless/rtlwifi/pci.c | 28 +++++++++++++--------------- 1 files changed, 13 insertions(+), 15 deletions(-)
drivers/net/wireless/rtlwifi/pci.c +13 -15
@@ -670,6 +670,19 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) &rx_status, (u8 *) pdesc, skb); + new_skb =dev_alloc_skb (rtlpci->rxbuffersize); +if (unlikely (!new_skb)) { +RT_TRACE (rtlpriv, (COMP_INTR |COMP_RECV ), +DBG_DMESG , + ("can't alloc skb for rx\n" )); + goto done; + } + +pci_unmap_single (rtlpci->pdev, + *((dma_addr_t *) skb->cb), + rtlpci->rxbuffersize, +PCI_DMA_FROMDEVICE ); +skb_put (skb, rtlpriv->cfg->ops->get_desc ((u8 *) pdesc, false,HW_DESC_RXPKT_LEN ));
@@ -686,21 +699,6 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) hdr =rtl_get_hdr (skb); fc =rtl_get_fc (skb); -/* try for new buffer - if allocation fails, drop -* frame and reuse old buffer -*/ - new_skb =dev_alloc_skb (rtlpci->rxbuffersize); -if (unlikely (!new_skb)) { -RT_TRACE (rtlpriv, (COMP_INTR |COMP_RECV ), -DBG_DMESG , - ("can't alloc skb for rx\n" )); - goto done; - } -pci_unmap_single (rtlpci->pdev, - *((dma_addr_t *) skb->cb), - rtlpci->rxbuffersize, -PCI_DMA_FROMDEVICE ); -if (!stats.crc && !stats.hwerror) {memcpy (IEEE80211_SKB_RXCB (skb), &rx_status,sizeof (rx_status));
Signature · 1 line
1.7.4.1
Quoted 11 lines · Mike McCormack
In the case we fail to allocate a new skb, the old skb should be resubmitted unmodified.
Fixes bug introduced in
a9e12869758430424804.Signed-off-by Mike McCormack<[email protected]>--- drivers/net/wireless/rtlwifi/pci.c | 28 +++++++++++++--------------- 1 files changed, 13 insertions(+), 15 deletions(-)
Acked-by Larry Finger <[email protected]>
John,
This patch is needed for kernel 3.0.
Larry
Quoted 46 lines
drivers/net/wireless/rtlwifi/pci.c +13
-15@@ -670,6 +670,19 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) &rx_status, (u8 *) pdesc, skb); + new_skb =dev_alloc_skb (rtlpci->rxbuffersize); +if (unlikely (!new_skb)) { +RT_TRACE (rtlpriv, (COMP_INTR |COMP_RECV ), +DBG_DMESG , + ("can't alloc skb for rx\n" )); + goto done; + } + +pci_unmap_single (rtlpci->pdev, + *((dma_addr_t *) skb->cb), + rtlpci->rxbuffersize, +PCI_DMA_FROMDEVICE ); +skb_put (skb, rtlpriv->cfg->ops->get_desc ((u8 *) pdesc, false,HW_DESC_RXPKT_LEN ));@@ -686,21 +699,6 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) hdr =rtl_get_hdr (skb); fc =rtl_get_fc (skb); -/* try for new buffer - if allocation fails, drop -* frame and reuse old buffer -*/ - new_skb =dev_alloc_skb (rtlpci->rxbuffersize); -if (unlikely (!new_skb)) { -RT_TRACE (rtlpriv, (COMP_INTR |COMP_RECV ), -DBG_DMESG , - ("can't alloc skb for rx\n" )); - goto done; - } -pci_unmap_single (rtlpci->pdev, - *((dma_addr_t *) skb->cb), - rtlpci->rxbuffersize, -PCI_DMA_FROMDEVICE ); -if (!stats.crc&& !stats.hwerror) {memcpy (IEEE80211_SKB_RXCB (skb),&rx_status,sizeof (rx_status));