rpms/kernel/devel kernel.spec, 1.456, 1.457 linux-2.6-at76.patch, 1.8, 1.9 linux-2.6-wireless.patch, 1.24, 1.25

John W. Linville (linville) fedora-extras-commits at redhat.com
Thu Feb 28 02:07:16 UTC 2008


Author: linville

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv20884

Modified Files:
	kernel.spec linux-2.6-at76.patch linux-2.6-wireless.patch 
Log Message:
recent wireless updates (at76 updates, fixes for 2.6.25)


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.456
retrieving revision 1.457
diff -u -r1.456 -r1.457
--- kernel.spec	27 Feb 2008 21:45:14 -0000	1.456
+++ kernel.spec	28 Feb 2008 02:06:24 -0000	1.457
@@ -1097,7 +1097,7 @@
 ApplyPatch linux-2.6-ata-quirk.patch
 
 # wireless patches headed for 2.6.25
-#ApplyPatch linux-2.6-wireless.patch
+ApplyPatch linux-2.6-wireless.patch
 # wireless patches headed for 2.6.26
 ApplyPatch linux-2.6-wireless-pending.patch
 
@@ -1733,6 +1733,25 @@
 %kernel_variant_files -a /%{image_install_path}/xen*-%{KVERREL} -e /etc/ld.so.conf.d/kernelcap-%{KVERREL}.conf %{with_xen} xen
 
 %changelog
+* Wed Feb 27 2008 John W. Linville <linville at redhat.com>
+- Use a separate config option for the b43 pci to ssb bridge.
+- Don't build bcm43xx if SSB is static and b43 PCI-SSB bridge is enabled.
+- Fix b43 driver build for arm
+- rt2x00: Fix antenna diversity
+- rt2x00: Add link tuner safe RX toggle states
+- rt2x00: Don't switch to antenna with low rssi
+- rt2x00: Fix rt2x00lib_reset_link_tuner()
+- rndis_wlan: fix sparse warnings
+- mac80211: fix kmalloc vs. net_ratelimit
+- PS3: gelic: Link the wireless net_device structure to the corresponding device structure
+- libertas: Remove unused exports
+- gelic wireless driver needs WIRELESS_EXT support
+- at76_usb: fix missing newlines in printk, improve some messages
+- at76_usb: remove unneeded code
+- at76_usb: add more MODULE_AUTHOR entries
+- at76_usb: reindent, reorder initializers for readability
+- at76_usb: make the driver depend on MAC80211
+
 * Wed Feb 27 2008 Jarod Wilson <jwilson at redhat.com>
 - firewire-sbp2: fix refcounting bug that prevented module unload
 - firewire-sbp2: fix use-after-free bug

linux-2.6-at76.patch:

Index: linux-2.6-at76.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-at76.patch,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- linux-2.6-at76.patch	21 Feb 2008 19:33:48 -0000	1.8
+++ linux-2.6-at76.patch	28 Feb 2008 02:06:24 -0000	1.9
@@ -1,3 +1,50 @@
+commit e141a848e24724c2d5534ff8152b0be4fe1b6f62
+Author: Pavel Roskin <proski at gnu.org>
+Date:   Fri Feb 22 00:01:07 2008 -0500
+
+    at76_usb: make the driver depend on MAC80211
+    
+    Signed-off-by: Pavel Roskin <proski at gnu.org>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
+commit 4891e7cb744d9e00dfe714c2827abcd32a02e405
+Author: Pavel Roskin <proski at gnu.org>
+Date:   Fri Feb 22 00:01:01 2008 -0500
+
+    at76_usb: reindent, reorder initializers for readability
+    
+    Signed-off-by: Pavel Roskin <proski at gnu.org>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
+commit a5d909eecd7c57843395780d7bc3e9655093bd5e
+Author: Pavel Roskin <proski at gnu.org>
+Date:   Fri Feb 22 00:00:55 2008 -0500
+
+    at76_usb: add more MODULE_AUTHOR entries
+    
+    Signed-off-by: Pavel Roskin <proski at gnu.org>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
+commit e5d8694e15d0f20a5a3999ca6697278df9a66ca7
+Author: Pavel Roskin <proski at gnu.org>
+Date:   Fri Feb 22 00:00:50 2008 -0500
+
+    at76_usb: remove unneeded code
+    
+    Signed-off-by: Pavel Roskin <proski at gnu.org>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
+commit 781e1500cd246b9aeaa0fc7593f028d43c87dbc0
+Author: Pavel Roskin <proski at gnu.org>
+Date:   Fri Feb 22 00:00:44 2008 -0500
+
+    at76_usb: fix missing newlines in printk, improve some messages
+    
+    It's important to know which function failed.
+    
+    Signed-off-by: Pavel Roskin <proski at gnu.org>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
 commit 4083ec919a7353cf7a9de6cf42aa13669b7e018e
 Author: Kalle Valo <kalle.valo at iki.fi>
 Date:   Sun Feb 10 17:01:19 2008 +0200
@@ -846,8 +893,8 @@
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
 diff -up linux-2.6.24.noarch/MAINTAINERS.orig linux-2.6.24.noarch/MAINTAINERS
---- linux-2.6.24.noarch/MAINTAINERS.orig	2008-02-21 14:15:54.000000000 -0500
-+++ linux-2.6.24.noarch/MAINTAINERS	2008-02-21 14:16:00.000000000 -0500
+--- linux-2.6.24.noarch/MAINTAINERS.orig	2008-02-27 20:56:07.000000000 -0500
++++ linux-2.6.24.noarch/MAINTAINERS	2008-02-27 20:56:14.000000000 -0500
 @@ -725,6 +725,15 @@ W:	http://www.thekelleys.org.uk/atmel
  W:	http://atmelwlandriver.sourceforge.net/
  S:	Maintained
@@ -865,9 +912,9 @@
  P:	David Woodhouse
  M:	dwmw2 at infradead.org
 diff -up /dev/null linux-2.6.24.noarch/drivers/net/wireless/at76_usb.h
---- /dev/null	2008-02-21 08:21:48.545426467 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/at76_usb.h	2008-02-21 14:19:39.000000000 -0500
-@@ -0,0 +1,477 @@
+--- /dev/null	2008-02-27 08:31:30.805858387 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/at76_usb.h	2008-02-27 20:56:23.000000000 -0500
+@@ -0,0 +1,464 @@
 +/*
 + * Copyright (c) 2002,2003 Oliver Kurth
 + *	     (c) 2003,2004 Joerg Albert <joerg.albert at gmx.de>
@@ -1225,17 +1272,6 @@
 +	u32 channel_map;	/* if bit N is set, channel (N+1) is allowed */
 +};
 +
-+/* a rx data buffer to collect rx fragments */
-+struct rx_data_buf {
-+	u8 sender[ETH_ALEN];	/* sender address */
-+	u16 seqnr;		/* sequence number */
-+	u16 fragnr;		/* last fragment received */
-+	unsigned long last_rx;	/* jiffies of last rx */
-+	struct sk_buff *skb;	/* == NULL if entry is free */
-+};
-+
-+#define NR_RX_DATA_BUF		8
-+
 +/* Data for one loaded firmware file */
 +struct fwentry {
 +	const char *const fwname;
@@ -1342,12 +1378,10 @@
 +/* the max padding size for tx in bytes (see calc_padding) */
 +#define MAX_PADDING_SIZE	53
 +
-+#define MIN_FRAG_THRESHOLD 256
-+
 +#endif				/* _AT76_USB_H */
 diff -up linux-2.6.24.noarch/drivers/net/wireless/Makefile.orig linux-2.6.24.noarch/drivers/net/wireless/Makefile
---- linux-2.6.24.noarch/drivers/net/wireless/Makefile.orig	2008-02-21 14:15:54.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/Makefile	2008-02-21 14:16:00.000000000 -0500
+--- linux-2.6.24.noarch/drivers/net/wireless/Makefile.orig	2008-02-27 20:56:07.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/Makefile	2008-02-27 20:56:14.000000000 -0500
 @@ -32,6 +32,8 @@ obj-$(CONFIG_ATMEL)             += atmel
  obj-$(CONFIG_PCI_ATMEL)         += atmel_pci.o 
  obj-$(CONFIG_PCMCIA_ATMEL)      += atmel_cs.o
@@ -1358,9 +1392,9 @@
  
  obj-$(CONFIG_HOSTAP)		+= hostap/
 diff -up /dev/null linux-2.6.24.noarch/drivers/net/wireless/at76_usb.c
---- /dev/null	2008-02-21 08:21:48.545426467 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/at76_usb.c	2008-02-21 14:19:39.000000000 -0500
-@@ -0,0 +1,2549 @@
+--- /dev/null	2008-02-27 08:31:30.805858387 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/at76_usb.c	2008-02-27 20:56:23.000000000 -0500
+@@ -0,0 +1,2518 @@
 +/*
 + * at76c503/at76c505 USB driver
 + *
@@ -1473,15 +1507,15 @@
 +static struct mutex fw_mutex;
 +
 +static struct fwentry firmwares[] = {
-+	[0] = {""},
-+	[BOARD_503_ISL3861] = {"atmel_at76c503-i3861.bin"},
-+	[BOARD_503_ISL3863] = {"atmel_at76c503-i3863.bin"},
-+	[BOARD_503] = {"atmel_at76c503-rfmd.bin"},
-+	[BOARD_503_ACC] = {"atmel_at76c503-rfmd-acc.bin"},
-+	[BOARD_505] = {"atmel_at76c505-rfmd.bin"},
-+	[BOARD_505_2958] = {"atmel_at76c505-rfmd2958.bin"},
-+	[BOARD_505A] = {"atmel_at76c505a-rfmd2958.bin"},
-+	[BOARD_505AMX] = {"atmel_at76c505amx-rfmd.bin"},
++	[0] = { "" },
++	[BOARD_503_ISL3861] = { "atmel_at76c503-i3861.bin" },
++	[BOARD_503_ISL3863] = { "atmel_at76c503-i3863.bin" },
++	[BOARD_503] = { "atmel_at76c503-rfmd.bin" },
++	[BOARD_503_ACC] = { "atmel_at76c503-rfmd-acc.bin" },
++	[BOARD_505] = { "atmel_at76c505-rfmd.bin" },
++	[BOARD_505_2958] = { "atmel_at76c505-rfmd2958.bin" },
++	[BOARD_505A] = { "atmel_at76c505a-rfmd2958.bin" },
++	[BOARD_505AMX] = { "atmel_at76c505amx-rfmd.bin" },
 +};
 +
 +#define USB_DEVICE_DATA(__ops)	.driver_info = (kernel_ulong_t)(__ops)
@@ -1491,133 +1525,133 @@
 +	 * at76c503-i3861
 +	 */
 +	/* Generic AT76C503/3861 device */
-+	{USB_DEVICE(0x03eb, 0x7603), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x03eb, 0x7603), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Linksys WUSB11 v2.1/v2.6 */
-+	{USB_DEVICE(0x066b, 0x2211), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x066b, 0x2211), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Netgear MA101 rev. A */
-+	{USB_DEVICE(0x0864, 0x4100), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x0864, 0x4100), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Tekram U300C / Allnet ALL0193 */
-+	{USB_DEVICE(0x0b3b, 0x1612), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x0b3b, 0x1612), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* HP HN210W J7801A */
-+	{USB_DEVICE(0x03f0, 0x011c), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x03f0, 0x011c), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Sitecom/Z-Com/Zyxel M4Y-750 */
-+	{USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Dynalink/Askey WLL013 (intersil) */
-+	{USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* EZ connect 11Mpbs Wireless USB Adapter SMC2662W v1 */
-+	{USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* BenQ AWL300 */
-+	{USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Addtron AWU-120, Compex WLU11 */
-+	{USB_DEVICE(0x05dd, 0xff31), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x05dd, 0xff31), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Intel AP310 AnyPoint II USB */
-+	{USB_DEVICE(0x8086, 0x0200), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x8086, 0x0200), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Dynalink L11U */
-+	{USB_DEVICE(0x0d8e, 0x7100), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x0d8e, 0x7100), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* Arescom WL-210, FCC id 07J-GL2411USB */
-+	{USB_DEVICE(0x0d8e, 0x7110), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x0d8e, 0x7110), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* I-O DATA WN-B11/USB */
-+	{USB_DEVICE(0x04bb, 0x0919), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x04bb, 0x0919), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/* BT Voyager 1010 */
-+	{USB_DEVICE(0x069a, 0x0821), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	{ USB_DEVICE(0x069a, 0x0821), USB_DEVICE_DATA(BOARD_503_ISL3861) },
 +	/*
 +	 * at76c503-i3863
 +	 */
 +	/* Generic AT76C503/3863 device */
-+	{USB_DEVICE(0x03eb, 0x7604), USB_DEVICE_DATA(BOARD_503_ISL3863)},
++	{ USB_DEVICE(0x03eb, 0x7604), USB_DEVICE_DATA(BOARD_503_ISL3863) },
 +	/* Samsung SWL-2100U */
-+	{USB_DEVICE(0x055d, 0xa000), USB_DEVICE_DATA(BOARD_503_ISL3863)},
++	{ USB_DEVICE(0x055d, 0xa000), USB_DEVICE_DATA(BOARD_503_ISL3863) },
 +	/*
 +	 * at76c503-rfmd
 +	 */
 +	/* Generic AT76C503/RFMD device */
-+	{USB_DEVICE(0x03eb, 0x7605), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x03eb, 0x7605), USB_DEVICE_DATA(BOARD_503) },
 +	/* Dynalink/Askey WLL013 (rfmd) */
-+	{USB_DEVICE(0x069a, 0x0321), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x069a, 0x0321), USB_DEVICE_DATA(BOARD_503) },
 +	/* Linksys WUSB11 v2.6 */
-+	{USB_DEVICE(0x077b, 0x2219), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x077b, 0x2219), USB_DEVICE_DATA(BOARD_503) },
 +	/* Network Everywhere NWU11B */
-+	{USB_DEVICE(0x077b, 0x2227), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x077b, 0x2227), USB_DEVICE_DATA(BOARD_503) },
 +	/* Netgear MA101 rev. B */
-+	{USB_DEVICE(0x0864, 0x4102), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x0864, 0x4102), USB_DEVICE_DATA(BOARD_503) },
 +	/* D-Link DWL-120 rev. E */
-+	{USB_DEVICE(0x2001, 0x3200), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x2001, 0x3200), USB_DEVICE_DATA(BOARD_503) },
 +	/* Actiontec 802UAT1, HWU01150-01UK */
