rpms/kernel/F-8 linux-2.6-wireless-pending.patch, 1.11, 1.12 config-generic, 1.35, 1.36 kernel.spec, 1.257, 1.258 linux-2.6-at76.patch, 1.3, 1.4 linux-2.6-ath5k.patch, 1.5, 1.6 linux-2.6-wireless.patch, 1.10, 1.11 linux-2.6-zd1211rw-mac80211.patch, 1.4, 1.5 linux-2.6-ath5k-fixes.patch, 1.4, NONE linux-2.6-iwlwifi-fixes.patch, 1.4, NONE linux-2.6-mac80211-decryption-noise.patch, 1.1, NONE linux-2.6-mac80211-extras.patch, 1.3, NONE linux-2.6-wireless-fixes.patch, 1.3, NONE

John W. Linville (linville) fedora-extras-commits at redhat.com
Thu Nov 8 22:06:32 UTC 2007


Author: linville

Update of /cvs/pkgs/rpms/kernel/F-8
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv4260

Modified Files:
	config-generic kernel.spec linux-2.6-at76.patch 
	linux-2.6-ath5k.patch linux-2.6-wireless.patch 
	linux-2.6-zd1211rw-mac80211.patch 
Added Files:
	linux-2.6-wireless-pending.patch 
Removed Files:
	linux-2.6-ath5k-fixes.patch linux-2.6-iwlwifi-fixes.patch 
	linux-2.6-mac80211-decryption-noise.patch 
	linux-2.6-mac80211-extras.patch linux-2.6-wireless-fixes.patch 
Log Message:
Resync wireless bits from current upstream

linux-2.6-wireless-pending.patch:

