All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shaddy Baddah <shaddy_baddah@hotmail.com>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "John W. Linville" <linville@tuxdriver.com>,
	netdev@vger.kernel.org, linux-wireless@vger.kernel.org,
	David Miller <davem@davemloft.net>,
	dsd@gentoo.org, kune@deine-taler.de
Subject: Re: ZD1211RW unaligned accesses...
Date: Fri, 30 Nov 2007 18:34:56 +1100	[thread overview]
Message-ID: <474FBD20.10202@hotmail.com> (raw)
In-Reply-To: <20071129234327.GA23769@gondor.apana.org.au>

Hi again,

Herbert Xu wrote:
> On Thu, Nov 29, 2007 at 04:45:33PM -0500, John W. Linville wrote:
>> So, did the patch below fix the problem?  Should I apply it?
> 
> I'm keen to find out the result too :)
> 
> Chances are it does make progress however we may still have the
> general wireless/IP stack alignment issue that we are still discussing.


OK... so I've applied patches left right and centre. As there have been 
a few, I'll in-line them all at the bottom of this email.

The result is that there are no more unaligned access messages at all. 
However, I still can only scan one (occasionally two) AP, using iwlist 
eth2 scanning command before a bus error. Jean, I missed your emails 
regarding compiling the wireless-tools, I will try these and see if they 
help.

Perhaps related to the scanning problems, I cannot setup any wireless 
links, with Open access points, WEP access points, anything at all. I am 
losing direction on what information to supply here-in, but am willing 
to take suggestions.

Thanks for all your help,
Shaddy

Patches applied follow:

diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c 
b/drivers/net/wireless/zd1211rw/zd_mac.c
index a903645..d06b05b 100644
--- a/drivers/net/wireless/zd1211rw/zd_mac.c
+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -1166,15 +1166,16 @@ static void do_rx(unsigned long mac_ptr)
  int zd_mac_rx_irq(struct zd_mac *mac, const u8 *buffer, unsigned int 
length)
  {
  	struct sk_buff *skb;
+	unsigned int hlen = ALIGN(sizeof(struct zd_rt_hdr), 16);

-	skb = dev_alloc_skb(sizeof(struct zd_rt_hdr) + length);
+	skb = dev_alloc_skb(hlen + length);
  	if (!skb) {
  		struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac);
  		dev_warn(zd_mac_dev(mac), "Could not allocate skb.\n");
  		ieee->stats.rx_dropped++;
  		return -ENOMEM;
  	}
-	skb_reserve(skb, sizeof(struct zd_rt_hdr));
+	skb_reserve(skb, hlen - ZD_PLCP_HEADER_SIZE);
  	memcpy(__skb_put(skb, length), buffer, length);
  	skb_queue_tail(&mac->rx_queue, skb);
  	tasklet_schedule(&mac->rx_tasklet);

diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c
index a4c3c51..6d06f13 100644
--- a/net/ieee80211/ieee80211_tx.c
+++ b/net/ieee80211/ieee80211_tx.c
@@ -144,7 +144,8 @@ static int ieee80211_copy_snap(u8 * data, u16 h_proto)
  	snap->oui[1] = oui[1];
  	snap->oui[2] = oui[2];

-	*(u16 *) (data + SNAP_SIZE) = htons(h_proto);
+	h_proto = htons(h_proto);
+	memcpy(data + SNAP_SIZE, &h_proto, sizeof(u16));

  	return SNAP_SIZE + sizeof(u16);
  }

Index: linux-2.6.24-rc3-git1/drivers/net/wireless/zd1211rw/zd_mac.c
===================================================================
--- linux-2.6.24-rc3-git1.orig/drivers/net/wireless/zd1211rw/zd_mac.c
+++ linux-2.6.24-rc3-git1/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -974,14 +974,14 @@ static int is_data_packet_for_us(struct
  	switch (ieee->iw_mode) {
  	case IW_MODE_ADHOC:
  		if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) != 0 ||
-		    compare_ether_addr(hdr->addr3, ieee->bssid) != 0)
+		    memcmp(hdr->addr3, ieee->bssid, ETH_ALEN) != 0)
  			return 0;
  		break;
  	case IW_MODE_AUTO:
  	case IW_MODE_INFRA:
  		if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) !=
  		    IEEE80211_FCTL_FROMDS ||
-		    compare_ether_addr(hdr->addr2, ieee->bssid) != 0)
+		    memcmp(hdr->addr2, ieee->bssid, ETH_ALEN) != 0)
  			return 0;
  		break;
  	default:
@@ -989,9 +989,9 @@ static int is_data_packet_for_us(struct
  		return 0;
  	}

