Return-path: Received: from Chamillionaire.breakpoint.cc ([85.10.199.196]:49213 "EHLO Chamillionaire.breakpoint.cc" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752153AbYJYLVt (ORCPT ); Sat, 25 Oct 2008 07:21:49 -0400 Date: Sat, 25 Oct 2008 13:21:47 +0200 From: Sebastian Andrzej Siewior To: linux-wireless@vger.kernel.org, Shaddy Baddah Subject: Re: zd1211rw (2.6.26 sparc64): unaligned access (zd_mac_rx) Message-ID: <20081025112147.GA12252@Chamillionaire.breakpoint.cc> (sfid-20081025_132155_219418_F2F1F56B) References: <4902DEBB.3050205@hotmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 In-Reply-To: <4902DEBB.3050205@hotmail.com> Sender: linux-wireless-owner@vger.kernel.org List-ID: * Shaddy Baddah | 2008-10-25 19:54:19 [+1100]: > [ 282.300681] Kernel unaligned access at TPC[10129b68] > zd_mac_rx+0x144/0x32c [zd1211rw] > > periodically is reported even after the ifconfig command completes > (seemingly successfully). > > Thanks in advance for your assistance, Could you try this patch: >From a46436536ab13926ff3f592cfa3c333e06a99a0a Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Sat, 25 Oct 2008 13:15:14 +0200 Subject: [PATCH] wireless/zd1211rw: use get_unaligned_le16 helper Signed-off-by: Sebastian Andrzej Siewior --- drivers/net/wireless/zd1211rw/zd_mac.c | 5 +++-- drivers/net/wireless/zd1211rw/zd_usb.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 4d7b98b..bf4b4a4 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "zd_def.h" #include "zd_chip.h" @@ -662,7 +663,7 @@ int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length) && !mac->pass_ctrl) return 0; - fc = *(__le16 *)buffer; + fc = get_unaligned_le32(buffer); need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc); skb = dev_alloc_skb(length + (need_padding ? 2 : 0)); @@ -758,7 +759,7 @@ void zd_process_intr(struct work_struct *work) u16 int_status; struct zd_mac *mac = container_of(work, struct zd_mac, process_intr); - int_status = le16_to_cpu(*(__le16 *)(mac->intr_buffer+4)); + int_status = get_unaligned_le16(mac->intr_buffer+4); if (int_status & INT_CFG_NEXT_BCN) { if (net_ratelimit()) dev_dbg_f(zd_mac_dev(mac), "INT_CFG_NEXT_BCN\n"); diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index a60ae86..0b27778 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c @@ -355,7 +355,7 @@ static inline void handle_regs_int(struct urb *urb) ZD_ASSERT(in_interrupt()); spin_lock(&intr->lock); - int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2)); + int_num = get_unaligned_le16(urb->transfer_buffer+2); if (int_num == CR_INTERRUPT) { struct zd_mac *mac = zd_hw_mac(zd_usb_to_hw(urb->context)); memcpy(&mac->intr_buffer, urb->transfer_buffer, -- 1.6.0.2