View full diff with command:
/usr/bin/cvs -f diff  -kk -u -N -r 1.11 -r 1.12 linux-2.6-wireless-pending.patch
Index: linux-2.6-wireless-pending.patch
===================================================================
RCS file: linux-2.6-wireless-pending.patch
diff -N linux-2.6-wireless-pending.patch
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ linux-2.6-wireless-pending.patch	8 Nov 2007 22:06:16 -0000	1.12
@@ -0,0 +1,19239 @@
+diff -up linux-2.6.23.noarch/drivers/net/wireless/atmel.c.orig linux-2.6.23.noarch/drivers/net/wireless/atmel.c
+--- linux-2.6.23.noarch/drivers/net/wireless/atmel.c.orig	2007-11-07 21:55:46.000000000 -0500
++++ linux-2.6.23.noarch/drivers/net/wireless/atmel.c	2007-11-07 22:04:40.000000000 -0500
+@@ -1761,7 +1761,7 @@ static int atmel_set_encode(struct net_d
+ 			priv->default_key = index;
+ 		} else
+ 			/* Don't complain if only change the mode */
+-			if (!dwrq->flags & IW_ENCODE_MODE) {
++			if (!(dwrq->flags & IW_ENCODE_MODE)) {
+ 				return -EINVAL;
+ 			}
+ 	}
+diff -up linux-2.6.23.noarch/drivers/net/wireless/p54pci.c.orig linux-2.6.23.noarch/drivers/net/wireless/p54pci.c
+--- linux-2.6.23.noarch/drivers/net/wireless/p54pci.c.orig	2007-11-07 21:55:59.000000000 -0500
++++ linux-2.6.23.noarch/drivers/net/wireless/p54pci.c	2007-11-07 22:04:40.000000000 -0500
+@@ -141,6 +141,7 @@ static irqreturn_t p54p_simple_interrupt
+ static int p54p_read_eeprom(struct ieee80211_hw *dev)
+ {
+ 	struct p54p_priv *priv = dev->priv;
++	struct p54p_ring_control *ring_control = priv->ring_control;
+ 	int err;
+ 	struct p54_control_hdr *hdr;
+ 	void *eeprom;
+@@ -164,7 +165,7 @@ static int p54p_read_eeprom(struct ieee8
+ 		goto out;
+ 	}
+ 
+-	memset(priv->ring_control, 0, sizeof(*priv->ring_control));
++	memset(ring_control, 0, sizeof(*ring_control));
+ 	P54P_WRITE(ring_control_base, priv->ring_control_dma);
+ 	P54P_READ(ring_control_base);
+ 	udelay(10);
+@@ -194,14 +195,14 @@ static int p54p_read_eeprom(struct ieee8
+ 	tx_mapping = pci_map_single(priv->pdev, (void *)hdr,
+ 				    EEPROM_READBACK_LEN, PCI_DMA_TODEVICE);
+ 
+-	priv->ring_control->rx_mgmt[0].host_addr = cpu_to_le32(rx_mapping);
+-	priv->ring_control->rx_mgmt[0].len = cpu_to_le16(0x2010);
+-	priv->ring_control->tx_data[0].host_addr = cpu_to_le32(tx_mapping);
+-	priv->ring_control->tx_data[0].device_addr = hdr->req_id;
+-	priv->ring_control->tx_data[0].len = cpu_to_le16(EEPROM_READBACK_LEN);
++	ring_control->rx_mgmt[0].host_addr = cpu_to_le32(rx_mapping);
++	ring_control->rx_mgmt[0].len = cpu_to_le16(0x2010);
++	ring_control->tx_data[0].host_addr = cpu_to_le32(tx_mapping);
++	ring_control->tx_data[0].device_addr = hdr->req_id;
++	ring_control->tx_data[0].len = cpu_to_le16(EEPROM_READBACK_LEN);
+ 
+-	priv->ring_control->host_idx[2] = cpu_to_le32(1);
+-	priv->ring_control->host_idx[1] = cpu_to_le32(1);
++	ring_control->host_idx[2] = cpu_to_le32(1);
++	ring_control->host_idx[1] = cpu_to_le32(1);
+ 
+ 	wmb();
+ 	mdelay(100);
+@@ -215,8 +216,8 @@ static int p54p_read_eeprom(struct ieee8
+ 	pci_unmap_single(priv->pdev, rx_mapping,
+ 			 0x2010, PCI_DMA_FROMDEVICE);
+ 
+-	alen = le16_to_cpu(priv->ring_control->rx_mgmt[0].len);
+-	if (le32_to_cpu(priv->ring_control->device_idx[2]) != 1 ||
++	alen = le16_to_cpu(ring_control->rx_mgmt[0].len);
++	if (le32_to_cpu(ring_control->device_idx[2]) != 1 ||
+ 	    alen < 0x10) {
+ 		printk(KERN_ERR "%s (prism54pci): Cannot read eeprom!\n",
+ 		       pci_name(priv->pdev));
+@@ -239,16 +240,17 @@ static int p54p_read_eeprom(struct ieee8
+ static void p54p_refill_rx_ring(struct ieee80211_hw *dev)
+ {
+ 	struct p54p_priv *priv = dev->priv;
++	struct p54p_ring_control *ring_control = priv->ring_control;
+ 	u32 limit, host_idx, idx;
+ 
+-	host_idx = le32_to_cpu(priv->ring_control->host_idx[0]);
++	host_idx = le32_to_cpu(ring_control->host_idx[0]);
+ 	limit = host_idx;
+-	limit -= le32_to_cpu(priv->ring_control->device_idx[0]);
+-	limit = ARRAY_SIZE(priv->ring_control->rx_data) - limit;
++	limit -= le32_to_cpu(ring_control->device_idx[0]);
++	limit = ARRAY_SIZE(ring_control->rx_data) - limit;
+ 
+-	idx = host_idx % ARRAY_SIZE(priv->ring_control->rx_data);
++	idx = host_idx % ARRAY_SIZE(ring_control->rx_data);
+ 	while (limit-- > 1) {
+-		struct p54p_desc *desc = &priv->ring_control->rx_data[idx];
++		struct p54p_desc *desc = &ring_control->rx_data[idx];
+ 
+ 		if (!desc->host_addr) {
+ 			struct sk_buff *skb;
+@@ -270,17 +272,18 @@ static void p54p_refill_rx_ring(struct i
+ 
+ 		idx++;
+ 		host_idx++;
+-		idx %= ARRAY_SIZE(priv->ring_control->rx_data);
++		idx %= ARRAY_SIZE(ring_control->rx_data);
+ 	}
+ 
+ 	wmb();
+-	priv->ring_control->host_idx[0] = cpu_to_le32(host_idx);
++	ring_control->host_idx[0] = cpu_to_le32(host_idx);
+ }
+ 
+ static irqreturn_t p54p_interrupt(int irq, void *dev_id)
+ {
+ 	struct ieee80211_hw *dev = dev_id;
+ 	struct p54p_priv *priv = dev->priv;
++	struct p54p_ring_control *ring_control = priv->ring_control;
+ 	__le32 reg;
+ 
+ 	spin_lock(&priv->lock);
+@@ -298,12 +301,12 @@ static irqreturn_t p54p_interrupt(int ir
+ 		struct p54p_desc *desc;
+ 		u32 idx, i;
+ 		i = priv->tx_idx;
+-		i %= ARRAY_SIZE(priv->ring_control->tx_data);
+-		priv->tx_idx = idx = le32_to_cpu(priv->ring_control->device_idx[1]);
+-		idx %= ARRAY_SIZE(priv->ring_control->tx_data);
++		i %= ARRAY_SIZE(ring_control->tx_data);
++		priv->tx_idx = idx = le32_to_cpu(ring_control->device_idx[1]);
++		idx %= ARRAY_SIZE(ring_control->tx_data);
+ 
+ 		while (i != idx) {
+-			desc = &priv->ring_control->tx_data[i];
++			desc = &ring_control->tx_data[i];
+ 			if (priv->tx_buf[i]) {
+ 				kfree(priv->tx_buf[i]);
+ 				priv->tx_buf[i] = NULL;
+@@ -318,17 +321,17 @@ static irqreturn_t p54p_interrupt(int ir
+ 			desc->flags = 0;
+ 
+ 			i++;
+-			i %= ARRAY_SIZE(priv->ring_control->tx_data);
++			i %= ARRAY_SIZE(ring_control->tx_data);
+ 		}
+ 
+ 		i = priv->rx_idx;
+-		i %= ARRAY_SIZE(priv->ring_control->rx_data);
+-		priv->rx_idx = idx = le32_to_cpu(priv->ring_control->device_idx[0]);
+-		idx %= ARRAY_SIZE(priv->ring_control->rx_data);
++		i %= ARRAY_SIZE(ring_control->rx_data);
++		priv->rx_idx = idx = le32_to_cpu(ring_control->device_idx[0]);
++		idx %= ARRAY_SIZE(ring_control->rx_data);
+ 		while (i != idx) {
+ 			u16 len;
+ 			struct sk_buff *skb;
+-			desc = &priv->ring_control->rx_data[i];
++			desc = &ring_control->rx_data[i];
+ 			len = le16_to_cpu(desc->len);
+ 			skb = priv->rx_buf[i];
+ 
+@@ -347,7 +350,7 @@ static irqreturn_t p54p_interrupt(int ir
+ 			}
+ 
+ 			i++;
+-			i %= ARRAY_SIZE(priv->ring_control->rx_data);
++			i %= ARRAY_SIZE(ring_control->rx_data);
+ 		}
+ 
+ 		p54p_refill_rx_ring(dev);
+@@ -366,6 +369,7 @@ static void p54p_tx(struct ieee80211_hw 
+ 		    size_t len, int free_on_tx)
+ {
+ 	struct p54p_priv *priv = dev->priv;
++	struct p54p_ring_control *ring_control = priv->ring_control;
+ 	unsigned long flags;
+ 	struct p54p_desc *desc;
+ 	dma_addr_t mapping;
+@@ -373,19 +377,19 @@ static void p54p_tx(struct ieee80211_hw 
+ 
+ 	spin_lock_irqsave(&priv->lock, flags);
+ 
+-	device_idx = le32_to_cpu(priv->ring_control->device_idx[1]);
+-	idx = le32_to_cpu(priv->ring_control->host_idx[1]);
+-	i = idx % ARRAY_SIZE(priv->ring_control->tx_data);
++	device_idx = le32_to_cpu(ring_control->device_idx[1]);
++	idx = le32_to_cpu(ring_control->host_idx[1]);
++	i = idx % ARRAY_SIZE(ring_control->tx_data);
+ 
+ 	mapping = pci_map_single(priv->pdev, data, len, PCI_DMA_TODEVICE);
+-	desc = &priv->ring_control->tx_data[i];
++	desc = &ring_control->tx_data[i];
+ 	desc->host_addr = cpu_to_le32(mapping);
+ 	desc->device_addr = data->req_id;
+ 	desc->len = cpu_to_le16(len);
+ 	desc->flags = 0;
+ 
+ 	wmb();
+-	priv->ring_control->host_idx[1] = cpu_to_le32(idx + 1);
++	ring_control->host_idx[1] = cpu_to_le32(idx + 1);
+ 
+ 	if (free_on_tx)
+ 		priv->tx_buf[i] = data;
+@@ -397,7 +401,7 @@ static void p54p_tx(struct ieee80211_hw 
+ 
[...18846 lines suppressed...]
++				break;
++			/* Bit rate given in 500 kb/s units (+ 0x80) */
++			iwe.u.bitrate.value = ((bss->p.rates[i] & 0x7f) * 500000);
++			current_val = iwe_stream_add_value(current_ev, current_val,
++							   end_buf, &iwe,
++							   IW_EV_PARAM_LEN);
++		}
++		/* Check if we added any event */
++		if ((current_val - current_ev) > IW_EV_LCP_LEN)
++			current_ev = current_val;
+ 	}
+-	return current_ev - buffer;
++
++	return current_ev;
+ }
+ 
+ /* Return results of a scan */
+@@ -4078,68 +4166,45 @@ static int orinoco_ioctl_getscan(struct 
+ 				 char *extra)
+ {
+ 	struct orinoco_private *priv = netdev_priv(dev);
++	bss_element *bss;
+ 	int err = 0;
+ 	unsigned long flags;
++	char *current_ev = extra;
+ 
+ 	if (orinoco_lock(priv, &flags) != 0)
+ 		return -EBUSY;
+ 
+-	/* If no results yet, ask to try again later */
+-	if (priv->scan_result == NULL) {
+-		if (priv->scan_inprogress)
+-			/* Important note : we don't want to block the caller
+-			 * until results are ready for various reasons.
+-			 * First, managing wait queues is complex and racy.
+-			 * Second, we grab some rtnetlink lock before comming
+-			 * here (in dev_ioctl()).
+-			 * Third, we generate an Wireless Event, so the
+-			 * caller can wait itself on that - Jean II */
+-			err = -EAGAIN;
+-		else
+-			/* Client error, no scan results...
+-			 * The caller need to restart the scan. */
+-			err = -ENODATA;
+-	} else {
+-		/* We have some results to push back to user space */
+-
+-		/* Translate to WE format */
+-		int ret = orinoco_translate_scan(dev, extra,
+-						 priv->scan_result,
+-						 priv->scan_len);
+-
+-		if (ret < 0) {
+-			err = ret;
+-			kfree(priv->scan_result);
+-			priv->scan_result = NULL;
+-		} else {
+-			srq->length = ret;
+-
+-			/* Return flags */
+-			srq->flags = (__u16) priv->scan_mode;
+-
+-			/* In any case, Scan results will be cleaned up in the
+-			 * reset function and when exiting the driver.
+-			 * The person triggering the scanning may never come to
+-			 * pick the results, so we need to do it in those places.
+-			 * Jean II */
++	if (priv->scan_inprogress) {
++		/* Important note : we don't want to block the caller
++		 * until results are ready for various reasons.
++		 * First, managing wait queues is complex and racy.
++		 * Second, we grab some rtnetlink lock before comming
++		 * here (in dev_ioctl()).
++		 * Third, we generate an Wireless Event, so the
++		 * caller can wait itself on that - Jean II */
++		err = -EAGAIN;
++		goto out;
++	}
+ 
+-#ifdef SCAN_SINGLE_READ
+-			/* If you enable this option, only one client (the first
+-			 * one) will be able to read the result (and only one
+-			 * time). If there is multiple concurent clients that
+-			 * want to read scan results, this behavior is not
+-			 * advisable - Jean II */
+-			kfree(priv->scan_result);
+-			priv->scan_result = NULL;
+-#endif /* SCAN_SINGLE_READ */
+-			/* Here, if too much time has elapsed since last scan,
+-			 * we may want to clean up scan results... - Jean II */
++	list_for_each_entry(bss, &priv->bss_list, list) {
++		/* Translate to WE format this entry */
++		current_ev = orinoco_translate_scan(dev, current_ev,
++						    extra + srq->length,
++						    &bss->bss,
++						    bss->last_scanned);
++
++		/* Check if there is space for one more entry */
++		if ((extra + srq->length - current_ev) <= IW_EV_ADDR_LEN) {
++			/* Ask user space to try again with a bigger buffer */
++			err = -E2BIG;
++			goto out;
+ 		}
+-
+-		/* Scan is no longer in progress */
+-		priv->scan_inprogress = 0;
+ 	}
+-	  
++
++	srq->length = (current_ev - extra);
++	srq->flags = (__u16) priv->scan_mode;
++
++out:
+ 	orinoco_unlock(priv, &flags);
+ 	return err;
+ }
+diff -up linux-2.6.23.noarch/net/ieee80211/ieee80211_wx.c.orig linux-2.6.23.noarch/net/ieee80211/ieee80211_wx.c
+--- linux-2.6.23.noarch/net/ieee80211/ieee80211_wx.c.orig	2007-11-07 21:55:46.000000000 -0500
++++ linux-2.6.23.noarch/net/ieee80211/ieee80211_wx.c	2007-11-07 22:04:40.000000000 -0500
+@@ -708,7 +708,7 @@ int ieee80211_wx_get_encodeext(struct ie
+ 	} else
+ 		idx = ieee->tx_keyidx;
+ 
+-	if (!ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY &&
++	if (!(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) &&
+ 	    ext->alg != IW_ENCODE_ALG_WEP)
+ 		if (idx != 0 || ieee->iw_mode != IW_MODE_INFRA)
+ 			return -EINVAL;
+diff -up linux-2.6.23.noarch/net/mac80211/ieee80211_ioctl.c.orig linux-2.6.23.noarch/net/mac80211/ieee80211_ioctl.c
+--- linux-2.6.23.noarch/net/mac80211/ieee80211_ioctl.c.orig	2007-11-07 21:55:59.000000000 -0500
++++ linux-2.6.23.noarch/net/mac80211/ieee80211_ioctl.c	2007-11-07 22:04:40.000000000 -0500
+@@ -633,22 +633,35 @@ static int ieee80211_ioctl_siwtxpower(st
+ {
+ 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+ 	bool need_reconfig = 0;
++	u8 new_power_level;
+ 
+ 	if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
+ 		return -EINVAL;
+ 	if (data->txpower.flags & IW_TXPOW_RANGE)
+ 		return -EINVAL;
+-	if (!data->txpower.fixed)
+-		return -EINVAL;
+ 
+-	if (local->hw.conf.power_level != data->txpower.value) {
+-		local->hw.conf.power_level = data->txpower.value;
++	if (data->txpower.fixed) {
++		new_power_level = data->txpower.value;
++	} else {
++		/* Automatic power level. Get the px power from the current
++		 * channel. */
++		struct ieee80211_channel* chan = local->oper_channel;
++		if (!chan)
++			return -EINVAL;
++
++		new_power_level = chan->power_level;
++	}
++
++	if (local->hw.conf.power_level != new_power_level) {
++		local->hw.conf.power_level = new_power_level;
+ 		need_reconfig = 1;
+ 	}
++
+ 	if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) {
+ 		local->hw.conf.radio_enabled = !(data->txpower.disabled);
+ 		need_reconfig = 1;
+ 	}
++
+ 	if (need_reconfig) {
+ 		ieee80211_hw_config(local);
+ 		/* The return value of hw_config is not of big interest here,
+diff -up linux-2.6.23.noarch/include/linux/ieee80211.h.orig linux-2.6.23.noarch/include/linux/ieee80211.h
+--- linux-2.6.23.noarch/include/linux/ieee80211.h.orig	2007-11-07 21:55:59.000000000 -0500
++++ linux-2.6.23.noarch/include/linux/ieee80211.h	2007-11-07 22:04:40.000000000 -0500
+@@ -81,18 +81,18 @@
+ 
+ 
+ /* miscellaneous IEEE 802.11 constants */
+-#define IEEE80211_MAX_FRAG_THRESHOLD	2346
+-#define IEEE80211_MAX_RTS_THRESHOLD	2347
++#define IEEE80211_MAX_FRAG_THRESHOLD	2352
++#define IEEE80211_MAX_RTS_THRESHOLD	2353
+ #define IEEE80211_MAX_AID		2007
+ #define IEEE80211_MAX_TIM_LEN		251
+-#define IEEE80211_MAX_DATA_LEN		2304
+ /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
+    6.2.1.1.2.
+ 
+-   The figure in section 7.1.2 suggests a body size of up to 2312
+-   bytes is allowed, which is a bit confusing, I suspect this
+-   represents the 2304 bytes of real data, plus a possible 8 bytes of
+-   WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
++   802.11e clarifies the figure in section 7.1.2. The frame body is
++   up to 2304 octets long (maximum MSDU size) plus any crypt overhead. */
++#define IEEE80211_MAX_DATA_LEN		2304
++/* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */
++#define IEEE80211_MAX_FRAME_LEN		2352
+ 
+ #define IEEE80211_MAX_SSID_LEN		32
+ 


Index: config-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/config-generic,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- config-generic	29 Oct 2007 20:51:09 -0000	1.35
+++ config-generic	8 Nov 2007 22:06:15 -0000	1.36
@@ -1247,14 +1247,17 @@
 # CONFIG_IPW2200_DEBUG is not set
 # CONFIG_LIBERTAS is not set
 
-CONFIG_IWLWIFI=y
-CONFIG_IWLWIFI_DEBUG=y
-CONFIG_IWLWIFI_SENSITIVITY=y
-CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT=y
-CONFIG_IWLWIFI_QOS=y
-CONFIG_IWLWIFI_HT=y
 CONFIG_IWL4965=m
+CONFIG_IWL4965_DEBUG=y
+CONFIG_IWL4965_SENSITIVITY=y
+CONFIG_IWL4965_SPECTRUM_MEASUREMENT=y
+CONFIG_IWL4965_QOS=y
+CONFIG_IWL4965_HT=y
 CONFIG_IWL3945=m
+CONFIG_IWL3945_DEBUG=y
+CONFIG_IWL3945_SENSITIVITY=y
+CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y
+CONFIG_IWL3945_QOS=y
 # CONFIG_NL80211 is not set
 CONFIG_NORTEL_HERMES=m
 CONFIG_P54_COMMON=m


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/kernel.spec,v
retrieving revision 1.257
retrieving revision 1.258
diff -u -r1.257 -r1.258
--- kernel.spec	7 Nov 2007 17:15:01 -0000	1.257
+++ kernel.spec	8 Nov 2007 22:06:15 -0000	1.258
@@ -665,16 +665,11 @@
 Patch662: linux-2.6-libata-add-dma-disable-option.patch
 Patch670: linux-2.6-ata-quirk.patch
 Patch680: linux-2.6-wireless.patch
-Patch682: linux-2.6-iwlwifi-fixes.patch
+Patch681: linux-2.6-wireless-pending.patch
 Patch690: linux-2.6-at76.patch
 Patch691: linux-2.6-ath5k.patch
-Patch693: linux-2.6-ath5k-fixes.patch
-Patch693: linux-2.6-zd1211rw-mac80211.patch
-Patch694: linux-2.6-mac80211-extras.patch
-Patch695: linux-2.6-wireless-fixes.patch
-Patch696: linux-2.6-mac80211-decryption-noise.patch
-Patch700: linux-2.6-bcm43xx-pci-neuter.patch
-Patch701: linux-2.6-drivers-ssb-debug-revision.patch
+Patch692: linux-2.6-zd1211rw-mac80211.patch
+Patch700: linux-2.6-drivers-ssb-debug-revision.patch
 Patch710: linux-2.6-netdev-e1000e-01.patch
 Patch711: linux-2.6-netdev-e1000e-02.patch
 Patch712: linux-2.6-netdev-e1000e-03.patch
@@ -1264,23 +1259,14 @@
 # add option to disable PATA DMA
 ApplyPatch linux-2.6-libata-add-dma-disable-option.patch
 
-# wireless patches headed for 2.6.23
+# wireless patches headed for 2.6.24
 ApplyPatch linux-2.6-wireless.patch
-# wireless patches staged for 2.6.24
-#ApplyPatch linux-2.6-wireless-pending.patch
-# late-breaking iwlwifi fixes (will be rolled into wireless-pending patch)
-ApplyPatch linux-2.6-iwlwifi-fixes.patch
+# wireless patches staged for 2.6.25
+ApplyPatch linux-2.6-wireless-pending.patch
 # Add misc wireless bits from upstream wireless tree
 ApplyPatch linux-2.6-at76.patch
 ApplyPatch linux-2.6-ath5k.patch
-ApplyPatch linux-2.6-ath5k-fixes.patch
 ApplyPatch linux-2.6-zd1211rw-mac80211.patch
-ApplyPatch linux-2.6-mac80211-extras.patch
-ApplyPatch linux-2.6-wireless-fixes.patch
-ApplyPatch linux-2.6-mac80211-decryption-noise.patch
-
-# avoid bcm3xx vs bcm43xx-mac80211 PCI ID conflicts
-ApplyPatch linux-2.6-bcm43xx-pci-neuter.patch
 
 # debug the SSB driver
 ApplyPatch linux-2.6-drivers-ssb-debug-revision.patch
@@ -1980,6 +1966,9 @@
 
 
 %changelog
+* Thu Nov  8 2007 John W. Linville <linville at redhat.com>
+- Resync wireless bits from current upstream
+
 * Wed Nov  7 2007 Chuck Ebbert <cebbert at redhat.com>
 - md/raid5: fix misapplication of previous patch
 - net: fix panic removing devices from teql secheduler

linux-2.6-at76.patch:

Index: linux-2.6-at76.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/linux-2.6-at76.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- linux-2.6-at76.patch	5 Oct 2007 15:17:09 -0000	1.3
+++ linux-2.6-at76.patch	8 Nov 2007 22:06:15 -0000	1.4
@@ -1,6 +1,6 @@
-diff -up linux-2.6.22.noarch/MAINTAINERS.orig linux-2.6.22.noarch/MAINTAINERS
---- linux-2.6.22.noarch/MAINTAINERS.orig	2007-09-26 19:57:31.000000000 -0400
-+++ linux-2.6.22.noarch/MAINTAINERS	2007-09-26 19:59:33.000000000 -0400
+diff -up linux-2.6.23.noarch/MAINTAINERS.orig linux-2.6.23.noarch/MAINTAINERS
+--- linux-2.6.23.noarch/MAINTAINERS.orig	2007-10-19 14:41:17.000000000 -0400
++++ linux-2.6.23.noarch/MAINTAINERS	2007-10-19 14:45:38.000000000 -0400
 @@ -685,6 +685,15 @@ W:	http://www.thekelleys.org.uk/atmel
  W:	http://atmelwlandriver.sourceforge.net/
  S:	Maintained
@@ -17,10 +17,10 @@
  AUDIT SUBSYSTEM
  P:	David Woodhouse
  M:	dwmw2 at infradead.org
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/at76_usb.h
---- /dev/null	2007-09-25 08:26:55.562976333 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/at76_usb.h	2007-09-26 19:59:33.000000000 -0400
-@@ -0,0 +1,662 @@
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/at76_usb.h
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/at76_usb.h	2007-10-19 14:45:38.000000000 -0400
+@@ -0,0 +1,619 @@
 +/*
 + * Copyright (c) 2002,2003 Oliver Kurth
 + *	     (c) 2003,2004 Joerg Albert <joerg.albert at gmx.de>
@@ -45,11 +45,6 @@
 +#ifndef _AT76_USB_H
 +#define _AT76_USB_H
 +
-+#include <net/ieee80211.h>
-+
-+/* current driver version */
-+#define DRIVER_VERSION	"0.16"
-+
 +/* Board types */
 +enum board_type {
 +	BOARD_503_ISL3861 = 1,
@@ -101,9 +96,9 @@
 +#define CMD_SCAN		0x03
 +#define CMD_JOIN		0x04
 +#define CMD_START_IBSS		0x05
-+#define CMD_RADIO		0x06
++#define CMD_RADIO_ON		0x06
++#define CMD_RADIO_OFF		0x07
 +#define CMD_STARTUP		0x0B
-+#define CMD_GETOPMODE		0x33
 +
 +#define MIB_LOCAL		0x01
 +#define MIB_MAC_ADDR		0x02
@@ -268,7 +263,11 @@
 +	u8 size;
 +	u8 index;
 +	u8 reserved;
-+	u8 data[72];
++	union {
++		u8 byte;
++		__le16 word;
++		u8 addr[ETH_ALEN];
++	} data;
 +} __attribute__((packed));
 +
 +struct mib_local {
@@ -417,8 +416,7 @@
 +	struct list_head list;
 +
 +	u8 bssid[ETH_ALEN];	/* bssid */
-+	u8 ssid[IW_ESSID_MAX_SIZE + 1];	/* ssid, +1 for trailing \0
-+					   to make it printable */
++	u8 ssid[IW_ESSID_MAX_SIZE];	/* essid */
 +	u8 ssid_len;		/* length of ssid above */
 +	u8 channel;
 +	u16 capa;		/* BSS capabilities */
@@ -576,7 +574,7 @@
 +	struct set_mib_buffer mib_buf;	/* global buffer for set_mib calls */
 +
 +	/* beacon counting */
-+	int beacon_period;	/* period of mgmt beacons */
++	int beacon_period;	/* period of mgmt beacons, Kus */
 +	int beacons_received;
 +	unsigned long beacons_last_qual;	/* time we restarted counting
 +						   beacons */
@@ -641,51 +639,10 @@
 +/* the max padding size for tx in bytes (see calc_padding) */
 +#define MAX_PADDING_SIZE	53
 +
-+/* at76_debug bits */
-+#define DBG_PROGRESS		0x00000001	/* authentication/accociation */
-+#define DBG_BSS_TABLE		0x00000002	/* show BSS table after scans */
-+#define DBG_IOCTL		0x00000004	/* ioctl calls / settings */
-+#define DBG_MAC_STATE		0x00000008	/* MAC state transitions */
-+#define DBG_TX_DATA		0x00000010	/* tx header */
-+#define DBG_TX_DATA_CONTENT	0x00000020	/* tx content */
-+#define DBG_TX_MGMT		0x00000040	/* tx management */
-+#define DBG_RX_DATA		0x00000080	/* rx data header */
-+#define DBG_RX_DATA_CONTENT	0x00000100	/* rx data content */
-+#define DBG_RX_MGMT		0x00000200	/* rx mgmt frame headers */
-+#define DBG_RX_BEACON		0x00000400	/* rx beacon */
-+#define DBG_RX_CTRL		0x00000800	/* rx control */
-+#define DBG_RX_MGMT_CONTENT	0x00001000	/* rx mgmt content */
-+#define DBG_RX_FRAGS		0x00002000	/* rx data fragment handling */
-+#define DBG_DEVSTART		0x00004000	/* fw download, device start */
-+#define DBG_URB			0x00008000	/* rx urb status, ... */
-+#define DBG_RX_ATMEL_HDR	0x00010000	/* Atmel-specific Rx headers */
-+#define DBG_PROC_ENTRY		0x00020000	/* procedure entries/exits */
-+#define DBG_PM			0x00040000	/* power management settings */
-+#define DBG_BSS_MATCH		0x00080000	/* BSS match failures */
-+#define DBG_PARAMS		0x00100000	/* show configured parameters */
-+#define DBG_WAIT_COMPLETE	0x00200000	/* command completion */
-+#define DBG_RX_FRAGS_SKB	0x00400000	/* skb header of Rx fragments */
-+#define DBG_BSS_TABLE_RM	0x00800000	/* purging bss table entries */
-+#define DBG_MONITOR_MODE	0x01000000	/* monitor mode */
-+#define DBG_MIB			0x02000000	/* dump all MIBs on startup */
-+#define DBG_MGMT_TIMER		0x04000000	/* dump mgmt_timer ops */
-+#define DBG_WE_EVENTS		0x08000000	/* dump wireless events */
-+#define DBG_FW			0x10000000	/* firmware download */
-+#define DBG_DFU			0x20000000	/* device firmware upgrade */
-+
-+#define DBG_DEFAULTS		0
-+
-+/* Use our own dbg macro */
-+#define at76_dbg(bits, format, arg...) \
-+	do { \
-+		if (at76_debug & (bits)) \
-+		printk(KERN_DEBUG DRIVER_NAME ": " format "\n" , ## arg); \
-+	} while (0)
-+
 +#endif				/* _AT76_USB_H */
-diff -up linux-2.6.22.noarch/drivers/net/wireless/Makefile.orig linux-2.6.22.noarch/drivers/net/wireless/Makefile
---- linux-2.6.22.noarch/drivers/net/wireless/Makefile.orig	2007-09-26 19:57:31.000000000 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/Makefile	2007-09-26 19:59:33.000000000 -0400
+diff -up linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig linux-2.6.23.noarch/drivers/net/wireless/Makefile
+--- linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig	2007-10-19 14:41:17.000000000 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/Makefile	2007-10-19 14:45:38.000000000 -0400
 @@ -32,6 +32,8 @@ obj-$(CONFIG_ATMEL)             += atmel
  obj-$(CONFIG_PCI_ATMEL)         += atmel_pci.o 
  obj-$(CONFIG_PCMCIA_ATMEL)      += atmel_cs.o
@@ -695,10 +652,10 @@
  obj-$(CONFIG_PRISM54)		+= prism54/
  
  obj-$(CONFIG_HOSTAP)		+= hostap/
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/at76_usb.c
---- /dev/null	2007-09-25 08:26:55.562976333 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/at76_usb.c	2007-09-26 19:59:33.000000000 -0400
-@@ -0,0 +1,5553 @@
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/at76_usb.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/at76_usb.c	2007-10-19 14:45:38.000000000 -0400
+@@ -0,0 +1,5556 @@
 +/*
 + * at76c503/at76c505 USB driver
 + *
@@ -737,13 +694,56 @@
 +#include <net/ieee80211_radiotap.h>
 +#include <linux/firmware.h>
 +#include <linux/leds.h>
++#include <net/ieee80211.h>
 +
 +#include "at76_usb.h"
 +
 +/* Version information */
 +#define DRIVER_NAME "at76_usb"
++#define DRIVER_VERSION	"0.17"
 +#define DRIVER_DESC "Atmel at76x USB Wireless LAN Driver"
 +
++/* at76_debug bits */
++#define DBG_PROGRESS		0x00000001	/* authentication/accociation */
++#define DBG_BSS_TABLE		0x00000002	/* show BSS table after scans */
++#define DBG_IOCTL		0x00000004	/* ioctl calls / settings */
++#define DBG_MAC_STATE		0x00000008	/* MAC state transitions */
++#define DBG_TX_DATA		0x00000010	/* tx header */
++#define DBG_TX_DATA_CONTENT	0x00000020	/* tx content */
++#define DBG_TX_MGMT		0x00000040	/* tx management */
++#define DBG_RX_DATA		0x00000080	/* rx data header */
++#define DBG_RX_DATA_CONTENT	0x00000100	/* rx data content */
++#define DBG_RX_MGMT		0x00000200	/* rx mgmt frame headers */
++#define DBG_RX_BEACON		0x00000400	/* rx beacon */
++#define DBG_RX_CTRL		0x00000800	/* rx control */
++#define DBG_RX_MGMT_CONTENT	0x00001000	/* rx mgmt content */
++#define DBG_RX_FRAGS		0x00002000	/* rx data fragment handling */
++#define DBG_DEVSTART		0x00004000	/* fw download, device start */
++#define DBG_URB			0x00008000	/* rx urb status, ... */
++#define DBG_RX_ATMEL_HDR	0x00010000	/* Atmel-specific Rx headers */
++#define DBG_PROC_ENTRY		0x00020000	/* procedure entries/exits */
++#define DBG_PM			0x00040000	/* power management settings */
++#define DBG_BSS_MATCH		0x00080000	/* BSS match failures */
++#define DBG_PARAMS		0x00100000	/* show configured parameters */
++#define DBG_WAIT_COMPLETE	0x00200000	/* command completion */
++#define DBG_RX_FRAGS_SKB	0x00400000	/* skb header of Rx fragments */
++#define DBG_BSS_TABLE_RM	0x00800000	/* purging bss table entries */
++#define DBG_MONITOR_MODE	0x01000000	/* monitor mode */
++#define DBG_MIB			0x02000000	/* dump all MIBs on startup */
++#define DBG_MGMT_TIMER		0x04000000	/* dump mgmt_timer ops */
++#define DBG_WE_EVENTS		0x08000000	/* dump wireless events */
++#define DBG_FW			0x10000000	/* firmware download */
++#define DBG_DFU			0x20000000	/* device firmware upgrade */
++
++#define DBG_DEFAULTS		0
++
++/* Use our own dbg macro */
++#define at76_dbg(bits, format, arg...) \
++	do { \
++		if (at76_debug & (bits)) \
++		printk(KERN_DEBUG DRIVER_NAME ": " format "\n" , ## arg); \
++	} while (0)
++
 +static int at76_debug = DBG_DEFAULTS;
 +
 +/* Protect against concurrent firmware loading and parsing */
@@ -761,127 +761,137 @@
 +	[BOARD_505AMX] = {"atmel_at76c505amx-rfmd.bin"},
 +};
 +
++#define USB_DEVICE_DATA(__ops)	.driver_info = (kernel_ulong_t)(__ops)
++
 +static struct usb_device_id dev_table[] = {
 +	/*
 +	 * at76c503-i3861
 +	 */
 +	/* Generic AT76C503/3861 device */
-+	{USB_DEVICE(0x03eb, 0x7603), .driver_info = BOARD_503_ISL3861},
++	{USB_DEVICE(0x03eb, 0x7603), USB_DEVICE_DATA(BOARD_503_ISL3861)},
 +	/* Linksys WUSB11 v2.1/v2.6 */
-+	{USB_DEVICE(0x066b, 0x2211), .driver_info = BOARD_503_ISL3861},
-+	/* Netgear MA 101 Rev. A */
-+	{USB_DEVICE(0x0864, 0x4100), .driver_info = BOARD_503_ISL3861},
-+	/* Tekram U-300C / Allnet ALL0193 */
-+	{USB_DEVICE(0x0b3b, 0x1612), .driver_info = BOARD_503_ISL3861},
-+	/* HP HN210W PKW-J7801A */
-+	{USB_DEVICE(0x03f0, 0x011c), .driver_info = 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)},
++	/* Tekram U300C / Allnet ALL0193 */
++	{USB_DEVICE(0x0b3b, 0x1612), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	/* HP HN210W J7801A */
++	{USB_DEVICE(0x03f0, 0x011c), USB_DEVICE_DATA(BOARD_503_ISL3861)},
 +	/* Sitecom/Z-Com/Zyxel M4Y-750 */
-+	{USB_DEVICE(0x0cde, 0x0001), .driver_info = BOARD_503_ISL3861},
++	{USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861)},
 +	/* Dynalink/Askey WLL013 (intersil) */
-+	{USB_DEVICE(0x069a, 0x0320), .driver_info = BOARD_503_ISL3861},
-+	/* EZ connect 11Mpbs Wireless USB Adapter SMC2662W (v1) */
-+	{USB_DEVICE(0x0d5c, 0xa001), .driver_info = BOARD_503_ISL3861},
-+	/* AWL-300 */
-+	{USB_DEVICE(0x04a5, 0x9000), .driver_info = BOARD_503_ISL3861},
-+	/* AWU-120, Compex WLU11 */
-+	{USB_DEVICE(0x05dd, 0xff31), .driver_info = BOARD_503_ISL3861},
-+	/* AP310 AnyPoint II USB */
-+	{USB_DEVICE(0x8086, 0x0200), .driver_info = 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)},
++	/* BenQ AWL300 */
++	{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)},
++	/* Intel AP310 AnyPoint II USB */
++	{USB_DEVICE(0x8086, 0x0200), USB_DEVICE_DATA(BOARD_503_ISL3861)},
 +	/* Dynalink L11U */
-+	{USB_DEVICE(0x0d8e, 0x7100), .driver_info = BOARD_503_ISL3861},
++	{USB_DEVICE(0x0d8e, 0x7100), USB_DEVICE_DATA(BOARD_503_ISL3861)},
 +	/* Arescom WL-210, FCC id 07J-GL2411USB */
-+	{USB_DEVICE(0x0d8e, 0x7110), .driver_info = BOARD_503_ISL3861},
-+	/* IO-DATA WN-B11/USB */
-+	{USB_DEVICE(0x04bb, 0x0919), .driver_info = 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)},
 +	/* BT Voyager 1010 */
-+	{USB_DEVICE(0x069a, 0x0821), .driver_info = BOARD_503_ISL3861},
-+	/* at76c503-i3863 */
++	{USB_DEVICE(0x069a, 0x0821), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++	/*
++	 * at76c503-i3863
++	 */
 +	/* Generic AT76C503/3863 device */
-+	{USB_DEVICE(0x03eb, 0x7604), .driver_info = BOARD_503_ISL3863},
++	{USB_DEVICE(0x03eb, 0x7604), USB_DEVICE_DATA(BOARD_503_ISL3863)},
 +	/* Samsung SWL-2100U */
-+	{USB_DEVICE(0x055d, 0xa000), .driver_info = BOARD_503_ISL3863},
++	{USB_DEVICE(0x055d, 0xa000), USB_DEVICE_DATA(BOARD_503_ISL3863)},
 +	/*
 +	 * at76c503-rfmd
 +	 */
 +	/* Generic AT76C503/RFMD device */
-+	{USB_DEVICE(0x03eb, 0x7605), .driver_info = BOARD_503},
++	{USB_DEVICE(0x03eb, 0x7605), USB_DEVICE_DATA(BOARD_503)},
 +	/* Dynalink/Askey WLL013 (rfmd) */
-+	{USB_DEVICE(0x069a, 0x0321), .driver_info = BOARD_503},
++	{USB_DEVICE(0x069a, 0x0321), USB_DEVICE_DATA(BOARD_503)},
 +	/* Linksys WUSB11 v2.6 */
-+	{USB_DEVICE(0x077b, 0x2219), .driver_info = BOARD_503},
++	{USB_DEVICE(0x077b, 0x2219), USB_DEVICE_DATA(BOARD_503)},
 +	/* Network Everywhere NWU11B */
-+	{USB_DEVICE(0x077b, 0x2227), .driver_info = BOARD_503},
-+	/* Netgear MA 101 Rev. B */
-+	{USB_DEVICE(0x0864, 0x4102), .driver_info = BOARD_503},
-+	/* DWL-120 rev. E */
-+	{USB_DEVICE(0x2001, 0x3200), .driver_info = BOARD_503},
++	{USB_DEVICE(0x077b, 0x2227), USB_DEVICE_DATA(BOARD_503)},
++	/* Netgear MA101 rev. B */
++	{USB_DEVICE(0x0864, 0x4102), USB_DEVICE_DATA(BOARD_503)},
++	/* D-Link DWL-120 rev. E */
++	{USB_DEVICE(0x2001, 0x3200), USB_DEVICE_DATA(BOARD_503)},
 +	/* Actiontec 802UAT1, HWU01150-01UK */
-+	{USB_DEVICE(0x1668, 0x7605), .driver_info = BOARD_503},
++	{USB_DEVICE(0x1668, 0x7605), USB_DEVICE_DATA(BOARD_503)},
 +	/* AirVast W-Buddie WN210 */
-+	{USB_DEVICE(0x03eb, 0x4102), .driver_info = BOARD_503},
-+	/* XH1153 802.11b USB adapter */
-+	{USB_DEVICE(0x1371, 0x5743), .driver_info = BOARD_503},
-+	/* WL-200U */
-+	{USB_DEVICE(0x1371, 0x0002), .driver_info = BOARD_503},
-+	/* BenQ AWL-400 USB stick */
-+	{USB_DEVICE(0x04a5, 0x9001), .driver_info = BOARD_503},
-+	/* 3COM 3CRSHEW696 */
-+	{USB_DEVICE(0x0506, 0x0a01), .driver_info = 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)},
++	/* CNet CNUSB611 */
++	{USB_DEVICE(0x1371, 0x0001), USB_DEVICE_DATA(BOARD_503)},
++	/* FiberLine FL-WL200U */
++	{USB_DEVICE(0x1371, 0x0002), USB_DEVICE_DATA(BOARD_503)},
++	/* BenQ AWL400 USB stick */
++	{USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503)},
++	/* 3Com 3CRSHEW696 */
++	{USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503)},
 +	/* Siemens Santis ADSL WLAN USB adapter WLL 013 */
-+	{USB_DEVICE(0x0681, 0x001b), .driver_info = BOARD_503},
++	{USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503)},
 +	/* Belkin F5D6050, version 2 */
-+	{USB_DEVICE(0x050d, 0x0050), .driver_info = BOARD_503},
++	{USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503)},
 +	/* iBlitzz, BWU613 (not *B or *SB) */
-+	{USB_DEVICE(0x07b8, 0xb000), .driver_info = BOARD_503},
++	{USB_DEVICE(0x07b8, 0xb000), USB_DEVICE_DATA(BOARD_503)},
 +	/* Gigabyte GN-WLBM101 */
-+	{USB_DEVICE(0x1044, 0x8003), .driver_info = BOARD_503},
++	{USB_DEVICE(0x1044, 0x8003), USB_DEVICE_DATA(BOARD_503)},
 +	/* Planex GW-US11S */
-+	{USB_DEVICE(0x2019, 0x3220), .driver_info = 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), .driver_info = 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)},
++	/* Corega Wireless LAN USB-11 mini2 */
++	{USB_DEVICE(0x07aa, 0x0018), USB_DEVICE_DATA(BOARD_503)},
 +	/*
 +	 * at76c503-rfmd-acc
 +	 */
-+	/* SMC 2664W */
-+	{USB_DEVICE(0x083a, 0x3501), .driver_info = BOARD_503_ACC},
-+	/* Belkin F5D6050, SMC 2662W v2, SMC 2662W-AR */
-+	{USB_DEVICE(0x0d5c, 0xa002), .driver_info = BOARD_503_ACC},
++	/* SMC2664W */
++	{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)},
 +	/*
 +	 * at76c505-rfmd
 +	 */
 +	/* Generic AT76C505/RFMD */
-+	{USB_DEVICE(0x03eb, 0x7606), .driver_info = BOARD_505},
++	{USB_DEVICE(0x03eb, 0x7606), USB_DEVICE_DATA(BOARD_505)},
 +	/*
 +	 * at76c505-rfmd2958
 +	 */
 +	/* Generic AT76C505/RFMD, OvisLink WL-1130USB */
-+	{USB_DEVICE(0x03eb, 0x7613), .driver_info = BOARD_505_2958},
-+	/* Fiberline WL-240U */
-+	{USB_DEVICE(0x1371, 0x0014), .driver_info = BOARD_505_2958},
-+	/* CNet CNUSB 611G */
-+	{USB_DEVICE(0x1371, 0x0013), .driver_info = 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)},
++	/* CNet CNUSB-611G */
++	{USB_DEVICE(0x1371, 0x0013), USB_DEVICE_DATA(BOARD_505_2958)},
 +	/* Linksys WUSB11 v2.8 */
-+	{USB_DEVICE(0x1915, 0x2233), .driver_info = BOARD_505_2958},
++	{USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958)},
 +	/* Xterasys XN-2122B, IBlitzz BWU613B/BWU613SB */
-+	{USB_DEVICE(0x12fd, 0x1001), .driver_info = BOARD_505_2958},
++	{USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958)},
 +	/* Corega WLAN USB Stick 11 */
-+	{USB_DEVICE(0x07aa, 0x7613), .driver_info = BOARD_505_2958},
++	{USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958)},
 +	/* Microstar MSI Box MS6978 */
-+	{USB_DEVICE(0x0db0, 0x1020), .driver_info = BOARD_505_2958},
++	{USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958)},
 +	/*
 +	 * at76c505a-rfmd2958
 +	 */
 +	/* Generic AT76C505A device */
-+	{USB_DEVICE(0x03eb, 0x7614), .driver_info = BOARD_505A},
++	{USB_DEVICE(0x03eb, 0x7614), USB_DEVICE_DATA(BOARD_505A)},
 +	/* Generic AT76C505AS device */
-+	{USB_DEVICE(0x03eb, 0x7617), .driver_info = BOARD_505A},
++	{USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A)},
 +	/* Siemens Gigaset USB WLAN Adapter 11 */
-+	{USB_DEVICE(0x1690, 0x0701), .driver_info = BOARD_505A},
++	{USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A)},
 +	/*
 +	 * at76c505amx-rfmd
 +	 */
 +	/* Generic AT76C505AMX device */
-+	{USB_DEVICE(0x03eb, 0x7615), .driver_info = BOARD_505AMX},
++	{USB_DEVICE(0x03eb, 0x7615), USB_DEVICE_DATA(BOARD_505AMX)},
 +	{}
 +};
 +
@@ -896,6 +906,8 @@
 +	2447, 2452, 2457, 2462, 2467, 2472, 2484
 +};
 +
++#define NUM_CHANNELS ARRAY_SIZE(channel_frequency)
++
 +static const char *const preambles[] = { "long", "short", "auto" };
 +
 +static const char *const mac_states[] = {
@@ -908,8 +920,6 @@
 +	[MAC_OWN_IBSS] = "OWN_IBSS"
 +};
 +
-+#define NUM_CHANNELS ARRAY_SIZE(channel_frequency)
-+
 +/* Firmware download */
 +/* DFU states */
 +#define STATE_IDLE			0x00
@@ -989,16 +999,16 @@
 +	return ret;
 +}
 +
