rpms/kernel/F-8 linux-2.6-wireless-pending.patch, NONE, 1.11.2.1 config-generic, 1.32, 1.32.4.1 kernel.spec, 1.244, 1.244.2.1 linux-2.6-at76.patch, 1.3, 1.3.6.1 linux-2.6-ath5k.patch, 1.5, 1.5.4.1 linux-2.6-mac80211-decryption-noise.patch, 1.1, 1.1.2.1 linux-2.6-mac80211-extras.patch, 1.3, 1.3.6.1 linux-2.6-wireless.patch, 1.10, 1.10.6.1 linux-2.6-zd1211rw-mac80211.patch, 1.4, 1.4.6.1 linux-2.6-ath5k-fixes.patch, 1.3, NONE linux-2.6-iwlwifi-fixes.patch, 1.3, NONE linux-2.6-wireless-fixes.patch, 1.3, NONE
John W. Linville (linville)
fedora-extras-commits at redhat.com
Fri Oct 26 04:19:15 UTC 2007
Author: linville
Update of /cvs/pkgs/rpms/kernel/F-8
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv15120
Modified Files:
Tag: private-linville-wl-f8-branch
config-generic kernel.spec linux-2.6-at76.patch
linux-2.6-ath5k.patch
linux-2.6-mac80211-decryption-noise.patch
linux-2.6-mac80211-extras.patch linux-2.6-wireless.patch
linux-2.6-zd1211rw-mac80211.patch
Added Files:
Tag: private-linville-wl-f8-branch
linux-2.6-wireless-pending.patch
Removed Files:
Tag: private-linville-wl-f8-branch
linux-2.6-ath5k-fixes.patch linux-2.6-iwlwifi-fixes.patch
linux-2.6-wireless-fixes.patch
Log Message:
Testing current wireless bits from upstream
linux-2.6-wireless-pending.patch:
--- NEW FILE linux-2.6-wireless-pending.patch ---
diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/iwlwifi/iwl-4965-commands.h
--- /dev/null 2007-10-19 08:28:46.917288885 -0400
+++ linux-2.6.23.noarch/drivers/net/wireless/iwlwifi/iwl-4965-commands.h 2007-10-25 23:45:34.000000000 -0400
@@ -0,0 +1,1582 @@
+/******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * Contact Information:
+ * James P. Ketrenos <ipw2100-admin at linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *****************************************************************************/
+
+#ifndef __iwl_commands_h__
+#define __iwl_commands_h__
+
+enum {
+ REPLY_ALIVE = 0x1,
+ REPLY_ERROR = 0x2,
+
+ /* RXON and QOS commands */
+ REPLY_RXON = 0x10,
+ REPLY_RXON_ASSOC = 0x11,
+ REPLY_QOS_PARAM = 0x13,
+ REPLY_RXON_TIMING = 0x14,
+
+ /* Multi-Station support */
+ REPLY_ADD_STA = 0x18,
+ REPLY_REMOVE_STA = 0x19, /* not used */
+ REPLY_REMOVE_ALL_STA = 0x1a, /* not used */
+
+ /* RX, TX, LEDs */
+ REPLY_TX = 0x1c,
+ REPLY_RATE_SCALE = 0x47, /* 3945 only */
+ REPLY_LEDS_CMD = 0x48,
+ REPLY_TX_LINK_QUALITY_CMD = 0x4e, /* 4965 only */
+
+ /* 802.11h related */
+ RADAR_NOTIFICATION = 0x70, /* not used */
+ REPLY_QUIET_CMD = 0x71, /* not used */
+ REPLY_CHANNEL_SWITCH = 0x72,
+ CHANNEL_SWITCH_NOTIFICATION = 0x73,
+ REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74,
+ SPECTRUM_MEASURE_NOTIFICATION = 0x75,
+
+ /* Power Management */
+ POWER_TABLE_CMD = 0x77,
+ PM_SLEEP_NOTIFICATION = 0x7A,
+ PM_DEBUG_STATISTIC_NOTIFIC = 0x7B,
+
+ /* Scan commands and notifications */
+ REPLY_SCAN_CMD = 0x80,
+ REPLY_SCAN_ABORT_CMD = 0x81,
+ SCAN_START_NOTIFICATION = 0x82,
+ SCAN_RESULTS_NOTIFICATION = 0x83,
+ SCAN_COMPLETE_NOTIFICATION = 0x84,
+
+ /* IBSS/AP commands */
+ BEACON_NOTIFICATION = 0x90,
+ REPLY_TX_BEACON = 0x91,
+ WHO_IS_AWAKE_NOTIFICATION = 0x94, /* not used */
+
+ /* Miscellaneous commands */
+ QUIET_NOTIFICATION = 0x96, /* not used */
+ REPLY_TX_PWR_TABLE_CMD = 0x97,
+ MEASURE_ABORT_NOTIFICATION = 0x99, /* not used */
+
+ /* BT config command */
+ REPLY_BT_CONFIG = 0x9b,
+
+ /* 4965 Statistics */
+ REPLY_STATISTICS_CMD = 0x9c,
+ STATISTICS_NOTIFICATION = 0x9d,
+
+ /* RF-KILL commands and notifications */
+ REPLY_CARD_STATE_CMD = 0xa0,
+ CARD_STATE_NOTIFICATION = 0xa1,
+
+ /* Missed beacons notification */
+ MISSED_BEACONS_NOTIFICATION = 0xa2,
+
+ REPLY_CT_KILL_CONFIG_CMD = 0xa4,
+ SENSITIVITY_CMD = 0xa8,
+ REPLY_PHY_CALIBRATION_CMD = 0xb0,
+ REPLY_RX_PHY_CMD = 0xc0,
+ REPLY_RX_MPDU_CMD = 0xc1,
+ REPLY_4965_RX = 0xc3,
+ REPLY_COMPRESSED_BA = 0xc5,
+ REPLY_MAX = 0xff
+};
+
+/******************************************************************************
+ * (0)
+ * Header
+ *
+ *****************************************************************************/
+
+#define IWL_CMD_FAILED_MSK 0x40
+
+struct iwl_cmd_header {
+ u8 cmd;
+ u8 flags;
+ /* We have 15 LSB to use as we please (MSB indicates
+ * a frame Rx'd from the HW). We encode the following
+ * information into the sequence field:
+ *
+ * 0:7 index in fifo
+ * 8:13 fifo selection
+ * 14:14 bit indicating if this packet references the 'extra'
+ * storage at the end of the memory queue
+ * 15:15 (Rx indication)
+ *
+ */
+ __le16 sequence;
+
+ /* command data follows immediately */
+ u8 data[0];
+} __attribute__ ((packed));
+
+/******************************************************************************
+ * (0a)
+ * Alive and Error Commands & Responses:
+ *
+ *****************************************************************************/
+
+#define UCODE_VALID_OK __constant_cpu_to_le32(0x1)
+#define INITIALIZE_SUBTYPE (9)
+
+/*
+ * REPLY_ALIVE = 0x1 (response only, not a command)
+ */
+struct iwl_alive_resp {
+ u8 ucode_minor;
+ u8 ucode_major;
+ __le16 reserved1;
+ u8 sw_rev[8];
+ u8 ver_type;
+ u8 ver_subtype;
+ __le16 reserved2;
+ __le32 log_event_table_ptr;
+ __le32 error_event_table_ptr;
+ __le32 timestamp;
+ __le32 is_valid;
+} __attribute__ ((packed));
+
[...15493 lines suppressed...]
+};
+
+static inline void b43legacy_leds_init(struct b43legacy_wldev *dev)
+{
+}
+static inline void b43legacy_leds_exit(struct b43legacy_wldev *dev)
+{
+}
+#endif /* CONFIG_B43LEGACY_LEDS */
#endif /* B43legacy_LEDS_H_ */
diff -up /dev/null linux-2.6.23.noarch/drivers/net/wireless/b43legacy/rfkill.c
--- /dev/null 2007-10-19 08:28:46.917288885 -0400
+++ linux-2.6.23.noarch/drivers/net/wireless/b43legacy/rfkill.c 2007-10-25 23:45:34.000000000 -0400
@@ -0,0 +1,185 @@
+/*
+
+ Broadcom B43 wireless driver
+ RFKILL support
+
+ Copyright (c) 2007 Michael Buesch <mb at bu3sch.de>
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#include "rfkill.h"
+#include "radio.h"
+#include "b43legacy.h"
+
+
+/* Returns TRUE, if the radio is enabled in hardware. */
+static bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)
+{
+ if (dev->phy.rev >= 3) {
+ if (!(b43legacy_read32(dev, B43legacy_MMIO_RADIO_HWENABLED_HI)
+ & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK))
+ return 1;
+ } else {
+ if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO)
+ & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK)
+ return 1;
+ }
+ return 0;
+}
+
+/* The poll callback for the hardware button. */
+static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev)
+{
+ struct b43legacy_wldev *dev = poll_dev->private;
+ struct b43legacy_wl *wl = dev->wl;
+ bool enabled;
+
+ mutex_lock(&wl->mutex);
+ B43legacy_WARN_ON(b43legacy_status(dev) < B43legacy_STAT_INITIALIZED);
+ enabled = b43legacy_is_hw_radio_enabled(dev);
+ if (unlikely(enabled != dev->radio_hw_enable)) {
+ dev->radio_hw_enable = enabled;
+ b43legacyinfo(wl, "Radio hardware status changed to %s\n",
+ enabled ? "ENABLED" : "DISABLED");
+ mutex_unlock(&wl->mutex);
+ input_report_key(poll_dev->input, KEY_WLAN, enabled);
+ } else
+ mutex_unlock(&wl->mutex);
+}
+
+/* Called when the RFKILL toggled in software.
+ * This is called without locking. */
+static int b43legacy_rfkill_soft_toggle(void *data, enum rfkill_state state)
+{
+ struct b43legacy_wldev *dev = data;
+ struct b43legacy_wl *wl = dev->wl;
+ int err = 0;
+
+ mutex_lock(&wl->mutex);
+ if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED)
+ goto out_unlock;
+
+ switch (state) {
+ case RFKILL_STATE_ON:
+ if (!dev->radio_hw_enable) {
+ /* No luck. We can't toggle the hardware RF-kill
+ * button from software. */
+ err = -EBUSY;
+ goto out_unlock;
+ }
+ if (!dev->phy.radio_on)
+ b43legacy_radio_turn_on(dev);
+ break;
+ case RFKILL_STATE_OFF:
+ if (dev->phy.radio_on)
+ b43legacy_radio_turn_off(dev, 0);
+ break;
+ }
+
+out_unlock:
+ mutex_unlock(&wl->mutex);
+
+ return err;
+}
+
+char * b43legacy_rfkill_led_name(struct b43legacy_wldev *dev)
+{
+ struct b43legacy_wl *wl = dev->wl;
+
+ if (!wl->rfkill.rfkill)
+ return NULL;
+ return rfkill_get_led_name(wl->rfkill.rfkill);
+}
+
+void b43legacy_rfkill_init(struct b43legacy_wldev *dev)
+{
+ struct b43legacy_wl *wl = dev->wl;
+ struct b43legacy_rfkill *rfk = &(wl->rfkill);
+ int err;
+
+ if (rfk->rfkill) {
+ err = rfkill_register(rfk->rfkill);
+ if (err) {
+ b43legacywarn(wl, "Failed to register RF-kill button\n");
+ goto err_free_rfk;
+ }
+ }
+ if (rfk->poll_dev) {
+ err = input_register_polled_device(rfk->poll_dev);
+ if (err) {
+ b43legacywarn(wl, "Failed to register RF-kill polldev\n");
+ goto err_free_polldev;
+ }
+ }
+
+ return;
+err_free_rfk:
+ rfkill_free(rfk->rfkill);
+ rfk->rfkill = NULL;
+err_free_polldev:
+ input_free_polled_device(rfk->poll_dev);
+ rfk->poll_dev = NULL;
+}
+
+void b43legacy_rfkill_exit(struct b43legacy_wldev *dev)
+{
+ struct b43legacy_rfkill *rfk = &(dev->wl->rfkill);
+
+ if (rfk->poll_dev)
+ input_unregister_polled_device(rfk->poll_dev);
+ if (rfk->rfkill)
+ rfkill_unregister(rfk->rfkill);
+}
+
+void b43legacy_rfkill_alloc(struct b43legacy_wldev *dev)
+{
+ struct b43legacy_wl *wl = dev->wl;
+ struct b43legacy_rfkill *rfk = &(wl->rfkill);
+
+ snprintf(rfk->name, sizeof(rfk->name),
+ "b43legacy-%s", wiphy_name(wl->hw->wiphy));
+
+ rfk->rfkill = rfkill_allocate(dev->dev->dev, RFKILL_TYPE_WLAN);
+ if (!rfk->rfkill) {
+ b43legacywarn(wl, "Failed to allocate RF-kill button\n");
+ return;
+ }
+ rfk->rfkill->name = rfk->name;
+ rfk->rfkill->state = RFKILL_STATE_ON;
+ rfk->rfkill->data = dev;
+ rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle;
+ rfk->rfkill->user_claim_unsupported = 1;
+
+ rfk->poll_dev = input_allocate_polled_device();
+ if (rfk->poll_dev) {
+ rfk->poll_dev->private = dev;
+ rfk->poll_dev->poll = b43legacy_rfkill_poll;
+ rfk->poll_dev->poll_interval = 1000; /* msecs */
+ } else
+ b43legacywarn(wl, "Failed to allocate RF-kill polldev\n");
+}
+
+void b43legacy_rfkill_free(struct b43legacy_wldev *dev)
+{
+ struct b43legacy_rfkill *rfk = &(dev->wl->rfkill);
+
+ input_free_polled_device(rfk->poll_dev);
+ rfk->poll_dev = NULL;
+ rfkill_free(rfk->rfkill);
+ rfk->rfkill = NULL;
+}
Index: config-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/config-generic,v
retrieving revision 1.32
retrieving revision 1.32.4.1
diff -u -r1.32 -r1.32.4.1
--- config-generic 12 Oct 2007 22:55:54 -0000 1.32
+++ config-generic 26 Oct 2007 04:17:54 -0000 1.32.4.1
@@ -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.244
retrieving revision 1.244.2.1
diff -u -r1.244 -r1.244.2.1
--- kernel.spec 24 Oct 2007 20:39:26 -0000 1.244
+++ kernel.spec 26 Oct 2007 04:17:54 -0000 1.244.2.1
@@ -13,6 +13,7 @@
# by setting the define to ".local" or ".bz123456"
#
#% define buildid .local
+%define buildid 35.wl.1
# fedora_build defines which build revision of this kernel version we're
# building. Rather than incrementing forever, as with the prior versioning
@@ -634,14 +635,10 @@
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
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
+Patch692: linux-2.6-zd1211rw-mac80211.patch
+Patch693: linux-2.6-mac80211-decryption-noise.patch
Patch700: linux-2.6-bcm43xx-pci-neuter.patch
Patch701: linux-2.6-drivers-ssb-debug-revision.patch
Patch710: linux-2.6-netdev-e1000e-01.patch
@@ -1169,19 +1166,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
@@ -1871,6 +1863,9 @@
%changelog
+* Wed Oct 25 2007 John W. Linville <linville at redhat.com>
+- Testing current wireless bits from upstream
+
* Wed Oct 24 2007 Dave Jones <davej at redhat.com>
- Disable early boot debugging for release.
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.3.6.1
diff -u -r1.3 -r1.3.6.1
--- linux-2.6-at76.patch 5 Oct 2007 15:17:09 -0000 1.3
+++ linux-2.6-at76.patch 26 Oct 2007 04:17:54 -0000 1.3.6.1
@@ -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.5.4.1 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.5.4.1
diff -u -r1.5 -r1.5.4.1
--- linux-2.6-ath5k.patch 16 Oct 2007 01:35:52 -0000 1.5
+++ linux-2.6-ath5k.patch 26 Oct 2007 04:17:54 -0000 1.5.4.1
@@ -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-10-25 23:30:33.000000000 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/Kconfig 2007-10-25 23:31:22.000000000 -0400
@@ -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-10-25 23:30:33.000000000 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/Makefile 2007-10-25 23:30:55.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 /dev/null linux-2.6.23.noarch/drivers/net/wireless/ath5k/initvals.c
+--- /dev/null 2007-10-19 08:28:46.917288885 -0400
++++ linux-2.6.23.noarch/drivers/net/wireless/ath5k/initvals.c 2007-10-25 23:30:55.000000000 -0400
+@@ -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,14385 @@
+ *
+ */
+
-+#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 } },
[...26333 lines suppressed...]
++/* Protocol Control Unit Functions */
++extern int ath5k_hw_set_opmode(struct ath5k_hw *ah);
++/* 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/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_sh + 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_sh + 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-10-25 23:30:33.000000000 -0400
++++ linux-2.6.23.noarch/MAINTAINERS 2007-10-25 23:30:55.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
linux-2.6-mac80211-decryption-noise.patch:
Index: linux-2.6-mac80211-decryption-noise.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/linux-2.6-mac80211-decryption-noise.patch,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
--- linux-2.6-mac80211-decryption-noise.patch 24 Oct 2007 00:34:09 -0000 1.1
+++ linux-2.6-mac80211-decryption-noise.patch 26 Oct 2007 04:17:54 -0000 1.1.2.1
@@ -1,44 +1,45 @@
-diff -up linux-2.6.23.noarch/net/mac80211/rx.c.orig linux-2.6.23.noarch/net/mac80211/rx.c
---- linux-2.6.23.noarch/net/mac80211/rx.c.orig 2007-10-23 20:18:05.000000000 -0400
-+++ linux-2.6.23.noarch/net/mac80211/rx.c 2007-10-23 20:22:21.000000000 -0400
-@@ -568,6 +568,8 @@ ieee80211_rx_h_wep_weak_iv_detection(str
- static ieee80211_txrx_result
- ieee80211_rx_h_wep_decrypt(struct ieee80211_txrx_data *rx)
+diff -up linux-2.6.23.noarch/net/mac80211/wep.c.orig linux-2.6.23.noarch/net/mac80211/wep.c
+--- linux-2.6.23.noarch/net/mac80211/wep.c.orig 2007-10-25 15:09:28.000000000 -0400
++++ linux-2.6.23.noarch/net/mac80211/wep.c 2007-10-25 15:12:47.000000000 -0400
+@@ -311,6 +311,8 @@ u8 * ieee80211_wep_is_weak_iv(struct sk_
+ ieee80211_txrx_result
+ ieee80211_crypto_wep_decrypt(struct ieee80211_txrx_data *rx)
{
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
+
- if ((rx->key && rx->key->conf.alg != ALG_WEP) ||
- !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
- ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
-@@ -576,7 +578,13 @@ ieee80211_rx_h_wep_decrypt(struct ieee80
- return TXRX_CONTINUE;
+ if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
+ ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
+ (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH))
+@@ -318,7 +320,14 @@ ieee80211_crypto_wep_decrypt(struct ieee
- if (!rx->key) {
-- if (net_ratelimit())
-+ /* if there are multiple SSIDs on this BSSID, the frame may
-+ not be for us anyway; so, check that either the frame is
-+ unicast or that we are not in managed mode before
-+ complaining about a missing key */
-+ if ((!is_multicast_ether_addr(hdr->addr1) ||
-+ rx->sdata->type != IEEE80211_IF_TYPE_STA) &&
-+ net_ratelimit())
- printk(KERN_DEBUG "%s: RX WEP frame, but no key set\n",
- rx->dev->name);
- return TXRX_DROP;
+ if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) {
+ if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) {
+- if (net_ratelimit())
++ /* if there are multiple SSIDs on this BSSID,
++ the frame may not be for us anyway; so, check
++ that either the frame is unicast or that we
++ are not in managed mode before complaining
++ about a missing key */
++ if ((!is_multicast_ether_addr(hdr->addr1) ||
++ rx->sdata->type != IEEE80211_IF_TYPE_STA) &&
++ net_ratelimit())
+ printk(KERN_DEBUG "%s: RX WEP frame, decrypt "
+ "failed\n", rx->dev->name);
+ return TXRX_DROP;
diff -up linux-2.6.23.noarch/net/mac80211/wpa.c.orig linux-2.6.23.noarch/net/mac80211/wpa.c
---- linux-2.6.23.noarch/net/mac80211/wpa.c.orig 2007-10-23 20:25:09.000000000 -0400
-+++ linux-2.6.23.noarch/net/mac80211/wpa.c 2007-10-23 20:25:03.000000000 -0400
-@@ -462,9 +462,16 @@ ieee80211_rx_h_tkip_decrypt(struct ieee8
- skb->len - hdrlen, rx->sta->addr,
- hwaccel, rx->u.rx.queue);
+--- linux-2.6.23.noarch/net/mac80211/wpa.c.orig 2007-10-25 15:09:28.000000000 -0400
++++ linux-2.6.23.noarch/net/mac80211/wpa.c 2007-10-25 15:12:47.000000000 -0400
+@@ -321,9 +321,16 @@ ieee80211_crypto_tkip_decrypt(struct iee
+ &rx->u.rx.tkip_iv32,
+ &rx->u.rx.tkip_iv16);
if (res != TKIP_DECRYPT_OK || wpa_test) {
- printk(KERN_DEBUG "%s: TKIP decrypt failed for RX frame from "
- MAC_FMT " (res=%d)\n",
- rx->dev->name, MAC_ARG(rx->sta->addr), res);
-+ /* if there are multiple SSIDs on this BSSID, the frame may
-+ not be for us anyway; so, check that either the frame is
-+ unicast or that we are not in managed mode before
-+ complaining about a missing key */
++ /* if there are multiple SSIDs on this BSSID, the
++ frame may not be for us anyway; so, check that either
++ the frame is unicast or that we are not in managed
++ mode before complaining about a missing key */
+ if ((!is_multicast_ether_addr(hdr->addr1) ||
+ rx->sdata->type != IEEE80211_IF_TYPE_STA) &&
+ net_ratelimit())
@@ -48,7 +49,7 @@
return TXRX_DROP;
}
-@@ -773,9 +780,17 @@ ieee80211_rx_h_ccmp_decrypt(struct ieee8
+@@ -590,9 +597,17 @@ ieee80211_crypto_ccmp_decrypt(struct iee
skb->data + hdrlen + CCMP_HDR_LEN, data_len,
skb->data + skb->len - CCMP_MIC_LEN,
skb->data + hdrlen + CCMP_HDR_LEN)) {
@@ -69,3 +70,21 @@
return TXRX_DROP;
}
}
+diff -up linux-2.6.23.noarch/net/mac80211/rx.c.orig linux-2.6.23.noarch/net/mac80211/rx.c
+--- linux-2.6.23.noarch/net/mac80211/rx.c.orig 2007-10-25 15:09:28.000000000 -0400
++++ linux-2.6.23.noarch/net/mac80211/rx.c 2007-10-25 15:12:39.000000000 -0400
+@@ -509,7 +509,13 @@ ieee80211_rx_h_decrypt(struct ieee80211_
+ rx->key->tx_rx_count++;
+ /* TODO: add threshold stuff again */
+ } else {
+- if (net_ratelimit())
++ /* if there are multiple SSIDs on this BSSID, the frame may
++ not be for us anyway; so, check that either the frame is
++ unicast or that we are not in managed mode before
++ complaining about a missing key */
++ if ((!is_multicast_ether_addr(hdr->addr1) ||
++ rx->sdata->type != IEEE80211_IF_TYPE_STA) &&
++ net_ratelimit())
+ printk(KERN_DEBUG "%s: RX protected frame,"
+ " but have no key\n", rx->dev->name);
+ return TXRX_DROP;
linux-2.6-mac80211-extras.patch:
View full diff with command:
/usr/bin/cvs -f diff -kk -u -N -r 1.3 -r 1.3.6.1 linux-2.6-mac80211-extras.patch
Index: linux-2.6-mac80211-extras.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/linux-2.6-mac80211-extras.patch,v
retrieving revision 1.3
retrieving revision 1.3.6.1
diff -u -r1.3 -r1.3.6.1
--- linux-2.6-mac80211-extras.patch 5 Oct 2007 15:17:09 -0000 1.3
+++ linux-2.6-mac80211-extras.patch 26 Oct 2007 04:17:54 -0000 1.3.6.1
@@ -1,7 +1,7 @@
-diff -up linux-2.6.22.noarch/include/linux/ieee80211.h.orig linux-2.6.22.noarch/include/linux/ieee80211.h
---- linux-2.6.22.noarch/include/linux/ieee80211.h.orig 2007-09-26 20:24:17.000000000 -0400
-+++ linux-2.6.22.noarch/include/linux/ieee80211.h 2007-09-26 20:24:22.000000000 -0400
-@@ -106,6 +106,75 @@ struct ieee80211_hdr {
+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-10-19 14:56:40.000000000 -0400
++++ linux-2.6.23.noarch/include/linux/ieee80211.h 2007-10-19 14:59:51.000000000 -0400
+@@ -107,6 +107,75 @@ struct ieee80211_hdr {
} __attribute__ ((packed));
@@ -77,7 +77,7 @@
struct ieee80211_mgmt {
__le16 frame_control;
__le16 duration;
-@@ -173,9 +242,51 @@ struct ieee80211_mgmt {
+@@ -174,9 +243,51 @@ struct ieee80211_mgmt {
struct {
u8 action_code;
u8 dialog_token;
@@ -129,7 +129,7 @@
struct{
u8 action_code;
u8 element_id;
-@@ -184,6 +295,25 @@ struct ieee80211_mgmt {
+@@ -185,6 +296,25 @@ struct ieee80211_mgmt {
u8 new_chan;
u8 switch_count;
} __attribute__((packed)) chan_switch;
@@ -155,7 +155,7 @@
} u;
} __attribute__ ((packed)) action;
} u;
-@@ -270,6 +400,18 @@ enum ieee80211_statuscode {
+@@ -271,6 +401,18 @@ enum ieee80211_statuscode {
WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
@@ -174,7 +174,7 @@
};
-@@ -300,9 +442,50 @@ enum ieee80211_reasoncode {
+@@ -301,9 +443,50 @@ enum ieee80211_reasoncode {
WLAN_REASON_INVALID_RSN_IE_CAP = 22,
WLAN_REASON_IEEE8021X_FAILED = 23,
WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
@@ -225,7 +225,7 @@
/* Information Element IDs */
enum ieee80211_eid {
WLAN_EID_SSID = 0,
-@@ -318,6 +501,15 @@ enum ieee80211_eid {
+@@ -319,6 +502,15 @@ enum ieee80211_eid {
WLAN_EID_HP_PARAMS = 8,
WLAN_EID_HP_TABLE = 9,
WLAN_EID_REQUEST = 10,
@@ -241,7 +241,7 @@
/* 802.11h */
WLAN_EID_PWR_CONSTRAINT = 32,
WLAN_EID_PWR_CAPABILITY = 33,
-@@ -332,6 +524,9 @@ enum ieee80211_eid {
+@@ -333,6 +525,9 @@ enum ieee80211_eid {
/* 802.11g */
WLAN_EID_ERP_INFO = 42,
WLAN_EID_EXT_SUPP_RATES = 50,
@@ -251,7 +251,7 @@
/* 802.11i */
WLAN_EID_RSN = 48,
WLAN_EID_WPA = 221,
-@@ -340,6 +535,9 @@ enum ieee80211_eid {
+@@ -341,6 +536,9 @@ enum ieee80211_eid {
WLAN_EID_QOS_PARAMETER = 222
};
@@ -261,9 +261,9 @@
/* cipher suite selectors */
#define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00
#define WLAN_CIPHER_SUITE_WEP40 0x000FAC01
-@@ -350,4 +548,37 @@ enum ieee80211_eid {
-
- #define WLAN_MAX_KEY_LEN 32
+@@ -411,4 +609,37 @@ static inline int ieee80211_get_morefrag
+ IEEE80211_FCTL_MOREFRAGS) != 0;
+ }
+enum ieee80211_tsinfo_direction {
+ WLAN_TSINFO_UPLINK = 0,
@@ -299,68 +299,96 @@
+};
+
#endif /* IEEE80211_H */
-diff -up linux-2.6.22.noarch/include/net/mac80211.h.orig linux-2.6.22.noarch/include/net/mac80211.h
---- linux-2.6.22.noarch/include/net/mac80211.h.orig 2007-09-26 20:24:17.000000000 -0400
-+++ linux-2.6.22.noarch/include/net/mac80211.h 2007-09-26 20:24:22.000000000 -0400
-@@ -665,6 +665,9 @@ struct ieee80211_hw {
- * specified in the device's EEPROM */
- #define IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED (1<<11)
-
-+ /* The device capable of supporting 11n */
-+#define IEEE80211_HW_SUPPORT_HT_MODE (1<<15)
-+
- u32 flags; /* hardware flags defined above */
-
- /* Set to the size of a needed device specific skb headroom for TX skbs. */
-@@ -810,8 +813,7 @@ struct ieee80211_ops {
- * used if the wlan hardware or low-level driver implements PAE.
- * 80211.o module will anyway filter frames based on authorization
- * state, so this function pointer can be NULL if low-level driver does
-- * not require event notification about port state changes.
-- * Currently unused. */
-+ * not require event notification about port state changes. */
- int (*set_port_auth)(struct ieee80211_hw *hw, u8 *addr,
- int authorized);
-
-@@ -871,8 +873,9 @@ struct ieee80211_ops {
- /* Get statistics of the current TX queue status. This is used to get
- * number of currently queued packets (queue length), maximum queue
- * size (limit), and total number of packets sent using each TX queue
-- * (count).
-- * Currently unused. */
-+ * (count). This information is used for WMM to find out which TX
-+ * queues have room for more packets and by hostapd to provide
-+ * statistics about the current queueing state to external programs. */
- int (*get_tx_stats)(struct ieee80211_hw *hw,
- struct ieee80211_tx_queue_stats *stats);
+diff -up linux-2.6.23.noarch/include/net/mac80211.h.orig linux-2.6.23.noarch/include/net/mac80211.h
+--- linux-2.6.23.noarch/include/net/mac80211.h.orig 2007-10-19 14:56:40.000000000 -0400
++++ linux-2.6.23.noarch/include/net/mac80211.h 2007-10-19 14:59:51.000000000 -0400
+@@ -472,6 +472,7 @@ struct ieee80211_conf {
+ enum ieee80211_if_types {
+ IEEE80211_IF_TYPE_INVALID,
+ IEEE80211_IF_TYPE_AP,
++ IEEE80211_IF_TYPE_MGMT,
+ IEEE80211_IF_TYPE_STA,
+ IEEE80211_IF_TYPE_IBSS,
+ IEEE80211_IF_TYPE_MNTR,
+@@ -521,6 +522,11 @@ struct ieee80211_if_init_conf {
+ * config_interface() call, so copy the value somewhere if you need
+ * it.
+ * @ssid_len: length of the @ssid field.
++ * @generic_elem: used (together with @generic_elem_len) by drivers for
++ * hardware that generate beacons independently. The pointer is valid
++ * only during the config_interface() call, so copy the value somewhere
++ * if you need it.
++ * @generic_elem_len: length of the generic element.
+ * @beacon: beacon template. Valid only if @host_gen_beacon_template in
+ * &struct ieee80211_hw is set. The driver is responsible of freeing
+ * the sk_buff.
+@@ -535,6 +541,8 @@ struct ieee80211_if_conf {
+ u8 *bssid;
+ u8 *ssid;
+ size_t ssid_len;
++ u8 *generic_elem;
++ size_t generic_elem_len;
+ struct sk_buff *beacon;
+ struct ieee80211_tx_control *beacon_control;
+ };
+@@ -662,12 +670,16 @@ enum sta_notify_cmd {
+ * @IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED:
+ * Channels are already configured to the default regulatory domain
+ * specified in the device's EEPROM
++ *
++ * @IEEE80211_HW_SUPPORT_HT_MODE
++ * The device capable of supporting 802.11n.
+ */
+ enum ieee80211_hw_flags {
+ IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0,
+ IEEE80211_HW_RX_INCLUDES_FCS = 1<<1,
+ IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2,
+ IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED = 1<<3,
++ IEEE80211_HW_SUPPORT_HT_MODE = 1<<4,
+ };
-@@ -888,6 +891,22 @@ struct ieee80211_ops {
- * TSF synchronization. */
+ /**
+@@ -994,6 +1006,12 @@ enum ieee80211_erp_change_flags {
+ * function is optional if the firmware/hardware takes full care of
+ * TSF synchronization.
+ *
++ * @handle_ba_action: Call low level driver with 11n Block Ack action.
++ *
++ * @conf_ht: Configure ht parameters.
++ *
++ * @get_ht_capab: Get ht capabilities from the device.
++ *
+ * @beacon_update: Setup beacon data for IBSS beacons. Unlike access point,
+ * IBSS uses a fixed beacon frame which is configured using this
+ * function.
+@@ -1054,6 +1072,15 @@ struct ieee80211_ops {
+ struct ieee80211_tx_queue_stats *stats);
[...1769 lines suppressed...]
+ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb,
+- struct ieee80211_tx_control *control)
++ struct ieee80211_tx_control *control, int mgmt)
+ {
+ struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+ struct sta_info *sta;
+@@ -1107,6 +1109,7 @@ static int ieee80211_tx(struct net_devic
+ rcu_read_lock();
+
+ sta = tx.sta;
++ tx.u.tx.mgmt_interface = mgmt;
+ tx.u.tx.mode = local->hw.conf.mode;
+
+ for (handler = local->tx_handlers; *handler != NULL;
+@@ -1253,7 +1256,8 @@ int ieee80211_master_start_xmit(struct s
+ control.flags |= IEEE80211_TXCTL_REQUEUE;
+ control.queue = pkt_data->queue;
+
+- ret = ieee80211_tx(odev, skb, &control);
++ ret = ieee80211_tx(odev, skb, &control,
++ control.type == IEEE80211_IF_TYPE_MGMT);
+ dev_put(odev);
+
+ return ret;
+@@ -1381,11 +1385,18 @@ int ieee80211_subif_start_xmit(struct sk
hdrlen = 30;
break;
case IEEE80211_IF_TYPE_STA:
@@ -3422,9 +4321,27 @@
hdrlen = 24;
break;
case IEEE80211_IF_TYPE_IBSS:
-diff -up linux-2.6.22.noarch/net/mac80211/sta_info.c.orig linux-2.6.22.noarch/net/mac80211/sta_info.c
---- linux-2.6.22.noarch/net/mac80211/sta_info.c.orig 2007-09-26 20:24:17.000000000 -0400
-+++ linux-2.6.22.noarch/net/mac80211/sta_info.c 2007-09-26 20:24:22.000000000 -0400
+@@ -1498,6 +1509,8 @@ int ieee80211_subif_start_xmit(struct sk
+ pkt_data = (struct ieee80211_tx_packet_data *)skb->cb;
+ memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data));
+ pkt_data->ifindex = dev->ifindex;
++ if (sdata->type == IEEE80211_IF_TYPE_MGMT)
++ pkt_data->flags |= IEEE80211_TXPD_MGMT_IFACE;
+
+ skb->dev = local->mdev;
+ dev->stats.tx_packets++;
+@@ -1555,6 +1568,8 @@ int ieee80211_mgmt_start_xmit(struct sk_
+ pkt_data = (struct ieee80211_tx_packet_data *) skb->cb;
+ memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data));
+ pkt_data->ifindex = sdata->dev->ifindex;
++ if (sdata->type == IEEE80211_IF_TYPE_MGMT)
++ pkt_data->flags |= IEEE80211_TXPD_MGMT_IFACE;
+
+ skb->priority = 20; /* use hardcoded priority for mgmt TX queue */
+ skb->dev = sdata->local->mdev;
+diff -up linux-2.6.23.noarch/net/mac80211/sta_info.c.orig linux-2.6.23.noarch/net/mac80211/sta_info.c
+--- linux-2.6.23.noarch/net/mac80211/sta_info.c.orig 2007-10-19 14:56:40.000000000 -0400
++++ linux-2.6.23.noarch/net/mac80211/sta_info.c 2007-10-19 15:01:04.000000000 -0400
@@ -32,7 +32,7 @@ static void sta_info_hash_add(struct iee
/* Caller must hold local->sta_lock */
@@ -3490,10 +4407,10 @@
return;
list_del(&sta->list);
-diff -up linux-2.6.22.noarch/net/mac80211/debugfs_netdev.c.orig linux-2.6.22.noarch/net/mac80211/debugfs_netdev.c
---- linux-2.6.22.noarch/net/mac80211/debugfs_netdev.c.orig 2007-09-26 20:24:17.000000000 -0400
-+++ linux-2.6.22.noarch/net/mac80211/debugfs_netdev.c 2007-09-26 20:24:22.000000000 -0400
-@@ -87,6 +87,267 @@ static const struct file_operations name
+diff -up linux-2.6.23.noarch/net/mac80211/debugfs_netdev.c.orig linux-2.6.23.noarch/net/mac80211/debugfs_netdev.c
+--- linux-2.6.23.noarch/net/mac80211/debugfs_netdev.c.orig 2007-10-19 14:56:40.000000000 -0400
++++ linux-2.6.23.noarch/net/mac80211/debugfs_netdev.c 2007-10-19 14:59:51.000000000 -0400
+@@ -87,6 +87,268 @@ static const struct file_operations name
IEEE80211_IF_FMT_##format(name, field) \
__IEEE80211_IF_FILE(name)
@@ -3532,8 +4449,9 @@
+static ssize_t qos_if_dls_mac(const struct ieee80211_sub_if_data *sdata,
+ char *buf, int buflen)
+{
-+ return scnprintf(buf, buflen, MAC_FMT "\n",
-+ MAC_ARG(sdata->u.sta.dls_mac));
++ DECLARE_MAC_BUF(mac);
++ return scnprintf(buf, buflen, "%s\n",
++ print_mac(mac, sdata->u.sta.dls_mac));
+}
+
+static ssize_t qos_dls_mac_read(struct file *file,
@@ -3761,7 +4679,7 @@
/* common attributes */
IEEE80211_IF_FILE(channel_use, channel_use, DEC);
IEEE80211_IF_FILE(drop_unencrypted, drop_unencrypted, DEC);
-@@ -184,6 +445,10 @@ __IEEE80211_IF_FILE(mode);
+@@ -167,6 +429,10 @@ IEEE80211_IF_FILE(peer, u.wds.remote_add
static void add_sta_files(struct ieee80211_sub_if_data *sdata)
{
@@ -3772,7 +4690,7 @@
DEBUGFS_ADD(channel_use, sta);
DEBUGFS_ADD(drop_unencrypted, sta);
DEBUGFS_ADD(eapol, sta);
-@@ -202,6 +467,42 @@ static void add_sta_files(struct ieee802
+@@ -185,6 +451,42 @@ static void add_sta_files(struct ieee802
DEBUGFS_ADD(auth_alg, sta);
DEBUGFS_ADD(auth_transaction, sta);
DEBUGFS_ADD(flags, sta);
@@ -3815,7 +4733,7 @@
}
static void add_ap_files(struct ieee80211_sub_if_data *sdata)
-@@ -297,6 +598,40 @@ static void del_sta_files(struct ieee802
+@@ -278,6 +580,40 @@ static void del_sta_files(struct ieee802
DEBUGFS_DEL(auth_alg, sta);
DEBUGFS_DEL(auth_transaction, sta);
DEBUGFS_DEL(flags, sta);
@@ -3856,9 +4774,9 @@
}
static void del_ap_files(struct ieee80211_sub_if_data *sdata)
-diff -up linux-2.6.22.noarch/net/mac80211/wpa.c.orig linux-2.6.22.noarch/net/mac80211/wpa.c
---- linux-2.6.22.noarch/net/mac80211/wpa.c.orig 2007-09-26 20:24:17.000000000 -0400
-+++ linux-2.6.22.noarch/net/mac80211/wpa.c 2007-09-26 20:24:22.000000000 -0400
+diff -up linux-2.6.23.noarch/net/mac80211/wpa.c.orig linux-2.6.23.noarch/net/mac80211/wpa.c
+--- linux-2.6.23.noarch/net/mac80211/wpa.c.orig 2007-10-19 14:56:40.000000000 -0400
++++ linux-2.6.23.noarch/net/mac80211/wpa.c 2007-10-19 15:24:27.000000000 -0400
@@ -18,6 +18,10 @@
#include "tkip.h"
#include "aes_ccm.h"
@@ -3963,7 +4881,7 @@
mac80211_ev_michael_mic_failure(rx->dev, rx->key->conf.keyidx,
(void *) skb->data);
-@@ -208,12 +271,30 @@ static int tkip_encrypt_skb(struct ieee8
+@@ -212,12 +275,30 @@ static int tkip_encrypt_skb(struct ieee8
memmove(pos, pos + TKIP_IV_LEN, hdrlen);
pos += hdrlen;
@@ -3995,7 +4913,7 @@
hdr = (struct ieee80211_hdr *)skb->data;
/* hwaccel - with preallocated room for IV */
-@@ -255,6 +336,37 @@ ieee80211_tx_h_tkip_encrypt(struct ieee8
+@@ -258,6 +339,37 @@ ieee80211_crypto_tkip_encrypt(struct iee
tx->u.tx.control->iv_len = TKIP_IV_LEN;
ieee80211_tx_set_iswep(tx);
@@ -4033,7 +4951,7 @@
if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&
!(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
!wpa_test) {
-@@ -268,6 +380,10 @@ ieee80211_tx_h_tkip_encrypt(struct ieee8
+@@ -271,6 +383,10 @@ ieee80211_crypto_tkip_encrypt(struct iee
if (tx->u.tx.extra_frag) {
int i;
@@ -4044,7 +4962,7 @@
for (i = 0; i < tx->u.tx.num_extra_frag; i++) {
if (tkip_encrypt_skb(tx, tx->u.tx.extra_frag[i], test)
< 0)
-@@ -275,6 +391,23 @@ ieee80211_tx_h_tkip_encrypt(struct ieee8
+@@ -278,6 +394,23 @@ ieee80211_crypto_tkip_encrypt(struct iee
}
}
@@ -4068,7 +4986,7 @@
return TXRX_CONTINUE;
}
-@@ -299,6 +432,17 @@ ieee80211_rx_h_tkip_decrypt(struct ieee8
+@@ -300,6 +433,17 @@ ieee80211_crypto_tkip_decrypt(struct iee
if (!rx->sta || skb->len - hdrlen < 12)
return TXRX_DROP;
@@ -4086,7 +5004,7 @@
if (rx->u.rx.status->flag & RX_FLAG_DECRYPTED) {
if (rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED) {
/*
-@@ -467,12 +611,26 @@ static int ccmp_encrypt_skb(struct ieee8
+@@ -470,12 +614,26 @@ static int ccmp_encrypt_skb(struct ieee8
/* PN = PN + 1 */
pn = key->u.ccmp.tx_pn;
@@ -4113,8 +5031,8 @@
ccmp_pn2hdr(pos, pn, key->conf.keyidx);
if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
-@@ -504,6 +662,27 @@ ieee80211_tx_h_ccmp_encrypt(struct ieee8
- if (!key || key->conf.alg != ALG_CCMP || !WLAN_FC_DATA_PRESENT(fc))
+@@ -506,6 +664,27 @@ ieee80211_crypto_ccmp_encrypt(struct iee
+ if (!WLAN_FC_DATA_PRESENT(fc))
return TXRX_CONTINUE;
+#ifdef CONFIG_HOSTAPD_WPA_TESTING
@@ -4141,7 +5059,7 @@
tx->u.tx.control->icv_len = CCMP_MIC_LEN;
tx->u.tx.control->iv_len = CCMP_HDR_LEN;
ieee80211_tx_set_iswep(tx);
-@@ -521,6 +700,10 @@ ieee80211_tx_h_ccmp_encrypt(struct ieee8
+@@ -523,6 +702,10 @@ ieee80211_crypto_ccmp_encrypt(struct iee
if (tx->u.tx.extra_frag) {
int i;
linux-2.6-wireless.patch:
View full diff with command:
/usr/bin/cvs -f diff -kk -u -N -r 1.10 -r 1.10.6.1 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.10.6.1
diff -u -r1.10 -r1.10.6.1
--- linux-2.6-wireless.patch 10 Oct 2007 21:58:12 -0000 1.10
+++ linux-2.6-wireless.patch 26 Oct 2007 04:17:54 -0000 1.10.6.1
@@ -1,40619 +1,22196 @@
-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-10-09 16:31:38.000000000 -0400
++++ linux-2.6.23.noarch/drivers/Kconfig 2007-10-25 23:23:22.000000000 -0400
+@@ -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-19 08:28:46.917288885 -0400
++++ linux-2.6.23.noarch/drivers/ssb/ssb_private.h 2007-10-25 23:23:23.000000000 -0400
+@@ -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,
[...248865 lines suppressed...]
++M: jbenc at suse.cz
+ L: linux-wireless at vger.kernel.org
+ W: http://linuxwireless.org/
+-T: git kernel.org:/pub/scm/linux/kernel/git/jbenc/mac80211.git
++T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
+ S: Maintained
+
+ MACVLAN DRIVER
+@@ -3019,6 +3054,14 @@ L: kpreempt-tech at lists.sourceforge.net
+ W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel
+ S: Supported
+
++P54 WIRELESS DRIVER
++P: Michael Wu
++M: flamingice at sourmilk.net
++L: linux-wireless at vger.kernel.org
++W: http://prism54.org
++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 +3149,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
+@@ -3430,6 +3481,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-10-09 16:31:38.000000000 -0400
++++ linux-2.6.23.noarch/CREDITS 2007-10-25 23:23:22.000000000 -0400
+@@ -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.4.6.1
diff -u -r1.4 -r1.4.6.1
--- linux-2.6-zd1211rw-mac80211.patch 5 Oct 2007 15:17:09 -0000 1.4
+++ linux-2.6-zd1211rw-mac80211.patch 26 Oct 2007 04:17:58 -0000 1.4.6.1
@@ -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-wireless-fixes.patch DELETED ---
More information about the fedora-extras-commits
mailing list