-	return compare_ether_addr(hdr->addr1, netdev->dev_addr) == 0 ||
+	return memcmp(hdr->addr1, netdev->dev_addr, ETH_ALEN) == 0 ||
  	       (is_multicast_ether_addr(hdr->addr1) &&
-		compare_ether_addr(hdr->addr3, netdev->dev_addr) != 0) ||
+		memcmp(hdr->addr3, netdev->dev_addr, ETH_ALEN) != 0) ||
  	       (netdev->flags & IFF_PROMISC);
  }

@@ -1047,7 +1047,7 @@ static void update_qual_rssi(struct zd_m
  	hdr = (struct ieee80211_hdr_3addr *)buffer;
  	if (length < offsetof(struct ieee80211_hdr_3addr, addr3))
  		return;
-	if (compare_ether_addr(hdr->addr2, zd_mac_to_ieee80211(mac)->bssid) != 0)
+	if (memcmp(hdr->addr2, zd_mac_to_ieee80211(mac)->bssid, ETH_ALEN) != 0)
  		return;

  	spin_lock_irqsave(&mac->lock, flags);


--- everything.orig/drivers/net/wireless/zd1211rw/Makefile	2007-11-23 
11:36:30.652094075 +0100
+++ everything/drivers/net/wireless/zd1211rw/Makefile	2007-11-23 
11:36:57.112090711 +0100
@@ -1,5 +1,7 @@
  obj-$(CONFIG_ZD1211RW) += zd1211rw.o

+EXTRA_CFLAGS += -fno-inline-functions-called-once
+
  zd1211rw-objs := zd_chip.o zd_ieee80211.o \
  		zd_mac.o zd_netdev.o \
  		zd_rf_al2230.o zd_rf_rf2959.o \


I believe that's it.




WARNING: multiple messages have this Message-ID (diff)
From: Shaddy Baddah <shaddy_baddah-PkbjNfxxIARBDgjK7y7TUQ@public.gmane.org>
To: Herbert Xu <herbert-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
Cc: "John W. Linville"
	<linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>,
	netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	David Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>,
	dsd-aBrp7R+bbdUdnm+yROfE0A@public.gmane.org,
	kune-hUSrv6EASfkEnNRfnnE9gw@public.gmane.org
Subject: Re: ZD1211RW unaligned accesses...
Date: Fri, 30 Nov 2007 18:34:56 +1100	[thread overview]
Message-ID: <474FBD20.10202@hotmail.com> (raw)
In-Reply-To: <20071129234327.GA23769-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>

Hi again,

Herbert Xu wrote:
> On Thu, Nov 29, 2007 at 04:45:33PM -0500, John W. Linville wrote:
>> So, did the patch below fix the problem?  Should I apply it?
> 
> I'm keen to find out the result too :)
> 
> Chances are it does make progress however we may still have the
> general wireless/IP stack alignment issue that we are still discussing.


OK... so I've applied patches left right and centre. As there have been 
a few, I'll in-line them all at the bottom of this email.

The result is that there are no more unaligned access messages at all. 
However, I still can only scan one (occasionally two) AP, using iwlist 
eth2 scanning command before a bus error. Jean, I missed your emails 
regarding compiling the wireless-tools, I will try these and see if they 
help.

Perhaps related to the scanning problems, I cannot setup any wireless 
links, with Open access points, WEP access points, anything at all. I am 
losing direction on what information to supply here-in, but am willing 
to take suggestions.

Thanks for all your help,
Shaddy

Patches applied follow:

diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c 
b/drivers/net/wireless/zd1211rw/zd_mac.c
index a903645..d06b05b 100644
--- a/drivers/net/wireless/zd1211rw/zd_mac.c
+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -1166,15 +1166,16 @@ static void do_rx(unsigned long mac_ptr)
  int zd_mac_rx_irq(struct zd_mac *mac, const u8 *buffer, unsigned int 
length)
  {
  	struct sk_buff *skb;
+	unsigned int hlen = ALIGN(sizeof(struct zd_rt_hdr), 16);

-	skb = dev_alloc_skb(sizeof(struct zd_rt_hdr) + length);
+	skb = dev_alloc_skb(hlen + length);
  	if (!skb) {
  		struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac);
  		dev_warn(zd_mac_dev(mac), "Could not allocate skb.\n");
  		ieee->stats.rx_dropped++;
  		return -ENOMEM;
  	}
-	skb_reserve(skb, sizeof(struct zd_rt_hdr));
+	skb_reserve(skb, hlen - ZD_PLCP_HEADER_SIZE);
  	memcpy(__skb_put(skb, length), buffer, length);
  	skb_queue_tail(&mac->rx_queue, skb);
  	tasklet_schedule(&mac->rx_tasklet);

diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c
index a4c3c51..6d06f13 100644
--- a/net/ieee80211/ieee80211_tx.c
+++ b/net/ieee80211/ieee80211_tx.c
@@ -144,7 +144,8 @@ static int ieee80211_copy_snap(u8 * data, u16 h_proto)
  	snap->oui[1] = oui[1];
  	snap->oui[2] = oui[2];

-	*(u16 *) (data + SNAP_SIZE) = htons(h_proto);
+	h_proto = htons(h_proto);
+	memcpy(data + SNAP_SIZE, &h_proto, sizeof(u16));

  	return SNAP_SIZE + sizeof(u16);
  }