-+static inline u32 at76_get_timeout(struct dfu_status *s)
++/* Convert timeout from the DFU status to jiffies */
++static inline unsigned long at76_get_timeout(struct dfu_status *s)
 +{
-+	u32 ret = (s->poll_timeout[2] << 16) | (s->poll_timeout[1] << 8) |
-+	    (s->poll_timeout[0]);
-+
-+	return ret;
++	return msecs_to_jiffies((s->poll_timeout[2] << 16)
++				| (s->poll_timeout[1] << 8)
++				| (s->poll_timeout[0]));
 +}
 +
 +/* Load internal firmware from the buffer.  If manifest_sync_timeout > 0, use
-+ * its value in msec in the MANIFEST_SYNC state.  */
++ * its value in jiffies in the MANIFEST_SYNC state.  */
 +static int at76_usbdfu_download(struct usb_device *udev, u8 *buf, u32 size,
 +				int manifest_sync_timeout)
 +{
@@ -1016,7 +1026,7 @@
 +		 manifest_sync_timeout);
 +
 +	if (!size) {
-+		err("FW Buffer length invalid!");
++		dev_printk(KERN_ERR, &udev->dev, "FW buffer length invalid!\n");
 +		return -EINVAL;
 +	}
 +
@@ -1028,7 +1038,8 @@
 +		if (need_dfu_state) {
 +			ret = at76_dfu_get_state(udev, &dfu_state);
 +			if (ret < 0) {
-+				err("DFU: Failed to get DFU state: %d", ret);
++				dev_printk(KERN_ERR, &udev->dev,
++					   "cannot get DFU state: %d\n", ret);
 +				goto exit;
 +			}
 +			need_dfu_state = 0;
@@ -1043,7 +1054,9 @@
 +				dfu_timeout = at76_get_timeout(&dfu_stat_buf);
 +				need_dfu_state = 0;
 +			} else
-+				err("at76_dfu_get_status failed with %d", ret);
++				dev_printk(KERN_ERR, &udev->dev,
++					   "at76_dfu_get_status returned %d\n",
++					   ret);
 +			break;
 +
 +		case STATE_DFU_DOWNLOAD_BUSY:
@@ -1051,8 +1064,7 @@
 +			need_dfu_state = 1;
 +
 +			at76_dbg(DBG_DFU, "DFU: Resetting device");
-+			schedule_timeout_interruptible(msecs_to_jiffies
-+						       (dfu_timeout));
++			schedule_timeout_interruptible(dfu_timeout);
 +			break;
 +
 +		case STATE_DFU_DOWNLOAD_IDLE:
@@ -1073,7 +1085,9 @@
 +			blockno++;
 +
 +			if (ret != bsize)
-+				err("dfu_download_block failed with %d", ret);
++				dev_printk(KERN_ERR, &udev->dev,
++					   "at76_load_int_fw_block "
++					   "returned %d\n", ret);
 +			need_dfu_state = 1;
 +			break;
 +
@@ -1094,8 +1108,7 @@
 +				dfu_timeout = manifest_sync_timeout;
 +
 +			at76_dbg(DBG_DFU, "DFU: Waiting for manifest phase");
-+			schedule_timeout_interruptible(msecs_to_jiffies
-+						       (dfu_timeout));
++			schedule_timeout_interruptible(dfu_timeout);
 +			break;
 +
 +		case STATE_DFU_MANIFEST:
@@ -1160,7 +1173,7 @@
 +	union iwreq_data wrqu;
 +	wrqu.data.length = 0;
 +	wrqu.data.flags = 0;
-+	memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
++	memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
 +	wrqu.ap_addr.sa_family = ARPHRD_ETHER;
 +	wireless_send_event(netdev, SIOCGIWAP, &wrqu, NULL);
 +	at76_dbg(DBG_WE_EVENTS, "%s: %s: SIOCGIWAP sent", netdev->name,
@@ -1226,7 +1239,7 @@
 +	if (tx_lastactivity != tx_activity) {
 +		tx_lastactivity = tx_activity;
 +		led_trigger_event(ledtrig_tx, LED_FULL);
-+		mod_timer(&ledtrig_tx_timer, jiffies + msecs_to_jiffies(250));
++		mod_timer(&ledtrig_tx_timer, jiffies + HZ / 4);
 +	} else
 +		led_trigger_event(ledtrig_tx, LED_OFF);
 +}
@@ -1235,7 +1248,7 @@
 +{
 +	tx_activity++;
 +	if (!timer_pending(&ledtrig_tx_timer))
-+		mod_timer(&ledtrig_tx_timer, jiffies + msecs_to_jiffies(250));
++		mod_timer(&ledtrig_tx_timer, jiffies + HZ / 4);
 +}
 +
 +/* Check if the given ssid is hidden */
@@ -1362,7 +1375,8 @@
 +exit:
 +	kfree(hwcfg);
 +	if (ret < 0)
-+		err("Get HW Config failed (%d)", ret);
++		printk(KERN_ERR "%s: cannot get HW Config (error %d)\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
@@ -1465,15 +1479,14 @@
 +/* Wait until the command is completed */
 +static int at76_wait_completion(struct at76_priv *priv, int cmd)
 +{
-+	struct net_device *netdev = priv->netdev;
 +	int status = 0;
 +	unsigned long timeout = jiffies + CMD_COMPLETION_TIMEOUT;
 +
 +	do {
 +		status = at76_get_cmd_status(priv->udev, cmd);
 +		if (status < 0) {
-+			err("%s: at76_get_cmd_status failed: %d", netdev->name,
-+			    status);
++			printk(KERN_ERR "%s: at76_get_cmd_status failed: %d\n",
++			       priv->netdev->name, status);
 +			break;
 +		}
 +
@@ -1488,8 +1501,9 @@
 +
 +		schedule_timeout_interruptible(HZ / 10);	/* 100 ms */
 +		if (time_after(jiffies, timeout)) {
-+			err("%s: timeout waiting for cmd %d completion",
-+			    netdev->name, cmd);
++			printk(KERN_ERR
++			       "%s: completion timeout for command %d\n",
++			       priv->netdev->name, cmd);
 +			status = -ETIMEDOUT;
 +			break;
 +		}
@@ -1520,21 +1534,24 @@
 +}
 +
 +/* Return < 0 on error, == 0 if no command sent, == 1 if cmd sent */
-+static int at76_set_radio(struct at76_priv *priv, int on_off)
++static int at76_set_radio(struct at76_priv *priv, int enable)
 +{
 +	int ret;
++	int cmd;
 +
-+	if (priv->radio_on == on_off)
++	if (priv->radio_on == enable)
 +		return 0;
 +
-+	ret = at76_set_card_command(priv->udev, CMD_RADIO, NULL, 0);
++	cmd = enable ? CMD_RADIO_ON : CMD_RADIO_OFF;
++
++	ret = at76_set_card_command(priv->udev, cmd, NULL, 0);
 +	if (ret < 0)
-+		err("%s: at76_set_card_command(CMD_RADIO) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: at76_set_card_command(%d) failed: %d\n",
++		       priv->netdev->name, cmd, ret);
 +	else
 +		ret = 1;
 +
-+	priv->radio_on = on_off;
++	priv->radio_on = enable;
 +	return ret;
 +}
 +
@@ -1543,17 +1560,15 @@
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC_MGMT;
 +	priv->mib_buf.size = 1;
 +	priv->mib_buf.index = offsetof(struct mib_mac_mgmt, power_mgmt_mode);
-+
-+	priv->mib_buf.data[0] = priv->pm_mode;
++	priv->mib_buf.data.byte = priv->pm_mode;
 +
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (pm_mode) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: set_mib (pm_mode) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
@@ -1563,17 +1578,15 @@
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC_MGMT;
 +	priv->mib_buf.size = 2;
 +	priv->mib_buf.index = offsetof(struct mib_mac_mgmt, station_id);
-+
-+	*(__le16 *)priv->mib_buf.data = cpu_to_le16(id);
++	priv->mib_buf.data.word = cpu_to_le16(id);
 +
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (associd) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: set_mib (associd) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
@@ -1583,17 +1596,16 @@
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC;
 +	priv->mib_buf.size = 2;
 +	priv->mib_buf.index = offsetof(struct mib_mac, listen_interval);
-+
-+	*(__le16 *)priv->mib_buf.data = cpu_to_le16(interval);
++	priv->mib_buf.data.word = cpu_to_le16(interval);
 +
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (listen_interval) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR
++		       "%s: set_mib (listen_interval) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
@@ -1602,15 +1614,15 @@
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_LOCAL;
 +	priv->mib_buf.size = 1;
 +	priv->mib_buf.index = offsetof(struct mib_local, preamble_type);
-+	priv->mib_buf.data[0] = type;
++	priv->mib_buf.data.byte = type;
++
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (preamble) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: set_mib (preamble) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
@@ -1619,15 +1631,15 @@
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC;
 +	priv->mib_buf.size = 2;
 +	priv->mib_buf.index = offsetof(struct mib_mac, frag_threshold);
-+	*(__le16 *)priv->mib_buf.data = cpu_to_le16(size);
++	priv->mib_buf.data.word = cpu_to_le16(size);
++
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (frag threshold) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: set_mib (frag threshold) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
@@ -1636,14 +1648,15 @@
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC;
 +	priv->mib_buf.size = 2;
 +	priv->mib_buf.index = offsetof(struct mib_mac, rts_threshold);
-+	*(__le16 *)priv->mib_buf.data = cpu_to_le16(size);
++	priv->mib_buf.data.word = cpu_to_le16(size);
++
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (rts) failed: %d", priv->netdev->name, ret);
++		printk(KERN_ERR "%s: set_mib (rts) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
@@ -1652,83 +1665,35 @@
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_LOCAL;
 +	priv->mib_buf.size = 1;
 +	priv->mib_buf.index = offsetof(struct mib_local, txautorate_fallback);
-+	priv->mib_buf.data[0] = onoff;
++	priv->mib_buf.data.byte = onoff;
++
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (autorate fallback) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: set_mib (autorate fallback) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
 +
-+/* Set network device type for the current mode */
-+static void at76_set_monitor_mode(struct at76_priv *priv)
-+{
-+	if (priv->iw_mode == IW_MODE_MONITOR) {
-+		at76_dbg(DBG_MONITOR_MODE, "%s: MONITOR MODE ON",
-+			 priv->netdev->name);
-+		priv->netdev->type = ARPHRD_IEEE80211_RADIOTAP;
-+	} else {
-+		at76_dbg(DBG_MONITOR_MODE, "%s: MONITOR MODE OFF",
-+			 priv->netdev->name);
-+		priv->netdev->type = ARPHRD_ETHER;
-+	}
-+}
-+
 +static int at76_add_mac_address(struct at76_priv *priv, void *addr)
 +{
 +	int ret = 0;
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC_ADDR;
 +	priv->mib_buf.size = ETH_ALEN;
 +	priv->mib_buf.index = offsetof(struct mib_mac_addr, mac_addr);
-+	memcpy(priv->mib_buf.data, addr, ETH_ALEN);
-+	ret = at76_set_mib(priv, &priv->mib_buf);
-+	if (ret < 0)
-+		err("%s: set_mib (MAC_ADDR, mac_addr) failed: %d",
-+		    priv->netdev->name, ret);
-+
-+	return ret;
-+}
++	memcpy(priv->mib_buf.data.addr, addr, ETH_ALEN);
 +
-+#if 0
-+/* Implemented to get promisc. mode working, but does not help.
-+   May still be useful for multicast eventually. */
-+static int at76_set_group_address(struct at76_priv *priv, u8 *addr, int n)
-+{
-+	int ret = 0;
-+
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
-+	priv->mib_buf.type = MIB_MAC_ADDR;
-+	priv->mib_buf.size = ETH_ALEN;
-+	priv->mib_buf.index =
-+	    offsetof(struct mib_mac_addr, group_addr) + n * ETH_ALEN;
-+	memcpy(priv->mib_buf.data, addr, ETH_ALEN);
-+	ret = at76_set_mib(priv, &priv->mib_buf);
-+	if (ret < 0)
-+		err("%s: set_mib (MIB_MAC_ADDR, group_addr) failed: %d",
-+		    priv->netdev->name, ret);
-+
-+	/* I do not know anything about the group_addr_status field... (oku) */
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
-+	priv->mib_buf.type = MIB_MAC_ADDR;
-+	priv->mib_buf.size = 1;
-+	priv->mib_buf.index =
-+	    offsetof(struct mib_mac_addr, group_addr_status) + n;
-+	priv->mib_buf.data[0] = 1;
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (MIB_MAC_ADDR, group_addr_status) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: set_mib (MAC_ADDR, mac_addr) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	return ret;
 +}
-+#endif
 +
 +static void at76_dump_mib_mac_addr(struct at76_priv *priv)
 +{
@@ -1743,8 +1708,8 @@
 +	ret = at76_get_mib(priv->udev, MIB_MAC_ADDR, m,
 +			   sizeof(struct mib_mac_addr));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib (MAC_ADDR) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: at76_get_mib (MAC_ADDR) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
@@ -1772,8 +1737,8 @@
 +	ret = at76_get_mib(priv->udev, MIB_MAC_WEP, m,
 +			   sizeof(struct mib_mac_wep));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib (MAC_WEP) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: at76_get_mib (MAC_WEP) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
@@ -1802,7 +1767,6 @@
 +	int ret;
 +	struct mib_mac_mgmt *m = kmalloc(sizeof(struct mib_mac_mgmt),
 +					 GFP_KERNEL);
-+	char country_string[4];
 +
 +	if (!m)
 +		return;
@@ -1810,21 +1774,18 @@
 +	ret = at76_get_mib(priv->udev, MIB_MAC_MGMT, m,
 +			   sizeof(struct mib_mac_mgmt));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib (MAC_MGMT) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: at76_get_mib (MAC_MGMT) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
-+	memcpy(&country_string, m->country_string, 3);
-+	country_string[3] = '\0';
-+
 +	at76_dbg(DBG_MIB, "%s: MIB MAC_MGMT: beacon_period %d CFP_max_duration "
 +		 "%d medium_occupancy_limit %d station_id 0x%x ATIM_window %d "
 +		 "CFP_mode %d privacy_opt_impl %d DTIM_period %d CFP_period %d "
 +		 "current_bssid %s current_essid %s current_bss_type %d "
 +		 "pm_mode %d ibss_change %d res %d "
 +		 "multi_domain_capability_implemented %d "
-+		 "international_roaming %d country_string %s",
++		 "international_roaming %d country_string %.3s",
 +		 priv->netdev->name, le16_to_cpu(m->beacon_period),
 +		 le16_to_cpu(m->CFP_max_duration),
 +		 le16_to_cpu(m->medium_occupancy_limit),
@@ -1834,7 +1795,7 @@
 +		 hex2str(m->current_essid, IW_ESSID_MAX_SIZE),
 +		 m->current_bss_type, m->power_mgmt_mode, m->ibss_change,
 +		 m->res, m->multi_domain_capability_implemented,
-+		 m->multi_domain_capability_enabled, country_string);
++		 m->multi_domain_capability_enabled, m->country_string);
 +exit:
 +	kfree(m);
 +}
@@ -1849,8 +1810,8 @@
 +
 +	ret = at76_get_mib(priv->udev, MIB_MAC, m, sizeof(struct mib_mac));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib (MAC) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: at76_get_mib (MAC) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
@@ -1885,8 +1846,8 @@
 +
 +	ret = at76_get_mib(priv->udev, MIB_PHY, m, sizeof(struct mib_phy));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib (PHY) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: at76_get_mib (PHY) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
@@ -1918,8 +1879,8 @@
 +
 +	ret = at76_get_mib(priv->udev, MIB_LOCAL, m, sizeof(struct mib_local));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib (LOCAL) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: at76_get_mib (LOCAL) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
@@ -1943,8 +1904,8 @@
 +	ret = at76_get_mib(priv->udev, MIB_MDOMAIN, m,
 +			   sizeof(struct mib_mdomain));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib (MDOMAIN) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: at76_get_mib (MDOMAIN) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
@@ -1973,7 +1934,8 @@
 +	ret = at76_get_mib(priv->udev, MIB_MAC_MGMT, mac_mgmt,
 +			   sizeof(struct mib_mac_mgmt));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib failed: %d", priv->netdev->name, ret);
++		printk(KERN_ERR "%s: at76_get_mib failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto error;
 +	}
 +	memcpy(priv->bssid, mac_mgmt->current_bssid, ETH_ALEN);
@@ -1996,8 +1958,8 @@
 +	}
 +	ret = at76_get_mib(priv->udev, MIB_PHY, phy, sizeof(struct mib_phy));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib(MIB_PHY) failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: at76_get_mib(MIB_PHY) failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto error;
 +	}
 +	priv->channel = phy->channel_id;
@@ -2094,14 +2056,15 @@
 +	ret = at76_set_card_command(priv->udev, CMD_START_IBSS, &bss,
 +				    sizeof(struct at76_req_ibss));
 +	if (ret < 0) {
-+		err("%s: start_ibss failed: %d", priv->netdev->name, ret);
++		printk(KERN_ERR "%s: start_ibss failed: %d\n",
++		       priv->netdev->name, ret);
 +		return ret;
 +	}
 +
 +	ret = at76_wait_completion(priv, CMD_START_IBSS);
 +	if (ret != CMD_STATUS_COMPLETE) {
-+		err("%s start_ibss failed to complete, %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: start_ibss failed to complete, %d\n",
++		       priv->netdev->name, ret);
 +		return ret;
 +	}
 +
@@ -2114,14 +2077,15 @@
 +		return ret;
 +
 +	/* not sure what this is good for ??? */
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC_MGMT;
 +	priv->mib_buf.size = 1;
 +	priv->mib_buf.index = offsetof(struct mib_mac_mgmt, ibss_change);
++	priv->mib_buf.data.byte = 0;
++
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0) {
-+		err("%s: set_mib (ibss change ok) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: set_mib (ibss change ok) failed: %d\n",
++		       priv->netdev->name, ret);
 +		return ret;
 +	}
 +
@@ -2231,8 +2195,8 @@
 +			  AT76_TX_HDRLEN, at76_tx_callback, priv);
 +	ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
 +	if (ret)
-+		err("%s: %s error in tx submit urb: %d",
-+		    priv->netdev->name, __func__, ret);
++		printk(KERN_ERR "%s: error in tx submit urb: %d\n",
++		       priv->netdev->name, ret);
 +
 +	kfree(mgmt_buf);
 +}
@@ -2262,18 +2226,19 @@
 +		/* a data/mgmt tx is already pending in the URB -
 +		   if this is no error in some situations we must
 +		   implement a queue or silently modify the old msg */
-+		err("%s: %s removed pending mgmt buffer %s", priv->netdev->name,
-+		    __func__, hex2str(oldbuf, 64));
++		printk(KERN_ERR "%s: removed pending mgmt buffer %s\n",
++		       priv->netdev->name, hex2str(oldbuf, 64));
 +		kfree(oldbuf);
 +		return 0;
 +	}
 +
-+	txbuf->tx_rate = 0;
++	txbuf->tx_rate = TX_RATE_1MBIT;
 +	txbuf->padding = at76_calc_padding(le16_to_cpu(txbuf->wlength));
++	memset(txbuf->reserved, 0, sizeof(txbuf->reserved));
 +
 +	if (priv->next_mgmt_bulk)
-+		err("%s: %s URB status %d, but mgmt is pending",
-+		    priv->netdev->name, __func__, urb_status);
++		printk(KERN_ERR "%s: URB status %d, but mgmt is pending\n",
++		       priv->netdev->name, urb_status);
 +
 +	at76_dbg(DBG_TX_MGMT,
 +		 "%s: tx mgmt: wlen %d tx_rate %d pad %d %s",
@@ -2290,8 +2255,8 @@
 +			  AT76_TX_HDRLEN, at76_tx_callback, priv);
 +	ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
 +	if (ret)
-+		err("%s: %s error in tx submit urb: %d",
-+		    priv->netdev->name, __func__, ret);
++		printk(KERN_ERR "%s: error in tx submit urb: %d\n",
++		       priv->netdev->name, ret);
 +
 +	kfree(txbuf);
 +
@@ -2364,9 +2329,9 @@
 +	struct at76_tx_buffer *tx_buffer;
 +	struct ieee80211_hdr_3addr *mgmt;
 +	struct ieee80211_assoc_request *req;
-+	struct ieee80211_info_element *tlv;
-+	char essid[IW_ESSID_MAX_SIZE + 1];
-+	int len;
++	struct ieee80211_info_element *ie;
++	char *essid;
++	int essid_len;
 +	u16 capa;
 +
 +	BUG_ON(!bss);
@@ -2377,7 +2342,7 @@
 +
 +	req = (struct ieee80211_assoc_request *)tx_buffer->packet;
 +	mgmt = &req->header;
-+	tlv = req->info_element;
++	ie = req->info_element;
 +
 +	/* make wireless header */
 +	mgmt->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_MGMT |
@@ -2404,29 +2369,29 @@
 +
 +	/* write TLV data elements */
 +
