|
@@ -548,7 +548,6 @@ static void iwl3945_pass_packet_to_mac80211(struct iwl_priv *priv,
|
|
|
struct iwl3945_rx_frame_end *rx_end = IWL_RX_END(pkt);
|
|
|
u16 len = le16_to_cpu(rx_hdr->len);
|
|
|
struct sk_buff *skb;
|
|
|
- int ret;
|
|
|
__le16 fc = hdr->frame_control;
|
|
|
|
|
|
/* We received data from the HW, so stop the watchdog */
|
|
@@ -565,9 +564,9 @@ static void iwl3945_pass_packet_to_mac80211(struct iwl_priv *priv,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- skb = alloc_skb(IWL_LINK_HDR_MAX * 2, GFP_ATOMIC);
|
|
|
+ skb = dev_alloc_skb(128);
|
|
|
if (!skb) {
|
|
|
- IWL_ERR(priv, "alloc_skb failed\n");
|
|
|
+ IWL_ERR(priv, "dev_alloc_skb failed\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -576,37 +575,13 @@ static void iwl3945_pass_packet_to_mac80211(struct iwl_priv *priv,
|
|
|
(struct ieee80211_hdr *)rxb_addr(rxb),
|
|
|
le32_to_cpu(rx_end->status), stats);
|
|
|
|
|
|
- skb_reserve(skb, IWL_LINK_HDR_MAX);
|
|
|
skb_add_rx_frag(skb, 0, rxb->page,
|
|
|
(void *)rx_hdr->payload - (void *)pkt, len);
|
|
|
|
|
|
- /* mac80211 currently doesn't support paged SKB. Convert it to
|
|
|
- * linear SKB for management frame and data frame requires
|
|
|
- * software decryption or software defragementation. */
|
|
|
- if (ieee80211_is_mgmt(fc) ||
|
|
|
- ieee80211_has_protected(fc) ||
|
|
|
- ieee80211_has_morefrags(fc) ||
|
|
|
- le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG)
|
|
|
- ret = skb_linearize(skb);
|
|
|
- else
|
|
|
- ret = __pskb_pull_tail(skb, min_t(u16, IWL_LINK_HDR_MAX, len)) ?
|
|
|
- 0 : -ENOMEM;
|
|
|
-
|
|
|
- if (ret) {
|
|
|
- kfree_skb(skb);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * XXX: We cannot touch the page and its virtual memory (pkt) after
|
|
|
- * here. It might have already been freed by the above skb change.
|
|
|
- */
|
|
|
-
|
|
|
iwl_update_stats(priv, false, fc, len);
|
|
|
memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats));
|
|
|
|
|
|
ieee80211_rx(priv->hw, skb);
|
|
|
- out:
|
|
|
priv->alloc_rxb_page--;
|
|
|
rxb->page = NULL;
|
|
|
}
|