-+	{USB_DEVICE(0x1668, 0x7605), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x1668, 0x7605), USB_DEVICE_DATA(BOARD_503) },
 +	/* AirVast W-Buddie WN210 */
-+	{USB_DEVICE(0x03eb, 0x4102), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x03eb, 0x4102), USB_DEVICE_DATA(BOARD_503) },
 +	/* Dick Smith Electronics XH1153 802.11b USB adapter */
-+	{USB_DEVICE(0x1371, 0x5743), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x1371, 0x5743), USB_DEVICE_DATA(BOARD_503) },
 +	/* CNet CNUSB611 */
-+	{USB_DEVICE(0x1371, 0x0001), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x1371, 0x0001), USB_DEVICE_DATA(BOARD_503) },
 +	/* FiberLine FL-WL200U */
-+	{USB_DEVICE(0x1371, 0x0002), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x1371, 0x0002), USB_DEVICE_DATA(BOARD_503) },
 +	/* BenQ AWL400 USB stick */
-+	{USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503) },
 +	/* 3Com 3CRSHEW696 */
-+	{USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503) },
 +	/* Siemens Santis ADSL WLAN USB adapter WLL 013 */
-+	{USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503) },
 +	/* Belkin F5D6050, version 2 */
-+	{USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503) },
 +	/* iBlitzz, BWU613 (not *B or *SB) */
-+	{USB_DEVICE(0x07b8, 0xb000), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x07b8, 0xb000), USB_DEVICE_DATA(BOARD_503) },
 +	/* Gigabyte GN-WLBM101 */
-+	{USB_DEVICE(0x1044, 0x8003), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x1044, 0x8003), USB_DEVICE_DATA(BOARD_503) },
 +	/* Planex GW-US11S */
-+	{USB_DEVICE(0x2019, 0x3220), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x2019, 0x3220), USB_DEVICE_DATA(BOARD_503) },
 +	/* Internal WLAN adapter in h5[4,5]xx series iPAQs */
-+	{USB_DEVICE(0x049f, 0x0032), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x049f, 0x0032), USB_DEVICE_DATA(BOARD_503) },
 +	/* Corega Wireless LAN USB-11 mini */
-+	{USB_DEVICE(0x07aa, 0x0011), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x07aa, 0x0011), USB_DEVICE_DATA(BOARD_503) },
 +	/* Corega Wireless LAN USB-11 mini2 */
-+	{USB_DEVICE(0x07aa, 0x0018), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x07aa, 0x0018), USB_DEVICE_DATA(BOARD_503) },
 +	/* Uniden PCW100 */
-+	{USB_DEVICE(0x05dd, 0xff35), USB_DEVICE_DATA(BOARD_503)},
++	{ USB_DEVICE(0x05dd, 0xff35), USB_DEVICE_DATA(BOARD_503) },
 +	/*
 +	 * at76c503-rfmd-acc
 +	 */
 +	/* SMC2664W */
-+	{USB_DEVICE(0x083a, 0x3501), USB_DEVICE_DATA(BOARD_503_ACC)},
++	{ USB_DEVICE(0x083a, 0x3501), USB_DEVICE_DATA(BOARD_503_ACC) },
 +	/* Belkin F5D6050, SMC2662W v2, SMC2662W-AR */
-+	{USB_DEVICE(0x0d5c, 0xa002), USB_DEVICE_DATA(BOARD_503_ACC)},
++	{ USB_DEVICE(0x0d5c, 0xa002), USB_DEVICE_DATA(BOARD_503_ACC) },
 +	/*
 +	 * at76c505-rfmd
 +	 */
 +	/* Generic AT76C505/RFMD */
-+	{USB_DEVICE(0x03eb, 0x7606), USB_DEVICE_DATA(BOARD_505)},
++	{ USB_DEVICE(0x03eb, 0x7606), USB_DEVICE_DATA(BOARD_505) },
 +	/*
 +	 * at76c505-rfmd2958
 +	 */
 +	/* Generic AT76C505/RFMD, OvisLink WL-1130USB */
-+	{USB_DEVICE(0x03eb, 0x7613), USB_DEVICE_DATA(BOARD_505_2958)},
++	{ USB_DEVICE(0x03eb, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) },
 +	/* Fiberline FL-WL240U */
-+	{USB_DEVICE(0x1371, 0x0014), USB_DEVICE_DATA(BOARD_505_2958)},
++	{ USB_DEVICE(0x1371, 0x0014), USB_DEVICE_DATA(BOARD_505_2958) },
 +	/* CNet CNUSB-611G */
-+	{USB_DEVICE(0x1371, 0x0013), USB_DEVICE_DATA(BOARD_505_2958)},
++	{ USB_DEVICE(0x1371, 0x0013), USB_DEVICE_DATA(BOARD_505_2958) },
 +	/* Linksys WUSB11 v2.8 */
-+	{USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958)},
++	{ USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958) },
 +	/* Xterasys XN-2122B, IBlitzz BWU613B/BWU613SB */
-+	{USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958)},
++	{ USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958) },
 +	/* Corega WLAN USB Stick 11 */
-+	{USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958)},
++	{ USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) },
 +	/* Microstar MSI Box MS6978 */
-+	{USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958)},
++	{ USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958) },
 +	/*
 +	 * at76c505a-rfmd2958
 +	 */
 +	/* Generic AT76C505A device */
-+	{USB_DEVICE(0x03eb, 0x7614), USB_DEVICE_DATA(BOARD_505A)},
++	{ USB_DEVICE(0x03eb, 0x7614), USB_DEVICE_DATA(BOARD_505A) },
 +	/* Generic AT76C505AS device */
-+	{USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A)},
++	{ USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A) },
 +	/* Siemens Gigaset USB WLAN Adapter 11 */
-+	{USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A)},
++	{ USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A) },
 +	/*
 +	 * at76c505amx-rfmd
 +	 */
 +	/* Generic AT76C505AMX device */
-+	{USB_DEVICE(0x03eb, 0x7615), USB_DEVICE_DATA(BOARD_505AMX)},
-+	{}
++	{ USB_DEVICE(0x03eb, 0x7615), USB_DEVICE_DATA(BOARD_505AMX) },
++	{ }
 +};
 +
 +MODULE_DEVICE_TABLE(usb, dev_table);
@@ -1625,14 +1659,6 @@
 +/* Supported rates of this hardware, bit 7 marks basic rates */
 +static const u8 hw_rates[] = { 0x82, 0x84, 0x0b, 0x16 };
 +
-+/* Frequency of each channel in MHz */
-+static const long channel_frequency[] = {
-+	2412, 2417, 2422, 2427, 2432, 2437, 2442,
-+	2447, 2452, 2457, 2462, 2467, 2472, 2484
-+};
-+
-+#define NUM_CHANNELS ARRAY_SIZE(channel_frequency)
-+
 +static const char *const preambles[] = { "long", "short", "auto" };
 +
 +/* Firmware download */
@@ -2034,15 +2060,15 @@
 +{
 +	int i;
 +	static struct reg_domain const fd_tab[] = {
-+		{0x10, "FCC (USA)", 0x7ff},	/* ch 1-11 */
-+		{0x20, "IC (Canada)", 0x7ff},	/* ch 1-11 */
-+		{0x30, "ETSI (most of Europe)", 0x1fff},	/* ch 1-13 */
-+		{0x31, "Spain", 0x600},	/* ch 10-11 */
-+		{0x32, "France", 0x1e00},	/* ch 10-13 */
-+		{0x40, "MKK (Japan)", 0x2000},	/* ch 14 */
-+		{0x41, "MKK1 (Japan)", 0x3fff},	/* ch 1-14 */
-+		{0x50, "Israel", 0x3fc},	/* ch 3-9 */
-+		{0x00, "<unknown>", 0xffffffff}	/* ch 1-32 */
++		{ 0x10, "FCC (USA)", 0x7ff },	/* ch 1-11 */
++		{ 0x20, "IC (Canada)", 0x7ff },	/* ch 1-11 */
++		{ 0x30, "ETSI (most of Europe)", 0x1fff },	/* ch 1-13 */
++		{ 0x31, "Spain", 0x600 },	/* ch 10-11 */
++		{ 0x32, "France", 0x1e00 },	/* ch 10-13 */
++		{ 0x40, "MKK (Japan)", 0x2000 },	/* ch 14 */
++		{ 0x41, "MKK1 (Japan)", 0x3fff },	/* ch 1-14 */
++		{ 0x50, "Israel", 0x3fc },	/* ch 3-9 */
++		{ 0x00, "<unknown>", 0xffffffff }	/* ch 1-32 */
 +	};
 +
 +	/* Last entry is fallback for unknown domain code */
@@ -2937,7 +2963,7 @@
 +	struct urb *urb = (struct urb *)param;
 +	struct at76_priv *priv = urb->context;
 +	struct at76_rx_buffer *buf;
-+	struct ieee80211_rx_status rx_status = {0};
++	struct ieee80211_rx_status rx_status = { 0 };
 +
 +	if (priv->device_unplugged) {
 +		at76_dbg(DBG_DEVSTART, "device unplugged");
@@ -2968,8 +2994,7 @@
 +	skb_pull(priv->rx_skb, AT76_RX_HDRLEN);
 +	skb_trim(priv->rx_skb, le16_to_cpu(buf->wlength));
 +	at76_dbg_dump(DBG_RX_DATA, priv->rx_skb->data,
-+		      priv->rx_skb->len, "RX: len=%d",
-+		      priv->rx_skb->len);
++		      priv->rx_skb->len, "RX: len=%d", priv->rx_skb->len);
 +
 +	rx_status.ssi = buf->rssi;
 +	rx_status.flag |= RX_FLAG_DECRYPTED;
@@ -3008,7 +3033,7 @@
 +			   fwe->fwname);
 +		dev_printk(KERN_ERR, &udev->dev,
 +			   "you may need to download the firmware from "
-+			   "http://developer.berlios.de/projects/at76c503a/");
++			   "http://developer.berlios.de/projects/at76c503a/\n");
 +		goto exit;
 +	}
 +
@@ -3096,7 +3121,7 @@
 +}
 +
 +static int at76_mac80211_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
-+		  struct ieee80211_tx_control *control)
++			    struct ieee80211_tx_control *control)
 +{
 +	struct at76_priv *priv = hw->priv;
 +	struct at76_tx_buffer *tx_buffer = priv->bulk_out_buffer;
@@ -3200,7 +3225,7 @@
 +}
 +
 +static int at76_add_interface(struct ieee80211_hw *hw,
-+			     struct ieee80211_if_init_conf *conf)
++			      struct ieee80211_if_init_conf *conf)
 +{
 +	struct at76_priv *priv = hw->priv;
 +	int ret = 0;
@@ -3225,7 +3250,7 @@
 +}
 +
 +static void at76_remove_interface(struct ieee80211_hw *hw,
-+				 struct ieee80211_if_init_conf *conf)
++				  struct ieee80211_if_init_conf *conf)
 +{
 +	at76_dbg(DBG_MAC80211, "%s()", __func__);
 +}