-+	tlv->id = MFIE_TYPE_SSID;
-+	tlv->len = bss->ssid_len;
-+	memcpy(tlv->data, bss->ssid, bss->ssid_len);
-+	next_ie(&tlv);
-+
-+	tlv->id = MFIE_TYPE_RATES;
-+	tlv->len = sizeof(hw_rates);
-+	memcpy(tlv->data, hw_rates, sizeof(hw_rates));
-+	next_ie(&tlv);		/* tlv points behind the supp_rates field */
++	ie->id = MFIE_TYPE_SSID;
++	ie->len = bss->ssid_len;
++	memcpy(ie->data, bss->ssid, bss->ssid_len);
++	next_ie(&ie);
++
++	ie->id = MFIE_TYPE_RATES;
++	ie->len = sizeof(hw_rates);
++	memcpy(ie->data, hw_rates, sizeof(hw_rates));
++	next_ie(&ie);		/* ie points behind the supp_rates field */
 +
 +	/* init. at76_priv tx header */
-+	tx_buffer->wlength = cpu_to_le16((u8 *)tlv - (u8 *)mgmt);
++	tx_buffer->wlength = cpu_to_le16((u8 *)ie - (u8 *)mgmt);
 +
-+	tlv = req->info_element;
-+	len = min_t(int, IW_ESSID_MAX_SIZE, tlv->len);
-+	memcpy(essid, tlv->data, len);
-+	essid[len] = '\0';
-+	next_ie(&tlv);		/* points to IE of rates now */
++	ie = req->info_element;
++	essid = ie->data;
++	essid_len = min_t(int, IW_ESSID_MAX_SIZE, ie->len);
++
++	next_ie(&ie);		/* points to IE of rates now */
 +	at76_dbg(DBG_TX_MGMT,
-+		 "%s: AssocReq bssid %s capa 0x%04x ssid %s rates %s",
++		 "%s: AssocReq bssid %s capa 0x%04x ssid %.*s rates %s",
 +		 priv->netdev->name, mac2str(mgmt->addr3),
-+		 le16_to_cpu(req->capability), essid,
-+		 hex2str(tlv->data, tlv->len));
++		 le16_to_cpu(req->capability), essid_len, essid,
++		 hex2str(ie->data, ie->len));
 +
 +	/* either send immediately (if no data tx is pending
 +	   or put it in pending list */
@@ -2483,13 +2448,12 @@
 +
 +	list_for_each(lptr, &priv->bss_list) {
 +		ptr = list_entry(lptr, struct bss_info, list);
-+		at76_dbg(DBG_BSS_TABLE,
-+			 "0x%p: bssid %s channel %d ssid %s (%s)"
-+			 " capa 0x%04x rates %s rssi %d link %d noise %d", ptr,
-+			 mac2str(ptr->bssid), ptr->channel, ptr->ssid,
-+			 hex2str(ptr->ssid, ptr->ssid_len), ptr->capa,
-+			 hex2str(ptr->rates, ptr->rates_len), ptr->rssi,
-+			 ptr->link_qual, ptr->noise_level);
++		at76_dbg(DBG_BSS_TABLE, "0x%p: bssid %s channel %d ssid %.*s "
++			 "(%s) capa 0x%04x rates %s rssi %d link %d noise %d",
++			 ptr, mac2str(ptr->bssid), ptr->channel, ptr->ssid_len,
++			 ptr->ssid, hex2str(ptr->ssid, ptr->ssid_len),
++			 ptr->capa, hex2str(ptr->rates, ptr->rates_len),
++			 ptr->rssi, ptr->link_qual, ptr->noise_level);
 +	}
 +	spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
 +}
@@ -3148,8 +3112,6 @@
 +		data->flags = 1;
 +		data->length = priv->essid_size;
 +		memcpy(extra, priv->essid, data->length);
-+		extra[data->length] = '\0';
-+		data->length += 1;
 +	} else {
 +		/* the ANY ssid was specified */
 +		if (priv->mac_state == MAC_CONNECTED && priv->curr_bss) {
@@ -3157,8 +3119,6 @@
 +			data->flags = 1;
 +			data->length = priv->curr_bss->ssid_len;
 +			memcpy(extra, priv->curr_bss->ssid, data->length);
-+			extra[priv->curr_bss->ssid_len] = '\0';
-+			data->length += 1;
 +		} else {
 +			/* report ANY back */
 +			data->flags = 0;
@@ -3166,7 +3126,8 @@
 +		}
 +	}
 +
-+	at76_dbg(DBG_IOCTL, "%s: SIOCGIWESSID - %s", netdev->name, extra);
++	at76_dbg(DBG_IOCTL, "%s: SIOCGIWESSID - %.*s", netdev->name,
++		 data->length, extra);
 +
 +	return 0;
 +}
@@ -3808,24 +3769,24 @@
 +	struct ethhdr *eh = (struct ethhdr *)skb->data;
 +
 +	if (netif_queue_stopped(netdev)) {
-+		err("%s: %s called while netdev is stopped", netdev->name,
-+		    __func__);
++		printk(KERN_ERR "%s: %s called while netdev is stopped\n",
++		       netdev->name, __func__);
 +		/* skip this packet */
 +		dev_kfree_skb(skb);
 +		return 0;
 +	}
 +
 +	if (priv->tx_urb->status == -EINPROGRESS) {
-+		err("%s: %s called while priv->tx_urb is pending for tx",
-+		    netdev->name, __func__);
++		printk(KERN_ERR "%s: %s called while tx urb is pending\n",
++		       netdev->name, __func__);
 +		/* skip this packet */
 +		dev_kfree_skb(skb);
 +		return 0;
 +	}
 +
 +	if (skb->len < ETH_HLEN) {
-+		err("%s: %s: skb too short (%d)", priv->netdev->name,
-+		    __func__, skb->len);
++		printk(KERN_ERR "%s: %s: skb too short (%d)\n",
++		       netdev->name, __func__, skb->len);
 +		dev_kfree_skb(skb);
 +		return 0;
 +	}
@@ -3845,11 +3806,11 @@
 +			       skb->len - ETH_HLEN);
 +			wlen = IEEE80211_3ADDR_LEN + skb->len - ETH_HLEN;
 +		} else {
-+			err("%s: %s: no support for non-SNAP 802.2 packets "
-+			    "(DSAP 0x%02x SSAP 0x%02x cntrl 0x%02x)",
-+			    priv->netdev->name, __func__,
-+			    skb->data[ETH_HLEN], skb->data[ETH_HLEN + 1],
-+			    skb->data[ETH_HLEN + 2]);
++			printk(KERN_ERR "%s: dropping non-SNAP 802.2 packet "
++			       "(DSAP 0x%02x SSAP 0x%02x cntrl 0x%02x)\n",
++			       priv->netdev->name, skb->data[ETH_HLEN],
++			       skb->data[ETH_HLEN + 1],
++			       skb->data[ETH_HLEN + 2]);
 +			dev_kfree_skb(skb);
 +			return 0;
 +		}
@@ -3889,7 +3850,7 @@
 +	   seems to choose the highest rate set with CMD_STARTUP in
 +	   basic_rate_set replacing this value */
 +
-+	memset(tx_buffer->reserved, 0, 4);
++	memset(tx_buffer->reserved, 0, sizeof(tx_buffer->reserved));
 +
 +	tx_buffer->padding = at76_calc_padding(wlen);
 +	submit_len = wlen + AT76_TX_HDRLEN + tx_buffer->padding;
@@ -3913,11 +3874,13 @@
 +	ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
 +	if (ret) {
 +		stats->tx_errors++;
-+		err("%s: error in tx submit urb: %d", netdev->name, ret);
++		printk(KERN_ERR "%s: error in tx submit urb: %d\n",
++		       netdev->name, ret);
 +		if (ret == -EINVAL)
-+			err("-EINVAL: urb %p urb->hcpriv %p urb->complete %p",
-+			    priv->tx_urb, priv->tx_urb->hcpriv,
-+			    priv->tx_urb->complete);
++			printk(KERN_ERR
++			       "%s: -EINVAL: tx urb %p hcpriv %p complete %p\n",
++			       priv->netdev->name, priv->tx_urb,
++			       priv->tx_urb->hcpriv, priv->tx_urb->complete);
 +	} else {
 +		stats->tx_bytes += skb->len;
 +		dev_kfree_skb(skb);
@@ -3945,15 +3908,16 @@
 +	struct sk_buff *skb = priv->rx_skb;
 +
 +	if (!priv->rx_urb) {
-+		err("%s: priv->rx_urb is NULL", __func__);
++		printk(KERN_ERR "%s: %s: priv->rx_urb is NULL\n",
++		       priv->netdev->name, __func__);
 +		return -EFAULT;
 +	}
 +
 +	if (!skb) {
 +		skb = dev_alloc_skb(sizeof(struct at76_rx_buffer));
 +		if (!skb) {
-+			err("%s: unable to allocate rx skbuff.",
-+			    priv->netdev->name);
++			printk(KERN_ERR "%s: cannot allocate rx skbuff\n",
++			       priv->netdev->name);
 +			ret = -ENOMEM;
 +			goto exit;
 +		}
@@ -3972,8 +3936,8 @@
 +			at76_dbg(DBG_DEVSTART,
 +				 "usb_submit_urb returned -ENODEV");
 +		else
-+			err("%s: rx, usb_submit_urb failed: %d",
-+			    priv->netdev->name, ret);
++			printk(KERN_ERR "%s: rx, usb_submit_urb failed: %d\n",
++			       priv->netdev->name, ret);
 +	}
 +
 +exit:
@@ -4008,7 +3972,8 @@
 +
 +	ret = at76_submit_rx_urb(priv);
 +	if (ret < 0) {
-+		err("%s: open: submit_rx_urb failed: %d", netdev->name, ret);
++		printk(KERN_ERR "%s: open: submit_rx_urb failed: %d\n",
++		       netdev->name, ret);
 +		goto error;
 +	}
 +
@@ -4055,14 +4020,12 @@
 +{
 +	struct at76_priv *priv = netdev_priv(netdev);
 +
-+	strncpy(info->driver, DRIVER_NAME, sizeof(info->driver) - 1);
-+
++	strncpy(info->driver, DRIVER_NAME, sizeof(info->driver));
 +	strncpy(info->version, DRIVER_VERSION, sizeof(info->version));
-+	info->version[sizeof(info->version) - 1] = '\0';
 +
 +	usb_make_path(priv->udev, info->bus_info, sizeof(info->bus_info));
 +
-+	snprintf(info->fw_version, sizeof(info->fw_version) - 1, "%d.%d.%d-%d",
++	snprintf(info->fw_version, sizeof(info->fw_version), "%d.%d.%d-%d",
 +		 priv->fw_version.major, priv->fw_version.minor,
 +		 priv->fw_version.patch, priv->fw_version.build);
 +}
@@ -4096,7 +4059,8 @@
 +	at76_dbg(DBG_DEVSTART, "opmode %d", op_mode);
 +
 +	if (op_mode != OPMODE_NORMAL_NIC_WITHOUT_FLASH) {
-+		err("unexpected opmode %d", op_mode);
++		dev_printk(KERN_ERR, &udev->dev, "unexpected opmode %d\n",
++			   op_mode);
 +		return -EINVAL;
 +	}
 +
@@ -4115,8 +4079,9 @@
 +			 size, bsize, blockno);
 +		ret = at76_load_ext_fw_block(udev, blockno, block, bsize);
 +		if (ret != bsize) {
-+			err("loading %dth firmware block failed: %d", blockno,
-+			    ret);
++			dev_printk(KERN_ERR, &udev->dev,
++				   "loading %dth firmware block failed: %d\n",
++				   blockno, ret);
 +			goto exit;
 +		}
 +		buf += bsize;
@@ -4132,7 +4097,8 @@
 +exit:
 +	kfree(block);
 +	if (ret < 0)
-+		err("Downloading external firmware failed: %d", ret);
++		dev_printk(KERN_ERR, &udev->dev,
++			   "downloading external firmware failed: %d\n", ret);
 +	return ret;
 +}
 +
@@ -4143,10 +4109,11 @@
 +	int need_remap = !at76_is_505a(fwe->board_type);
 +
 +	ret = at76_usbdfu_download(udev, fwe->intfw, fwe->intfw_size,
-+				   need_remap ? 0 : 2000);
++				   need_remap ? 0 : 2 * HZ);
 +
 +	if (ret < 0) {
-+		err("downloading internal fw failed with %d", ret);
++		dev_printk(KERN_ERR, &udev->dev,
++			   "downloading internal fw failed with %d\n", ret);
 +		goto exit;
 +	}
 +
@@ -4156,7 +4123,8 @@
 +	if (need_remap) {
 +		ret = at76_remap(udev);
 +		if (ret < 0) {
-+			err("sending REMAP failed with %d", ret);
++			dev_printk(KERN_ERR, &udev->dev,
++				   "sending REMAP failed with %d\n", ret);
 +			goto exit;
 +		}
 +	}