Index: linux-2.6.24-rc3-git1/drivers/net/wireless/zd1211rw/zd_mac.c
===================================================================
--- linux-2.6.24-rc3-git1.orig/drivers/net/wireless/zd1211rw/zd_mac.c
+++ linux-2.6.24-rc3-git1/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -974,14 +974,14 @@ static int is_data_packet_for_us(struct
  	switch (ieee->iw_mode) {
  	case IW_MODE_ADHOC:
  		if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) != 0 ||
-		    compare_ether_addr(hdr->addr3, ieee->bssid) != 0)
+		    memcmp(hdr->addr3, ieee->bssid, ETH_ALEN) != 0)
  			return 0;
  		break;
  	case IW_MODE_AUTO:
  	case IW_MODE_INFRA:
  		if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) !=
  		    IEEE80211_FCTL_FROMDS ||
-		    compare_ether_addr(hdr->addr2, ieee->bssid) != 0)
+		    memcmp(hdr->addr2, ieee->bssid, ETH_ALEN) != 0)
  			return 0;
  		break;
  	default:
@@ -989,9 +989,9 @@ static int is_data_packet_for_us(struct
  		return 0;
  	}

-	return compare_ether_addr(hdr->addr1, netdev->dev_addr) == 0 ||
+	return memcmp(hdr->addr1, netdev->dev_addr, ETH_ALEN) == 0 ||
  	       (is_multicast_ether_addr(hdr->addr1) &&
-		compare_ether_addr(hdr->addr3, netdev->dev_addr) != 0) ||
+		memcmp(hdr->addr3, netdev->dev_addr, ETH_ALEN) != 0) ||
  	       (netdev->flags & IFF_PROMISC);
  }

@@ -1047,7 +1047,7 @@ static void update_qual_rssi(struct zd_m
  	hdr = (struct ieee80211_hdr_3addr *)buffer;
  	if (length < offsetof(struct ieee80211_hdr_3addr, addr3))
  		return;
-	if (compare_ether_addr(hdr->addr2, zd_mac_to_ieee80211(mac)->bssid) != 0)
+	if (memcmp(hdr->addr2, zd_mac_to_ieee80211(mac)->bssid, ETH_ALEN) != 0)
  		return;

  	spin_lock_irqsave(&mac->lock, flags);


--- everything.orig/drivers/net/wireless/zd1211rw/Makefile	2007-11-23 
11:36:30.652094075 +0100
+++ everything/drivers/net/wireless/zd1211rw/Makefile	2007-11-23 
11:36:57.112090711 +0100
@@ -1,5 +1,7 @@
  obj-$(CONFIG_ZD1211RW) += zd1211rw.o

+EXTRA_CFLAGS += -fno-inline-functions-called-once
+
  zd1211rw-objs := zd_chip.o zd_ieee80211.o \
  		zd_mac.o zd_netdev.o \
  		zd_rf_al2230.o zd_rf_rf2959.o \


I believe that's it.

  reply	other threads:[~2007-11-30  7:36 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-20 12:05 ZD1211RW unaligned accesses David Miller
2007-11-21 13:00 ` Shaddy Baddah
2007-11-21 13:00   ` Shaddy Baddah
2007-11-24 15:02   ` Herbert Xu
2007-11-24 15:02     ` Herbert Xu
2007-11-24 16:52     ` Ulrich Kunitz
2007-11-24 16:52       ` Ulrich Kunitz
2007-11-29 21:45     ` John W. Linville
2007-11-29 23:43       ` Herbert Xu
2007-11-29 23:43         ` Herbert Xu
2007-11-30  7:34         ` Shaddy Baddah [this message]
2007-11-30  7:34           ` Shaddy Baddah
2007-11-30  9:50           ` Herbert Xu
2007-11-30 11:33         ` Johannes Berg
2007-11-30 11:33           ` Johannes Berg
2007-12-01 10:33       ` Ulrich Kunitz
2007-12-01 10:33         ` Ulrich Kunitz
2007-11-23 10:41 ` Johannes Berg
2007-11-23 10:41   ` Johannes Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=474FBD20.10202@hotmail.com \
    --to=shaddy_baddah@hotmail.com \
    --cc=davem@davemloft.net \
    --cc=dsd@gentoo.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=kune@deine-taler.de \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.