From patchwork Thu Nov 26 15:09:04 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kalle Valo X-Patchwork-Id: 63184 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id nAQF9KU5018392 for ; Thu, 26 Nov 2009 15:09:20 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760645AbZKZPJM (ORCPT ); Thu, 26 Nov 2009 10:09:12 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1760643AbZKZPJM (ORCPT ); Thu, 26 Nov 2009 10:09:12 -0500 Received: from smtp.nokia.com ([192.100.105.134]:27748 "EHLO mgw-mx09.nokia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760641AbZKZPJK (ORCPT ); Thu, 26 Nov 2009 10:09:10 -0500 Received: from vaebh105.NOE.Nokia.com (vaebh105.europe.nokia.com [10.160.244.31]) by mgw-mx09.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id nAQF8rK1026965; Thu, 26 Nov 2009 09:09:13 -0600 Received: from esebh102.NOE.Nokia.com ([172.21.138.183]) by vaebh105.NOE.Nokia.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 26 Nov 2009 17:09:07 +0200 Received: from mgw-sa01.ext.nokia.com ([147.243.1.47]) by esebh102.NOE.Nokia.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Thu, 26 Nov 2009 17:09:07 +0200 Received: from [127.0.1.1] (essapo-nirac252122.europe.nokia.com [10.162.252.122]) by mgw-sa01.ext.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id nAQF95Pe013246; Thu, 26 Nov 2009 17:09:05 +0200 Subject: [PATCH 06/12] wl1251: fix payload alignment To: linville@tuxdriver.com From: Kalle Valo Cc: linux-wireless@vger.kernel.org Date: Thu, 26 Nov 2009 17:09:04 +0200 Message-ID: <20091126150904.917.8182.stgit@tikku> In-Reply-To: <20091126150141.917.35278.stgit@tikku> References: <20091126150141.917.35278.stgit@tikku> User-Agent: StGit/0.15 MIME-Version: 1.0 X-OriginalArrivalTime: 26 Nov 2009 15:09:07.0107 (UTC) FILETIME=[662AFF30:01CA6EAA] X-Nokia-AV: Clean Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org diff --git a/drivers/net/wireless/wl12xx/wl1251_rx.c b/drivers/net/wireless/wl12xx/wl1251_rx.c index f84cc89..04f3dcd 100644 --- a/drivers/net/wireless/wl12xx/wl1251_rx.c +++ b/drivers/net/wireless/wl12xx/wl1251_rx.c @@ -22,6 +22,7 @@ * */ +#include #include #include @@ -32,6 +33,9 @@ #include "wl1251_cmd.h" #include "wl1251_acx.h" +/* needs to be divisible by four because of DMA */ +#define WL1251_RX_ALIGNMENT 4 + static void wl1251_rx_header(struct wl1251 *wl, struct wl1251_rx_descriptor *desc) { @@ -106,6 +110,7 @@ static void wl1251_rx_body(struct wl1251 *wl, struct sk_buff *skb; struct ieee80211_rx_status status; u8 *rx_buffer, beacon = 0; + unsigned char *from, *to; u16 length, *fc; u32 curr_id, last_id_inc, rx_packet_ring_addr; @@ -126,12 +131,15 @@ static void wl1251_rx_body(struct wl1251 *wl, if (wl->rx_current_buffer) rx_packet_ring_addr += wl->data_path->rx_packet_ring_chunk_size; - skb = dev_alloc_skb(length); + skb = dev_alloc_skb(length + WL1251_RX_ALIGNMENT); if (!skb) { wl1251_error("Couldn't allocate RX frame"); return; } + /* for the case if payload is unaligned */ + skb_reserve(skb, WL1251_RX_ALIGNMENT); + rx_buffer = skb_put(skb, length); wl1251_mem_read(wl, rx_packet_ring_addr, rx_buffer, length); @@ -140,6 +148,13 @@ static void wl1251_rx_body(struct wl1251 *wl, fc = (u16 *)skb->data; + if (ieee80211_hdrlen(*fc) & 0x3) { + from = skb->data; + to = skb_push(skb, 2); + memmove(to, from, skb->len); + fc = (u16 *) skb->data; + } + if ((*fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON) beacon = 1;