@@ -4329,18 +4297,18 @@
 +
 +	ret = at76_join_bss(priv, priv->curr_bss);
 +	if (ret < 0) {
-+		err("%s: join_bss failed with %d", priv->netdev->name, ret);
++		printk(KERN_ERR "%s: join_bss failed with %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
 +	ret = at76_wait_completion(priv, CMD_JOIN);
 +	if (ret != CMD_STATUS_COMPLETE) {
 +		if (ret != CMD_STATUS_TIME_OUT)
-+			err("%s join_bss completed with %d",
-+			    priv->netdev->name, ret);
++			printk(KERN_ERR "%s: join_bss completed with %d\n",
++			       priv->netdev->name, ret);
 +		else
-+			printk(KERN_INFO
-+			       "%s: join_bss ssid %s timed out\n",
++			printk(KERN_INFO "%s: join_bss ssid %s timed out\n",
 +			       priv->netdev->name,
 +			       mac2str(priv->curr_bss->bssid));
 +
@@ -4394,8 +4362,8 @@
 +
 +	status = at76_get_cmd_status(priv->udev, CMD_SCAN);
 +	if (status < 0) {
-+		err("%s: %s: at76_get_cmd_status failed with %d",
-+		    priv->netdev->name, __func__, status);
++		printk(KERN_ERR "%s: %s: at76_get_cmd_status failed with %d\n",
++		       priv->netdev->name, __func__, status);
 +		status = CMD_STATUS_IN_PROGRESS;
 +		/* INFO: Hope it was a one off error - if not, scanning
 +		   further down the line and stop this cycle */
@@ -4408,9 +4376,9 @@
 +	if (status != CMD_STATUS_COMPLETE) {
 +		if ((status != CMD_STATUS_IN_PROGRESS) &&
 +		    (status != CMD_STATUS_IDLE))
-+			err("%s: %s: Bad scan status: %s",
-+			    priv->netdev->name, __func__,
-+			    at76_get_cmd_status_string(status));
++			printk(KERN_ERR "%s: %s: Bad scan status: %s\n",
++			       priv->netdev->name, __func__,
++			       at76_get_cmd_status_string(status));
 +
 +		/* the first cmd status after scan start is always a IDLE ->
 +		   start the timer to poll again until COMPLETED */
@@ -4428,11 +4396,12 @@
 +	if (priv->scan_need_any) {
 +		ret = at76_start_scan(priv, 0);
 +		if (ret < 0)
-+			err("%s: %s: start_scan (ANY) failed with %d",
-+			    priv->netdev->name, __func__, ret);
++			printk(KERN_ERR
++			       "%s: %s: start_scan (ANY) failed with %d\n",
++			       priv->netdev->name, __func__, ret);
 +		at76_dbg(DBG_MGMT_TIMER,
-+			 "%s:%d: starting mgmt_timer for %d ticks",
-+			 __func__, __LINE__, SCAN_POLL_INTERVAL);
++			 "%s:%d: starting mgmt_timer for %d ticks", __func__,
++			 __LINE__, SCAN_POLL_INTERVAL);
 +		schedule_delayed_work(&priv->dwork_get_scan,
 +				      SCAN_POLL_INTERVAL);
 +		priv->scan_need_any = 0;
@@ -4536,7 +4505,6 @@
 +	struct at76_priv *priv = container_of(work, struct at76_priv,
 +					      work_new_bss);
 +	int ret;
-+	struct net_device *netdev = priv->netdev;
 +	struct mib_mac_mgmt mac_mgmt;
 +
 +	mutex_lock(&priv->mtx);
@@ -4544,7 +4512,8 @@
 +	ret = at76_get_mib(priv->udev, MIB_MAC_MGMT, &mac_mgmt,
 +			   sizeof(struct mib_mac_mgmt));
 +	if (ret < 0) {
-+		err("%s: at76_get_mib failed: %d", netdev->name, ret);
++		printk(KERN_ERR "%s: at76_get_mib failed: %d\n",
++		       priv->netdev->name, ret);
 +		goto exit;
 +	}
 +
@@ -4554,14 +4523,15 @@
 +
 +	at76_iwevent_bss_connect(priv->netdev, priv->bssid);
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_MAC_MGMT;
 +	priv->mib_buf.size = 1;
 +	priv->mib_buf.index = offsetof(struct mib_mac_mgmt, ibss_change);
++	priv->mib_buf.data.byte = 0;
++
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (ibss change ok) failed: %d", netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: set_mib (ibss change ok) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +exit:
 +	mutex_unlock(&priv->mtx);
@@ -4571,16 +4541,10 @@
 +{
 +	struct at76_card_config *ccfg = &priv->card_config;
 +	int ret;
-+	char ossid[IW_ESSID_MAX_SIZE + 1];
-+
-+	/* make priv->essid printable */
-+	BUG_ON(priv->essid_size > IW_ESSID_MAX_SIZE);
-+	memcpy(ossid, priv->essid, priv->essid_size);
-+	ossid[priv->essid_size] = '\0';
 +
 +	at76_dbg(DBG_PARAMS,
-+		 "%s param: ssid %s (%s) mode %s ch %d wep %s key %d "
-+		 "keylen %d", priv->netdev->name, ossid,
++		 "%s param: ssid %.*s (%s) mode %s ch %d wep %s key %d "
++		 "keylen %d", priv->netdev->name, priv->essid_size, priv->essid,
 +		 hex2str(priv->essid, IW_ESSID_MAX_SIZE),
 +		 priv->iw_mode == IW_MODE_ADHOC ? "adhoc" : "infra",
 +		 priv->channel, priv->wep_enabled ? "enabled" : "disabled",
@@ -4640,8 +4604,8 @@
 +	ret = at76_set_card_command(priv->udev, CMD_STARTUP, &priv->card_config,
 +				    sizeof(struct at76_card_config));
 +	if (ret < 0) {
-+		err("%s: at76_set_card_command failed: %d", priv->netdev->name,
-+		    ret);
++		printk(KERN_ERR "%s: at76_set_card_command failed: %d\n",
++		       priv->netdev->name, ret);
 +		return ret;
 +	}
 +
@@ -4651,7 +4615,7 @@
 +	memset(priv->bssid, 0, ETH_ALEN);
 +
 +	if (at76_set_radio(priv, 1) == 1)
-+		at76_wait_completion(priv, CMD_RADIO);
++		at76_wait_completion(priv, CMD_RADIO_ON);
 +
 +	ret = at76_set_preamble(priv, priv->preamble_type);
 +	if (ret < 0)
@@ -4674,8 +4638,6 @@
 +	if (ret < 0)
 +		return ret;
 +
-+	at76_set_monitor_mode(priv);
-+
 +	if (at76_debug & DBG_MIB) {
 +		at76_dump_mib_mac(priv);
 +		at76_dump_mib_mac_addr(priv);
@@ -4697,15 +4659,19 @@
 +
 +	mutex_lock(&priv->mtx);
 +
-+	at76_startup_device(priv);
 +	netif_carrier_off(priv->netdev);	/* stop netdev watchdog */
 +	netif_stop_queue(priv->netdev);	/* stop tx data packets */
 +
++	at76_startup_device(priv);
++
 +	if (priv->iw_mode != IW_MODE_MONITOR) {
++		priv->netdev->type = ARPHRD_ETHER;
 +		at76_set_mac_state(priv, MAC_SCANNING);
 +		schedule_work(&priv->work_start_scan);
-+	} else
++	} else {
++		priv->netdev->type = ARPHRD_IEEE80211_RADIOTAP;
 +		at76_start_monitor(priv);
++	}
 +
 +	mutex_unlock(&priv->mtx);
 +}
@@ -4734,8 +4700,8 @@
 +	ret = at76_start_scan(priv, 1);
 +
 +	if (ret < 0)
-+		err("%s: %s: start_scan failed with %d",
-+		    priv->netdev->name, __func__, ret);
++		printk(KERN_ERR "%s: %s: start_scan failed with %d\n",
++		       priv->netdev->name, __func__, ret);
 +	else {
 +		at76_dbg(DBG_MGMT_TIMER,
 +			 "%s:%d: starting mgmt_timer for %d ticks",
@@ -4757,15 +4723,15 @@
 +
 +	mutex_lock(&priv->mtx);
 +
-+	memset(&priv->mib_buf, 0, sizeof(struct set_mib_buffer));
 +	priv->mib_buf.type = MIB_LOCAL;
 +	priv->mib_buf.size = 1;
 +	priv->mib_buf.index = offsetof(struct mib_local, promiscuous_mode);
-+	priv->mib_buf.data[0] = priv->promisc ? 1 : 0;
++	priv->mib_buf.data.byte = priv->promisc ? 1 : 0;
++
 +	ret = at76_set_mib(priv, &priv->mib_buf);
 +	if (ret < 0)
-+		err("%s: set_mib (promiscuous_mode) failed: %d",
-+		    priv->netdev->name, ret);
++		printk(KERN_ERR "%s: set_mib (promiscuous_mode) failed: %d\n",
++		       priv->netdev->name, ret);
 +
 +	mutex_unlock(&priv->mtx);
 +}
@@ -4787,15 +4753,14 @@
 +{
 +	struct ieee80211_assoc_response *resp =
 +	    (struct ieee80211_assoc_response *)buf->packet;
-+	struct ieee80211_hdr_3addr *mgmt = &resp->header;
 +	u16 assoc_id = le16_to_cpu(resp->aid);
 +	u16 status = le16_to_cpu(resp->status);
-+	u16 capa = le16_to_cpu(resp->capability);
-+	at76_dbg(DBG_RX_MGMT,
-+		 "%s: rx AssocResp bssid %s capa 0x%04x status 0x%04x "
-+		 "assoc_id 0x%04x rates %s", priv->netdev->name,
-+		 mac2str(mgmt->addr3), capa, status, assoc_id,
-+		 hex2str(resp->info_element->data, resp->info_element->len));
++
++	at76_dbg(DBG_RX_MGMT, "%s: rx AssocResp bssid %s capa 0x%04x status "
++		 "0x%04x assoc_id 0x%04x rates %s", priv->netdev->name,
++		 mac2str(resp->header.addr3), le16_to_cpu(resp->capability),
++		 status, assoc_id, hex2str(resp->info_element->data,
++					   resp->info_element->len));
 +
 +	if (priv->mac_state != MAC_ASSOC) {
 +		printk(KERN_INFO "%s: AssocResp in state %s ignored\n",
@@ -4982,7 +4947,7 @@
 +	struct bss_info *match;	/* entry matching addr3 with its bssid */
 +	int new_entry = 0;
 +	int len;
-+	struct ieee80211_info_element *tlv;
++	struct ieee80211_info_element *ie;
 +	int have_ssid = 0;
 +	int have_rates = 0;
 +	int have_channel = 0;
@@ -5024,14 +4989,13 @@
 +
 +	if (!match) {
 +		/* BSS not in the list - append it */
-+		match = kmalloc(sizeof(struct bss_info), GFP_ATOMIC);
++		match = kzalloc(sizeof(struct bss_info), GFP_ATOMIC);
 +		if (!match) {
 +			at76_dbg(DBG_BSS_TABLE,
 +				 "%s: cannot kmalloc new bss info (%zd byte)",
 +				 priv->netdev->name, sizeof(struct bss_info));
 +			goto exit;
 +		}
-+		memset(match, 0, sizeof(*match));
 +		new_entry = 1;
 +		list_add_tail(&match->list, &priv->bss_list);
 +	}
@@ -5045,7 +5009,7 @@
 +	at76_dbg(DBG_RX_BEACON, "%s: bssid %s", priv->netdev->name,
 +		 mac2str(match->bssid));
 +
-+	tlv = bdata->info_element;
++	ie = bdata->info_element;
 +
 +	/* length of var length beacon parameters */
 +	varpar_len = min_t(int, le16_to_cpu(buf->wlength) -
@@ -5067,34 +5031,31 @@
 +	 * bytes are useful, hence the have_ssid etc optimizations. */
 +
 +	while (keep_going &&
-+	       ((&tlv->data[tlv->len] - (u8 *)bdata->info_element) <=
++	       ((&ie->data[ie->len] - (u8 *)bdata->info_element) <=
 +		varpar_len)) {
 +
-+		switch (tlv->id) {
++		switch (ie->id) {
 +
 +		case MFIE_TYPE_SSID:
 +			if (have_ssid)
 +				break;
 +
-+			len = min_t(int, IW_ESSID_MAX_SIZE, tlv->len);
++			len = min_t(int, IW_ESSID_MAX_SIZE, ie->len);
 +
 +			/* we copy only if this is a new entry,
 +			   or the incoming SSID is not a hidden SSID. This
 +			   will protect us from overwriting a real SSID read
 +			   in a ProbeResponse with a hidden one from a
 +			   following beacon. */
-+			if (!new_entry && at76_is_hidden_ssid(tlv->data, len)) {
++			if (!new_entry && at76_is_hidden_ssid(ie->data, len)) {
 +				have_ssid = 1;
 +				break;
 +			}
 +
 +			match->ssid_len = len;
-+			memcpy(match->ssid, tlv->data, len);
-+			match->ssid[len] = '\0';	/* terminate the
-+							   string for
-+							   printing */
-+			at76_dbg(DBG_RX_BEACON, "%s: SSID - %s",
-+				 priv->netdev->name, match->ssid);
++			memcpy(match->ssid, ie->data, len);
++			at76_dbg(DBG_RX_BEACON, "%s: SSID - %.*s",
++				 priv->netdev->name, len, match->ssid);
 +			have_ssid = 1;
 +			break;
 +
@@ -5103,19 +5064,19 @@
 +				break;
 +
 +			match->rates_len =
-+			    min_t(int, sizeof(match->rates), tlv->len);
-+			memcpy(match->rates, tlv->data, match->rates_len);
++			    min_t(int, sizeof(match->rates), ie->len);
++			memcpy(match->rates, ie->data, match->rates_len);
 +			have_rates = 1;
 +			at76_dbg(DBG_RX_BEACON, "%s: SUPPORTED RATES %s",
 +				 priv->netdev->name,
-+				 hex2str(tlv->data, tlv->len));
++				 hex2str(ie->data, ie->len));
 +			break;
 +
 +		case MFIE_TYPE_DS_SET:
 +			if (have_channel)
 +				break;
 +
-+			match->channel = tlv->data[0];
++			match->channel = ie->data[0];
 +			have_channel = 1;
 +			at76_dbg(DBG_RX_BEACON, "%s: CHANNEL - %d",
 +				 priv->netdev->name, match->channel);
@@ -5126,13 +5087,13 @@
 +		case MFIE_TYPE_IBSS_SET:
 +		default:
 +			at76_dbg(DBG_RX_BEACON, "%s: beacon IE id %d len %d %s",
-+				 priv->netdev->name, tlv->id, tlv->len,
-+				 hex2str(tlv->data, tlv->len));
++				 priv->netdev->name, ie->id, ie->len,
++				 hex2str(ie->data, ie->len));
 +			break;
 +		}
 +
 +		/* advance to the next informational element */
-+		next_ie(&tlv);
++		next_ie(&ie);
 +
 +		/* Optimization: after all, the bdata->data array is
 +		 * varpar_len bytes long, whereas we get all of the useful
@@ -5172,17 +5133,17 @@
 +	if (at76_is_intersil(priv->board_type))
 +		qual->qual = buf->link_quality;
 +	else {
-+		unsigned long msec;
++		unsigned long elapsed;
 +
 +		/* Update qual at most once a second */
-+		msec = jiffies_to_msecs(jiffies) - priv->beacons_last_qual;
-+		if (msec < 1000)
++		elapsed = jiffies - priv->beacons_last_qual;
++		if (elapsed < 1 * HZ)
 +			return;
 +
 +		qual->qual = qual->level * priv->beacons_received *
-+		    priv->beacon_period / msec;
++		    msecs_to_jiffies(priv->beacon_period) / elapsed;
 +
-+		priv->beacons_last_qual = jiffies_to_msecs(jiffies);
++		priv->beacons_last_qual = jiffies;
 +		priv->beacons_received = 0;
 +	}
 +	qual->qual = (qual->qual > 100) ? 100 : qual->qual;
@@ -5608,8 +5569,8 @@
 +
 +	skb = dev_alloc_skb(skblen);
 +	if (!skb) {
-+		err("%s: MONITOR MODE: dev_alloc_skb for radiotap header "
-+		    "returned NULL", priv->netdev->name);
++		printk(KERN_ERR "%s: MONITOR MODE: dev_alloc_skb for radiotap "
++		       "header returned NULL\n", priv->netdev->name);
 +		return;
 +	}
 +
@@ -5636,7 +5597,7 @@
 +	skb->ip_summed = CHECKSUM_NONE;
 +	skb_reset_mac_header(skb);
 +	skb->pkt_type = PACKET_OTHERHOST;
-+	skb->protocol = htons(ETH_P_80211_RAW);
++	skb->protocol = htons(ETH_P_802_2);
 +
 +	netdev->last_rx = jiffies;
 +	netif_rx(skb);
@@ -5761,9 +5722,11 @@
 +	at76_dbg(DBG_FW, "downloading firmware %s", fwe->fwname);
 +	ret = request_firmware(&fwe->fw, fwe->fwname, &udev->dev);
 +	if (ret < 0) {
-+		err("firmware %s not found.", fwe->fwname);
-+		err("You may need to download the firmware from "
-+		    "http://developer.berlios.de/projects/at76c503a/");
++		dev_printk(KERN_ERR, &udev->dev, "firmware %s not found!\n",
++			   fwe->fwname);
++		dev_printk(KERN_ERR, &udev->dev,
++			   "you may need to download the firmware from "
++			   "http://developer.berlios.de/projects/at76c503a/");
 +		goto exit;
 +	}
 +
@@ -5771,15 +5734,17 @@
 +	fwh = (struct at76_fw_header *)(fwe->fw->data);
 +
 +	if (fwe->fw->size <= sizeof(*fwh)) {
-+		err("firmware is too short (0x%zx)", fwe->fw->size);
++		dev_printk(KERN_ERR, &udev->dev,
++			   "firmware is too short (0x%zx)\n", fwe->fw->size);
 +		goto exit;
 +	}
 +
 +	/* CRC currently not checked */
 +	fwe->board_type = le32_to_cpu(fwh->board_type);
 +	if (fwe->board_type != board_type) {
-+		err("board type mismatch, requested %u, got %u", board_type,
-+		    fwe->board_type);
++		dev_printk(KERN_ERR, &udev->dev,
++			   "board type mismatch, requested %u, got %u\n",
++			   board_type, fwe->board_type);
 +		goto exit;
 +	}
 +
@@ -5796,9 +5761,11 @@
 +
 +	fwe->loaded = 1;
 +
-+	at76_dbg(DBG_DEVSTART, "firmware board %u version %u.%u.%u-%u "
-+		 "(int %d:%d, ext %d:%d)", board_type,
-+		 fwh->major, fwh->minor, fwh->patch, fwh->build,
++	dev_printk(KERN_DEBUG, &udev->dev,
++		   "using firmware %s (version %d.%d.%d-%d)\n",
++		   fwe->fwname, fwh->major, fwh->minor, fwh->patch, fwh->build);
++
++	at76_dbg(DBG_DEVSTART, "board %u, int %d:%d, ext %d:%d", board_type,
 +		 le32_to_cpu(fwh->int_fw_offset), le32_to_cpu(fwh->int_fw_len),
 +		 le32_to_cpu(fwh->ext_fw_offset), le32_to_cpu(fwh->ext_fw_len));
 +	at76_dbg(DBG_DEVSTART, "firmware id %s", str);
@@ -5822,12 +5789,11 @@
 +	/* allocate memory for our device state and initialize it */
 +	netdev = alloc_etherdev(sizeof(struct at76_priv));
 +	if (!netdev) {
-+		err("out of memory");
++		dev_printk(KERN_ERR, &udev->dev, "out of memory\n");
 +		return NULL;
 +	}
 +
 +	priv = netdev_priv(netdev);
-+	memset(priv, 0, sizeof(*priv));
 +
 +	priv->udev = udev;
 +	priv->netdev = netdev;
@@ -5904,7 +5870,8 @@
 +	}
 +
 +	if (!ep_in || !ep_out) {
-+		printk(KERN_ERR DRIVER_NAME ": bulk endpoints missing\n");
++		dev_printk(KERN_ERR, &interface->dev,
++			   "bulk endpoints missing\n");
 +		return -ENXIO;
 +	}
 +
@@ -5914,15 +5881,15 @@
 +	priv->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
 +	priv->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
 +	if (!priv->rx_urb || !priv->tx_urb) {
-+		printk(KERN_ERR DRIVER_NAME ": cannot allocate URB\n");
++		dev_printk(KERN_ERR, &interface->dev, "cannot allocate URB\n");
 +		return -ENOMEM;
 +	}
 +
 +	buffer_size = sizeof(struct at76_tx_buffer) + MAX_PADDING_SIZE;
 +	priv->bulk_out_buffer = kmalloc(buffer_size, GFP_KERNEL);
 +	if (!priv->bulk_out_buffer) {
-+		printk(KERN_ERR DRIVER_NAME
-+		       ": cannot allocate output buffer\n");
++		dev_printk(KERN_ERR, &interface->dev,
++			   "cannot allocate output buffer\n");
 +		return -ENOMEM;
 +	}
 +
@@ -5951,7 +5918,8 @@
 +	/* MAC address */
 +	ret = at76_get_hw_config(priv);
 +	if (ret < 0) {
-+		err("could not get MAC address");
++		dev_printk(KERN_ERR, &interface->dev,
++			   "cannot get MAC address\n");
 +		goto exit;
 +	}
 +
@@ -5961,14 +5929,13 @@
 +
 +	priv->channel = DEF_CHANNEL;
 +	priv->iw_mode = IW_MODE_INFRA;
-+	memset(priv->essid, 0, IW_ESSID_MAX_SIZE);
 +	priv->rts_threshold = DEF_RTS_THRESHOLD;
 +	priv->frag_threshold = DEF_FRAG_THRESHOLD;
 +	priv->short_retry_limit = DEF_SHORT_RETRY_LIMIT;
 +	priv->txrate = TX_RATE_AUTO;
 +	priv->preamble_type = PREAMBLE_TYPE_LONG;
 +	priv->beacon_period = 100;
-+	priv->beacons_last_qual = jiffies_to_msecs(jiffies);
++	priv->beacons_last_qual = jiffies;
 +	priv->auth_mode = WLAN_AUTH_OPEN;
 +	priv->scan_min_time = DEF_SCAN_MIN_TIME;
 +	priv->scan_max_time = DEF_SCAN_MAX_TIME;
@@ -5990,18 +5957,18 @@
 +	netdev->wireless_handlers = &at76_handler_def;
 +	netdev->set_multicast_list = at76_set_multicast;
 +	netdev->set_mac_address = at76_set_mac_address;
++	dev_alloc_name(netdev, "wlan%d");
 +
 +	ret = register_netdev(priv->netdev);
 +	if (ret) {
-+		err("unable to register netdevice %s (status %d)!",
-+		    priv->netdev->name, ret);
++		dev_printk(KERN_ERR, &interface->dev,
++			   "cannot register netdevice (status %d)!\n", ret);
 +		goto exit;
 +	}
 +	priv->netdev_registered = 1;
 +
-+	printk(KERN_INFO "%s: MAC address %s\n", netdev->name,
-+	       mac2str(priv->mac_addr));
-+	printk(KERN_INFO "%s: firmware version %d.%d.%d-%d\n", netdev->name,
++	printk(KERN_INFO "%s: USB %s, MAC %s, firmware %d.%d.%d-%d\n",
++	       netdev->name, interface->dev.bus_id, mac2str(priv->mac_addr),
 +	       priv->fw_version.major, priv->fw_version.minor,
 +	       priv->fw_version.patch, priv->fw_version.build);
 +	printk(KERN_INFO "%s: regulatory domain 0x%02x: %s\n", netdev->name,
@@ -6097,8 +6064,8 @@
 +	   we get 204 with 2.4.23, Fiberline FL-WL240u (505A+RFMD2958) ??? */
 +
 +	if (op_mode == OPMODE_HW_CONFIG_MODE) {
-+		err("cannot handle a device in HW_CONFIG_MODE (opmode %d)",
-+		    op_mode);
++		dev_printk(KERN_ERR, &interface->dev,
++			   "cannot handle a device in HW_CONFIG_MODE\n");
 +		ret = -EBUSY;
 +		goto error;
 +	}
@@ -6106,10 +6073,13 @@
 +	if (op_mode != OPMODE_NORMAL_NIC_WITH_FLASH
 +	    && op_mode != OPMODE_NORMAL_NIC_WITHOUT_FLASH) {
 +		/* download internal firmware part */
-+		at76_dbg(DBG_DEVSTART, "downloading internal firmware");
++		dev_printk(KERN_DEBUG, &interface->dev,
++			   "downloading internal firmware\n");
 +		ret = at76_load_internal_fw(udev, fwe);
 +		if (ret < 0) {
-+			err("error %d downloading internal firmware", ret);
++			dev_printk(KERN_ERR, &interface->dev,
++				   "error %d downloading internal firmware\n",
++				   ret);
 +			goto error;
 +		}
 +		usb_put_dev(udev);
@@ -6134,7 +6104,8 @@
 +		need_ext_fw = 1;
 +
 +	if (need_ext_fw) {
-+		at76_dbg(DBG_DEVSTART, "downloading external firmware");
++		dev_printk(KERN_DEBUG, &interface->dev,
++			   "downloading external firmware\n");
 +
 +		ret = at76_load_external_fw(udev, fwe);
 +		if (ret)
@@ -6143,20 +6114,8 @@
 +		/* Re-check firmware version */
 +		ret = at76_get_mib(udev, MIB_FW_VERSION, &fwv, sizeof(fwv));
 +		if (ret < 0) {
-+			err("error %d getting firmware version", ret);
-+			goto error;
-+		}
-+
-+		/* Major and minor version must match */
-+		if (fwv.major != fwe->fw_version.major
-+		    || fwv.minor != fwe->fw_version.minor) {
-+			printk(KERN_ERR DRIVER_NAME
-+			       ": wrong firmware version, loaded %d.%d.%d-%d, "
-+			       "read back %d.%d.%d-%d\n",
-+			       fwe->fw_version.major, fwe->fw_version.minor,
-+			       fwe->fw_version.patch, fwe->fw_version.build,
-+			       fwv.major, fwv.minor, fwv.patch, fwv.build);
-+			ret = -EBUSY;
++			dev_printk(KERN_ERR, &interface->dev,
++				   "error %d getting firmware version\n", ret);
 +			goto error;
 +		}
 +	}
@@ -6197,7 +6156,7 @@
 +
 +	printk(KERN_INFO "%s: disconnecting\n", priv->netdev->name);
 +	at76_delete_device(priv);
-+	printk(KERN_INFO DRIVER_NAME ": disconnected\n");
++	dev_printk(KERN_INFO, &interface->dev, "disconnected\n");
 +}
 +
 +/* Structure for registering this driver with the USB subsystem */
@@ -6219,7 +6178,8 @@
 +	/* register this driver with the USB subsystem */
 +	result = usb_register(&at76_driver);
 +	if (result < 0)
-+		err("usb_register failed (status %d)", result);
++		printk(KERN_ERR DRIVER_NAME
++		       ": usb_register failed (status %d)\n", result);
 +
 +	led_trigger_register_simple("at76_usb-tx", &ledtrig_tx);
 +	return result;
@@ -6252,9 +6212,9 @@
 +MODULE_AUTHOR("Pavel Roskin <proski at gnu.org>");
 +MODULE_DESCRIPTION(DRIVER_DESC);
 +MODULE_LICENSE("GPL");
-diff -up linux-2.6.22.noarch/drivers/net/wireless/Kconfig.orig linux-2.6.22.noarch/drivers/net/wireless/Kconfig
---- linux-2.6.22.noarch/drivers/net/wireless/Kconfig.orig	2007-09-26 19:57:31.000000000 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/Kconfig	2007-09-26 19:59:33.000000000 -0400
+diff -up linux-2.6.23.noarch/drivers/net/wireless/Kconfig.orig linux-2.6.23.noarch/drivers/net/wireless/Kconfig
+--- linux-2.6.23.noarch/drivers/net/wireless/Kconfig.orig	2007-10-19 14:41:17.000000000 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/Kconfig	2007-10-19 14:45:38.000000000 -0400
 @@ -381,6 +381,14 @@ config PCI_HERMES
  	  common.  Some of the built-in wireless adaptors in laptops are of
  	  this variety.

linux-2.6-ath5k.patch:

View full diff with command:
/usr/bin/cvs -f diff  -kk -u -N -r 1.5 -r 1.6 linux-2.6-ath5k.patch
Index: linux-2.6-ath5k.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/linux-2.6-ath5k.patch,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- linux-2.6-ath5k.patch	16 Oct 2007 01:35:52 -0000	1.5
+++ linux-2.6-ath5k.patch	8 Nov 2007 22:06:15 -0000	1.6
@@ -1,33 +1,6 @@
-diff -up linux-2.6.23.noarch/MAINTAINERS.orig linux-2.6.23.noarch/MAINTAINERS
---- linux-2.6.23.noarch/MAINTAINERS.orig	2007-10-15 21:21:41.000000000 -0400
-+++ linux-2.6.23.noarch/MAINTAINERS	2007-10-15 21:21:48.000000000 -0400
-@@ -642,6 +642,14 @@ M:	ecashin at coraid.com
- W:	http://www.coraid.com/support/linux
- S:	Supported
- 
-+ATHEROS ATH5K WIRELESS DRIVER
-+P:	Jiri Slaby
-+M:	jirislaby at gmail.com
-+P:	Luis R. Rodriguez
-+M:	mcgrof at gmail.com
-+L:	linux-wireless at vger.kernel.org
-+S:	Maintained
-+
- ATL1 ETHERNET DRIVER
- P:	Jay Cliburn
- M:	jcliburn at gmail.com
-diff -up linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig linux-2.6.23.noarch/drivers/net/wireless/Makefile
---- linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig	2007-10-15 21:21:41.000000000 -0400
-+++ linux-2.6.23.noarch/drivers/net/wireless/Makefile	2007-10-15 21:21:48.000000000 -0400
-@@ -62,3 +62,5 @@ obj-$(CONFIG_RT2X00)		+= rt2x00/
- obj-$(CONFIG_P54_COMMON)	+= p54common.o
- obj-$(CONFIG_P54_USB)		+= p54usb.o
- obj-$(CONFIG_P54_PCI)		+= p54pci.o
-+
-+obj-$(CONFIG_ATH5K)	+= ath5k/
 diff -up linux-2.6.23.noarch/drivers/net/wireless/Kconfig.orig linux-2.6.23.noarch/drivers/net/wireless/Kconfig
---- linux-2.6.23.noarch/drivers/net/wireless/Kconfig.orig	2007-10-15 21:21:41.000000000 -0400
-+++ linux-2.6.23.noarch/drivers/net/wireless/Kconfig	2007-10-15 21:21:48.000000000 -0400
+--- linux-2.6.23.noarch/drivers/net/wireless/Kconfig.orig	2007-11-08 16:48:58.000000000 -0500
++++ linux-2.6.23.noarch/drivers/net/wireless/Kconfig	2007-11-08 16:50:01.000000000 -0500
 @@ -598,6 +598,19 @@ config P54_PCI
  	tristate "Prism54 PCI support"
  	depends on P54_COMMON && PCI
@@ -48,12 +21,21 @@
  source "drivers/net/wireless/hostap/Kconfig"
  source "drivers/net/wireless/bcm43xx/Kconfig"
  source "drivers/net/wireless/b43/Kconfig"
-diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/ath5k/phy.c
---- /dev/null	2007-10-15 19:30:01.791299883 -0400
-+++ linux-2.6.23.noarch/drivers/net/wireless/ath5k/phy.c	2007-10-15 21:22:03.000000000 -0400
-@@ -0,0 +1,1686 @@
+diff -up linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig linux-2.6.23.noarch/drivers/net/wireless/Makefile
+--- linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig	2007-11-08 16:48:58.000000000 -0500
++++ linux-2.6.23.noarch/drivers/net/wireless/Makefile	2007-11-08 16:49:33.000000000 -0500
+@@ -62,3 +62,5 @@ obj-$(CONFIG_RT2X00)		+= rt2x00/
+ obj-$(CONFIG_P54_COMMON)	+= p54common.o
+ obj-$(CONFIG_P54_USB)		+= p54usb.o
+ obj-$(CONFIG_P54_PCI)		+= p54pci.o
++
++obj-$(CONFIG_ATH5K)	+= ath5k/
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/ath5k/initvals.c
+--- /dev/null	2007-10-26 17:27:29.928203379 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/ath5k/initvals.c	2007-11-08 16:49:33.000000000 -0500
+@@ -0,0 +1,1102 @@
 +/*
-+ * PHY functions
++ * Initial register settings functions
 + *
 + * Copyright (c) 2004, 2005, 2006, 2007 Reyk Floeter <reyk at openbsd.org>
 + * Copyright (c) 2006, 2007 Nick Kossifidis <mickflemm at gmail.com>
@@ -73,14353 +55,14642 @@
 + *
 + */
 +
-+#include <linux/delay.h>
-+
 +#include "ath5k.h"
 +#include "reg.h"
 +
-+/* Struct to hold initial RF register values (RF Banks) */
-+struct ath5k_ini_rf {
-+	u8	rf_bank;	/* check out ath5k_reg.h */
-+	u16	rf_register;	/* register address */
-+	u32	rf_value[5];	/* register value for different modes (above) */
-+};
++/*
++ * MAC/PHY REGISTERS
++ */
++
 +
 +/*
-+ * Mode-specific RF Gain table (64bytes) for RF5111/5112
-+ * (RF5110 only comes with AR5210 and only supports a/turbo a mode so initial
-+ * RF Gain values are included in AR5K_AR5210_INI)
++ * Mode-independent initial register writes
 + */
-+struct ath5k_ini_rfgain {
-+	u16	rfg_register;	/* RF Gain register address */
-+	u32	rfg_value[2];	/* [freq (see below)] */
-+};
 +
-+struct ath5k_gain_opt {
-+	u32			go_default;
-+	u32			go_steps_count;
-+	const struct ath5k_gain_opt_step	go_step[AR5K_GAIN_STEP_COUNT];
-+};
++struct ath5k_ini {
++	u16	ini_register;
++	u32	ini_value;
 +
-+/* RF5111 mode-specific init registers */
-+static const struct ath5k_ini_rf rfregs_5111[] = {
-+	{ 0, 0x989c,
-+	/*    mode a/XR   mode aTurbo mode b      mode g      mode gTurbo */
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00380000, 0x00380000, 0x00380000, 0x00380000, 0x00380000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 0, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x000000c0, 0x00000080, 0x00000080 } },
-+	{ 0, 0x989c,
-+	    { 0x000400f9, 0x000400f9, 0x000400ff, 0x000400fd, 0x000400fd } },
-+	{ 0, 0x98d4,
-+	    { 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000004 } },
-+	{ 1, 0x98d4,
-+	    { 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020 } },
-+	{ 2, 0x98d4,
-+	    { 0x00000010, 0x00000014, 0x00000010, 0x00000010, 0x00000014 } },
-+	{ 3, 0x98d8,
-+	    { 0x00601068, 0x00601068, 0x00601068, 0x00601068, 0x00601068 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000 } },
-+	{ 6, 0x989c,
-+	    { 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x00000000, 0x00000000, 0x0a000000, 0x00000000, 0x00000000 } },
-+	{ 6, 0x989c,
-+	    { 0x003800c0, 0x00380080, 0x023800c0, 0x003800c0, 0x003800c0 } },
-+	{ 6, 0x989c,
-+	    { 0x00020006, 0x00020006, 0x00000006, 0x00020006, 0x00020006 } },
-+	{ 6, 0x989c,
-+	    { 0x00000089, 0x00000089, 0x00000089, 0x00000089, 0x00000089 } },
-+	{ 6, 0x989c,
-+	    { 0x000000a0, 0x000000a0, 0x000000a0, 0x000000a0, 0x000000a0 } },
-+	{ 6, 0x989c,
-+	    { 0x00040007, 0x00040007, 0x00040007, 0x00040007, 0x00040007 } },
-+	{ 6, 0x98d4,
-+	    { 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a } },
-+	{ 7, 0x989c,
-+	    { 0x00000040, 0x00000048, 0x00000040, 0x00000040, 0x00000040 } },
-+	{ 7, 0x989c,
-+	    { 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010 } },
-+	{ 7, 0x989c,
-+	    { 0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000008 } },
-+	{ 7, 0x989c,
-+	    { 0x0000004f, 0x0000004f, 0x0000004f, 0x0000004f, 0x0000004f } },
-+	{ 7, 0x989c,
-+	    { 0x000000f1, 0x000000f1, 0x00000061, 0x000000f1, 0x000000f1 } },
-+	{ 7, 0x989c,
-+	    { 0x0000904f, 0x0000904f, 0x0000904c, 0x0000904f, 0x0000904f } },
[...26682 lines suppressed...]
++/* BSSID Functions */
++extern void ath5k_hw_get_lladdr(struct ath5k_hw *ah, u8 *mac);
++extern int ath5k_hw_set_lladdr(struct ath5k_hw *ah, const u8 *mac);
++extern void ath5k_hw_set_associd(struct ath5k_hw *ah, const u8 *bssid, u16 assoc_id);
++extern int ath5k_hw_set_bssid_mask(struct ath5k_hw *ah, const u8 *mask);
++/* Receive start/stop functions */
++extern void ath5k_hw_start_rx_pcu(struct ath5k_hw *ah);
++extern void ath5k_hw_stop_pcu_recv(struct ath5k_hw *ah);
++/* RX Filter functions */
++extern void ath5k_hw_set_mcast_filter(struct ath5k_hw *ah, u32 filter0, u32 filter1);
++extern int ath5k_hw_set_mcast_filterindex(struct ath5k_hw *ah, u32 index);
++extern int ath5k_hw_clear_mcast_filter_idx(struct ath5k_hw *ah, u32 index);
++extern u32 ath5k_hw_get_rx_filter(struct ath5k_hw *ah);
++extern void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter);
++/* Beacon related functions */
++extern u32 ath5k_hw_get_tsf32(struct ath5k_hw *ah);
++extern u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah);
++extern void ath5k_hw_reset_tsf(struct ath5k_hw *ah);
++extern void ath5k_hw_init_beacon(struct ath5k_hw *ah, u32 next_beacon, u32 interval);
++extern int ath5k_hw_set_beacon_timers(struct ath5k_hw *ah, const struct ath5k_beacon_state *state);
++extern void ath5k_hw_reset_beacon(struct ath5k_hw *ah);
++extern int ath5k_hw_wait_for_beacon(struct ath5k_hw *ah, unsigned long phys_addr);
++extern void ath5k_hw_update_mib_counters(struct ath5k_hw *ah, struct ath5k_mib_stats *statistics);
++/* ACK bit rate */
++void ath5k_hw_set_ack_bitrate_high(struct ath5k_hw *ah, bool high);
++/* ACK/CTS Timeouts */
++extern int ath5k_hw_set_ack_timeout(struct ath5k_hw *ah, unsigned int timeout);
++extern unsigned int ath5k_hw_get_ack_timeout(struct ath5k_hw *ah);
++extern int ath5k_hw_set_cts_timeout(struct ath5k_hw *ah, unsigned int timeout);
++extern unsigned int ath5k_hw_get_cts_timeout(struct ath5k_hw *ah);
++/* Key table (WEP) functions */
++extern int ath5k_hw_reset_key(struct ath5k_hw *ah, u16 entry);
++extern int ath5k_hw_is_key_valid(struct ath5k_hw *ah, u16 entry);
++extern int ath5k_hw_set_key(struct ath5k_hw *ah, u16 entry, const struct ieee80211_key_conf *key, const u8 *mac);
++extern int ath5k_hw_set_key_lladdr(struct ath5k_hw *ah, u16 entry, const u8 *mac);
++/* Queue Control Unit, DFS Control Unit Functions */
++extern int ath5k_hw_setup_tx_queue(struct ath5k_hw *ah, enum ath5k_tx_queue queue_type, struct ath5k_txq_info *queue_info);
++extern int ath5k_hw_setup_tx_queueprops(struct ath5k_hw *ah, int queue, const struct ath5k_txq_info *queue_info);
++extern int ath5k_hw_get_tx_queueprops(struct ath5k_hw *ah, int queue, struct ath5k_txq_info *queue_info);
++extern void ath5k_hw_release_tx_queue(struct ath5k_hw *ah, unsigned int queue);
++extern int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue);
++extern u32 ath5k_hw_num_tx_pending(struct ath5k_hw *ah, unsigned int queue);
++extern int ath5k_hw_set_slot_time(struct ath5k_hw *ah, unsigned int slot_time);
++extern unsigned int ath5k_hw_get_slot_time(struct ath5k_hw *ah);
++/* Hardware Descriptor Functions */
++extern int ath5k_hw_setup_rx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc, u32 size, unsigned int flags);
++/* GPIO Functions */
++extern void ath5k_hw_set_ledstate(struct ath5k_hw *ah, unsigned int state);
++extern int ath5k_hw_set_gpio_output(struct ath5k_hw *ah, u32 gpio);
++extern int ath5k_hw_set_gpio_input(struct ath5k_hw *ah, u32 gpio);
++extern u32 ath5k_hw_get_gpio(struct ath5k_hw *ah, u32 gpio);
++extern int ath5k_hw_set_gpio(struct ath5k_hw *ah, u32 gpio, u32 val);
++extern void ath5k_hw_set_gpio_intr(struct ath5k_hw *ah, unsigned int gpio, u32 interrupt_level);
++/* Regulatory Domain/Channels Setup */
++extern u16 ath5k_get_regdomain(struct ath5k_hw *ah);
++/* Misc functions */
++extern void ath5k_hw_dump_state(struct ath5k_hw *ah);
++extern int ath5k_hw_get_capability(struct ath5k_hw *ah, enum ath5k_capability_type cap_type, u32 capability, u32 *result);
 +
-+#include "regdom.h"
 +
-+static const struct ath5k_regdommap {
-+	enum ath5k_regdom dmn;
-+	enum ath5k_regdom dmn5;
-+	enum ath5k_regdom dmn2;
-+} r_map[] = {
-+	{ DMN_DEFAULT,		DMN_DEBUG,	DMN_DEBUG },
-+	{ DMN_NULL_WORLD,	DMN_NULL,	DMN_WORLD },
-+	{ DMN_NULL_ETSIB,	DMN_NULL,	DMN_ETSIB },
-+	{ DMN_NULL_ETSIC,	DMN_NULL,	DMN_ETSIC },
-+	{ DMN_FCC1_FCCA,	DMN_FCC1,	DMN_FCCA },
-+	{ DMN_FCC1_WORLD,	DMN_FCC1,	DMN_WORLD },
-+	{ DMN_FCC2_FCCA,	DMN_FCC2,	DMN_FCCA },
-+	{ DMN_FCC2_WORLD,	DMN_FCC2,	DMN_WORLD },
-+	{ DMN_FCC2_ETSIC,	DMN_FCC2,	DMN_ETSIC },
-+	{ DMN_FRANCE_NULL,	DMN_ETSI3,	DMN_ETSI3 },
-+	{ DMN_FCC3_FCCA,	DMN_FCC3,	DMN_WORLD },
-+	{ DMN_ETSI1_WORLD,	DMN_ETSI1,	DMN_WORLD },
-+	{ DMN_ETSI3_ETSIA,	DMN_ETSI3,	DMN_WORLD },
-+	{ DMN_ETSI2_WORLD,	DMN_ETSI2,	DMN_WORLD },
-+	{ DMN_ETSI3_WORLD,	DMN_ETSI3,	DMN_WORLD },
-+	{ DMN_ETSI4_WORLD,	DMN_ETSI4,	DMN_WORLD },
-+	{ DMN_ETSI4_ETSIC,	DMN_ETSI4,	DMN_ETSIC },
-+	{ DMN_ETSI5_WORLD,	DMN_ETSI5,	DMN_WORLD },
-+	{ DMN_ETSI6_WORLD,	DMN_ETSI6,	DMN_WORLD },
-+	{ DMN_ETSI_NULL,	DMN_ETSI1,	DMN_ETSI1 },
-+	{ DMN_MKK1_MKKA,	DMN_MKK1,	DMN_MKKA },
-+	{ DMN_MKK1_MKKB,	DMN_MKK1,	DMN_MKKA },
-+	{ DMN_APL4_WORLD,	DMN_APL4,	DMN_WORLD },
-+	{ DMN_MKK2_MKKA,	DMN_MKK2,	DMN_MKKA },
-+	{ DMN_APL_NULL,		DMN_APL1,	DMN_NULL },
-+	{ DMN_APL2_WORLD,	DMN_APL2,	DMN_WORLD },
-+	{ DMN_APL2_APLC,	DMN_APL2,	DMN_WORLD },
-+	{ DMN_APL3_WORLD,	DMN_APL3,	DMN_WORLD },
-+	{ DMN_MKK1_FCCA,	DMN_MKK1,	DMN_FCCA },
-+	{ DMN_APL2_APLD,	DMN_APL2,	DMN_APLD },
-+	{ DMN_MKK1_MKKA1,	DMN_MKK1,	DMN_MKKA },
-+	{ DMN_MKK1_MKKA2,	DMN_MKK1,	DMN_MKKA },
-+	{ DMN_APL1_WORLD,	DMN_APL1,	DMN_WORLD },
-+	{ DMN_APL1_FCCA,	DMN_APL1,	DMN_FCCA },
-+	{ DMN_APL1_APLA,	DMN_APL1,	DMN_WORLD },
-+	{ DMN_APL1_ETSIC,	DMN_APL1,	DMN_ETSIC },
-+	{ DMN_APL2_ETSIC,	DMN_APL2,	DMN_ETSIC },
-+	{ DMN_APL5_WORLD,	DMN_APL5,	DMN_WORLD },
-+	{ DMN_WOR0_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WOR1_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WOR2_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WOR3_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WOR4_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WOR5_ETSIC,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WOR01_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WOR02_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_EU1_WORLD,	DMN_ETSI1,	DMN_WORLD },
-+	{ DMN_WOR9_WORLD,	DMN_WORLD,	DMN_WORLD },
-+	{ DMN_WORA_WORLD,	DMN_WORLD,	DMN_WORLD },
-+};
++/* Initial register settings functions */
++extern int ath5k_hw_write_initvals(struct ath5k_hw *ah, u8 mode, bool change_channel);
++/* Initialize RF */
++extern int ath5k_hw_rfregs(struct ath5k_hw *ah, struct ieee80211_channel *channel, unsigned int mode);
++extern int ath5k_hw_rfgain(struct ath5k_hw *ah, unsigned int freq);
++extern enum ath5k_rfgain ath5k_hw_get_rf_gain(struct ath5k_hw *ah);
++extern int ath5k_hw_set_rfgain_opt(struct ath5k_hw *ah);
 +
-+enum ath5k_regdom ath5k_regdom2flag(enum ath5k_regdom dmn, u16 mhz)
-+{
-+	unsigned int i;
 +
-+	for (i = 0; i < ARRAY_SIZE(r_map); i++) {
-+		if (r_map[i].dmn == dmn) {
-+			if (mhz >= 2000 && mhz <= 3000)
-+				return r_map[i].dmn2;
-+			if (mhz >= IEEE80211_CHANNELS_5GHZ_MIN &&
-+					mhz <= IEEE80211_CHANNELS_5GHZ_MAX)
-+				return r_map[i].dmn5;
-+		}
-+	}
++/* PHY/RF channel functions */
++extern bool ath5k_channel_ok(struct ath5k_hw *ah, u16 freq, unsigned int flags);
++extern int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel);
++/* PHY calibration */
++extern int ath5k_hw_phy_calibrate(struct ath5k_hw *ah, struct ieee80211_channel *channel);
++extern int ath5k_hw_phy_disable(struct ath5k_hw *ah);
++/* Misc PHY functions */
++extern u16 ath5k_hw_radio_revision(struct ath5k_hw *ah, unsigned int chan);
++extern void ath5k_hw_set_def_antenna(struct ath5k_hw *ah, unsigned int ant);
++extern unsigned int ath5k_hw_get_def_antenna(struct ath5k_hw *ah);
++/* TX power setup */
++extern int ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel, unsigned int txpower);
++extern int ath5k_hw_set_txpower_limit(struct ath5k_hw *ah, unsigned int power);
 +
-+	return DMN_DEBUG;
-+}
 +
-+u16 ath5k_regdom_from_ieee(enum ath5k_regdom ieee)
++static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg)
 +{
-+	u32 regdomain = (u32)ieee;
-+
-+	/*
-+	 * Use the default regulation domain if the value is empty
-+	 * or not supported by the net80211 regulation code.
-+	 */
-+	if (ath5k_regdom2flag(regdomain, IEEE80211_CHANNELS_5GHZ_MIN) ==
-+			DMN_DEBUG)
-+		return (u16)AR5K_TUNE_REGDOMAIN;
-+
-+	/* It is supported, just return the value */
-+	return regdomain;
++	return ioread32(ah->ah_iobase + reg);
 +}
 +
-+enum ath5k_regdom ath5k_regdom_to_ieee(u16 regdomain)
++static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg)
 +{
-+	enum ath5k_regdom ieee = (enum ath5k_regdom)regdomain;
-+
-+	return ieee;
++	iowrite32(val, ah->ah_iobase + reg);
 +}
 +
++#endif
+diff -up linux-2.6.23.noarch/MAINTAINERS.orig linux-2.6.23.noarch/MAINTAINERS
+--- linux-2.6.23.noarch/MAINTAINERS.orig	2007-11-08 16:48:58.000000000 -0500
++++ linux-2.6.23.noarch/MAINTAINERS	2007-11-08 16:49:33.000000000 -0500
+@@ -642,6 +642,14 @@ M:	ecashin at coraid.com
+ W:	http://www.coraid.com/support/linux
+ S:	Supported
+ 
++ATHEROS ATH5K WIRELESS DRIVER
++P:	Jiri Slaby
++M:	jirislaby at gmail.com
++P:	Luis R. Rodriguez
++M:	mcgrof at gmail.com
++L:	linux-wireless at vger.kernel.org
++S:	Maintained
++
+ ATL1 ETHERNET DRIVER
+ P:	Jay Cliburn
+ M:	jcliburn at gmail.com

linux-2.6-wireless.patch:

View full diff with command:
/usr/bin/cvs -f diff  -kk -u -N -r 1.10 -r 1.11 linux-2.6-wireless.patch
Index: linux-2.6-wireless.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/linux-2.6-wireless.patch,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- linux-2.6-wireless.patch	10 Oct 2007 21:58:12 -0000	1.10
+++ linux-2.6-wireless.patch	8 Nov 2007 22:06:16 -0000	1.11
@@ -1,26088 +1,8723 @@
-diff -up linux-2.6.22.noarch/CREDITS.orig linux-2.6.22.noarch/CREDITS
---- linux-2.6.22.noarch/CREDITS.orig	2007-09-26 19:41:26.000000000 -0400
-+++ linux-2.6.22.noarch/CREDITS	2007-09-26 19:49:37.000000000 -0400
-@@ -665,6 +665,11 @@ D: Minor updates to SCSI types, added /p
- S: (ask for current address)
- S: USA
+diff -up linux-2.6.23.noarch/drivers/Kconfig.orig linux-2.6.23.noarch/drivers/Kconfig
+--- linux-2.6.23.noarch/drivers/Kconfig.orig	2007-11-07 21:34:15.000000000 -0500
++++ linux-2.6.23.noarch/drivers/Kconfig	2007-11-07 21:34:29.000000000 -0500
+@@ -58,6 +58,8 @@ source "drivers/power/Kconfig"
  
-+N: Robin Cornelius
-+E: robincornelius at users.sourceforge.net
-+D: Ralink rt2x00 WLAN driver
-+S: Cornwall, U.K.
-+
- N: Mark Corner
- E: mcorner at umich.edu
- W: http://www.eecs.umich.edu/~mcorner/
-@@ -679,6 +684,11 @@ D: Kernel module SMART utilities
- S: Santa Cruz, California
- S: USA
+ source "drivers/hwmon/Kconfig"
  
-+N: Luis Correia
-+E: lfcorreia at users.sf.net
-+D: Ralink rt2x00 WLAN driver
-+S: Belas, Portugal
++source "drivers/ssb/Kconfig"
 +
- N: Alan Cox
- W: http://www.linux.org.uk/diary/
- D: Linux Networking (0.99.10->2.0.29)
-@@ -833,6 +843,12 @@ S: Lancs
- S: PR4 6AX
- S: United Kingdom
+ source "drivers/mfd/Kconfig"
  
-+N: Ivo van Doorn
-+E: IvDoorn at gmail.com
-+W: http://www.mendiosus.nl
-+D: Ralink rt2x00 WLAN driver
-+S: Haarlem, The Netherlands
+ source "drivers/media/Kconfig"
+diff -up /dev/null linux-2.6.23.noarch/drivers/ssb/ssb_private.h
+--- /dev/null	2007-10-26 17:27:29.928203379 -0400
++++ linux-2.6.23.noarch/drivers/ssb/ssb_private.h	2007-11-07 21:34:29.000000000 -0500
+@@ -0,0 +1,136 @@
++#ifndef LINUX_SSB_PRIVATE_H_
++#define LINUX_SSB_PRIVATE_H_
 +
- N: John G Dorsey
- E: john+ at cs.cmu.edu
- D: ARM Linux ports to Assabet/Neponset, Spot
-@@ -3517,6 +3533,12 @@ S: Maastrichterweg 63
- S: 5554 GG Valkenswaard
- S: The Netherlands
- 
-+N: Mark Wallis
-+E: mwallis at serialmonkey.com
-+W: http://mark.serialmonkey.com
-+D: Ralink rt2x00 WLAN driver
-+S: Newcastle, Australia
++#include <linux/ssb/ssb.h>
++#include <linux/types.h>
 +
- N: Peter Shaobo Wang
- E: pwang at mmdcorp.com
- W: http://www.mmdcorp.com/pw/linux
-@@ -3651,6 +3673,15 @@ S: Alte Regensburger Str. 11a
- S: 93149 Nittenau
- S: Germany
- 
-+N: Gertjan van Wingerde
-+E: gwingerde at home.nl
-+D: Ralink rt2x00 WLAN driver
-+D: Minix V2 file-system
-+D: Misc fixes
-+S: Geessinkweg 177
-+S: 7544 TX Enschede
-+S: The Netherlands
 +
- N: Lars Wirzenius
- E: liw at iki.fi
- D: Linux System Administrator's Guide, author, former maintainer
-diff -up linux-2.6.22.noarch/include/linux/nl80211.h.orig linux-2.6.22.noarch/include/linux/nl80211.h
---- linux-2.6.22.noarch/include/linux/nl80211.h.orig	2007-07-08 19:32:17.000000000 -0400
-+++ linux-2.6.22.noarch/include/linux/nl80211.h	2007-09-26 19:49:38.000000000 -0400
-@@ -7,7 +7,97 @@
-  */
- 
- /**
-+ * enum nl80211_commands - supported nl80211 commands
-+ *
-+ * @NL80211_CMD_UNSPEC: unspecified command to catch errors
-+ *
-+ * @NL80211_CMD_GET_WIPHY: request information about a wiphy or dump request
-+ *	to get a list of all present wiphys.
-+ * @NL80211_CMD_SET_WIPHY: set wiphy name, needs %NL80211_ATTR_WIPHY and
-+ *	%NL80211_ATTR_WIPHY_NAME.
-+ * @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request
-+ *	or rename notification. Has attributes %NL80211_ATTR_WIPHY and
-+ *	%NL80211_ATTR_WIPHY_NAME.
-+ * @NL80211_CMD_DEL_WIPHY: Wiphy deleted. Has attributes
-+ *	%NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME.
-+ *
-+ * @NL80211_CMD_GET_INTERFACE: Request an interface's configuration;
-+ *	either a dump request on a %NL80211_ATTR_WIPHY or a specific get
-+ *	on an %NL80211_ATTR_IFINDEX is supported.
-+ * @NL80211_CMD_SET_INTERFACE: Set type of a virtual interface, requires
-+ 	%NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE.
-+ * @NL80211_CMD_NEW_INTERFACE: Newly created virtual interface or response
-+ *	to %NL80211_CMD_GET_INTERFACE. Has %NL80211_ATTR_IFINDEX,
-+ *	%NL80211_ATTR_WIPHY and %NL80211_ATTR_IFTYPE attributes. Can also
-+ *	be sent from userspace to request creation of a new virtual interface,
-+ *	then requires attributes %NL80211_ATTR_WIPHY, %NL80211_ATTR_IFTYPE and
-+ *	%NL80211_ATTR_IFNAME.
-+ * @NL80211_CMD_DEL_INTERFACE: Virtual interface was deleted, has attributes
-+ *	%NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from
-+ *	userspace to request deletion of a virtual interface, then requires
-+ *	attribute %NL80211_ATTR_IFINDEX.
-+ *
-+ * @NL80211_CMD_MAX: highest used command number
-+ * @__NL80211_CMD_AFTER_LAST: internal use
-+ */
-+enum nl80211_commands {
-+/* don't change the order or add anything inbetween, this is ABI! */
-+	NL80211_CMD_UNSPEC,
++#define PFX	"ssb: "
 +
-+	NL80211_CMD_GET_WIPHY,		/* can dump */
-+	NL80211_CMD_SET_WIPHY,
-+	NL80211_CMD_NEW_WIPHY,
-+	NL80211_CMD_DEL_WIPHY,
++#ifdef CONFIG_SSB_SILENT
++# define ssb_printk(fmt, x...)	do { /* nothing */ } while (0)
++#else
++# define ssb_printk		printk
++#endif /* CONFIG_SSB_SILENT */
 +
-+	NL80211_CMD_GET_INTERFACE,	/* can dump */
-+	NL80211_CMD_SET_INTERFACE,
-+	NL80211_CMD_NEW_INTERFACE,
-+	NL80211_CMD_DEL_INTERFACE,
++/* dprintk: Debugging printk; vanishes for non-debug compilation */
++#ifdef CONFIG_SSB_DEBUG
++# define ssb_dprintk(fmt, x...)	ssb_printk(fmt , ##x)
++#else
++# define ssb_dprintk(fmt, x...)	do { /* nothing */ } while (0)
++#endif
 +
-+	/* add commands here */
++#ifdef CONFIG_SSB_DEBUG
++# define SSB_WARN_ON(x)		WARN_ON(x)
++# define SSB_BUG_ON(x)		BUG_ON(x)
++#else
++static inline int __ssb_do_nothing(int x) { return x; }
++# define SSB_WARN_ON(x)		__ssb_do_nothing(unlikely(!!(x)))
++# define SSB_BUG_ON(x)		__ssb_do_nothing(unlikely(!!(x)))
++#endif
 +
-+	/* used to define NL80211_CMD_MAX below */
-+	__NL80211_CMD_AFTER_LAST,
-+	NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
-+};
 +
++/* pci.c */
++#ifdef CONFIG_SSB_PCIHOST
++extern int ssb_pci_switch_core(struct ssb_bus *bus,
++			       struct ssb_device *dev);
++extern int ssb_pci_switch_coreidx(struct ssb_bus *bus,
++				  u8 coreidx);
++extern int ssb_pci_xtal(struct ssb_bus *bus, u32 what,
++			int turn_on);
++extern int ssb_pci_get_invariants(struct ssb_bus *bus,
++				  struct ssb_init_invariants *iv);
++extern void ssb_pci_exit(struct ssb_bus *bus);
++extern int ssb_pci_init(struct ssb_bus *bus);
++extern const struct ssb_bus_ops ssb_pci_ops;
 +
-+/**
-+ * enum nl80211_attrs - nl80211 netlink attributes
-+ *
-+ * @NL80211_ATTR_UNSPEC: unspecified attribute to catch errors
-+ *
-+ * @NL80211_ATTR_WIPHY: index of wiphy to operate on, cf.
-+ *	/sys/class/ieee80211/<phyname>/index
-+ * @NL80211_ATTR_WIPHY_NAME: wiphy name (used for renaming)
++#else /* CONFIG_SSB_PCIHOST */
++
++static inline int ssb_pci_switch_core(struct ssb_bus *bus,
[...248890 lines suppressed...]
++T:	git kernel.org:/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git
++S:	Maintained
 +
-+	if (!pdev)
-+		goto out;
-+	bus = pdev->bus;
+ PRISM54 WIRELESS DRIVER
+ P:	Luis R. Rodriguez
+ M:	mcgrof at gmail.com
+@@ -3106,6 +3151,14 @@ M:	corey at world.std.com
+ L:	linux-wireless at vger.kernel.org
+ S:	Maintained
+ 
++RALINK RT2X00 WLAN DRIVER
++P:	rt2x00 project
++L:	linux-wireless at vger.kernel.org
++L:	rt2400-devel at lists.sourceforge.net
++W:	http://rt2x00.serialmonkey.com/
++S:	Maintained
++F:	drivers/net/wireless/rt2x00/
 +
-+	/* Enable interrupts for this device. */
-+	if (bus->host_pci &&
-+	    ((pdev->id.revision >= 6) || (pdev->id.coreid == SSB_DEV_PCIE))) {
-+		u32 coremask;
+ RANDOM NUMBER DRIVER
+ P:	Matt Mackall
+ M:	mpm at selenic.com
+@@ -3390,15 +3443,10 @@ L:	lm-sensors at lm-sensors.org
+ S:	Maintained
+ 
+ SOFTMAC LAYER (IEEE 802.11)
+-P:	Johannes Berg
+-M:	johannes at sipsolutions.net
+-P:	Joe Jezak
+-M:	josejx at gentoo.org
+ P:	Daniel Drake
+ M:	dsd at gentoo.org
+-W:	http://softmac.sipsolutions.net/
+ L:	linux-wireless at vger.kernel.org
+-S:	Maintained
++S:	Obsolete
+ 
+ SOFTWARE RAID (Multiple Disks) SUPPORT
+ P:	Ingo Molnar
+@@ -3430,6 +3478,12 @@ M:	tsbogend at alpha.franken.de
+ L:	netdev at vger.kernel.org
+ S:	Maintained
+ 
++SONICS SILICON BACKPLANE DRIVER (SSB)
++P:	Michael Buesch
++M:	mb at bu3sch.de
++L:	netdev at vger.kernel.org
++S:	Maintained
 +
-+		/* Calculate the "coremask" for the device. */
-+		coremask = (1 << dev->core_index);
+ SONY VAIO CONTROL DEVICE DRIVER
+ P:	Mattia Dongili
+ M:	malattia at linux.it
+diff -up linux-2.6.23.noarch/CREDITS.orig linux-2.6.23.noarch/CREDITS
+--- linux-2.6.23.noarch/CREDITS.orig	2007-11-07 21:34:15.000000000 -0500
++++ linux-2.6.23.noarch/CREDITS	2007-11-07 21:34:30.000000000 -0500
+@@ -665,6 +665,11 @@ D: Minor updates to SCSI types, added /p
+ S: (ask for current address)
+ S: USA
+ 
++N: Robin Cornelius
++E: robincornelius at users.sourceforge.net
++D: Ralink rt2x00 WLAN driver
++S: Cornwall, U.K.
 +
-+		err = pci_read_config_dword(bus->host_pci, SSB_PCI_IRQMASK, &tmp);
-+		if (err)
-+			goto out;
-+		tmp |= coremask << 8;
-+		err = pci_write_config_dword(bus->host_pci, SSB_PCI_IRQMASK, tmp);
-+		if (err)
-+			goto out;
-+	} else {
-+		u32 intvec;
+ N: Mark Corner
+ E: mcorner at umich.edu
+ W: http://www.eecs.umich.edu/~mcorner/
+@@ -679,6 +684,11 @@ D: Kernel module SMART utilities
+ S: Santa Cruz, California
+ S: USA
+ 
++N: Luis Correia
++E: lfcorreia at users.sf.net
++D: Ralink rt2x00 WLAN driver
++S: Belas, Portugal
 +
-+		intvec = ssb_read32(pdev, SSB_INTVEC);
-+		if ((bus->chip_id & 0xFF00) == 0x4400) {
-+			/* Workaround: On the BCM44XX the BPFLAG routing
-+			 * bit is wrong. Use a hardcoded constant. */
-+			intvec |= 0x00000002;
-+		} else {
-+			tmp = ssb_read32(dev, SSB_TPSFLAG);
-+			tmp &= SSB_TPSFLAG_BPFLAG;
-+			intvec |= tmp;
-+		}
-+		ssb_write32(pdev, SSB_INTVEC, intvec);
-+	}
+ N: Alan Cox
+ W: http://www.linux.org.uk/diary/
+ D: Linux Networking (0.99.10->2.0.29)
+@@ -833,6 +843,12 @@ S: Lancs
+ S: PR4 6AX
+ S: United Kingdom
+ 
++N: Ivo van Doorn
++E: IvDoorn at gmail.com
++W: http://www.mendiosus.nl
++D: Ralink rt2x00 WLAN driver
++S: Haarlem, The Netherlands
 +
-+	/* Setup PCIcore operation. */
-+	if (pc->setup_done)
-+		goto out;
-+	if (pdev->id.coreid == SSB_DEV_PCI) {
-+		tmp = pcicore_read32(pc, SSB_PCICORE_SBTOPCI2);
-+		tmp |= SSB_PCICORE_SBTOPCI_PREF;
-+		tmp |= SSB_PCICORE_SBTOPCI_BURST;
-+		pcicore_write32(pc, SSB_PCICORE_SBTOPCI2, tmp);
+ N: John G Dorsey
+ E: john+ at cs.cmu.edu
+ D: ARM Linux ports to Assabet/Neponset, Spot
+@@ -3517,6 +3533,12 @@ S: Maastrichterweg 63
+ S: 5554 GG Valkenswaard
+ S: The Netherlands
+ 
++N: Mark Wallis
++E: mwallis at serialmonkey.com
++W: http://mark.serialmonkey.com
++D: Ralink rt2x00 WLAN driver
++S: Newcastle, Australia
 +
-+		if (pdev->id.revision < 5) {
-+			tmp = ssb_read32(pdev, SSB_IMCFGLO);
-+			tmp &= ~SSB_IMCFGLO_SERTO;
-+			tmp |= 2;
-+			tmp &= ~SSB_IMCFGLO_REQTO;
-+			tmp |= 3 << SSB_IMCFGLO_REQTO_SHIFT;
-+			ssb_write32(pdev, SSB_IMCFGLO, tmp);
-+			ssb_commit_settings(bus);
-+		} else if (pdev->id.revision >= 11) {
-+			tmp = pcicore_read32(pc, SSB_PCICORE_SBTOPCI2);
-+			tmp |= SSB_PCICORE_SBTOPCI_MRM;
-+			pcicore_write32(pc, SSB_PCICORE_SBTOPCI2, tmp);
-+		}
-+	} else {
-+		WARN_ON(pdev->id.coreid != SSB_DEV_PCIE);
-+		//TODO: Better make defines for all these magic PCIE values.
-+		if ((pdev->id.revision == 0) || (pdev->id.revision == 1)) {
-+			/* TLP Workaround register. */
-+			tmp = ssb_pcie_read(pc, 0x4);
-+			tmp |= 0x8;
-+			ssb_pcie_write(pc, 0x4, tmp);
-+		}
-+		if (pdev->id.revision == 0) {
-+			const u8 serdes_rx_device = 0x1F;
+ N: Peter Shaobo Wang
+ E: pwang at mmdcorp.com
+ W: http://www.mmdcorp.com/pw/linux
+@@ -3651,6 +3673,15 @@ S: Alte Regensburger Str. 11a
+ S: 93149 Nittenau
+ S: Germany
+ 
++N: Gertjan van Wingerde
++E: gwingerde at home.nl
++D: Ralink rt2x00 WLAN driver
++D: Minix V2 file-system
++D: Misc fixes
++S: Geessinkweg 177
++S: 7544 TX Enschede
++S: The Netherlands
 +
-+			ssb_pcie_mdio_write(pc, serdes_rx_device,
-+					    2 /* Timer */, 0x8128);
-+			ssb_pcie_mdio_write(pc, serdes_rx_device,
-+					    6 /* CDR */, 0x0100);
-+			ssb_pcie_mdio_write(pc, serdes_rx_device,
-+					    7 /* CDR BW */, 0x1466);
-+		} else if (pdev->id.revision == 1) {
-+			/* DLLP Link Control register. */
-+			tmp = ssb_pcie_read(pc, 0x100);
-+			tmp |= 0x40;
-+			ssb_pcie_write(pc, 0x100, tmp);
-+		}
-+	}
-+	pc->setup_done = 1;
-+out:
-+	return err;
-+}
-+EXPORT_SYMBOL(ssb_pcicore_dev_irqvecs_enable);
+ N: Lars Wirzenius
+ E: liw at iki.fi
+ D: Linux System Administrator's Guide, author, former maintainer

linux-2.6-zd1211rw-mac80211.patch:

Index: linux-2.6-zd1211rw-mac80211.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/linux-2.6-zd1211rw-mac80211.patch,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- linux-2.6-zd1211rw-mac80211.patch	5 Oct 2007 15:17:09 -0000	1.4
+++ linux-2.6-zd1211rw-mac80211.patch	8 Nov 2007 22:06:18 -0000	1.5
@@ -1,11 +1,11 @@
-diff -up linux-2.6.22.noarch/MAINTAINERS.orig linux-2.6.22.noarch/MAINTAINERS
---- linux-2.6.22.noarch/MAINTAINERS.orig	2007-09-27 09:59:49.000000000 -0400
-+++ linux-2.6.22.noarch/MAINTAINERS	2007-09-27 09:59:55.000000000 -0400
+diff -up linux-2.6.23.noarch/MAINTAINERS.orig linux-2.6.23.noarch/MAINTAINERS
+--- linux-2.6.23.noarch/MAINTAINERS.orig	2007-10-19 14:54:06.000000000 -0400
++++ linux-2.6.23.noarch/MAINTAINERS	2007-10-19 14:54:14.000000000 -0400
 @@ -4287,6 +4287,16 @@ W:	http://www.qsl.net/dl1bke/
  L:	linux-hams at vger.kernel.org
  S:	Maintained
  
-+ZD1211RW-MAC80211 WIRELESS DRIVER
++ZD1211-MAC80211 WIRELESS DRIVER
 +P:	Daniel Drake
 +M:	dsd at gentoo.org
 +P:	Ulrich Kunitz
@@ -18,9 +18,9 @@
  ZD1211RW WIRELESS DRIVER
  P:	Daniel Drake
  M:	dsd at gentoo.org
-diff -up linux-2.6.22.noarch/drivers/net/wireless/Makefile.orig linux-2.6.22.noarch/drivers/net/wireless/Makefile
---- linux-2.6.22.noarch/drivers/net/wireless/Makefile.orig	2007-09-27 09:59:49.000000000 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/Makefile	2007-09-27 09:59:55.000000000 -0400
+diff -up linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig linux-2.6.23.noarch/drivers/net/wireless/Makefile
+--- linux-2.6.23.noarch/drivers/net/wireless/Makefile.orig	2007-10-19 14:54:06.000000000 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/Makefile	2007-10-19 14:54:14.000000000 -0400
 @@ -41,6 +41,7 @@ obj-$(CONFIG_BCM43XX)		+= bcm43xx/
  obj-$(CONFIG_B43)		+= b43/
  obj-$(CONFIG_B43LEGACY)		+= b43legacy/
@@ -29,10 +29,10 @@
  
  # 16-bit wireless PCMCIA client drivers
  obj-$(CONFIG_PCMCIA_RAYCS)	+= ray_cs.o
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.c	2007-09-27 10:00:45.000000000 -0400
-@@ -0,0 +1,1619 @@
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.c	2007-10-19 14:54:54.000000000 -0400
+@@ -0,0 +1,1621 @@
 +/* zd_chip.c
 + *
 + * This program is free software; you can redistribute it and/or modify
@@ -63,7 +63,6 @@
 +#include "zd_ieee80211.h"
 +#include "zd_mac.h"
 +#include "zd_rf.h"
-+#include "zd_util.h"
 +
 +void zd_chip_init(struct zd_chip *chip,
 +	         struct ieee80211_hw *hw,
@@ -86,7 +85,7 @@
 +
 +static int scnprint_mac_oui(struct zd_chip *chip, char *buffer, size_t size)
 +{
-+	u8 *addr = zd_chip_to_mac(chip)->hwaddr;
++	u8 *addr = zd_mac_get_perm_addr(zd_chip_to_mac(chip));
 +	return scnprintf(buffer, size, "%02x-%02x-%02x",
 +		         addr[0], addr[1], addr[2]);
 +}
@@ -413,15 +412,18 @@
 +		[1] = { .addr = CR_MAC_ADDR_P2 },
 +	};
 +
-+	reqs[0].value = (mac_addr[3] << 24)
-+		      | (mac_addr[2] << 16)
-+		      | (mac_addr[1] <<  8)
-+		      |  mac_addr[0];
-+	reqs[1].value = (mac_addr[5] <<  8)
-+		      |  mac_addr[4];
-+
-+	dev_dbg_f(zd_chip_dev(chip),
-+		"mac addr " MAC_FMT "\n", MAC_ARG(mac_addr));
++	if (mac_addr) {
++		reqs[0].value = (mac_addr[3] << 24)
++			      | (mac_addr[2] << 16)
++			      | (mac_addr[1] <<  8)
++			      |  mac_addr[0];
++		reqs[1].value = (mac_addr[5] <<  8)
++			      |  mac_addr[4];
++		dev_dbg_f(zd_chip_dev(chip),
++			"mac addr " MAC_FMT "\n", MAC_ARG(mac_addr));
++	} else {
++		dev_dbg_f(zd_chip_dev(chip), "set NULL mac\n");
++	}
 +
 +	mutex_lock(&chip->mutex);
 +	r = zd_iowrite32a_locked(chip, reqs, ARRAY_SIZE(reqs));
@@ -1652,24 +1654,24 @@
 +
 +	return zd_iowrite32a(chip, ioreqs, ARRAY_SIZE(ioreqs));
 +}
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/Makefile
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/Makefile	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/Makefile
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/Makefile	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,10 @@
 +obj-$(CONFIG_ZD1211RW_MAC80211) += zd1211rw-mac80211.o
 +
 +zd1211rw-mac80211-objs := zd_chip.o zd_mac.o \
 +		zd_rf_al2230.o zd_rf_rf2959.o \
 +		zd_rf_al7230b.o zd_rf_uw2453.o \
-+		zd_ieee80211.o zd_rf.o zd_usb.o zd_util.o
++		zd_ieee80211.o zd_rf.o zd_usb.o
 +
 +ifeq ($(CONFIG_ZD1211RW_MAC80211_DEBUG),y)
 +EXTRA_CFLAGS += -DDEBUG
 +endif
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_def.h
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_def.h	2007-09-27 09:59:55.000000000 -0400
-@@ -0,0 +1,57 @@
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_def.h
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_def.h	2007-10-19 14:54:14.000000000 -0400
+@@ -0,0 +1,56 @@
 +/* zd_def.h
 + *
 + * This program is free software; you can redistribute it and/or modify
@@ -1693,7 +1695,6 @@
 +#include <linux/kernel.h>
 +#include <linux/stringify.h>
 +#include <linux/device.h>
-+#include <linux/kernel.h>
 +
 +typedef u16 __nocast zd_addr_t;
 +
@@ -1727,9 +1728,9 @@
 +#endif
 +
 +#endif /* _ZD_DEF_H */
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.h
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.h	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.h
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.h	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,108 @@
 +/* zd_rf.h
 + *
@@ -1839,10 +1840,10 @@
 +int zd_rf_init_uw2453(struct zd_rf *rf);
 +
 +#endif /* _ZD_RF_H */
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.h
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.h	2007-09-27 09:59:55.000000000 -0400
-@@ -0,0 +1,921 @@
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.h
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_chip.h	2007-10-19 14:54:14.000000000 -0400
+@@ -0,0 +1,943 @@
 +/* zd_chip.h
 + *
 + * This program is free software; you can redistribute it and/or modify
@@ -2355,15 +2356,37 @@
 +#define CR_UNDERRUN_CNT			CTL_REG(0x0688)
 +
 +#define CR_RX_FILTER			CTL_REG(0x068c)
++#define RX_FILTER_ASSOC_REQUEST		(1 <<  0)
 +#define RX_FILTER_ASSOC_RESPONSE	(1 <<  1)
++#define RX_FILTER_REASSOC_REQUEST	(1 <<  2)
 +#define RX_FILTER_REASSOC_RESPONSE	(1 <<  3)
++#define RX_FILTER_PROBE_REQUEST		(1 <<  4)
 +#define RX_FILTER_PROBE_RESPONSE	(1 <<  5)
++/* bits 6 and 7 reserved */
 +#define RX_FILTER_BEACON		(1 <<  8)
++#define RX_FILTER_ATIM			(1 <<  9)
 +#define RX_FILTER_DISASSOC		(1 << 10)
 +#define RX_FILTER_AUTH			(1 << 11)
++#define RX_FILTER_DEAUTH		(1 << 12)
++#define RX_FILTER_PSPOLL		(1 << 26)
++#define RX_FILTER_RTS			(1 << 27)
++#define RX_FILTER_CTS			(1 << 28)
 +#define RX_FILTER_ACK			(1 << 29)
-+#define AP_RX_FILTER			0x0400feff
-+#define STA_RX_FILTER			0x2000ffff
++#define RX_FILTER_CFEND			(1 << 30)
++#define RX_FILTER_CFACK			(1 << 31)
++
++/* Enable bits for all frames you are interested in. */
++#define STA_RX_FILTER	(RX_FILTER_ASSOC_REQUEST | RX_FILTER_ASSOC_RESPONSE | \
++	RX_FILTER_REASSOC_REQUEST | RX_FILTER_REASSOC_RESPONSE | \
++	RX_FILTER_PROBE_REQUEST | RX_FILTER_PROBE_RESPONSE | \
++	(0x3 << 6) /* vendor driver sets these reserved bits */ | \
++	RX_FILTER_BEACON | RX_FILTER_ATIM | RX_FILTER_DISASSOC | \
++	RX_FILTER_AUTH | RX_FILTER_DEAUTH | \
++	(0x7 << 13) /* vendor driver sets these reserved bits */ | \
++	RX_FILTER_PSPOLL | RX_FILTER_ACK) /* 0x2400ffff */
++
++#define RX_FILTER_CTRL (RX_FILTER_RTS | RX_FILTER_CTS | \
++	RX_FILTER_CFEND | RX_FILTER_CFACK)
 +
 +/* Monitor mode sets filter to 0xfffff */
 +
@@ -2764,9 +2787,9 @@
 +	                       struct zd_mc_hash *hash);
 +
 +#endif /* _ZD_CHIP_H */
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al2230.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al2230.c	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al2230.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al2230.c	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,439 @@
 +/* zd_rf_al2230.c: Functions for the AL2230 RF controller
 + *
@@ -3207,128 +3230,9 @@
 +	rf->patch_cck_gain = 1;
 +	return 0;
 +}
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_util.h
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_util.h	2007-09-27 09:59:55.000000000 -0400
-@@ -0,0 +1,29 @@
-+/* zd_util.h
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#ifndef _ZD_UTIL_H
-+#define _ZD_UTIL_H
-+
-+void *zd_tail(const void *buffer, size_t buffer_size, size_t tail_size);
-+
-+#ifdef DEBUG
-+void zd_hexdump(const void *bytes, size_t size);
-+#else
-+#define zd_hexdump(bytes, size)
-+#endif /* DEBUG */
-+
-+#endif /* _ZD_UTIL_H */
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_util.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_util.c	2007-09-27 09:59:55.000000000 -0400
-@@ -0,0 +1,82 @@
-+/* zd_util.c
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ * Utility program
-+ */
-+
-+#include "zd_def.h"
-+#include "zd_util.h"
-+
-+#ifdef DEBUG
-+static char hex(u8 v)
-+{
-+	v &= 0xf;
-+	return (v < 10 ? '0' : 'a' - 10) + v;
-+}
-+
-+static char hex_print(u8 c)
-+{
-+	return (0x20 <= c && c < 0x7f) ? c : '.';
-+}
-+
-+static void dump_line(const u8 *bytes, size_t size)
-+{
-+	char c;
-+	size_t i;
-+
-+	size = size <= 8 ? size : 8;
-+	printk(KERN_DEBUG "zd1211 %p ", bytes);
-+	for (i = 0; i < 8; i++) {
-+		switch (i) {
-+		case 1:
-+		case 5:
-+			c = '.';
-+			break;
-+		case 3:
-+			c = ':';
-+			break;
-+		default:
-+			c = ' ';
-+		}
-+		if (i < size) {
-+			printk("%c%c%c", hex(bytes[i] >> 4), hex(bytes[i]), c);
-+		} else {
-+			printk("  %c", c);
-+		}
-+	}
-+
-+	for (i = 0; i < size; i++)
-+		printk("%c", hex_print(bytes[i]));
-+	printk("\n");
-+}
-+
-+void zd_hexdump(const void *bytes, size_t size)
-+{
-+	size_t i = 0;
-+
-+	do {
-+		dump_line((u8 *)bytes + i, size-i);
-+		i += 8;
-+	} while (i < size);
-+}
-+#endif /* DEBUG */
-+
-+void *zd_tail(const void *buffer, size_t buffer_size, size_t tail_size)
-+{
-+	if (buffer_size < tail_size)
-+		return NULL;
-+	return (u8 *)buffer + (buffer_size - tail_size);
-+}
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_rf2959.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_rf2959.c	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_rf2959.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_rf2959.c	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,279 @@
 +/* zd_rf_rfmd.c: Functions for the RFMD RF controller
 + *
@@ -3609,9 +3513,9 @@
 +	rf->switch_radio_off = rf2959_switch_radio_off;
 +	return 0;
 +}
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.h
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.h	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.h
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.h	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,75 @@
 +#ifndef _ZD_IEEE80211_H
 +#define _ZD_IEEE80211_H
@@ -3688,9 +3592,9 @@
 +#define ZD_CCK_PLCP_SIGNAL_11M	0x6e
 +
 +#endif /* _ZD_IEEE80211_H */
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/Kconfig
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/Kconfig	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/Kconfig
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/Kconfig	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,18 @@
 +config ZD1211RW_MAC80211
 +	tristate "ZyDAS ZD1211/ZD1211B USB support (mac80211 stack)"
@@ -3710,9 +3614,9 @@
 +	---help---
 +	  ZD1211 debugging messages. Choosing Y will result in additional debug
 +	  messages being saved to your kernel logs, which may help debug any
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.c	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_ieee80211.c	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,100 @@
 +/* zd_ieee80211.c
 + *
@@ -3814,9 +3718,9 @@
 +	unmask_bg_channels(hw, range, &mac->modes[1]);
 +}
 +
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.h
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.h	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.h
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.h	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,263 @@
 +/* zd_usb.h: Header for USB interface implemented by ZD1211 chip
 + *
@@ -4081,9 +3985,9 @@
 +extern struct workqueue_struct *zd_workqueue;
 +
 +#endif /* _ZD_USB_H */
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.c	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf.c	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,178 @@
 +/* zd_rf.c
 + *
@@ -4263,9 +4167,9 @@
 +	return zd_chip_generic_patch_6m_band(zd_rf_to_chip(rf), channel);
 +}
 +
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_uw2453.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_uw2453.c	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_uw2453.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_uw2453.c	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,534 @@
 +/* zd_rf_uw2453.c: Functions for the UW2453 RF controller
 + *
@@ -4801,10 +4705,10 @@
 +	return 0;
 +}
 +
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.h
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.h	2007-09-27 09:59:55.000000000 -0400
-@@ -0,0 +1,227 @@
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.h
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.h	2007-10-19 14:54:14.000000000 -0400
+@@ -0,0 +1,238 @@
 +/* zd_mac.h
 + *
 + * This program is free software; you can redistribute it and/or modify
@@ -4980,12 +4884,12 @@
 +	struct housekeeping housekeeping;
 +	struct work_struct set_multicast_hash_work;
 +	struct work_struct set_rts_cts_work;
++	struct work_struct set_rx_filter_work;
 +	struct zd_mc_hash multicast_hash;
 +	u8 regdomain;
 +	u8 default_regdomain;
 +	int type;
 +	int associated;
-+	u8 *hwaddr;
 +	struct sk_buff_head ack_wait_queue;
 +	struct ieee80211_channel channels[14];
 +	struct ieee80211_rate rates[12];
@@ -4996,6 +4900,12 @@
 +
 +	/* flags to indicate update in progress */
 +	unsigned int updating_rts_rate:1;
++
++	/* whether to pass frames with CRC errors to stack */
++	unsigned int pass_failed_fcs:1;
++
++	/* whether to pass control frames to stack */
++	unsigned int pass_ctrl:1;
 +};
 +
 +static inline struct zd_mac *zd_hw_mac(struct ieee80211_hw *hw)
@@ -5013,6 +4923,11 @@
 +	return zd_chip_to_mac(zd_usb_to_chip(usb));
 +}
 +
++static inline u8 *zd_mac_get_perm_addr(struct zd_mac *mac)
++{
++	return mac->hw->wiphy->perm_addr;
++}
++
 +#define zd_mac_dev(mac) (zd_chip_dev(&(mac)->chip))
 +
 +struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf);
@@ -5032,9 +4947,9 @@
 +#endif /* DEBUG */
 +
 +#endif /* _ZD_MAC_H */
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al7230b.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al7230b.c	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al7230b.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_rf_al7230b.c	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,492 @@
 +/* zd_rf_al7230b.c: Functions for the AL7230B RF controller
 + *
@@ -5528,9 +5443,9 @@
 +
 +	return 0;
 +}
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.c	2007-09-27 09:59:55.000000000 -0400
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_usb.c	2007-10-19 14:54:14.000000000 -0400
 @@ -0,0 +1,1528 @@
 +/* zd_usb.c
 + *
@@ -5563,7 +5478,6 @@
 +#include "zd_def.h"
 +#include "zd_mac.h"
 +#include "zd_usb.h"
-+#include "zd_util.h"
 +
 +static struct usb_device_id usb_ids[] = {
 +	/* ZD1211 */
@@ -5609,6 +5523,7 @@
 +	{ USB_DEVICE(0x129b, 0x1667), .driver_info = DEVICE_ZD1211B },
 +	{ USB_DEVICE(0x0cde, 0x001a), .driver_info = DEVICE_ZD1211B },
 +	{ USB_DEVICE(0x0586, 0x340a), .driver_info = DEVICE_ZD1211B },
++	{ USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B },
 +	/* "Driverless" devices that need ejecting */
 +	{ USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
 +	{ USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER },
@@ -7060,12 +6975,14 @@
 +	kfree(req);
 +	return r;
 +}
-diff -up /dev/null linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.c
---- /dev/null	2007-09-27 08:31:24.563724082 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.c	2007-09-27 10:01:28.000000000 -0400
-@@ -0,0 +1,950 @@
+diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.c
+--- /dev/null	2007-10-19 09:45:41.508682727 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/zd1211rw-mac80211/zd_mac.c	2007-10-19 14:54:54.000000000 -0400
+@@ -0,0 +1,976 @@
 +/* zd_mac.c
 + *
++ * Copyright (c) 2007 Luis R. Rodriguez <mcgrof at winlab.rutgers.edu>
++ *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
@@ -7092,7 +7009,6 @@
 +#include "zd_mac.h"
 +#include "zd_ieee80211.h"
 +#include "zd_rf.h"
-+#include "zd_util.h"
 +
 +/* This table contains the hardware specific values for the modulation rates. */
 +static const struct ieee80211_rate zd_rates[] = {
@@ -7182,10 +7098,7 @@
 +	if (r)
 +		return r;
 +
-+	spin_lock_irq(&mac->lock);
 +	SET_IEEE80211_PERM_ADDR(hw, addr);
-+	memcpy(mac->hwaddr, addr, ETH_ALEN);
-+	spin_unlock_irq(&mac->lock);
 +
 +	return 0;
 +}
@@ -7236,43 +7149,27 @@
 +	ZD_MEMCLEAR(mac, sizeof(struct zd_mac));
 +}
 +
-+/**
-+ * has_monitor_interfaces - have monitor interfaces been enabled?
-+ * @mac: the struct zd_mac pointer
-+ *
-+ * The function returns, whether the device has monitor interfaces attached.
-+ */
-+static int has_monitor_interfaces(struct zd_mac *mac)
-+{
-+	return mac->type == IEEE80211_IF_TYPE_MNTR;
-+}
-+
 +static int set_rx_filter(struct zd_mac *mac)
 +{
-+	u32 filter = has_monitor_interfaces(mac) ? ~0 : STA_RX_FILTER;
++	unsigned long flags;
++	u32 filter = STA_RX_FILTER;
 +
-+	return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter);
-+}
++	spin_lock_irqsave(&mac->lock, flags);
++	if (mac->pass_ctrl)
++		filter |= RX_FILTER_CTRL;
++	spin_unlock_irqrestore(&mac->lock, flags);
 +