@@ -3248,7 +3273,7 @@
 +				    sizeof(struct at76_req_join));
 +
 +	if (ret < 0) {
-+		printk(KERN_ERR "%s: CMD_JOIN failed: %d",
++		printk(KERN_ERR "%s: at76_set_card_command failed: %d\n",
 +		       wiphy_name(priv->hw->wiphy), ret);
 +		return 0;
 +	}
@@ -3256,7 +3281,7 @@
 +	ret = at76_wait_completion(priv, CMD_JOIN);
 +	at76_dbg(DBG_MAC80211, "%s: CMD_JOIN returned: 0x%02x", __func__, ret);
 +	if (ret != CMD_STATUS_COMPLETE) {
-+		printk(KERN_ERR "%s: CMD_JOIN failed: %d",
++		printk(KERN_ERR "%s: at76_wait_completion failed: %d\n",
 +		       wiphy_name(priv->hw->wiphy), ret);
 +		return 0;
 +	}
@@ -3275,8 +3300,7 @@
 +	mutex_lock(&priv->mtx);
 +
 +	ret = at76_get_cmd_status(priv->udev, CMD_SCAN);
-+	at76_dbg(DBG_MAC80211, "%s: CMD_SCAN status 0x%02x",
-+		 __func__, ret);
++	at76_dbg(DBG_MAC80211, "%s: CMD_SCAN status 0x%02x", __func__, ret);
 +
 +	/* FIXME: add maximum time for scan to complete */
 +
@@ -3297,7 +3321,6 @@
 +	mutex_unlock(&priv->mtx);
 +}
 +
-+
 +static int at76_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len)
 +{
 +	struct at76_priv *priv = hw->priv;
@@ -3305,8 +3328,7 @@
 +	int ret;
 +
 +	at76_dbg(DBG_MAC80211, "%s():", __func__);
-+	at76_dbg_dump(DBG_MAC80211, ssid, len,
-+		      "ssid %zd bytes:", len);
++	at76_dbg_dump(DBG_MAC80211, ssid, len, "ssid %zd bytes:", len);
 +
 +	mutex_lock(&priv->mtx);
 +
@@ -3325,8 +3347,7 @@
 +	scan.international_scan = 0;
 +
 +	at76_dbg(DBG_MAC80211, "%s: sending CMD_SCAN", __func__);
-+	ret = at76_set_card_command(priv->udev, CMD_SCAN, &scan,
-+				    sizeof(scan));
++	ret = at76_set_card_command(priv->udev, CMD_SCAN, &scan, sizeof(scan));
 +
 +	if (ret < 0) {
 +		err("CMD_SCAN failed: %d", ret);
@@ -3470,7 +3491,6 @@
 +	return 0;
 +}
 +
-+
 +static const struct ieee80211_ops at76_ops = {
 +	.tx = at76_mac80211_tx,
 +	.add_interface = at76_add_interface,
@@ -3579,45 +3599,27 @@
 +}
 +
 +static struct ieee80211_rate at76_rates[] = {
-+	{ .bitrate = 10,
-+	  .hw_value = TX_RATE_1MBIT, },
-+	{ .bitrate = 20,
-+	  .hw_value = TX_RATE_2MBIT, },
-+	{ .bitrate = 55,
-+	  .hw_value = TX_RATE_5_5MBIT, },
-+	{ .bitrate = 110,
-+	  .hw_value = TX_RATE_11MBIT, },
++	{ .bitrate = 10, .hw_value = TX_RATE_1MBIT, },
++	{ .bitrate = 20, .hw_value = TX_RATE_2MBIT, },
++	{ .bitrate = 55, .hw_value = TX_RATE_5_5MBIT, },
++	{ .bitrate = 110, .hw_value = TX_RATE_11MBIT, },
 +};
 +
 +static struct ieee80211_channel at76_channels[] = {
-+	{ .hw_value = 1,
-+	  .center_freq = 2412},
-+	{ .hw_value = 2,
-+	  .center_freq = 2417},
-+	{ .hw_value = 3,
-+	  .center_freq = 2422},
-+	{ .hw_value = 4,
-+	  .center_freq = 2427},
-+	{ .hw_value = 5,
-+	  .center_freq = 2432},
-+	{ .hw_value = 6,
-+	  .center_freq = 2437},
-+	{ .hw_value = 7,
-+	  .center_freq = 2442},
-+	{ .hw_value = 8,
-+	  .center_freq = 2447},
-+	{ .hw_value = 9,
-+	  .center_freq = 2452},
-+	{ .hw_value = 10,
-+	  .center_freq = 2457},
-+	{ .hw_value = 11,
-+	  .center_freq = 2462},
-+	{ .hw_value = 12,
-+	  .center_freq = 2467},
-+	{ .hw_value = 13,
-+	  .center_freq = 2472},
-+	{ .hw_value = 14,
-+	  .center_freq = 2484}
++	{ .center_freq = 2412, .hw_value = 1 },
++	{ .center_freq = 2417, .hw_value = 2 },
++	{ .center_freq = 2422, .hw_value = 3 },
++	{ .center_freq = 2427, .hw_value = 4 },
++	{ .center_freq = 2432, .hw_value = 5 },
++	{ .center_freq = 2437, .hw_value = 6 },
++	{ .center_freq = 2442, .hw_value = 7 },
++	{ .center_freq = 2447, .hw_value = 8 },
++	{ .center_freq = 2452, .hw_value = 9 },
++	{ .center_freq = 2457, .hw_value = 10 },
++	{ .center_freq = 2462, .hw_value = 11 },
++	{ .center_freq = 2467, .hw_value = 12 },
++	{ .center_freq = 2472, .hw_value = 13 },
++	{ .center_freq = 2484, .hw_value = 14 }
 +};
 +
 +static struct ieee80211_supported_band at76_supported_band = {
@@ -3627,7 +3629,6 @@
 +	.n_bitrates = ARRAY_SIZE(at76_rates),
 +};
 +
-+
 +/* Register network device and initialize the hardware */
 +static int at76_init_new_device(struct at76_priv *priv,
 +				struct usb_interface *interface)
@@ -3908,18 +3909,20 @@
 +MODULE_AUTHOR("Nick Jones");
 +MODULE_AUTHOR("Balint Seeber <n0_5p4m_p13453 at hotmail.com>");
 +MODULE_AUTHOR("Pavel Roskin <proski at gnu.org>");
++MODULE_AUTHOR("Guido Guenther <agx at sigxcpu.org>");
++MODULE_AUTHOR("Kalle Valo <kalle.valo at iki.fi>");
 +MODULE_DESCRIPTION(DRIVER_DESC);
 +MODULE_LICENSE("GPL");
 diff -up linux-2.6.24.noarch/drivers/net/wireless/Kconfig.orig linux-2.6.24.noarch/drivers/net/wireless/Kconfig
---- linux-2.6.24.noarch/drivers/net/wireless/Kconfig.orig	2008-02-21 14:15:54.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/Kconfig	2008-02-21 14:16:00.000000000 -0500
+--- linux-2.6.24.noarch/drivers/net/wireless/Kconfig.orig	2008-02-27 20:56:07.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/Kconfig	2008-02-27 20:56:23.000000000 -0500
 @@ -457,6 +457,14 @@ config PCMCIA_ATMEL
  	  Enable support for PCMCIA cards containing the
  	  Atmel at76c502 and at76c504 chips.
  
 +config USB_ATMEL
 +	tristate "Atmel at76c503/at76c505/at76c505a USB cards"
-+	depends on WLAN_80211 && USB
++	depends on MAC80211 && WLAN_80211 && USB
 +	select FW_LOADER
 +	---help---
 +	  Enable support for USB Wireless devices using Atmel at76c503,

linux-2.6-wireless.patch:

Index: linux-2.6-wireless.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-wireless.patch,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- linux-2.6-wireless.patch	21 Feb 2008 19:33:49 -0000	1.24
+++ linux-2.6-wireless.patch	28 Feb 2008 02:06:24 -0000	1.25
@@ -1,994 +1,706 @@
-commit fc71acc846c577473ada72a46c5ea9c935eca086
-Author: Michael Buesch <mb at bu3sch.de>
-Date:   Sat Feb 16 18:13:36 2008 +0100
+commit c2893054cc823e05c723114378244c8caba084c0
+Author: Alexey Zaytsev <alexey.zaytsev at gmail.com>
+Date:   Sat Feb 23 13:33:07 2008 +0300
 
-    ssb: Fix support for PCI devices behind a SSB->PCI bridge
+    Don't build bcm43xx if SSB is static and b43 PCI-SSB bridge is enabled.
     
-    We must pin all resources and make sure the PCI subsystem
-    won't relocate us, as the addresses are hardwired into hardware.
+    This may happen e.g. when the ssb is statically enables by the b44 driver,
+    and the b43 pci-ssb bridge is enbled by the b43/b43legacy drivers, or the
+    b43/b43legacy drivers are built statically.
     
-    Signed-off-by: Michael Buesch <mb at bu3sch.de>
+    Signed-off-by: Alexey Zaytsev <alexey.zaytsev at gmail.com>
+    Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 5078ed50712aa3df1099540b524d01075aee653f
-Author: Johannes Berg <johannes at sipsolutions.net>
-Date:   Wed Feb 20 12:09:25 2008 +0100
+commit 82928757f3e9451c1ae520f46d327d6110a4eec1
+Author: Alexey Zaytsev <alexey.zaytsev at gmail.com>
+Date:   Sat Feb 23 12:59:26 2008 +0300
 
-    zd1211rw: fix sparse warnings
+    Use a separate config option for the b43 pci to ssb bridge.
     
-    This silences sparse when run on zd1211rw.
+    The bridge code was unnecessary enabled by the b44
+    driver, but it prevents the bcm43xx driver from
+    being loaded, as the bridge claims the same pci ids.
     
-    Signed-off-by: Johannes Berg <johannes at sipsolutions.net>
+    Now we enable the birdge only if the b43{legacy}
+    drivers are selected.
+    
+    Signed-off-by: Alexey Zaytsev <alexey.zaytsev at gmail.com>
+    Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 1955fd0b533d05828bff7ed290213d2a0fc0f04f
-Author: Johannes Berg <johannes at sipsolutions.net>
-Date:   Wed Feb 20 12:05:59 2008 +0100
+commit e668b6729ca1c7f88c7ea1789fb0ed4503c384ce
+Author: Roland Dreier <rdreier at cisco.com>
+Date:   Tue Feb 26 15:26:56 2008 +0100
 
-    rtl818x: fix sparse warnings
+    libertas: Remove unused exports
     
-    This silences a few sparse warnings. There are two more where
-    I can't follow the code.
+    The libertas driver exports a number of symbols with no in-tree users;
+    remove these unused exports.  lbs_reset_device() is completely unused, with
+    no callers at all, so remove the function completely.
     
-    Signed-off-by: Johannes Berg <johannes at sipsolutions.net>
-    Signed-off-by: John W. Linville <linville at tuxdriver.com>
-
-commit 7cb4461520f307a6e3fb2bb32cb8daee45aa1fae
-Author: Michael Buesch <mb at bu3sch.de>
-Date:   Tue Feb 19 17:46:48 2008 +0100
-
-    ssb: Fix pcicore cardbus mode
+    A couple of these unused exported symbols are static, which causes the
+    following build error on ia64 with gcc 4.2.3:
     
-    This fixes the pcicore driver to not die a horrible
-    crash death when inserting a cardbus card.
+        drivers/net/wireless/libertas/main.c:1375: error: __ksymtab_lbs_remove_mesh causes a section type conflict
+        drivers/net/wireless/libertas/main.c:1354: error: __ksymtab_lbs_add_mesh causes a section type conflict
     
-    Signed-off-by: Michael Buesch <mb at bu3sch.de>
+    Signed-off-by: Roland Dreier <rolandd at cisco.com>
+    Acked-by: Holger Schurig <hs4233 at mail.mn-solutions.de>
+    Acked-by: Dan Williams <dcbw at redhat.com>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 53521d8c90d366191b6c134f88a8ebe83de60614
-Author: Michael Buesch <mb at bu3sch.de>
-Date:   Tue Feb 19 16:22:50 2008 +0100
+commit 7e0a589e4de9278215da894ba8e41ba0943e7aca
+Author: Johannes Berg <johannes at sipsolutions.net>
+Date:   Tue Feb 26 00:39:28 2008 +0100
 
-    ssb: Make the GPIO API reentrancy safe
+    mac80211: fix kmalloc vs. net_ratelimit
     
-    This fixes the GPIO API to be reentrancy safe.
+    The "goto end;" part definitely must not be rate limited.
     
-    Signed-off-by: Michael Buesch <mb at bu3sch.de>
+    Signed-off-by: Johannes Berg <johannes at sipsolutions.net>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit c2bcbe65fc88d61f9a806367ff6eab76c9eabb3a
-Author: Michael Buesch <mb at bu3sch.de>
-Date:   Tue Feb 19 14:53:35 2008 +0100
+commit 702ebfa36437c98a60ea21ac2a18b159e6aa16c6
+Author: Ivo van Doorn <ivdoorn at gmail.com>
+Date:   Mon Feb 25 23:15:13 2008 +0100
 
-    ssb: Fix the GPIO API
+    rt2x00: Fix rt2x00lib_reset_link_tuner()
     
-    This fixes the GPIO API to be usable.
+    rt2x00lib_reset_link_tuner() can be called from within
+    the link tuner itself. This means that it should
+    _not_ call rt2x00lib_stop_link_tuner() since that will
+    cause the thread to hang.
     
-    Signed-off-by: Michael Buesch <mb at bu3sch.de>
-    Signed-off-by: John W. Linville <linville at tuxdriver.com>
-
-commit 42bfad4f71637c4eb4791aa8062063c4a8526522
-Author: Michael Buesch <mb at bu3sch.de>
-Date:   Tue Feb 19 12:41:30 2008 +0100
-
-    ssb: Fix watchdog access for devices without a chipcommon
+    Reorder the things that should be done during a
+    link tuner reset and during a link tuner start.
     
-    This fixes the SSB watchdog access for devices without a chipcommon.
-    These devices have the watchdog on the extif.
+    Also make antenna tuning the last step of the link
+    tuner since it could possibly reset some statistical
+    information which we need for average calculation.
     
-    Signed-off-by: Michael Buesch <mb at bu3sch.de>
+    Signed-off-by: Ivo van Doorn <IvDoorn at gmail.com>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 58ff70d4feae29cbb7ace410fa6585ef3afb44b6
-Author: Michael Buesch <mb at bu3sch.de>
-Date:   Mon Feb 18 21:44:39 2008 +0100
+commit 4460423f7cd0e1c5c0cf92e6159f151ba16e518f
+Author: Ivo van Doorn <ivdoorn at gmail.com>
+Date:   Mon Feb 25 23:15:08 2008 +0100
 
-    ssb: Fix serial console on new bcm47xx devices
+    rt2x00: Don't switch to antenna with low rssi
+    
+    When rssi_a > rssi_b is true and the current antenna
+    was already antenna A, then rt2x00 incorrectly jumped
+    to antenna B.
     
-    This fixes the baud settings for new devices
-    like the Linksys WRT350n.
+    Also don't configure the antenna when there has been
+    no change in the antenna setup.
     
-    Signed-off-by: Michael Buesch <mb at bu3sch.de>
+    Signed-off-by: Ivo van Doorn <IvDoorn at gmail.com>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 04f93a87a2db84e7214a4ec56fccd2289e973ce5
-Author: David Miller <davem at davemloft.net>
-Date:   Fri Feb 15 16:08:59 2008 -0800
+commit 50cbbe9cf17c52588a6b709273547c93b7c3d329
+Author: Ivo van Doorn <ivdoorn at gmail.com>
+Date:   Mon Feb 25 23:15:05 2008 +0100
 
-    ath5k: Fix build warnings on some 64-bit platforms.
-    
-    'u64' is not necessarily 'unsigned long long'
+    rt2x00: Add link tuner safe RX toggle states
     
-    drivers/net/wireless/ath5k/base.c: In function 'ath5k_beacon_update_timers':
-    drivers/net/wireless/ath5k/base.c:2130: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
-    drivers/net/wireless/ath5k/base.c:2130: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
-    drivers/net/wireless/ath5k/base.c: In function 'ath5k_intr':
-    drivers/net/wireless/ath5k/base.c:2391: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
+    This adds 2 new states which both are used to toggle
+    the RX. These new states are required for usage
+    inside the link tuner thread, because the normal
+    RX toggling will stop the link tuner thread.
+    While it is possible that the link tuner thread itself
+    is the caller of the RX toggle (when using software
+    antenna diversity).
     
-    Signed-off-by: David S. Miller <davem at davemloft.net>
+    Signed-off-by: Ivo van Doorn <IvDoorn at gmail.com>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit b988763857426020e50a19434c8434a1e08e70eb
-Author: Jiri Slaby <jirislaby at gmail.com>
-Date:   Fri Feb 15 21:58:52 2008 +0100
+commit b268ed34199317e1c627106f1bc60317f2d5c44c
+Author: Ivo van Doorn <ivdoorn at gmail.com>
+Date:   Mon Feb 25 23:15:01 2008 +0100
 
-    WDEV, ath5k, don't return int from bool function
+    rt2x00: Fix antenna diversity
     
-    sparse sees int -> bool cast as an error:
-    hw.c:3754:10: warning: cast truncates bits from constant value (ffffffea becomes 0)
-    Fix it by converting the rettype to int and check appropriately.
+    Fix 2 issues in antenna diversity selection.
     
-    Signed-off-by: Jiri Slaby <jirislaby at gmail.com>
-    Cc: Nick Kossifidis <mickflemm at gmail.com>
-    Cc: Luis R. Rodriguez <mcgrof at gmail.com>
+    1) the following statement will always return true.
+    	if ((rssi_curr - rssi_old) > -5 || (rssi_curr - rssi_old) < 5)
+    It is cleaner to check if the absolute value is smaller then 5.
+    
+    2) Only enable software diversity when default antenna setup
+    indicates support for it. Don't select it when the hardware
+    does not indicate support for it...
+    
+    Signed-off-by: Ivo van Doorn <IvDoorn at gmail.com>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 65872e6b434ca463123f7d03b530f143aabc6333
-Author: Jiri Slaby <jirislaby at gmail.com>
-Date:   Fri Feb 15 21:58:51 2008 +0100
+commit 57b7ed05c7e68e1b14cc7da232cba2967fb670a7
+Author: Sebastian Siewior <linux+wireless at ml.breakpoint.cc>
+Date:   Sat Feb 23 21:46:31 2008 +0100
 
