|
@@ -1130,6 +1130,8 @@ static void zd_mac_rx(struct zd_mac *mac, struct sk_buff *skb)
|
|
__skb_trim(skb, skb->len -
|
|
__skb_trim(skb, skb->len -
|
|
(IEEE80211_FCS_LEN + sizeof(struct rx_status)));
|
|
(IEEE80211_FCS_LEN + sizeof(struct rx_status)));
|
|
|
|
|
|
|
|
+ ZD_ASSERT(IS_ALIGNED((unsigned long)skb->data, 4));
|
|
|
|
+
|
|
update_qual_rssi(mac, skb->data, skb->len, stats.signal,
|
|
update_qual_rssi(mac, skb->data, skb->len, stats.signal,
|
|
status->signal_strength);
|
|
status->signal_strength);
|
|
|
|
|
|
@@ -1166,15 +1168,19 @@ static void do_rx(unsigned long mac_ptr)
|
|
int zd_mac_rx_irq(struct zd_mac *mac, const u8 *buffer, unsigned int length)
|
|
int zd_mac_rx_irq(struct zd_mac *mac, const u8 *buffer, unsigned int length)
|
|
{
|
|
{
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
|
|
+ unsigned int reserved =
|
|
|
|
+ ALIGN(max_t(unsigned int,
|
|
|
|
+ sizeof(struct zd_rt_hdr), ZD_PLCP_HEADER_SIZE), 4) -
|
|
|
|
+ ZD_PLCP_HEADER_SIZE;
|
|
|
|
|
|
- skb = dev_alloc_skb(sizeof(struct zd_rt_hdr) + length);
|
|
|
|
|
|
+ skb = dev_alloc_skb(reserved + length);
|
|
if (!skb) {
|
|
if (!skb) {
|
|
struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac);
|
|
struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac);
|
|
dev_warn(zd_mac_dev(mac), "Could not allocate skb.\n");
|
|
dev_warn(zd_mac_dev(mac), "Could not allocate skb.\n");
|
|
ieee->stats.rx_dropped++;
|
|
ieee->stats.rx_dropped++;
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
- skb_reserve(skb, sizeof(struct zd_rt_hdr));
|
|
|
|
|
|
+ skb_reserve(skb, reserved);
|
|
memcpy(__skb_put(skb, length), buffer, length);
|
|
memcpy(__skb_put(skb, length), buffer, length);
|
|
skb_queue_tail(&mac->rx_queue, skb);
|
|
skb_queue_tail(&mac->rx_queue, skb);
|
|
tasklet_schedule(&mac->rx_tasklet);
|
|
tasklet_schedule(&mac->rx_tasklet);
|