-+static int set_sniffer(struct zd_mac *mac)
-+{
-+	return zd_iowrite32(&mac->chip, CR_SNIFFER_ON,
-+		has_monitor_interfaces(mac) ? 1 : 0);
-+	return 0;
++	return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter);
 +}
 +
 +static int set_mc_hash(struct zd_mac *mac)
 +{
 +	struct zd_mc_hash hash;
-+
 +	zd_mc_clear(&hash);
-+	if (has_monitor_interfaces(mac))
-+		zd_mc_add_all(&hash);
-+
 +	return zd_chip_set_multicast_hash(&mac->chip, &hash);
 +}
 +
-+static int zd_op_open(struct ieee80211_hw *hw)
++static int zd_op_start(struct ieee80211_hw *hw)
 +{
 +	struct zd_mac *mac = zd_hw_mac(hw);
 +	struct zd_chip *chip = &mac->chip;
@@ -7289,18 +7186,12 @@
 +	if (r < 0)
 +		goto out;
 +
-+	r = zd_write_mac_addr(chip, mac->hwaddr);
-+	if (r)
-+		goto disable_int;
 +	r = zd_chip_set_basic_rates(chip, CR_RATES_80211B | CR_RATES_80211G);
 +	if (r < 0)
 +		goto disable_int;
 +	r = set_rx_filter(mac);
 +	if (r)
 +		goto disable_int;
-+	r = set_sniffer(mac);
-+	if (r)
-+		goto disable_int;
 +	r = set_mc_hash(mac);
 +	if (r)
 +		goto disable_int;
@@ -7356,7 +7247,7 @@
 +	dev_kfree_skb_any(skb);
 +}
 +
