aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChaoming Li <chaoming_li@realsil.com.cn>2010-12-22 10:56:02 -0600
committerJohn W. Linville <linville@tuxdriver.com>2010-12-22 15:45:52 -0500
commit5c4bc1ce917d93ce8f7dd498fbec6881b3d7743a (patch)
tree4f6d275e0c29d6d0e24558065d96d9da09d6a873
parent172128468f61e16e1427238278b9ad775584aa89 (diff)
rtlwifi: Fix large packet issue
An RX buffer is set to 9100 bytes to receive 8K AMSDU; however, an skb of this size fails in the kernel. Signed-off-by: Chaoming Li <chaoming_li@realsil.com.cn> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 353e2035888..0fa36aa6701 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -612,10 +612,22 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
num_rx_inperiod++;
}
- if (unlikely(!rtl_action_proc(hw, skb, false)))
+ if (unlikely(!rtl_action_proc(hw, skb,
+ false))) {
dev_kfree_skb_any(skb);
- else
- ieee80211_rx_irqsafe(hw, skb);
+ } else {
+ struct sk_buff *uskb = NULL;
+ u8 *pdata;
+ uskb = dev_alloc_skb(skb->len + 128);
+ memcpy(IEEE80211_SKB_RXCB(uskb),
+ &rx_status,
+ sizeof(rx_status));
+ pdata = (u8 *)skb_put(uskb, skb->len);
+ memcpy(pdata, skb->data, skb->len);
+ dev_kfree_skb_any(skb);
+
+ ieee80211_rx_irqsafe(hw, uskb);
+ }
} else {
dev_kfree_skb_any(skb);
}