-    WDEV: ath5k, fix lock imbalance
-    
-    Omitted lock causes sparse warning
-    drivers/net/wireless/ath5k/base.c:1682:1: warning: context imbalance in 'ath5k_tasklet_rx' - different lock contexts for basic block
+    gelic wireless driver needs WIRELESS_EXT support
     
-    Add the lock to the guilty fail path.
+    |   CC      drivers/net/ps3_gelic_wireless.o
+    | /home/bigeasy/git/linux-2.6/drivers/net/ps3_gelic_wireless.c: In function 'gelic_wl_setup_netdev_ops':
+    | /home/bigeasy/git/linux-2.6/drivers/net/ps3_gelic_wireless.c:2660: error: 'struct net_device' has no member named 'wireless_data'
+    | /home/bigeasy/git/linux-2.6/drivers/net/ps3_gelic_wireless.c:2661: error: 'struct net_device' has no member named 'wireless_handlers'
+    | make[3]: *** [drivers/net/ps3_gelic_wireless.o] Error 1
+    | make[2]: *** [drivers/net] Error 2
+    | make[1]: *** [drivers] Error 2
+    | make[1]: *** Waiting for unfinished jobs....
+    | make: *** [sub-make] Error 2
     
-    Signed-off-by: Jiri Slaby <jirislaby at gmail.com>
-    Acked-by: Nick Kossifidis <mickflemm at gmail.com>
-    Cc: Luis R. Rodriguez <mcgrof at gmail.com>
+    Signed-off-by: Sebastian Siewior <sebastian at breakpoint.cc>
+    Acked-by: Masakazu Mokuno <mokuno at sm.sony.co.jp>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 387e100ac24a6c8f2b6f4ce572098447d2893008
-Author: John W. Linville <linville at tuxdriver.com>
-Date:   Wed Feb 20 15:06:02 2008 -0500
+commit 3da83bba86f2aef628919469db5707db6a785868
+Author: Masakazu Mokuno <mokuno at sm.sony.co.jp>
+Date:   Fri Feb 22 16:45:26 2008 +0900
 
-    p54usb: add USB ID for Linksys WUSB54G ver 2
+    PS3: gelic: Link the wireless net_device structure to the corresponding device structure
     
-    Based on report from Cavan Carroll <cavancarroll at hotmail.com>:
+    Link the net_device structure of the wireless part to the
+    corresponding device structure.
     
-    	http://bugzilla.kernel.org/show_bug.cgi?id=9863
+    Without this, the sysfs node for this net_device would not have
+    'device' link.
     
-    Cc: Cavan Carroll <cavancarroll at hotmail.com>
+    Signed-off-by: Masakazu Mokuno <mokuno at sm.sony.co.jp>
+    Acked-by: Dan Williams <dcbw at redhat.com>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-commit 1a17582e64dcc690a7edcd7dcf6fe89f1aa0ef97
-Author: Ivo Couckuyt <iv0co at yahoo.co.uk>
-Date:   Wed Feb 20 14:58:00 2008 -0500
+commit 04d0a24457e249388ec3ee32b345617d1bc6ebf2
+Author: Johannes Berg <johannes at sipsolutions.net>
+Date:   Wed Feb 20 11:47:45 2008 +0100
 
-    p54usb: add USB ID for Phillips CPWUA054
-    
-    Retarget of an old patch against prism54usb in linux-wireless archive:
+    rndis_wlan: fix sparse warnings
     
-    	http://marc.info/?l=linux-wireless&m=117449935810254&w=2
+    It is obviously wrong to use an enum in a little endian struct,
+    and those other enums should be declared differently.
     
-    Cc: Ivo Couckuyt <iv0co at yahoo.co.uk>
+    Signed-off-by: Johannes Berg <johannes at sipsolutions.net>
+    Acked-by: Jussi Kivilinna <jussi.kivilinna at mbnet.fi>
     Signed-off-by: John W. Linville <linville at tuxdriver.com>
 