-+static int zd_op_stop(struct ieee80211_hw *hw)
++static void zd_op_stop(struct ieee80211_hw *hw)
 +{
 +	struct zd_mac *mac = zd_hw_mac(hw);
 +	struct zd_chip *chip = &mac->chip;
@@ -7379,8 +7270,6 @@
 +
 +	while ((skb = skb_dequeue(ack_wait_queue)))
 +		kfree_tx_skb(skb);
-+
-+	return 0;
 +}
 +
 +/**
@@ -7668,32 +7557,6 @@
 +	return 0;
 +}
 +
-+static int fill_rx_stats(struct ieee80211_rx_status *stats,
-+	                 const struct rx_status **pstatus,
-+		         struct zd_mac *mac,
-+			 const u8 *buffer, unsigned int length)
-+{
-+	const struct rx_status *status;
-+
-+	*pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status));
-+	if (status->frame_status & ZD_RX_ERROR) {
-+		/* FIXME: update? */
-+		return -EINVAL;
-+	}
-+	memset(stats, 0, sizeof(*stats));
-+
-+	stats->channel = _zd_chip_get_channel(&mac->chip);
-+	stats->freq = zd_channels[stats->channel - 1].freq;
-+	stats->phymode = MODE_IEEE80211G;
-+	stats->ssi = status->signal_strength;
-+	stats->signal = zd_rx_qual_percent(buffer,
-+		                          length - sizeof(struct rx_status),
-+		                          status);
-+	stats->rate = zd_rx_rate(buffer, status);
-+
-+	return 0;
-+}
-+
 +/**
 + * filter_ack - filters incoming packets for acknowledgements
 + * @dev: the mac80211 device
@@ -7705,6 +7568,8 @@
 + * the upper layers is informed about the successful transmission. If
 + * mac80211 queues have been stopped and the number of frames still to be
 + * transmitted is low the queues will be opened again.
++ *
++ * Returns 1 if the frame was an ACK, 0 if it was ignored.
 + */
 +static int filter_ack(struct ieee80211_hw *hw, struct ieee80211_hdr *rx_hdr,
 +		      struct ieee80211_rx_status *stats)