-diff -up linux-2.6.24.noarch/include/linux/ssb/ssb_driver_chipcommon.h.orig linux-2.6.24.noarch/include/linux/ssb/ssb_driver_chipcommon.h
---- linux-2.6.24.noarch/include/linux/ssb/ssb_driver_chipcommon.h.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/include/linux/ssb/ssb_driver_chipcommon.h	2008-02-21 13:46:08.000000000 -0500
-@@ -51,9 +51,12 @@
- #define  SSB_CHIPCO_CAP_JTAGM		0x00400000	/* JTAG master present */
- #define  SSB_CHIPCO_CAP_BROM		0x00800000	/* Internal boot ROM active */
- #define  SSB_CHIPCO_CAP_64BIT		0x08000000	/* 64-bit Backplane */
-+#define  SSB_CHIPCO_CAP_PMU		0x10000000	/* PMU available (rev >= 20) */
-+#define  SSB_CHIPCO_CAP_ECI		0x20000000	/* ECI available (rev >= 20) */
- #define SSB_CHIPCO_CORECTL		0x0008
- #define  SSB_CHIPCO_CORECTL_UARTCLK0	0x00000001	/* Drive UART with internal clock */
- #define	 SSB_CHIPCO_CORECTL_SE		0x00000002	/* sync clk out enable (corerev >= 3) */
-+#define  SSB_CHIPCO_CORECTL_UARTCLKEN	0x00000008	/* UART clock enable (rev >= 21) */
- #define SSB_CHIPCO_BIST			0x000C
- #define SSB_CHIPCO_OTPS			0x0010		/* OTP status */
- #define	 SSB_CHIPCO_OTPS_PROGFAIL	0x80000000
-@@ -357,6 +360,11 @@ struct ssb_chipcommon {
- 	u16 fast_pwrup_delay;
+commit 7672b302058148f0e9a4a2be36c851510ff9cb88
+Author: Gordon Farquharson <gordonfarquharson at gmail.com>
+Date:   Sat Feb 23 03:14:23 2008 -0700
+
+    Fix b43 driver build for arm
+    
+    Align the members of the SSB device structure to a 32 bit boundary so
+    that the b43 driver can be built for arm using a cross compiler. This
+    alignment is required so that the test in scripts/mod/file2alias.c
+    that checks that the size of the device ID type against the size of
+    the section in the object file succeeds (see comment and
+    http://lkml.org/lkml/2008/2/18/481 for explanation).
+    
+    Signed-off-by: Gordon Farquharson <gordonfarquharson at gmail.com>
+    Acked-by: Michael Buesch <mb at bu3sch.de>
+    Signed-off-by: John W. Linville <linville at tuxdriver.com>
+
+diff -up linux-2.6.24.noarch/include/linux/mod_devicetable.h.orig linux-2.6.24.noarch/include/linux/mod_devicetable.h
+--- linux-2.6.24.noarch/include/linux/mod_devicetable.h.orig	2008-02-27 20:46:37.000000000 -0500
++++ linux-2.6.24.noarch/include/linux/mod_devicetable.h	2008-02-27 20:47:51.000000000 -0500
+@@ -351,7 +351,13 @@ struct sdio_device_id {
+ struct ssb_device_id {
+ 	__u16	vendor;
+ 	__u16	coreid;
+-	__u8	revision;
++	/* Explicit padding to support a broken sanity check in file2alias.c.
++	 * The check compares the size of the structure in the kernel
++	 * object file to the size of the structure reported in userspace for
++	 * the system on which the kernel is compiled. The check breaks on
++	 * cross-compilation, and the padding is a workaround for this. */
++	__u8	revision
++		__attribute__((aligned(sizeof(__u32))));
  };
+ #define SSB_DEVICE(_vendor, _coreid, _revision)  \
+ 	{ .vendor = _vendor, .coreid = _coreid, .revision = _revision, }
+diff -up linux-2.6.24.noarch/net/mac80211/ieee80211_sta.c.orig linux-2.6.24.noarch/net/mac80211/ieee80211_sta.c
+--- linux-2.6.24.noarch/net/mac80211/ieee80211_sta.c.orig	2008-02-27 20:46:37.000000000 -0500
++++ linux-2.6.24.noarch/net/mac80211/ieee80211_sta.c	2008-02-27 20:47:51.000000000 -0500
+@@ -1116,9 +1116,10 @@ static void ieee80211_sta_process_addba_
+ 	/* prepare reordering buffer */
+ 	tid_agg_rx->reorder_buf =
+ 		kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC);
+-	if ((!tid_agg_rx->reorder_buf) && net_ratelimit()) {
+-		printk(KERN_ERR "can not allocate reordering buffer "
+-						"to tid %d\n", tid);
++	if (!tid_agg_rx->reorder_buf) {
++		if (net_ratelimit())
++			printk(KERN_ERR "can not allocate reordering buffer "
++			       "to tid %d\n", tid);
+ 		goto end;
+ 	}
+ 	memset(tid_agg_rx->reorder_buf, 0,
+diff -up linux-2.6.24.noarch/drivers/net/ps3_gelic_wireless.c.orig linux-2.6.24.noarch/drivers/net/ps3_gelic_wireless.c
+--- linux-2.6.24.noarch/drivers/net/ps3_gelic_wireless.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/ps3_gelic_wireless.c	2008-02-27 20:47:51.000000000 -0500
+@@ -2690,6 +2690,7 @@ int gelic_wl_driver_probe(struct gelic_c
+ 		return -ENOMEM;
+ 
+ 	/* setup net_device structure */
++	SET_NETDEV_DEV(netdev, &card->dev->core);
+ 	gelic_wl_setup_netdev_ops(netdev);
+ 
+ 	/* setup some of net_device and register it */
+diff -up linux-2.6.24.noarch/drivers/net/Kconfig.orig linux-2.6.24.noarch/drivers/net/Kconfig
+--- linux-2.6.24.noarch/drivers/net/Kconfig.orig	2008-02-27 20:46:43.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/Kconfig	2008-02-27 20:47:51.000000000 -0500
+@@ -2374,6 +2374,7 @@ config GELIC_NET
+ config GELIC_WIRELESS
+        bool "PS3 Wireless support"
+        depends on GELIC_NET
++       select WIRELESS_EXT
+        help
+         This option adds the support for the wireless feature of PS3.
+         If you have the wireless-less model of PS3 or have no plan to
+diff -up linux-2.6.24.noarch/drivers/net/wireless/b43/Kconfig.orig linux-2.6.24.noarch/drivers/net/wireless/b43/Kconfig
+--- linux-2.6.24.noarch/drivers/net/wireless/b43/Kconfig.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/b43/Kconfig	2008-02-27 20:47:51.000000000 -0500
+@@ -32,6 +32,7 @@ config B43_PCI_AUTOSELECT
+ 	bool
+ 	depends on B43 && SSB_PCIHOST_POSSIBLE
+ 	select SSB_PCIHOST
++	select SSB_B43_PCI_BRIDGE
+ 	default y
+ 
+ # Auto-select SSB PCICORE driver, if possible
+diff -up linux-2.6.24.noarch/drivers/net/wireless/b43legacy/Kconfig.orig linux-2.6.24.noarch/drivers/net/wireless/b43legacy/Kconfig
+--- linux-2.6.24.noarch/drivers/net/wireless/b43legacy/Kconfig.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/b43legacy/Kconfig	2008-02-27 20:47:51.000000000 -0500
+@@ -25,6 +25,7 @@ config B43LEGACY_PCI_AUTOSELECT
+ 	bool
+ 	depends on B43LEGACY && SSB_PCIHOST_POSSIBLE
+ 	select SSB_PCIHOST
++	select SSB_B43_PCI_BRIDGE
+ 	default y
+ 
+ # Auto-select SSB PCICORE driver, if possible
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rndis_wlan.c.orig linux-2.6.24.noarch/drivers/net/wireless/rndis_wlan.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rndis_wlan.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rndis_wlan.c	2008-02-27 20:47:51.000000000 -0500
+@@ -228,9 +228,9 @@ struct NDIS_WLAN_BSSID_EX {
+ 	struct NDIS_802_11_SSID Ssid;
+ 	__le32 Privacy;
+ 	__le32 Rssi;
+-	enum NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
++	__le32 NetworkTypeInUse;
+ 	struct NDIS_802_11_CONFIGURATION Configuration;
+-	enum NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
++	__le32 InfrastructureMode;
+ 	u8 SupportedRates[NDIS_802_11_LENGTH_RATES_EX];
+ 	__le32 IELength;
+ 	u8 IEs[0];
+@@ -279,11 +279,11 @@ struct RNDIS_CONFIG_PARAMETER_INFOBUFFER
+ } __attribute__((packed));
+ 
+ /* these have to match what is in wpa_supplicant */
+-enum { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP } wpa_alg;
+-enum { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, CIPHER_WEP104 }
+-	wpa_cipher;
+-enum { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, KEY_MGMT_802_1X_NO_WPA,
+-	KEY_MGMT_WPA_NONE } wpa_key_mgmt;
++enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP };
++enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP,
++		  CIPHER_WEP104 };
++enum wpa_key_mgmt { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE,
++		    KEY_MGMT_802_1X_NO_WPA, KEY_MGMT_WPA_NONE };
  
-+static inline bool ssb_chipco_available(struct ssb_chipcommon *cc)
-+{
-+	return (cc->dev != NULL);
-+}
-+
- extern void ssb_chipcommon_init(struct ssb_chipcommon *cc);
- 
- #include <linux/pm.h>
-@@ -382,11 +390,13 @@ extern void ssb_chipco_set_clockmode(str
- extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc,
- 					  u32 ticks);
- 
-+/* Chipcommon GPIO pin access. */
- u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask);
--
--void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
+ /*
+  *  private data
+diff -up linux-2.6.24.noarch/drivers/net/wireless/libertas/main.c.orig linux-2.6.24.noarch/drivers/net/wireless/libertas/main.c
+--- linux-2.6.24.noarch/drivers/net/wireless/libertas/main.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/libertas/main.c	2008-02-27 20:47:51.000000000 -0500
+@@ -1351,8 +1351,6 @@ done:
+ 	lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret);
+ 	return ret;
+ }
+-EXPORT_SYMBOL_GPL(lbs_add_mesh);
 -
--void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value);
-+u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
-+u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value);
-+u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value);
-+u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value);
-+u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value);
- 
- #ifdef CONFIG_SSB_SERIAL
- extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
-diff -up linux-2.6.24.noarch/include/linux/ssb/ssb_driver_extif.h.orig linux-2.6.24.noarch/include/linux/ssb/ssb_driver_extif.h
---- linux-2.6.24.noarch/include/linux/ssb/ssb_driver_extif.h.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/include/linux/ssb/ssb_driver_extif.h	2008-02-21 13:46:08.000000000 -0500
-@@ -171,11 +171,15 @@ extern void ssb_extif_get_clockcontrol(s
- extern void ssb_extif_timing_init(struct ssb_extif *extif,
- 				  unsigned long ns);
  
--u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask);
--
--void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value);
-+extern void ssb_extif_watchdog_timer_set(struct ssb_extif *extif,
-+					 u32 ticks);
- 
--void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value);
-+/* Extif GPIO pin access */
-+u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask);
-+u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value);
-+u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value);
-+u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value);
-+u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value);
- 
- #ifdef CONFIG_SSB_SERIAL
- extern int ssb_extif_serial_init(struct ssb_extif *extif,
-@@ -200,5 +204,11 @@ void ssb_extif_get_clockcontrol(struct s
+ static void lbs_remove_mesh(struct lbs_private *priv)
  {
+@@ -1372,7 +1370,6 @@ static void lbs_remove_mesh(struct lbs_p
+ 	free_netdev(mesh_dev);
+ 	lbs_deb_leave(LBS_DEB_MESH);
  }
+-EXPORT_SYMBOL_GPL(lbs_remove_mesh);
  
-+static inline
-+void ssb_extif_watchdog_timer_set(struct ssb_extif *extif,
-+				  u32 ticks)
-+{
-+}
-+
- #endif /* CONFIG_SSB_DRIVER_EXTIF */
- #endif /* LINUX_SSB_EXTIFCORE_H_ */
-diff -up linux-2.6.24.noarch/include/linux/ssb/ssb_driver_pci.h.orig linux-2.6.24.noarch/include/linux/ssb/ssb_driver_pci.h
---- linux-2.6.24.noarch/include/linux/ssb/ssb_driver_pci.h.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/include/linux/ssb/ssb_driver_pci.h	2008-02-21 13:46:08.000000000 -0500
-@@ -51,6 +51,11 @@
- #define  SSB_PCICORE_SBTOPCI1_MASK	0xFC000000
- #define SSB_PCICORE_SBTOPCI2		0x0108	/* Backplane to PCI translation 2 (sbtopci2) */
- #define  SSB_PCICORE_SBTOPCI2_MASK	0xC0000000
-+#define SSB_PCICORE_PCICFG0		0x0400	/* PCI config space 0 (rev >= 8) */
-+#define SSB_PCICORE_PCICFG1		0x0500	/* PCI config space 1 (rev >= 8) */
-+#define SSB_PCICORE_PCICFG2		0x0600	/* PCI config space 2 (rev >= 8) */
-+#define SSB_PCICORE_PCICFG3		0x0700	/* PCI config space 3 (rev >= 8) */
-+#define SSB_PCICORE_SPROM(wordoffset)	(0x0800 + ((wordoffset) * 2)) /* SPROM shadow area (72 bytes) */
- 
- /* SBtoPCIx */
- #define SSB_PCICORE_SBTOPCI_MEM		0x00000000
-diff -up linux-2.6.24.noarch/include/linux/ssb/ssb.h.orig linux-2.6.24.noarch/include/linux/ssb/ssb.h
---- linux-2.6.24.noarch/include/linux/ssb/ssb.h.orig	2008-02-21 13:44:11.000000000 -0500
-+++ linux-2.6.24.noarch/include/linux/ssb/ssb.h	2008-02-21 13:46:08.000000000 -0500
-@@ -282,6 +282,13 @@ struct ssb_bus {
- 	struct ssb_boardinfo boardinfo;
- 	/* Contents of the SPROM. */
- 	struct ssb_sprom sprom;
-+	/* If the board has a cardbus slot, this is set to true. */
-+	bool has_cardbus_slot;
-+
-+#ifdef CONFIG_SSB_EMBEDDED
-+	/* Lock for GPIO register access. */
-+	spinlock_t gpio_lock;
-+#endif /* EMBEDDED */
- 
- 	/* Internal-only stuff follows. Do not touch. */
- 	struct list_head list;
-@@ -294,8 +301,13 @@ struct ssb_bus {
- 
- /* The initialization-invariants. */
- struct ssb_init_invariants {
-+	/* Versioning information about the PCB. */
- 	struct ssb_boardinfo boardinfo;
-+	/* The SPROM information. That's either stored in an
-+	 * EEPROM or NVRAM on the board. */
- 	struct ssb_sprom sprom;
-+	/* If the board has a cardbus slot, this is set to true. */
-+	bool has_cardbus_slot;
- };
- /* Type of function to fetch the invariants. */
- typedef int (*ssb_invariants_func_t)(struct ssb_bus *bus,
-diff -up /dev/null linux-2.6.24.noarch/include/linux/ssb/ssb_embedded.h
---- /dev/null	2008-02-21 08:21:48.545426467 -0500
-+++ linux-2.6.24.noarch/include/linux/ssb/ssb_embedded.h	2008-02-21 13:46:08.000000000 -0500
-@@ -0,0 +1,18 @@
-+#ifndef LINUX_SSB_EMBEDDED_H_
-+#define LINUX_SSB_EMBEDDED_H_
-+
-+#include <linux/types.h>
-+#include <linux/ssb/ssb.h>
-+
-+
-+extern int ssb_watchdog_timer_set(struct ssb_bus *bus, u32 ticks);
-+
-+/* Generic GPIO API */
-+u32 ssb_gpio_in(struct ssb_bus *bus, u32 mask);
-+u32 ssb_gpio_out(struct ssb_bus *bus, u32 mask, u32 value);
-+u32 ssb_gpio_outen(struct ssb_bus *bus, u32 mask, u32 value);
-+u32 ssb_gpio_control(struct ssb_bus *bus, u32 mask, u32 value);
-+u32 ssb_gpio_intmask(struct ssb_bus *bus, u32 mask, u32 value);
-+u32 ssb_gpio_polarity(struct ssb_bus *bus, u32 mask, u32 value);
-+
-+#endif /* LINUX_SSB_EMBEDDED_H_ */
-diff -up linux-2.6.24.noarch/drivers/net/wireless/zd1211rw/zd_mac.c.orig linux-2.6.24.noarch/drivers/net/wireless/zd1211rw/zd_mac.c
---- linux-2.6.24.noarch/drivers/net/wireless/zd1211rw/zd_mac.c.orig	2008-02-21 13:44:19.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/zd1211rw/zd_mac.c	2008-02-21 13:46:08.000000000 -0500
-@@ -345,11 +345,14 @@ void zd_mac_tx_failed(struct ieee80211_h
- {
- 	struct sk_buff_head *q = &zd_hw_mac(hw)->ack_wait_queue;
- 	struct sk_buff *skb;
--	struct ieee80211_tx_status status = {{0}};
-+	struct ieee80211_tx_status status;
- 
- 	skb = skb_dequeue(q);
- 	if (skb == NULL)
- 		return;
-+
-+	memset(&status, 0, sizeof(status));
-+
- 	tx_status(hw, skb, &status, 0);
+ /**
+  *  @brief This function finds the CFP in
+@@ -1458,20 +1455,6 @@ void lbs_interrupt(struct lbs_private *p
  }
+ EXPORT_SYMBOL_GPL(lbs_interrupt);
  
-@@ -374,7 +377,8 @@ void zd_mac_tx_to_dev(struct sk_buff *sk
- 		if (unlikely(error ||
- 		    (cb->control->flags & IEEE80211_TXCTL_NO_ACK)))
- 		{
--			struct ieee80211_tx_status status = {{0}};
-+			struct ieee80211_tx_status status;
-+			memset(&status, 0, sizeof(status));
- 			tx_status(hw, skb, &status, !error);
- 		} else {
- 			struct sk_buff_head *q =
-@@ -590,7 +594,9 @@ static int filter_ack(struct ieee80211_h
- 		tx_hdr = (struct ieee80211_hdr *)skb->data;
- 		if (likely(!compare_ether_addr(tx_hdr->addr2, rx_hdr->addr1)))
- 		{
--			struct ieee80211_tx_status status = {{0}};
-+			struct ieee80211_tx_status status;
-+
-+			memset(&status, 0, sizeof(status));
- 			status.flags = IEEE80211_TX_STATUS_ACK;
- 			status.ack_signal = stats->ssi;
- 			__skb_unlink(skb, q);
-diff -up linux-2.6.24.noarch/drivers/net/wireless/rtl8187_dev.c.orig linux-2.6.24.noarch/drivers/net/wireless/rtl8187_dev.c
---- linux-2.6.24.noarch/drivers/net/wireless/rtl8187_dev.c.orig	2008-02-21 13:44:19.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/rtl8187_dev.c	2008-02-21 13:46:08.000000000 -0500
-@@ -145,10 +145,12 @@ void rtl8187_write_phy(struct ieee80211_
- 
- static void rtl8187_tx_cb(struct urb *urb)
+-int lbs_reset_device(struct lbs_private *priv)
+-{
+-	int ret;
+-
+-	lbs_deb_enter(LBS_DEB_MAIN);
+-	ret = lbs_prepare_and_send_command(priv, CMD_802_11_RESET,
+-				    CMD_ACT_HALT, 0, 0, NULL);
+-	msleep_interruptible(10);
+-
+-	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
+-	return ret;
+-}
+-EXPORT_SYMBOL_GPL(lbs_reset_device);
+-
+ static int __init lbs_init_module(void)
  {
--	struct ieee80211_tx_status status = { {0} };
-+	struct ieee80211_tx_status status;
- 	struct sk_buff *skb = (struct sk_buff *)urb->context;
- 	struct rtl8187_tx_info *info = (struct rtl8187_tx_info *)skb->cb;
- 
-+	memset(&status, 0, sizeof(status));
+ 	lbs_deb_enter(LBS_DEB_MAIN);
+diff -up linux-2.6.24.noarch/drivers/net/wireless/libertas/cmd.c.orig linux-2.6.24.noarch/drivers/net/wireless/libertas/cmd.c
+--- linux-2.6.24.noarch/drivers/net/wireless/libertas/cmd.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/libertas/cmd.c	2008-02-27 20:47:51.000000000 -0500
+@@ -1040,7 +1040,6 @@ int lbs_mesh_access(struct lbs_private *
+ 	lbs_deb_leave(LBS_DEB_CMD);
+ 	return ret;
+ }
+-EXPORT_SYMBOL_GPL(lbs_mesh_access);
+ 
+ int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan)
+ {
+@@ -1576,7 +1575,6 @@ done:
+ 	lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
+ 	return ret;
+ }
+-EXPORT_SYMBOL_GPL(lbs_prepare_and_send_command);
+ 
+ /**
+  *  @brief This function allocates the command buffer and link
+diff -up linux-2.6.24.noarch/drivers/net/wireless/libertas/decl.h.orig linux-2.6.24.noarch/drivers/net/wireless/libertas/decl.h
+--- linux-2.6.24.noarch/drivers/net/wireless/libertas/decl.h.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/libertas/decl.h	2008-02-27 20:47:51.000000000 -0500
+@@ -69,7 +69,6 @@ struct lbs_private *lbs_add_card(void *c
+ int lbs_remove_card(struct lbs_private *priv);
+ int lbs_start_card(struct lbs_private *priv);
+ int lbs_stop_card(struct lbs_private *priv);
+-int lbs_reset_device(struct lbs_private *priv);
+ void lbs_host_to_card_done(struct lbs_private *priv);
+ 
+ int lbs_update_channel(struct lbs_private *priv);
+diff -up linux-2.6.24.noarch/drivers/net/wireless/bcm43xx/Kconfig.orig linux-2.6.24.noarch/drivers/net/wireless/bcm43xx/Kconfig
+--- linux-2.6.24.noarch/drivers/net/wireless/bcm43xx/Kconfig.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/bcm43xx/Kconfig	2008-02-27 20:47:51.000000000 -0500
+@@ -1,6 +1,6 @@
+ config BCM43XX
+ 	tristate "Broadcom BCM43xx wireless support (DEPRECATED)"
+-	depends on PCI && IEEE80211 && IEEE80211_SOFTMAC && WLAN_80211 && EXPERIMENTAL
++	depends on PCI && IEEE80211 && IEEE80211_SOFTMAC && WLAN_80211 && (!SSB_B43_PCI_BRIDGE || SSB != y) && EXPERIMENTAL
+ 	select WIRELESS_EXT
+ 	select FW_LOADER
+ 	select HW_RANDOM
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00dev.c	2008-02-27 20:47:51.000000000 -0500
+@@ -61,11 +61,33 @@ EXPORT_SYMBOL_GPL(rt2x00lib_get_ring);
+ /*
+  * Link tuning handlers
+  */
+-static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
++void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
+ {
++	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++		return;
 +
- 	usb_free_urb(info->urb);
- 	if (info->control)
- 		memcpy(&status.control, info->control, sizeof(status.control));
-diff -up linux-2.6.24.noarch/drivers/net/wireless/p54usb.c.orig linux-2.6.24.noarch/drivers/net/wireless/p54usb.c
---- linux-2.6.24.noarch/drivers/net/wireless/p54usb.c.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/p54usb.c	2008-02-21 13:46:08.000000000 -0500
-@@ -35,6 +35,7 @@ static struct usb_device_id p54u_table[]
- 	{USB_DEVICE(0x0707, 0xee06)},	/* SMC 2862W-G */
- 	{USB_DEVICE(0x083a, 0x4501)},	/* Accton 802.11g WN4501 USB */
- 	{USB_DEVICE(0x083a, 0x4502)},	/* Siemens Gigaset USB Adapter */
-+	{USB_DEVICE(0x083a, 0x5501)},	/* Phillips CPWUA054 */
- 	{USB_DEVICE(0x0846, 0x4200)},	/* Netgear WG121 */
- 	{USB_DEVICE(0x0846, 0x4210)},	/* Netgear WG121 the second ? */
- 	{USB_DEVICE(0x0846, 0x4220)},	/* Netgear WG111 */
-@@ -62,6 +63,7 @@ static struct usb_device_id p54u_table[]
- 	{USB_DEVICE(0x0cde, 0x0008)},	/* Sagem XG703A */
- 	{USB_DEVICE(0x0d8e, 0x3762)},	/* DLink DWL-G120 Cohiba */
- 	{USB_DEVICE(0x09aa, 0x1000)},	/* Spinnaker Proto board */
-+	{USB_DEVICE(0x13b1, 0x000a)},	/* Linksys WUSB54G ver 2 */
- 	{USB_DEVICE(0x13B1, 0x000C)},	/* Linksys WUSB54AG */
- 	{USB_DEVICE(0x1435, 0x0427)},	/* Inventel UR054G */
- 	{USB_DEVICE(0x2001, 0x3704)},	/* DLink DWL-G122 rev A2 */
-diff -up linux-2.6.24.noarch/drivers/net/wireless/rtl8180_dev.c.orig linux-2.6.24.noarch/drivers/net/wireless/rtl8180_dev.c
---- linux-2.6.24.noarch/drivers/net/wireless/rtl8180_dev.c.orig	2008-02-21 13:44:19.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/rtl8180_dev.c	2008-02-21 13:46:08.000000000 -0500
-@@ -170,13 +170,15 @@ static void rtl8180_handle_tx(struct iee
- 	while (skb_queue_len(&ring->queue)) {
- 		struct rtl8180_tx_desc *entry = &ring->desc[ring->idx];
- 		struct sk_buff *skb;
--		struct ieee80211_tx_status status = { {0} };
-+		struct ieee80211_tx_status status;
- 		struct ieee80211_tx_control *control;
- 		u32 flags = le32_to_cpu(entry->flags);
- 
- 		if (flags & RTL8180_TX_DESC_FLAG_OWN)
- 			return;
++	/*
++	 * Reset link information.
++	 * Both the currently active vgc level as well as
++	 * the link tuner counter should be reset. Resetting
++	 * the counter is important for devices where the
++	 * device should only perform link tuning during the
++	 * first minute after being enabled.
++	 */
+ 	rt2x00dev->link.count = 0;
+ 	rt2x00dev->link.vgc_level = 0;
+ 
++	/*
++	 * Reset the link tuner.
++	 */
++	rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
++}
++
++static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
++{
++	/*
++	 * Clear all (possibly) pre-existing quality statistics.
++	 */
+ 	memset(&rt2x00dev->link.qual, 0, sizeof(rt2x00dev->link.qual));
  
-+		memset(&status, 0, sizeof(status));
-+
- 		ring->idx = (ring->idx + 1) % ring->entries;
- 		skb = __skb_dequeue(&ring->queue);
- 		pci_unmap_single(priv->pdev, le32_to_cpu(entry->tx_buf),
-diff -up linux-2.6.24.noarch/drivers/net/wireless/ath5k/ath5k.h.orig linux-2.6.24.noarch/drivers/net/wireless/ath5k/ath5k.h
---- linux-2.6.24.noarch/drivers/net/wireless/ath5k/ath5k.h.orig	2008-02-21 13:44:19.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/ath5k/ath5k.h	2008-02-21 13:46:07.000000000 -0500
-@@ -1033,7 +1033,7 @@ struct ath5k_hw {
- 		unsigned int, unsigned int, enum ath5k_pkt_type, unsigned int,
- 		unsigned int, unsigned int, unsigned int, unsigned int,
- 		unsigned int, unsigned int, unsigned int);
--	bool (*ah_setup_xtx_desc)(struct ath5k_hw *, struct ath5k_desc *,
-+	int (*ah_setup_xtx_desc)(struct ath5k_hw *, struct ath5k_desc *,
- 		unsigned int, unsigned int, unsigned int, unsigned int,
- 		unsigned int, unsigned int);
- 	int (*ah_proc_tx_desc)(struct ath5k_hw *, struct ath5k_desc *);
-diff -up linux-2.6.24.noarch/drivers/net/wireless/ath5k/hw.c.orig linux-2.6.24.noarch/drivers/net/wireless/ath5k/hw.c
---- linux-2.6.24.noarch/drivers/net/wireless/ath5k/hw.c.orig	2008-02-21 13:44:19.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/ath5k/hw.c	2008-02-21 13:46:07.000000000 -0500
-@@ -45,7 +45,7 @@ static int ath5k_hw_setup_4word_tx_desc(
- 	unsigned int, unsigned int, enum ath5k_pkt_type, unsigned int,
- 	unsigned int, unsigned int, unsigned int, unsigned int, unsigned int,
- 	unsigned int, unsigned int);
--static bool ath5k_hw_setup_xr_tx_desc(struct ath5k_hw *, struct ath5k_desc *,
-+static int ath5k_hw_setup_xr_tx_desc(struct ath5k_hw *, struct ath5k_desc *,
- 	unsigned int, unsigned int, unsigned int, unsigned int, unsigned int,
- 	unsigned int);
- static int ath5k_hw_proc_4word_tx_status(struct ath5k_hw *, struct ath5k_desc *);
-@@ -3694,7 +3694,7 @@ static int ath5k_hw_setup_4word_tx_desc(
+ 	/*
+@@ -79,10 +101,7 @@ static void rt2x00lib_start_link_tuner(s
+ 	rt2x00dev->link.qual.rx_percentage = 50;
+ 	rt2x00dev->link.qual.tx_percentage = 50;
+ 
+-	/*
+-	 * Reset the link tuner.
+-	 */
+-	rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
++	rt2x00lib_reset_link_tuner(rt2x00dev);
+ 
+ 	queue_delayed_work(rt2x00dev->hw->workqueue,
+ 			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+@@ -93,15 +112,6 @@ static void rt2x00lib_stop_link_tuner(st
+ 	cancel_delayed_work_sync(&rt2x00dev->link.work);
+ }
+ 
+-void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
+-{
+-	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
+-		return;
+-
+-	rt2x00lib_stop_link_tuner(rt2x00dev);
+-	rt2x00lib_start_link_tuner(rt2x00dev);
+-}
+-
  /*
-  * Initialize a 4-word multirate tx descriptor on 5212
+  * Ring initialization
   */
--static bool
-+static int
- ath5k_hw_setup_xr_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
- 	unsigned int tx_rate1, u_int tx_tries1, u_int tx_rate2, u_int tx_tries2,
- 	unsigned int tx_rate3, u_int tx_tries3)
-@@ -3734,10 +3734,10 @@ ath5k_hw_setup_xr_tx_desc(struct ath5k_h
+@@ -260,19 +270,11 @@ static void rt2x00lib_evaluate_antenna_s
+ 	if (sample_a == sample_b)
+ 		return;
  
- #undef _XTX_TRIES
+-	if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) {
+-		if (sample_a > sample_b && rx == ANTENNA_B)
+-			rx = ANTENNA_A;
+-		else if (rx == ANTENNA_A)
+-			rx = ANTENNA_B;
+-	}
++	if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY)
++		rx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
+ 
+-	if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY) {
+-		if (sample_a > sample_b && tx == ANTENNA_B)
+-			tx = ANTENNA_A;
+-		else if (tx == ANTENNA_A)
+-			tx = ANTENNA_B;
+-	}
++	if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)
++		tx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
+ 
+ 	rt2x00lib_config_antenna(rt2x00dev, rx, tx);
+ }
+@@ -293,7 +295,7 @@ static void rt2x00lib_evaluate_antenna_e
+ 	 * sample the rssi from the other antenna to make a valid
+ 	 * comparison between the 2 antennas.
+ 	 */
+-	if ((rssi_curr - rssi_old) > -5 || (rssi_curr - rssi_old) < 5)
++	if (abs(rssi_curr - rssi_old) < 5)
+ 		return;
  
--		return true;
-+		return 1;
+ 	rt2x00dev->link.ant.flags |= ANTENNA_MODE_SAMPLE;
+@@ -319,15 +321,15 @@ static void rt2x00lib_evaluate_antenna(s
+ 	rt2x00dev->link.ant.flags &= ~ANTENNA_TX_DIVERSITY;
+ 
+ 	if (rt2x00dev->hw->conf.antenna_sel_rx == 0 &&
+-	    rt2x00dev->default_ant.rx != ANTENNA_SW_DIVERSITY)
++	    rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY)
+ 		rt2x00dev->link.ant.flags |= ANTENNA_RX_DIVERSITY;
+ 	if (rt2x00dev->hw->conf.antenna_sel_tx == 0 &&
+-	    rt2x00dev->default_ant.tx != ANTENNA_SW_DIVERSITY)
++	    rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY)
+ 		rt2x00dev->link.ant.flags |= ANTENNA_TX_DIVERSITY;
+ 
+ 	if (!(rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) &&
+ 	    !(rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)) {
+-		rt2x00dev->link.ant.flags &= ~ANTENNA_MODE_SAMPLE;
++		rt2x00dev->link.ant.flags = 0;
+ 		return;
  	}
  
--	return false;
-+	return 0;
- }
+@@ -441,17 +443,18 @@ static void rt2x00lib_link_tuner(struct 
+ 		rt2x00dev->ops->lib->link_tuner(rt2x00dev);
  
- /*
-diff -up linux-2.6.24.noarch/drivers/net/wireless/ath5k/base.c.orig linux-2.6.24.noarch/drivers/net/wireless/ath5k/base.c
---- linux-2.6.24.noarch/drivers/net/wireless/ath5k/base.c.orig	2008-02-21 13:44:19.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/net/wireless/ath5k/base.c	2008-02-21 13:46:07.000000000 -0500
-@@ -681,7 +681,10 @@ ath5k_attach(struct pci_dev *pdev, struc
- 	 * return false w/o doing anything.  MAC's that do
- 	 * support it will return true w/o doing anything.
+ 	/*
+-	 * Evaluate antenna setup.
+-	 */
+-	rt2x00lib_evaluate_antenna(rt2x00dev);
+-
+-	/*
+ 	 * Precalculate a portion of the link signal which is
+ 	 * in based on the tx/rx success/failure counters.
  	 */
--	if (ah->ah_setup_xtx_desc(ah, NULL, 0, 0, 0, 0, 0, 0))
-+	ret = ah->ah_setup_xtx_desc(ah, NULL, 0, 0, 0, 0, 0, 0);
-+	if (ret < 0)
-+		goto err;
-+	if (ret > 0)
- 		__set_bit(ATH_STAT_MRRETRY, sc->status);
+ 	rt2x00lib_precalculate_link_signal(&rt2x00dev->link.qual);
  
  	/*
-@@ -1772,6 +1775,7 @@ ath5k_tasklet_rx(unsigned long data)
- 			break;
- 		else if (unlikely(ret)) {
- 			ATH5K_ERR(sc, "error in processing rx descriptor\n");
-+			spin_unlock(&sc->rxbuflock);
- 			return;
- 		}
- 
-@@ -2184,8 +2188,9 @@ ath5k_beacon_update_timers(struct ath5k_
- 			"updated timers based on beacon TSF\n");
- 
- 	ATH5K_DBG_UNLIMIT(sc, ATH5K_DEBUG_BEACON,
--		"bc_tsf %llx hw_tsf %llx bc_tu %u hw_tu %u nexttbtt %u\n",
--		bc_tsf, hw_tsf, bc_tu, hw_tu, nexttbtt);
-+			  "bc_tsf %llx hw_tsf %llx bc_tu %u hw_tu %u nexttbtt %u\n",
-+			  (unsigned long long) bc_tsf,
-+			  (unsigned long long) hw_tsf, bc_tu, hw_tu, nexttbtt);
- 	ATH5K_DBG_UNLIMIT(sc, ATH5K_DEBUG_BEACON, "intval %u %s %s\n",
- 		intval & AR5K_BEACON_PERIOD,
- 		intval & AR5K_BEACON_ENA ? "AR5K_BEACON_ENA" : "",
-@@ -2444,10 +2449,11 @@ ath5k_intr(int irq, void *dev_id)
- 					u64 tsf = ath5k_hw_get_tsf64(ah);
- 					sc->nexttbtt += sc->bintval;
- 					ATH5K_DBG(sc, ATH5K_DEBUG_BEACON,
--						"SWBA nexttbtt: %x hw_tu: %x "
--						"TSF: %llx\n",
--						sc->nexttbtt,
--						TSF_TO_TU(tsf), tsf);
-+						  "SWBA nexttbtt: %x hw_tu: %x "
-+						  "TSF: %llx\n",
-+						  sc->nexttbtt,
-+						  TSF_TO_TU(tsf),
-+						  (unsigned long long) tsf);
- 				} else {
- 					ath5k_beacon_send(sc);
- 				}
-diff -up linux-2.6.24.noarch/drivers/ssb/Makefile.orig linux-2.6.24.noarch/drivers/ssb/Makefile
---- linux-2.6.24.noarch/drivers/ssb/Makefile.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/ssb/Makefile	2008-02-21 13:46:08.000000000 -0500
-@@ -1,5 +1,6 @@
- # core
- ssb-y					+= main.o scan.o
-+ssb-$(CONFIG_SSB_EMBEDDED)		+= embedded.o
- 
- # host support
- ssb-$(CONFIG_SSB_PCIHOST)		+= pci.o pcihost_wrapper.o
-diff -up linux-2.6.24.noarch/drivers/ssb/main.c.orig linux-2.6.24.noarch/drivers/ssb/main.c
---- linux-2.6.24.noarch/drivers/ssb/main.c.orig	2008-02-21 13:44:10.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/ssb/main.c	2008-02-21 13:46:08.000000000 -0500
-@@ -557,6 +557,7 @@ static int ssb_fetch_invariants(struct s
- 		goto out;
- 	memcpy(&bus->boardinfo, &iv.boardinfo, sizeof(iv.boardinfo));
- 	memcpy(&bus->sprom, &iv.sprom, sizeof(iv.sprom));
-+	bus->has_cardbus_slot = iv.has_cardbus_slot;
- out:
- 	return err;
- }
-@@ -569,6 +570,9 @@ static int ssb_bus_register(struct ssb_b
- 
- 	spin_lock_init(&bus->bar_lock);
- 	INIT_LIST_HEAD(&bus->list);
-+#ifdef CONFIG_SSB_EMBEDDED
-+	spin_lock_init(&bus->gpio_lock);
-+#endif
- 
- 	/* Powerup the bus */
- 	err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1);
-diff -up linux-2.6.24.noarch/drivers/ssb/driver_chipcommon.c.orig linux-2.6.24.noarch/drivers/ssb/driver_chipcommon.c
---- linux-2.6.24.noarch/drivers/ssb/driver_chipcommon.c.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/ssb/driver_chipcommon.c	2008-02-21 13:46:08.000000000 -0500
-@@ -39,12 +39,14 @@ static inline void chipco_write32(struct
- 	ssb_write32(cc->dev, offset, value);
- }
- 
--static inline void chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset,
--					 u32 mask, u32 value)
-+static inline u32 chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset,
-+					u32 mask, u32 value)
- {
- 	value &= mask;
- 	value |= chipco_read32(cc, offset) & ~mask;
- 	chipco_write32(cc, offset, value);
-+
-+	return value;
- }
- 
- void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
-@@ -356,14 +358,29 @@ u32 ssb_chipco_gpio_in(struct ssb_chipco
- 	return chipco_read32(cc, SSB_CHIPCO_GPIOIN) & mask;
- }
- 
--void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value)
-+u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value)
-+{
-+	return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value);
-+}
-+
-+u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value)
-+{
-+	return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value);
-+}
++	 * Evaluate antenna setup, make this the last step since this could
++	 * possibly reset some statistics.
++	 */
++	rt2x00lib_evaluate_antenna(rt2x00dev);
 +
-+u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value)
-+{
-+	return chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value);
-+}
++	/*
+ 	 * Increase tuner counter, and reschedule the next link tuner run.
+ 	 */
+ 	rt2x00dev->link.count++;
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2400pci.c.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2400pci.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2400pci.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2400pci.c	2008-02-27 20:47:51.000000000 -0500
+@@ -960,8 +960,12 @@ static int rt2400pci_set_device_state(st
+ 		rt2400pci_disable_radio(rt2x00dev);
+ 		break;
+ 	case STATE_RADIO_RX_ON:
++	case STATE_RADIO_RX_ON_LINK:
++		rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
++		break;
+ 	case STATE_RADIO_RX_OFF:
+-		rt2400pci_toggle_rx(rt2x00dev, state);
++	case STATE_RADIO_RX_OFF_LINK:
++		rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
+ 		break;
+ 	case STATE_DEEP_SLEEP:
+ 	case STATE_SLEEP:
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500usb.c.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500usb.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500usb.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500usb.c	2008-02-27 20:47:51.000000000 -0500
+@@ -1001,8 +1001,12 @@ static int rt2500usb_set_device_state(st
+ 		rt2500usb_disable_radio(rt2x00dev);
+ 		break;
+ 	case STATE_RADIO_RX_ON:
++	case STATE_RADIO_RX_ON_LINK:
++		rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
++		break;
+ 	case STATE_RADIO_RX_OFF:
+-		rt2500usb_toggle_rx(rt2x00dev, state);
++	case STATE_RADIO_RX_OFF_LINK:
++		rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
+ 		break;
+ 	case STATE_DEEP_SLEEP:
+ 	case STATE_SLEEP:
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00reg.h.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00reg.h
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00reg.h.orig	2008-01-24 17:58:37.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00reg.h	2008-02-27 20:47:51.000000000 -0500
+@@ -85,6 +85,8 @@ enum dev_state {
+ 	STATE_RADIO_OFF,
+ 	STATE_RADIO_RX_ON,
+ 	STATE_RADIO_RX_OFF,
++	STATE_RADIO_RX_ON_LINK,
++	STATE_RADIO_RX_OFF_LINK,
+ 	STATE_RADIO_IRQ_ON,
+ 	STATE_RADIO_IRQ_OFF,
+ };
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00config.c.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00config.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00config.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2x00config.c	2008-02-27 20:47:51.000000000 -0500
+@@ -97,12 +97,16 @@ void rt2x00lib_config_antenna(struct rt2
+ 	libconf.ant.rx = rx;
+ 	libconf.ant.tx = tx;
+ 
++	if (rx == rt2x00dev->link.ant.active.rx &&
++	    tx == rt2x00dev->link.ant.active.tx)
++		return;
 +
-+u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value)
- {
--	chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value);
-+	return chipco_write32_masked(cc, SSB_CHIPCO_GPIOIRQ, mask, value);
- }
+ 	/*
+ 	 * Antenna setup changes require the RX to be disabled,
+ 	 * else the changes will be ignored by the device.
+ 	 */
+ 	if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
+-		rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
++		rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF_LINK);
  