@@ -7741,25 +7606,60 @@
 +
 +int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length)
 +{
-+	int r;
 +	struct zd_mac *mac = zd_hw_mac(hw);
 +	struct ieee80211_rx_status stats;
 +	const struct rx_status *status;
 +	struct sk_buff *skb;
++	int bad_frame = 0;
 +
 +	if (length < ZD_PLCP_HEADER_SIZE + 10 /* IEEE80211_1ADDR_LEN */ +
 +	             FCS_LEN + sizeof(struct rx_status))
 +		return -EINVAL;
 +
-+	r = fill_rx_stats(&stats, &status, mac, buffer, length);
-+	if (r)
-+		return r;
++	memset(&stats, 0, sizeof(stats));
++
++	/* Note about pass_failed_fcs and pass_ctrl access below:
++	 * mac locking intentionally omitted here, as this is the only unlocked
++	 * reader and the only writer is configure_filter. Plus, if there were
++	 * any races accessing these variables, it wouldn't really matter.
++	 * If mac80211 ever provides a way for us to access filter flags
++	 * from outside configure_filter, we could improve on this. Also, this
++	 * situation may change once we implement some kind of DMA-into-skb
++	 * RX path. */
++
++	/* Caller has to ensure that length >= sizeof(struct rx_status). */
++	status = (struct rx_status *)
++		(buffer + (length - sizeof(struct rx_status)));
++	if (status->frame_status & ZD_RX_ERROR) {
++		if (mac->pass_failed_fcs &&
++				(status->frame_status & ZD_RX_CRC32_ERROR)) {
++			stats.flag |= RX_FLAG_FAILED_FCS_CRC;
++			bad_frame = 1;
++		} else {
++			return -EINVAL;
++		}
++	}
++
++	stats.channel = _zd_chip_get_channel(&mac->chip);
++	stats.freq = zd_channels[stats.channel - 1].freq;
++	stats.phymode = MODE_IEEE80211G;
++	stats.ssi = status->signal_strength;
++	stats.signal = zd_rx_qual_percent(buffer,
++		                          length - sizeof(struct rx_status),
++		                          status);
++	stats.rate = zd_rx_rate(buffer, status);
 +
 +	length -= ZD_PLCP_HEADER_SIZE + sizeof(struct rx_status);
 +	buffer += ZD_PLCP_HEADER_SIZE;
 +
-+	if (filter_ack(hw, (struct ieee80211_hdr *)buffer, &stats) &&
-+	    !has_monitor_interfaces(mac))
++	/* Except for bad frames, filter each frame to see if it is an ACK, in
++	 * which case our internal TX tracking is updated. Normally we then
++	 * bail here as there's no need to pass ACKs on up to the stack, but
++	 * there is also the case where the stack has requested us to pass
++	 * control frames on up (pass_ctrl) which we must consider. */
++	if (!bad_frame &&
++			filter_ack(hw, (struct ieee80211_hdr *)buffer, &stats)
++			&& !mac->pass_ctrl)
 +		return 0;
 +
 +	skb = dev_alloc_skb(length);
@@ -7776,9 +7676,9 @@
 +{
 +	struct zd_mac *mac = zd_hw_mac(hw);
 +
-+	/* NOTE: using IEEE80211_IF_TYPE_MGMT to indicate no mode selected */
-+	if (mac->type != IEEE80211_IF_TYPE_MGMT)
-+		return -1;
++	/* using IEEE80211_IF_TYPE_INVALID to indicate no mode selected */
++	if (mac->type != IEEE80211_IF_TYPE_INVALID)
++		return -EOPNOTSUPP;
 +
 +	switch (conf->type) {
 +	case IEEE80211_IF_TYPE_MNTR:
@@ -7789,16 +7689,15 @@
 +		return -EOPNOTSUPP;
 +	}
 +
-+	mac->hwaddr = conf->mac_addr;
-+
-+	return 0;
++	return zd_write_mac_addr(&mac->chip, conf->mac_addr);
 +}
 +
 +static void zd_op_remove_interface(struct ieee80211_hw *hw,
 +				    struct ieee80211_if_init_conf *conf)
 +{
 +	struct zd_mac *mac = zd_hw_mac(hw);
-+	mac->type = IEEE80211_IF_TYPE_MGMT;
++	mac->type = IEEE80211_IF_TYPE_INVALID;
++	zd_write_mac_addr(&mac->chip, NULL);
 +}
 +
 +static int zd_op_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf)
@@ -7812,7 +7711,9 @@
 +{
 +	struct zd_mac *mac = zd_hw_mac(hw);
 +
++	spin_lock_irq(&mac->lock);
 +	mac->associated = is_valid_ether_addr(conf->bssid);
++	spin_unlock_irq(&mac->lock);
 +
 +	/* TODO: do hardware bssid filtering */
 +	return 0;
@@ -7831,33 +7732,73 @@
 +	zd_chip_set_multicast_hash(&mac->chip, &hash);
 +}
 +
-+static void zd_op_set_multicast_list(struct ieee80211_hw *hw,
-+				      unsigned short dev_flags, int mc_count)
++static void set_rx_filter_handler(struct work_struct *work)
++{
++	struct zd_mac *mac =
++		container_of(work, struct zd_mac, set_rx_filter_work);
++	int r;
++
++	dev_dbg_f(zd_mac_dev(mac), "\n");
++	r = set_rx_filter(mac);
++	if (r)
++		dev_err(zd_mac_dev(mac), "set_rx_filter_handler error %d\n", r);
++}
++
++#define SUPPORTED_FIF_FLAGS \
++	(FIF_PROMISC_IN_BSS | FIF_ALLMULTI | FIF_FCSFAIL | FIF_CONTROL | \
++	FIF_OTHER_BSS)
++static void zd_op_configure_filter(struct ieee80211_hw *hw,
++			unsigned int changed_flags,
++			unsigned int *new_flags,
++			int mc_count, struct dev_mc_list *mclist)
 +{
 +	struct zd_mc_hash hash;
 +	struct zd_mac *mac = zd_hw_mac(hw);
 +	unsigned long flags;
++	int i;
 +
-+	if ((dev_flags & (IFF_PROMISC|IFF_ALLMULTI)) ||
-+	     has_monitor_interfaces(mac))
-+	{
++	/* Only deal with supported flags */
++	changed_flags &= SUPPORTED_FIF_FLAGS;
++	*new_flags &= SUPPORTED_FIF_FLAGS;
++
++	/* changed_flags is always populated but this driver
++	 * doesn't support all FIF flags so its possible we don't
++	 * need to do anything */
++	if (!changed_flags)
++		return;
++
++	if (*new_flags & (FIF_PROMISC_IN_BSS | FIF_ALLMULTI)) {
 +		zd_mc_add_all(&hash);
 +	} else {
-+		struct dev_mc_list *mc = NULL;
-+		void *tmp = NULL;
-+
 +		zd_mc_clear(&hash);
-+		while ((mc = ieee80211_get_mc_list_item(hw, mc, &tmp))) {
++		for (i = 0; i < mc_count; i++) {
++			if (!mclist)
++				break;
 +			dev_dbg_f(zd_mac_dev(mac), "mc addr " MAC_FMT "\n",
-+				  MAC_ARG(mc->dmi_addr));
-+			zd_mc_add_addr(&hash, mc->dmi_addr);
++				  MAC_ARG(mclist->dmi_addr));
++			zd_mc_add_addr(&hash, mclist->dmi_addr);
++			mclist = mclist->next;
 +		}
 +	}
 +
 +	spin_lock_irqsave(&mac->lock, flags);
++	mac->pass_failed_fcs = !!(*new_flags & FIF_FCSFAIL);
++	mac->pass_ctrl = !!(*new_flags & FIF_CONTROL);
 +	mac->multicast_hash = hash;
 +	spin_unlock_irqrestore(&mac->lock, flags);
 +	queue_work(zd_workqueue, &mac->set_multicast_hash_work);
++
++	if (changed_flags & FIF_CONTROL)
++		queue_work(zd_workqueue, &mac->set_rx_filter_work);
++
++	/* no handling required for FIF_OTHER_BSS as we don't currently
++	 * do BSSID filtering */
++	/* FIXME: in future it would be nice to enable the probe response
++	 * filter (so that the driver doesn't see them) until
++	 * FIF_BCN_PRBRESP_PROMISC is set. however due to atomicity here, we'd
++	 * have to schedule work to enable prbresp reception, which might
++	 * happen too late. For now we'll just listen and forward them all the
++	 * time. */
 +}
 +
 +static void set_rts_cts_work(struct work_struct *work)
@@ -7901,13 +7842,13 @@
 +
 +static const struct ieee80211_ops zd_ops = {
 +	.tx			= zd_op_tx,
-+	.open			= zd_op_open,
++	.start			= zd_op_start,
 +	.stop			= zd_op_stop,
 +	.add_interface		= zd_op_add_interface,
 +	.remove_interface	= zd_op_remove_interface,
 +	.config			= zd_op_config,
 +	.config_interface	= zd_op_config_interface,
-+	.set_multicast_list	= zd_op_set_multicast_list,
++	.configure_filter	= zd_op_configure_filter,
 +	.erp_ie_changed		= zd_op_erp_ie_changed,
 +};
 +
@@ -7929,8 +7870,7 @@
 +	spin_lock_init(&mac->lock);
 +	mac->hw = hw;
 +
-+	mac->type = IEEE80211_IF_TYPE_MGMT;
-+	mac->hwaddr = hw->wiphy->perm_addr;
++	mac->type = IEEE80211_IF_TYPE_INVALID;
 +
 +	memcpy(mac->channels, zd_channels, sizeof(zd_channels));
 +	memcpy(mac->rates, zd_rates, sizeof(zd_rates));
@@ -7967,6 +7907,7 @@
 +	housekeeping_init(mac);
 +	INIT_WORK(&mac->set_multicast_hash_work, set_multicast_hash_handler);
 +	INIT_WORK(&mac->set_rts_cts_work, set_rts_cts_work);
++	INIT_WORK(&mac->set_rx_filter_work, set_rx_filter_handler);
 +
 +	SET_IEEE80211_DEV(hw, &intf->dev);
 +	return hw;
@@ -7989,7 +7930,7 @@
 +	r = zd_chip_control_leds(chip,
 +		                 is_associated ? LED_ASSOCIATED : LED_SCANNING);
 +	if (r)
-+		dev_err(zd_mac_dev(mac), "zd_chip_control_leds error %d\n", r);
++		dev_dbg_f(zd_mac_dev(mac), "zd_chip_control_leds error %d\n", r);
 +
 +	queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work,
 +		           LINK_LED_WORK_DELAY);
@@ -8014,14 +7955,13 @@
 +		&mac->housekeeping.link_led_work);
 +	zd_chip_control_leds(&mac->chip, LED_OFF);
 +}
-diff -up linux-2.6.22.noarch/drivers/net/wireless/Kconfig.orig linux-2.6.22.noarch/drivers/net/wireless/Kconfig
---- linux-2.6.22.noarch/drivers/net/wireless/Kconfig.orig	2007-09-27 09:59:49.000000000 -0400
-+++ linux-2.6.22.noarch/drivers/net/wireless/Kconfig	2007-09-27 09:59:55.000000000 -0400
-@@ -616,6 +616,7 @@ source "drivers/net/wireless/bcm43xx/Kco
- source "drivers/net/wireless/b43/Kconfig"
- source "drivers/net/wireless/b43legacy/Kconfig"
+diff -up linux-2.6.23.noarch/drivers/net/wireless/Kconfig.orig linux-2.6.23.noarch/drivers/net/wireless/Kconfig
+--- linux-2.6.23.noarch/drivers/net/wireless/Kconfig.orig	2007-10-19 14:54:06.000000000 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/Kconfig	2007-10-19 14:54:14.000000000 -0400
+@@ -618,5 +618,6 @@ source "drivers/net/wireless/b43legacy/K
  source "drivers/net/wireless/zd1211rw/Kconfig"
-+source "drivers/net/wireless/zd1211rw-mac80211/Kconfig"
  source "drivers/net/wireless/rt2x00/Kconfig"
  source "drivers/net/wireless/iwlwifi/Kconfig"
++source "drivers/net/wireless/zd1211rw-mac80211/Kconfig"
  
+ endmenu


--- linux-2.6-ath5k-fixes.patch DELETED ---


--- linux-2.6-iwlwifi-fixes.patch DELETED ---


--- linux-2.6-mac80211-decryption-noise.patch DELETED ---


--- linux-2.6-mac80211-extras.patch DELETED ---


--- linux-2.6-wireless-fixes.patch DELETED ---




More information about the fedora-extras-commits mailing list