--void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value)
-+u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value)
+ 	/*
+ 	 * Write new antenna setup to device and reset the link tuner.
+@@ -116,7 +120,7 @@ void rt2x00lib_config_antenna(struct rt2
+ 	rt2x00dev->link.ant.active.tx = libconf.ant.tx;
+ 
+ 	if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
+-		rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
++		rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK);
+ }
+ 
+ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500pci.c.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500pci.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500pci.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt2500pci.c	2008-02-27 20:47:51.000000000 -0500
+@@ -1112,8 +1112,12 @@ static int rt2500pci_set_device_state(st
+ 		rt2500pci_disable_radio(rt2x00dev);
+ 		break;
+ 	case STATE_RADIO_RX_ON:
++	case STATE_RADIO_RX_ON_LINK:
++		rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
++		break;
+ 	case STATE_RADIO_RX_OFF:
+-		rt2500pci_toggle_rx(rt2x00dev, state);
++	case STATE_RADIO_RX_OFF_LINK:
++		rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
+ 		break;
+ 	case STATE_DEEP_SLEEP:
+ 	case STATE_SLEEP:
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt61pci.c.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt61pci.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt61pci.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt61pci.c	2008-02-27 20:47:51.000000000 -0500
+@@ -1482,8 +1482,12 @@ static int rt61pci_set_device_state(stru
+ 		rt61pci_disable_radio(rt2x00dev);
+ 		break;
+ 	case STATE_RADIO_RX_ON:
++	case STATE_RADIO_RX_ON_LINK:
++		rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
++		break;
+ 	case STATE_RADIO_RX_OFF:
+-		rt61pci_toggle_rx(rt2x00dev, state);
++	case STATE_RADIO_RX_OFF_LINK:
++		rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
+ 		break;
+ 	case STATE_DEEP_SLEEP:
+ 	case STATE_SLEEP:
+diff -up linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt73usb.c.orig linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt73usb.c
+--- linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt73usb.c.orig	2008-02-27 20:46:34.000000000 -0500
++++ linux-2.6.24.noarch/drivers/net/wireless/rt2x00/rt73usb.c	2008-02-27 20:47:51.000000000 -0500
+@@ -1208,8 +1208,12 @@ static int rt73usb_set_device_state(stru
+ 		rt73usb_disable_radio(rt2x00dev);
+ 		break;
+ 	case STATE_RADIO_RX_ON:
++	case STATE_RADIO_RX_ON_LINK:
++		rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
++		break;
+ 	case STATE_RADIO_RX_OFF:
+-		rt73usb_toggle_rx(rt2x00dev, state);
++	case STATE_RADIO_RX_OFF_LINK:
++		rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
+ 		break;
+ 	case STATE_DEEP_SLEEP:
+ 	case STATE_SLEEP:
+diff -up linux-2.6.24.noarch/drivers/ssb/Makefile.orig linux-2.6.24.noarch/drivers/ssb/Makefile
+--- linux-2.6.24.noarch/drivers/ssb/Makefile.orig	2008-02-27 20:46:35.000000000 -0500
++++ linux-2.6.24.noarch/drivers/ssb/Makefile	2008-02-27 20:47:51.000000000 -0500
+@@ -14,6 +14,6 @@ ssb-$(CONFIG_SSB_DRIVER_PCICORE)	+= driv
+ 
+ # b43 pci-ssb-bridge driver
+ # Not strictly a part of SSB, but kept here for convenience
+-ssb-$(CONFIG_SSB_PCIHOST)		+= b43_pci_bridge.o
++ssb-$(CONFIG_SSB_B43_PCI_BRIDGE)	+= b43_pci_bridge.o
+ 
+ obj-$(CONFIG_SSB)			+= ssb.o
+diff -up linux-2.6.24.noarch/drivers/ssb/ssb_private.h.orig linux-2.6.24.noarch/drivers/ssb/ssb_private.h
+--- linux-2.6.24.noarch/drivers/ssb/ssb_private.h.orig	2008-01-24 17:58:37.000000000 -0500
++++ linux-2.6.24.noarch/drivers/ssb/ssb_private.h	2008-02-27 20:47:51.000000000 -0500
+@@ -120,10 +120,10 @@ extern int ssb_devices_thaw(struct ssb_b
+ extern struct ssb_bus *ssb_pci_dev_to_bus(struct pci_dev *pdev);
+ 
+ /* b43_pci_bridge.c */
+-#ifdef CONFIG_SSB_PCIHOST
++#ifdef CONFIG_SSB_B43_PCI_BRIDGE
+ extern int __init b43_pci_ssb_bridge_init(void);
+ extern void __exit b43_pci_ssb_bridge_exit(void);
+-#else /* CONFIG_SSB_PCIHOST */
++#else /* CONFIG_SSB_B43_PCI_BRIDGR */
+ static inline int b43_pci_ssb_bridge_init(void)
  {
--	chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value);
-+	return chipco_write32_masked(cc, SSB_CHIPCO_GPIOPOL, mask, value);
- }
- 
- #ifdef CONFIG_SSB_SERIAL
-@@ -376,6 +393,7 @@ int ssb_chipco_serial_init(struct ssb_ch
- 	unsigned int irq;
- 	u32 baud_base, div;
- 	u32 i, n;
-+	unsigned int ccrev = cc->dev->id.revision;
- 
- 	plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
- 	irq = ssb_mips_irq(cc->dev);
-@@ -387,14 +405,39 @@ int ssb_chipco_serial_init(struct ssb_ch
- 						chipco_read32(cc, SSB_CHIPCO_CLOCK_M2));
- 		div = 1;
- 	} else {
--		if (cc->dev->id.revision >= 11) {
-+		if (ccrev == 20) {
-+			/* BCM5354 uses constant 25MHz clock */
-+			baud_base = 25000000;
-+			div = 48;
-+			/* Set the override bit so we don't divide it */
-+			chipco_write32(cc, SSB_CHIPCO_CORECTL,
-+				       chipco_read32(cc, SSB_CHIPCO_CORECTL)
-+				       | SSB_CHIPCO_CORECTL_UARTCLK0);
-+		} else if ((ccrev >= 11) && (ccrev != 15)) {
- 			/* Fixed ALP clock */
- 			baud_base = 20000000;
-+			if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
-+				/* FIXME: baud_base is different for devices with a PMU */
-+				SSB_WARN_ON(1);
-+			}
- 			div = 1;
-+			if (ccrev >= 21) {
-+				/* Turn off UART clock before switching clocksource. */
-+				chipco_write32(cc, SSB_CHIPCO_CORECTL,
-+					       chipco_read32(cc, SSB_CHIPCO_CORECTL)
-+					       & ~SSB_CHIPCO_CORECTL_UARTCLKEN);
-+			}
- 			/* Set the override bit so we don't divide it */
- 			chipco_write32(cc, SSB_CHIPCO_CORECTL,
--				       SSB_CHIPCO_CORECTL_UARTCLK0);
--		} else if (cc->dev->id.revision >= 3) {
-+				       chipco_read32(cc, SSB_CHIPCO_CORECTL)
-+				       | SSB_CHIPCO_CORECTL_UARTCLK0);
-+			if (ccrev >= 21) {
-+				/* Re-enable the UART clock. */
-+				chipco_write32(cc, SSB_CHIPCO_CORECTL,
-+					       chipco_read32(cc, SSB_CHIPCO_CORECTL)
-+					       | SSB_CHIPCO_CORECTL_UARTCLKEN);
-+			}
-+		} else if (ccrev >= 3) {
- 			/* Internal backplane clock */
- 			baud_base = ssb_clockspeed(bus);
- 			div = chipco_read32(cc, SSB_CHIPCO_CLKDIV)
-@@ -406,7 +449,7 @@ int ssb_chipco_serial_init(struct ssb_ch
- 		}
- 
- 		/* Clock source depends on strapping if UartClkOverride is unset */
--		if ((cc->dev->id.revision > 0) &&
-+		if ((ccrev > 0) &&
- 		    !(chipco_read32(cc, SSB_CHIPCO_CORECTL) & SSB_CHIPCO_CORECTL_UARTCLK0)) {
- 			if ((cc->capabilities & SSB_CHIPCO_CAP_UARTCLK) ==
- 			    SSB_CHIPCO_CAP_UARTCLK_INT) {
-@@ -428,7 +471,7 @@ int ssb_chipco_serial_init(struct ssb_ch
- 		cc_mmio = cc->dev->bus->mmio + (cc->dev->core_index * SSB_CORE_SIZE);
- 		uart_regs = cc_mmio + SSB_CHIPCO_UART0_DATA;
- 		/* Offset changed at after rev 0 */
--		if (cc->dev->id.revision == 0)
-+		if (ccrev == 0)
- 			uart_regs += (i * 8);
- 		else
- 			uart_regs += (i * 256);
+ 	return 0;
 diff -up linux-2.6.24.noarch/drivers/ssb/Kconfig.orig linux-2.6.24.noarch/drivers/ssb/Kconfig
---- linux-2.6.24.noarch/drivers/ssb/Kconfig.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/ssb/Kconfig	2008-02-21 13:46:08.000000000 -0500
-@@ -105,6 +105,12 @@ config SSB_DRIVER_MIPS
+--- linux-2.6.24.noarch/drivers/ssb/Kconfig.orig	2008-02-27 20:46:35.000000000 -0500
++++ linux-2.6.24.noarch/drivers/ssb/Kconfig	2008-02-27 20:47:51.000000000 -0500
+@@ -35,6 +35,11 @@ config SSB_PCIHOST
  
- 	  If unsure, say N
+ 	  If unsure, say Y
  
-+# Assumption: We are on embedded, if we compile the MIPS core.
-+config SSB_EMBEDDED
++config SSB_B43_PCI_BRIDGE
 +	bool
-+	depends on SSB_DRIVER_MIPS
-+	default y
-+
- config SSB_DRIVER_EXTIF
- 	bool "SSB Broadcom EXTIF core driver (EXPERIMENTAL)"
- 	depends on SSB_DRIVER_MIPS && EXPERIMENTAL
-diff -up /dev/null linux-2.6.24.noarch/drivers/ssb/embedded.c
---- /dev/null	2008-02-21 08:21:48.545426467 -0500
-+++ linux-2.6.24.noarch/drivers/ssb/embedded.c	2008-02-21 13:46:08.000000000 -0500
-@@ -0,0 +1,132 @@
-+/*
-+ * Sonics Silicon Backplane
-+ * Embedded systems support code
-+ *
-+ * Copyright 2005-2008, Broadcom Corporation
-+ * Copyright 2006-2008, Michael Buesch <mb at bu3sch.de>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include <linux/ssb/ssb.h>
-+#include <linux/ssb/ssb_embedded.h>
-+
-+#include "ssb_private.h"
-+
-+
-+int ssb_watchdog_timer_set(struct ssb_bus *bus, u32 ticks)
-+{
-+	if (ssb_chipco_available(&bus->chipco)) {
-+		ssb_chipco_watchdog_timer_set(&bus->chipco, ticks);
-+		return 0;
-+	}
-+	if (ssb_extif_available(&bus->extif)) {
-+		ssb_extif_watchdog_timer_set(&bus->extif, ticks);
-+		return 0;
-+	}
-+	return -ENODEV;
-+}
-+
-+u32 ssb_gpio_in(struct ssb_bus *bus, u32 mask)
-+{
-+	unsigned long flags;
-+	u32 res = 0;
-+
-+	spin_lock_irqsave(&bus->gpio_lock, flags);
-+	if (ssb_chipco_available(&bus->chipco))
-+		res = ssb_chipco_gpio_in(&bus->chipco, mask);
-+	else if (ssb_extif_available(&bus->extif))
-+		res = ssb_extif_gpio_in(&bus->extif, mask);
-+	else
-+		SSB_WARN_ON(1);
-+	spin_unlock_irqrestore(&bus->gpio_lock, flags);
-+
-+	return res;
-+}
-+EXPORT_SYMBOL(ssb_gpio_in);
-+
-+u32 ssb_gpio_out(struct ssb_bus *bus, u32 mask, u32 value)
-+{
-+	unsigned long flags;
-+	u32 res = 0;
-+
-+	spin_lock_irqsave(&bus->gpio_lock, flags);
-+	if (ssb_chipco_available(&bus->chipco))
-+		res = ssb_chipco_gpio_out(&bus->chipco, mask, value);
-+	else if (ssb_extif_available(&bus->extif))
-+		res = ssb_extif_gpio_out(&bus->extif, mask, value);
-+	else
-+		SSB_WARN_ON(1);
-+	spin_unlock_irqrestore(&bus->gpio_lock, flags);
-+
-+	return res;
-+}
-+EXPORT_SYMBOL(ssb_gpio_out);
-+
-+u32 ssb_gpio_outen(struct ssb_bus *bus, u32 mask, u32 value)
-+{
-+	unsigned long flags;
-+	u32 res = 0;
-+
-+	spin_lock_irqsave(&bus->gpio_lock, flags);
-+	if (ssb_chipco_available(&bus->chipco))
-+		res = ssb_chipco_gpio_outen(&bus->chipco, mask, value);
-+	else if (ssb_extif_available(&bus->extif))
-+		res = ssb_extif_gpio_outen(&bus->extif, mask, value);
-+	else
-+		SSB_WARN_ON(1);
-+	spin_unlock_irqrestore(&bus->gpio_lock, flags);
-+
-+	return res;
-+}
-+EXPORT_SYMBOL(ssb_gpio_outen);
-+
-+u32 ssb_gpio_control(struct ssb_bus *bus, u32 mask, u32 value)
-+{
-+	unsigned long flags;
-+	u32 res = 0;
-+
-+	spin_lock_irqsave(&bus->gpio_lock, flags);
-+	if (ssb_chipco_available(&bus->chipco))
-+		res = ssb_chipco_gpio_control(&bus->chipco, mask, value);
-+	spin_unlock_irqrestore(&bus->gpio_lock, flags);
-+
-+	return res;
-+}
-+EXPORT_SYMBOL(ssb_gpio_control);
-+
-+u32 ssb_gpio_intmask(struct ssb_bus *bus, u32 mask, u32 value)
-+{
-+	unsigned long flags;
-+	u32 res = 0;
-+
-+	spin_lock_irqsave(&bus->gpio_lock, flags);
-+	if (ssb_chipco_available(&bus->chipco))
-+		res = ssb_chipco_gpio_intmask(&bus->chipco, mask, value);
-+	else if (ssb_extif_available(&bus->extif))
-+		res = ssb_extif_gpio_intmask(&bus->extif, mask, value);
-+	else
-+		SSB_WARN_ON(1);
-+	spin_unlock_irqrestore(&bus->gpio_lock, flags);
-+
-+	return res;
-+}
-+EXPORT_SYMBOL(ssb_gpio_intmask);
-+
-+u32 ssb_gpio_polarity(struct ssb_bus *bus, u32 mask, u32 value)
-+{
-+	unsigned long flags;
-+	u32 res = 0;
-+
-+	spin_lock_irqsave(&bus->gpio_lock, flags);
-+	if (ssb_chipco_available(&bus->chipco))
-+		res = ssb_chipco_gpio_polarity(&bus->chipco, mask, value);
-+	else if (ssb_extif_available(&bus->extif))
-+		res = ssb_extif_gpio_polarity(&bus->extif, mask, value);
-+	else
-+		SSB_WARN_ON(1);
-+	spin_unlock_irqrestore(&bus->gpio_lock, flags);
-+
-+	return res;
-+}
-+EXPORT_SYMBOL(ssb_gpio_polarity);
-diff -up linux-2.6.24.noarch/drivers/ssb/driver_extif.c.orig linux-2.6.24.noarch/drivers/ssb/driver_extif.c
---- linux-2.6.24.noarch/drivers/ssb/driver_extif.c.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/ssb/driver_extif.c	2008-02-21 13:46:08.000000000 -0500
-@@ -27,12 +27,14 @@ static inline void extif_write32(struct 
- 	ssb_write32(extif->dev, offset, value);
- }
- 
--static inline void extif_write32_masked(struct ssb_extif *extif, u16 offset,
--					u32 mask, u32 value)
-+static inline u32 extif_write32_masked(struct ssb_extif *extif, u16 offset,
-+				       u32 mask, u32 value)
- {
- 	value &= mask;
- 	value |= extif_read32(extif, offset) & ~mask;
- 	extif_write32(extif, offset, value);
-+
-+	return value;
- }
- 
- #ifdef CONFIG_SSB_SERIAL
-@@ -110,20 +112,35 @@ void ssb_extif_get_clockcontrol(struct s
- 	*m = extif_read32(extif, SSB_EXTIF_CLOCK_SB);
- }
- 
-+void ssb_extif_watchdog_timer_set(struct ssb_extif *extif,
-+				  u32 ticks)
-+{
-+	extif_write32(extif, SSB_EXTIF_WATCHDOG, ticks);
-+}
++	depends on SSB_PCIHOST
++	default n
 +
- u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask)
- {
- 	return extif_read32(extif, SSB_EXTIF_GPIO_IN) & mask;
- }
- 
--void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value)
-+u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value)
- {
- 	return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUT(0),
- 				   mask, value);
- }
- 
--void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value)
-+u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value)
- {
- 	return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUTEN(0),
- 				   mask, value);
- }
- 
-+u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value)
-+{
-+	return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTPOL, mask, value);
-+}
-+
-+u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value)
-+{
-+	return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTMASK, mask, value);
-+}
-diff -up linux-2.6.24.noarch/drivers/ssb/driver_pcicore.c.orig linux-2.6.24.noarch/drivers/ssb/driver_pcicore.c
---- linux-2.6.24.noarch/drivers/ssb/driver_pcicore.c.orig	2008-01-24 17:58:37.000000000 -0500
-+++ linux-2.6.24.noarch/drivers/ssb/driver_pcicore.c	2008-02-21 13:46:08.000000000 -0500
-@@ -11,6 +11,7 @@
- #include <linux/ssb/ssb.h>
- #include <linux/pci.h>
- #include <linux/delay.h>
-+#include <linux/ssb/ssb_embedded.h>
- 
- #include "ssb_private.h"
- 
-@@ -27,6 +28,18 @@ void pcicore_write32(struct ssb_pcicore 
- 	ssb_write32(pc->dev, offset, value);
- }
- 
-+static inline
-+u16 pcicore_read16(struct ssb_pcicore *pc, u16 offset)
-+{
-+	return ssb_read16(pc->dev, offset);
-+}
-+
-+static inline
-+void pcicore_write16(struct ssb_pcicore *pc, u16 offset, u16 value)
-+{
-+	ssb_write16(pc->dev, offset, value);
-+}
-+
- /**************************************************
-  * Code for hostmode operation.
-  **************************************************/
-@@ -66,6 +79,7 @@ int pcibios_plat_dev_init(struct pci_dev
- 			base = &ssb_pcicore_pcibus_iobase;
- 		else
- 			base = &ssb_pcicore_pcibus_membase;
-+		res->flags |= IORESOURCE_PCI_FIXED;
- 		if (res->end) {
- 			size = res->end - res->start + 1;
- 			if (*base & (size - 1))
-@@ -88,10 +102,12 @@ int pcibios_plat_dev_init(struct pci_dev
- 
- static void __init ssb_fixup_pcibridge(struct pci_dev *dev)
- {
-+	u8 lat;
-+
- 	if (dev->bus->number != 0 || PCI_SLOT(dev->devfn) != 0)
- 		return;
- 
--	ssb_printk(KERN_INFO "PCI: fixing up bridge\n");
-+	ssb_printk(KERN_INFO "PCI: Fixing up bridge %s\n", pci_name(dev));
- 
- 	/* Enable PCI bridge bus mastering and memory space */
- 	pci_set_master(dev);
-@@ -101,7 +117,10 @@ static void __init ssb_fixup_pcibridge(s
- 	pci_write_config_dword(dev, SSB_BAR1_CONTROL, 3);
- 
- 	/* Make sure our latency is high enough to handle the devices behind us */
--	pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0xa8);
-+	lat = 168;
-+	ssb_printk(KERN_INFO "PCI: Fixing latency timer of device %s to %u\n",
-+		   pci_name(dev), lat);
-+	pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
- }
- DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, ssb_fixup_pcibridge);
- 
-@@ -117,8 +136,10 @@ static u32 get_cfgspace_addr(struct ssb_
- 	u32 addr = 0;
- 	u32 tmp;
- 
--	if (unlikely(pc->cardbusmode && dev > 1))
-+	/* We do only have one cardbus device behind the bridge. */
-+	if (pc->cardbusmode && (dev >= 1))
- 		goto out;
-+
- 	if (bus == 0) {
- 		/* Type 0 transaction */
- 		if (unlikely(dev >= SSB_PCI_SLOT_MAX))
-@@ -279,14 +300,14 @@ static struct resource ssb_pcicore_mem_r
- 	.name	= "SSB PCIcore external memory",
- 	.start	= SSB_PCI_DMA,
- 	.end	= SSB_PCI_DMA + SSB_PCI_DMA_SZ - 1,
--	.flags	= IORESOURCE_MEM,
-+	.flags	= IORESOURCE_MEM | IORESOURCE_PCI_FIXED,
- };
- 
- static struct resource ssb_pcicore_io_resource = {
- 	.name	= "SSB PCIcore external I/O",
- 	.start	= 0x100,
- 	.end	= 0x7FF,
--	.flags	= IORESOURCE_IO,
-+	.flags	= IORESOURCE_IO | IORESOURCE_PCI_FIXED,
- };
- 
- static struct pci_controller ssb_pcicore_controller = {
-@@ -318,7 +339,16 @@ static void ssb_pcicore_init_hostmode(st
- 	pcicore_write32(pc, SSB_PCICORE_ARBCTL, val);
- 	udelay(1); /* Assertion time demanded by the PCI standard */
- 
--	/*TODO cardbus mode */
-+	if (pc->dev->bus->has_cardbus_slot) {
-+		ssb_dprintk(KERN_INFO PFX "CardBus slot detected\n");
-+		pc->cardbusmode = 1;
-+		/* GPIO 1 resets the bridge */
-+		ssb_gpio_out(pc->dev->bus, 1, 1);
-+		ssb_gpio_outen(pc->dev->bus, 1, 1);
-+		pcicore_write16(pc, SSB_PCICORE_SPROM(0),
-+				pcicore_read16(pc, SSB_PCICORE_SPROM(0))
-+				| 0x0400);
-+	}
- 
- 	/* 64MB I/O window */
- 	pcicore_write32(pc, SSB_PCICORE_SBTOPCI0,
-@@ -344,7 +374,8 @@ static void ssb_pcicore_init_hostmode(st
- 	/* Ok, ready to run, register it to the system.
- 	 * The following needs change, if we want to port hostmode
- 	 * to non-MIPS platform. */
--	set_io_port_base((unsigned long)ioremap_nocache(SSB_PCI_MEM, 0x04000000));
-+	ssb_pcicore_controller.io_map_base = (unsigned long)ioremap_nocache(SSB_PCI_MEM, 0x04000000);
-+	set_io_port_base(ssb_pcicore_controller.io_map_base);
- 	/* Give some time to the PCI controller to configure itself with the new
- 	 * values. Not waiting at this point causes crashes of the machine. */
- 	mdelay(10);
+ config SSB_PCMCIAHOST_POSSIBLE
+ 	bool
+ 	depends on SSB && (PCMCIA = y || PCMCIA = SSB) && EXPERIMENTAL




More information about the fedora-extras-commits mailing list