Skip to contentSkip to conversation

Please pull 'upstream' branch of rt2x00

PATCH In review Ivo van Doorn 4 participants 36 messages Aug 19, 2007 – Aug 23, 2007 Networking drivers (wireless)

lore
Share & tools
lore
#0 lore raw

Hi John,

Well finally rt2x00 2.0.7 is released, unfortunately it will not be the last release in the 2.0.* series as promised earlier.

This series contains lots of bugfixes, but some of the more critical issues are still present. rt2x00 is however becoming more usable for more people, so the progress is there. ;)

I'll do my best to make the next release 2.0.8 the last in the 2.0.* series so 2.1.0 can be moved upstream. :)

Ivo

---
The following changes since commit f5a420590f3f6a45ee5bca0048640f0f24852315:
John W. Linville (1):
Merge branch 'b43' into everything

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git/ upstream

Ivo van Doorn (27):
rt2x00: Correctly configure packet filter in monitor mode
rt2x00: Clear MAC and BSSID when non-monitor interface goes down
rt2x00: Check return value of usb_control_msg()
rt2x00: Clear all fields on start_link_tune()
rt2x00: Don't increase rx_failed for individual frames
rt2x00: Set vgc_level during reset_tuner
rt2x00: Schedule beacon update
rt2x00: Be consistent with unsigned
rt2x00: Correctly reset TX/RX success/failed counters
rt2x00: Rework RF register handling
rt2x00: rt2x00_ring_free returns invalid length
rt2x00: Use caching for USB transfers
rt2x00: Cleanup set_state for rt61 and rt73
rt2x00: Fix register initialization ordering
rt2x00: memset descriptor before use
rt2x00: Remove IEEE80211_HW_WEP_INCLUDE_IV flag
rt2x00: Cleanup TXD flags
rt2x00: Add byte-ordering annotation for MAC and BSSID
rt2x00: Correctly set TXD retry flag
rt2x00: Move rt2x00 files into rt2x00 folder
rt2x00: Add file pattern to MAINTAINER entry
rt2x00: Fix PLCP setup
rt2x00: Clean up RATEMASK handling
rt2x00: Add rt2x00lib_reset_link_tuner()
rt2x00: Always check if mac80211 requested TX status update
rt2x00: Lindent
rt2x00: rt2x00 2.0.7

Luca Tettamanti (1):
Fix off-by-one error in debugfs helpers

Mattias Nissler (2):
rt2x00: Fix width of filter field.
rt2x00: Store firmware in memory

 MAINTAINERS                                        |    1 +
 drivers/net/wireless/Kconfig                       |  131 +------
 drivers/net/wireless/Makefile                      |   23 +-
 drivers/net/wireless/rt2x00/Kconfig                |  130 ++++++
 drivers/net/wireless/rt2x00/Makefile               |   22 +
 drivers/net/wireless/{ => rt2x00}/rt2400pci.c      |  149 ++++---
 drivers/net/wireless/{ => rt2x00}/rt2400pci.h      |    0 
 drivers/net/wireless/{ => rt2x00}/rt2500pci.c      |  409 ++++++++++--------
 drivers/net/wireless/{ => rt2x00}/rt2500pci.h      |    0 
 drivers/net/wireless/{ => rt2x00}/rt2500usb.c      |  382 +++++++++-------
 drivers/net/wireless/{ => rt2x00}/rt2500usb.h      |    0 
 drivers/net/wireless/{ => rt2x00}/rt2x00.h         |   56 ++-
 drivers/net/wireless/{ => rt2x00}/rt2x00config.c   |   14 +-
 drivers/net/wireless/{ => rt2x00}/rt2x00debug.c    |   23 +-
 drivers/net/wireless/{ => rt2x00}/rt2x00debug.h    |    0 
 drivers/net/wireless/{ => rt2x00}/rt2x00dev.c      |  221 ++++++----
 drivers/net/wireless/{ => rt2x00}/rt2x00firmware.c |   43 ++-
 drivers/net/wireless/{ => rt2x00}/rt2x00lib.h      |    5 +
 drivers/net/wireless/{ => rt2x00}/rt2x00mac.c      |   15 +-
 drivers/net/wireless/{ => rt2x00}/rt2x00pci.c      |    7 +-
 drivers/net/wireless/{ => rt2x00}/rt2x00pci.h      |    0 
 drivers/net/wireless/{ => rt2x00}/rt2x00reg.h      |   56 ++-
 drivers/net/wireless/{ => rt2x00}/rt2x00rfkill.c   |    0 
 drivers/net/wireless/{ => rt2x00}/rt2x00ring.h     |    6 +-
 drivers/net/wireless/{ => rt2x00}/rt2x00usb.c      |  114 ++++-
 drivers/net/wireless/{ => rt2x00}/rt2x00usb.h      |   60 +++-
 drivers/net/wireless/{ => rt2x00}/rt61pci.c        |  466 ++++++++------------
 drivers/net/wireless/{ => rt2x00}/rt61pci.h        |    0 
 drivers/net/wireless/{ => rt2x00}/rt73usb.c        |  471 +++++++++++---------
 drivers/net/wireless/{ => rt2x00}/rt73usb.h        |    0 
 30 files changed, 1532 insertions(+), 1272 deletions(-)
 create mode 100644 drivers/net/wireless/rt2x00/Kconfig
 create mode 100644 drivers/net/wireless/rt2x00/Makefile
 rename drivers/net/wireless/{ => rt2x00}/rt2400pci.c (94%)
 rename drivers/net/wireless/{ => rt2x00}/rt2400pci.h (100%)
 rename drivers/net/wireless/{ => rt2x00}/rt2500pci.c (84%)
 rename drivers/net/wireless/{ => rt2x00}/rt2500pci.h (100%)
 rename drivers/net/wireless/{ => rt2x00}/rt2500usb.c (81%)
 rename drivers/net/wireless/{ => rt2x00}/rt2500usb.h (100%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00.h (94%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00config.c (92%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00debug.c (94%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00debug.h (100%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00dev.c (85%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00firmware.c (84%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00lib.h (94%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00mac.c (97%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00pci.c (98%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00pci.h (100%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00reg.h (80%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00rfkill.c (100%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00ring.h (96%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00usb.c (85%)
 rename drivers/net/wireless/{ => rt2x00}/rt2x00usb.h (65%)
 rename drivers/net/wireless/{ => rt2x00}/rt61pci.c (89%)
 rename drivers/net/wireless/{ => rt2x00}/rt61pci.h (100%)
 rename drivers/net/wireless/{ => rt2x00}/rt73usb.c (82%)
 rename drivers/net/wireless/{ => rt2x00}/rt73usb.h (100%)
#1 lore raw

PATCH 1/30 rt2x00: Correctly configure packet filter in monitor mode

Quoted 1 line

From a065c6ce407b30a02777761794e77ee6cfa8663e Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 12:50:42 +0200
Subject: [PATCH 01/30] rt2x00: Correctly configure packet filter in monitor mode

If there is a non-monitor interface present
the packet should be strict (even if a monitor interface is present!). When there is only 1 interface present which is in monitor mode we should start accepting _all_ frames.
This also means there is no special packet filtering in monitor mode, so don't check for monitor mode in the set_multicast_list handler.

---
 drivers/net/wireless/rt2400pci.c    |   19 +++++++++++++------
 drivers/net/wireless/rt2500pci.c    |   19 +++++++++++++------
 drivers/net/wireless/rt2500usb.c    |   19 +++++++++++++------
 drivers/net/wireless/rt2x00config.c |   12 ------------
 drivers/net/wireless/rt2x00mac.c    |    6 ------
 drivers/net/wireless/rt61pci.c      |   21 ++++++++++++++-------
 drivers/net/wireless/rt73usb.c      |   21 ++++++++++++++-------
 7 files changed, 67 insertions(+), 50 deletions(-)
drivers/net/wireless/rt2400pci.c +13 -6
index 757d749..d97fa31 100644
@@ -305,15 +305,22 @@ static void rt2400pci_config_type(struct rt2x00_dev *rt2x00dev, int type)
 	else
 		rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 0);
 
-	rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 1);
-	if (is_monitor_present(&rt2x00dev->interface)) {
-		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 0);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 0);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 0);
-	} else {
+	/*
+	 * If there is a non-monitor interface present
+	 * the packet should be strict (even if a monitor interface is present!).
+	 * When there is only 1 interface present which is in monitor mode
+	 * we should start accepting _all_ frames.
+	 */
+	if (is_interface_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 1);
 		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 1);
 		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 1);
 		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
+	} else if (is_monitor_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 0);
+		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 0);
+		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 0);
+		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 0);
 	}
 
 	rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
drivers/net/wireless/rt2500pci.c +13 -6
index dd98aa4..0a0fa22 100644
@@ -309,15 +309,22 @@ static void rt2500pci_config_type(struct rt2x00_dev *rt2x00dev, const int type)
 	else
 		rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 0);
 
-	rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 1);
-	if (is_monitor_present(&rt2x00dev->interface)) {
-		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 0);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 0);
-		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 0);
-	} else {
+	/*
+	 * If there is a non-monitor interface present
+	 * the packet should be strict (even if a monitor interface is present!).
+	 * When there is only 1 interface present which is in monitor mode
+	 * we should start accepting _all_ frames.
+	 */
+	if (is_interface_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 1);
 		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 1);
 		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 1);
 		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
+	} else if (is_monitor_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, RXCSR0_DROP_CRC, 0);
+		rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL, 0);
+		rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL, 0);
+		rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 0);
 	}
 
 	rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
drivers/net/wireless/rt2500usb.c +13 -6
index e09fb9f..ad400dd 100644
@@ -314,15 +314,22 @@ static void rt2500usb_config_type(struct rt2x00_dev *rt2x00dev, const int type)
 	else
 		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS, 0);
 
-	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CRC, 1);
-	if (is_monitor_present(&rt2x00dev->interface)) {
-		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_PHYSICAL, 0);
-		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL, 0);
-		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 0);
-	} else {
+	/*
+	 * If there is a non-monitor interface present
+	 * the packet should be strict (even if a monitor interface is present!).
+	 * When there is only 1 interface present which is in monitor mode
+	 * we should start accepting _all_ frames.
+	 */
+	if (is_interface_present(&rt2x00dev->interface)) {
+		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CRC, 1);
 		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_PHYSICAL, 1);
 		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL, 1);
 		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1);
+	} else if (is_monitor_present(&rt2x00dev->interface)) {
+		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CRC, 0);
+		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_PHYSICAL, 0);
+		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL, 0);
+		rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 0);
 	}
 
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);
drivers/net/wireless/rt2x00config.c +0 -12
index 11d5646..4fec0af 100644
@@ -48,18 +48,6 @@ void rt2x00lib_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 
 void rt2x00lib_config_packet_filter(struct rt2x00_dev *rt2x00dev, int filter)
 {
-	struct interface *intf = &rt2x00dev->interface;
-
-	/*
-	 * When a monitor interface is present,
-	 * we should force enable all modes.
-	 */
-	if (is_monitor_present(intf)) {
-		filter = IFF_PROMISC | IFF_MULTICAST | IFF_BROADCAST;
-		if (intf->filter != filter)
-			__set_bit(PACKET_FILTER_PENDING, &rt2x00dev->flags);
-	}
-
 	/*
 	 * Only configure the device when something has changed,
 	 * or if we are in RESET state in which case all configuration
drivers/net/wireless/rt2x00mac.c +0 -6
index 205f10f..c384767 100644
@@ -333,12 +333,6 @@ void rt2x00mac_set_multicast_list(struct ieee80211_hw *hw,
 	rt2x00dev->interface.filter = flags;
 
 	/*
-	 * No filtering in monitor mode.
-	 */
-	if (is_monitor_present(&rt2x00dev->interface))
-		return;
-
-	/*
 	 * Raise the pending bit to indicate the
 	 * packet filter should be updated.
 	 */
drivers/net/wireless/rt61pci.c +14 -7
index 00f66e0..7f3a00b 100644
@@ -338,17 +338,24 @@ static void rt61pci_config_type(struct rt2x00_dev *rt2x00dev, const int type)
 	else
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS, 0);
 
-	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC, 1);
-	if (is_monitor_present(&rt2x00dev->interface)) {
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL, 0);
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 0);
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 0);
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 0);
-	} else {
+	/*
+	 * If there is a non-monitor interface present
+	 * the packet should be strict (even if a monitor interface is present!).
+	 * When there is only 1 interface present which is in monitor mode
+	 * we should start accepting _all_ frames.
+	 */
+	if (is_interface_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 1);
+	} else if (is_monitor_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 0);
 	}
 
 	rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg);
drivers/net/wireless/rt73usb.c +14 -7
index 2f0bf29..90e2b29 100644
@@ -313,17 +313,24 @@ static void rt73usb_config_type(struct rt2x00_dev *rt2x00dev, const int type)
 	else
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS, 0);
 
-	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC, 1);
-	if (is_monitor_present(&rt2x00dev->interface)) {
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL, 0);
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 0);
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 0);
-		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 0);
-	} else {
+	/*
+	 * If there is a non-monitor interface present
+	 * the packet should be strict (even if a monitor interface is present!).
+	 * When there is only 1 interface present which is in monitor mode
+	 * we should start accepting _all_ frames.
+	 */
+	if (is_interface_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
 		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 1);
+	} else if (is_monitor_present(&rt2x00dev->interface)) {
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 0);
+		rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 0);
 	}
 
 	rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg);
Signature · 1 line
1.5.3.rc5
#2 lore raw

PATCH 2/30 rt2x00: Clear MAC and BSSID when non-monitor interface goes down

In reply to Ivo van Doorn
Quoted 1 line

From f027057821e22cf353fd37e3c139dc908c85bffe Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 12:51:46 +0200
Subject: [PATCH 02/30] rt2x00: Clear MAC and BSSID when non-monitor interface goes down

When the non-monitor interface goes down the BSSID and MAC address should be cleared inside the registers to prevent acking of frames.

---
 drivers/net/wireless/rt2x00.h    |    2 +-
 drivers/net/wireless/rt2x00dev.c |    8 ++++++--
 drivers/net/wireless/rt2x00mac.c |    4 ++--
 3 files changed, 9 insertions(+), 5 deletions(-)
drivers/net/wireless/rt2x00.h +1 -1
index 77556fe..b06cda6 100644
@@ -290,7 +290,7 @@ struct interface {
 	/*
 	 * MAC of the device.
 	 */
-	u8 *mac;
+	u8 mac[ETH_ALEN];
 
 	/*
 	 * BBSID of the AP to associate with.
drivers/net/wireless/rt2x00dev.c +6 -2
index 28ddbe0..1597d2d 100644
@@ -920,12 +920,16 @@ void rt2x00lib_deinit_interface(struct rt2x00_dev *rt2x00dev)
 
 	/*
 	 * If no interfaces are present, we should disable the radio
-	 * Otherwise check which interface needs to be initialized.
+	 * Otherwise configure the mac_address and bssid and check
+	 * which interface needs to be initialized.
 	 */
 	if (!is_monitor_present(intf) && !is_interface_present(intf))
 		rt2x00lib_disable_radio(rt2x00dev);
-	else if (is_monitor_present(intf) ^ is_interface_present(intf))
+	else if (is_monitor_present(intf) ^ is_interface_present(intf)) {
+		rt2x00lib_config_mac_addr(rt2x00dev, intf->mac);
+		rt2x00lib_config_bssid(rt2x00dev, intf->bssid);
 		rt2x00lib_config_type(rt2x00dev, intf->type);
+	}
 
 	/*
 	 * If we are in reset mode, the device must be deinitialized.
drivers/net/wireless/rt2x00mac.c +2 -2
index c384767..31fe0f1 100644
@@ -192,7 +192,7 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
 		intf->type = conf->type;
 		if (conf->type == IEEE80211_IF_TYPE_AP)
 			memcpy(&intf->bssid, conf->mac_addr, ETH_ALEN);
-		intf->mac = conf->mac_addr;
+		memcpy(&intf->mac, conf->mac_addr, ETH_ALEN);
 		intf->filter = 0;
 	}
 
@@ -232,7 +232,7 @@ void rt2x00mac_remove_interface(struct ieee80211_hw *hw,
 		intf->id = 0;
 		intf->type = INVALID_INTERFACE;
 		memset(&intf->bssid, 0x00, ETH_ALEN);
-		intf->mac = NULL;
+		memset(&intf->mac, 0x00, ETH_ALEN);
 		intf->filter = 0;
 	}
 
Signature · 1 line
1.5.3.rc5
#3 lore raw

PATCH 3/30 rt2x00: Check return value of usb_control_msg()

In reply to Ivo van Doorn
Quoted 1 line

From 91de0ebc5c8e4c6799b4de5b34301a0884c085d2 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 12:52:33 +0200
Subject: [PATCH 03/30] rt2x00: Check return value of usb_control_msg()

Check the return value of usb_control_msg and try
to determine the best course of action:
- Bail out immediately
- Increase timeout value
- Try again

---
 drivers/net/wireless/rt2x00usb.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)
drivers/net/wireless/rt2x00usb.c +13 -1
index 38804d7..05ae870 100644
@@ -47,6 +47,7 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
 	    interface_to_usbdev(rt2x00dev_usb(rt2x00dev));
 	int status;
 	unsigned int i;
+	unsigned int time = timeout;
 
 	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
 		status = usb_control_msg(usb_dev,
@@ -54,9 +55,20 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
 					  usb_rcvctrlpipe(usb_dev, 0) :
 					  usb_sndctrlpipe(usb_dev, 0)),
 					 request, type, value, offset,
-					 buffer, buffer_length, timeout);
+					 buffer, buffer_length, time);
+
 		if (status >= 0)
 			return 0;
+
+		/*
+		 * Check for errors,
+		 * -ETIMEDOUT: We need a bit more time to complete.
+		 * -ENODEV: Device has disappeared, no point continuing.
+		 */
+		if (status == -ETIMEDOUT)
+			time *= 2;
+		else if (status == -ENODEV)
+			break;
 	}
 
 	ERROR(rt2x00dev,
Signature · 1 line
1.5.3.rc5
#4 lore raw

PATCH 4/30 rt2x00: Clear all fields on start_link_tune()

In reply to Ivo van Doorn
Quoted 1 line

From 643e88e4fca8b22d60f718226bede9f033b3e869 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 12:55:02 +0200
Subject: [PATCH 04/30] rt2x00: Clear all fields on start_link_tune()

All variables inside the link structure need to be cleared when calling start_link_tune().

---
 drivers/net/wireless/rt2x00dev.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
drivers/net/wireless/rt2x00dev.c +4 -0
index 1597d2d..b7191cc 100644
@@ -73,6 +73,10 @@ static void rt2x00_start_link_tune(struct rt2x00_dev *rt2x00dev)
 	rt2x00dev->link.avg_rssi = 0;
 	rt2x00dev->link.vgc_level = 0;
 	rt2x00dev->link.false_cca = 0;
+	rt2x00dev->link.rx_success = 0;
+	rt2x00dev->link.rx_failed = 0;
+	rt2x00dev->link.tx_success = 0;
+	rt2x00dev->link.tx_failed = 0;
 
 	/*
 	 * Reset the link tuner.
Signature · 1 line
1.5.3.rc5
#5 lore raw

PATCH 5/30 rt2x00: Don't increase rx_failed for individual frames

In reply to Ivo van Doorn
Quoted 1 line

From 53237308ec1ca8f3b3679c7e04cfe467bfeef077 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 12:55:29 +0200
Subject: [PATCH 05/30] rt2x00: Don't increase rx_failed for individual frames

Add the size argument to fill_rxdone.
This will make the return value of rxdone more meaningfull (valid frame or invalid frame) and don't increase the rx_failed counter when a invalid frame is encountered. This will prevent the signal value to be very low when monitor mode is enabled and invalid frames are passed to the device.
Note that dropping of these frames will disappear in the future when mac80211 receives the correct patches that will allow us to send corrupt packages to it.

---
 drivers/net/wireless/rt2400pci.c |    9 ++++-----
 drivers/net/wireless/rt2500pci.c |    9 ++++-----
 drivers/net/wireless/rt2500usb.c |    9 ++++-----
 drivers/net/wireless/rt2x00.h    |    2 +-
 drivers/net/wireless/rt2x00pci.c |    7 ++++---
 drivers/net/wireless/rt2x00usb.c |    6 ++++--
 drivers/net/wireless/rt61pci.c   |    9 ++++-----
 drivers/net/wireless/rt73usb.c   |    9 ++++-----
 8 files changed, 29 insertions(+), 31 deletions(-)
drivers/net/wireless/rt2400pci.c +4 -5
index d97fa31..1506666 100644
@@ -1203,7 +1203,7 @@ static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
  * RX control handlers
  */
 static int rt2400pci_fill_rxdone(struct data_entry *entry,
-				 int *signal, int *rssi, int *ofdm)
+				 int *signal, int *rssi, int *ofdm, int *size)
 {
 	struct data_desc *rxd = entry->priv;
 	u32 word0;
@@ -1213,10 +1213,8 @@ static int rt2400pci_fill_rxdone(struct data_entry *entry,
 	rt2x00_desc_read(rxd, 2, &word2);
 
 	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR) ||
-	    rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR)) {
-		entry->ring->rt2x00dev->link.rx_failed++;
+	    rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR))
 		return -EINVAL;
-	}
 
 	/*
 	 * Obtain the status about this packet.
@@ -1225,8 +1223,9 @@ static int rt2400pci_fill_rxdone(struct data_entry *entry,
 	*rssi = rt2x00_get_field32(word2, RXD_W2_RSSI) -
 	    entry->ring->rt2x00dev->rssi_offset;
 	*ofdm = 0;
+	*size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
-	return rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
+	return 0;
 }
 
 /*
drivers/net/wireless/rt2500pci.c +4 -5
index 0a0fa22..445ec3e 100644
@@ -1381,7 +1381,7 @@ static void rt2500pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
  * RX control handlers
  */
 static int rt2500pci_fill_rxdone(struct data_entry *entry,
-				 int *signal, int *rssi, int *ofdm)
+				 int *signal, int *rssi, int *ofdm, int *size)
 {
 	struct data_desc *rxd = entry->priv;
 	u32 word0;
@@ -1392,17 +1392,16 @@ static int rt2500pci_fill_rxdone(struct data_entry *entry,
 
 	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR) ||
 	    rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR) ||
-	    rt2x00_get_field32(word0, RXD_W0_ICV_ERROR)) {
-		entry->ring->rt2x00dev->link.rx_failed++;
+	    rt2x00_get_field32(word0, RXD_W0_ICV_ERROR))
 		return -EINVAL;
-	}
 
 	*signal = rt2x00_get_field32(word2, RXD_W2_SIGNAL);
 	*rssi = rt2x00_get_field32(word2, RXD_W2_RSSI) -
 	    entry->ring->rt2x00dev->rssi_offset;
 	*ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
+	*size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
-	return rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
+	return 0;
 }
 
 /*
drivers/net/wireless/rt2500usb.c +4 -5
index ad400dd..29b675c 100644
@@ -1178,7 +1178,7 @@ static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
  * RX control handlers
  */
 static int rt2500usb_fill_rxdone(struct data_entry *entry,
-				 int *signal, int *rssi, int *ofdm)
+				 int *signal, int *rssi, int *ofdm, int *size)
 {
 	struct urb *urb = entry->priv;
 	struct data_desc *rxd = (struct data_desc *)(entry->skb->data +
@@ -1192,10 +1192,8 @@ static int rt2500usb_fill_rxdone(struct data_entry *entry,
 
 	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR) ||
 	    rt2x00_get_field32(word0, RXD_W0_PHYSICAL_ERROR) ||
-	    rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR)) {
-		entry->ring->rt2x00dev->link.rx_failed++;
+	    rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR))
 		return -EINVAL;
-	}
 
 	/*
 	 * Obtain the status about this packet.
@@ -1204,8 +1202,9 @@ static int rt2500usb_fill_rxdone(struct data_entry *entry,
 	*rssi = rt2x00_get_field32(word1, RXD_W1_RSSI) -
 	    entry->ring->rt2x00dev->rssi_offset;
 	*ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
+	*size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
-	return rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
+	return;
 }
 
 /*
drivers/net/wireless/rt2x00.h +1 -1
index b06cda6..4b8906e 100644
@@ -402,7 +402,7 @@ struct rt2x00lib_ops {
 	 * RX control handlers
 	 */
 	int (*fill_rxdone) (struct data_entry *entry,
-			    int *signal, int *rssi, int *ofdm);
+			    int *signal, int *rssi, int *ofdm, int *size);
 
 	/*
 	 * Configuration handlers.
drivers/net/wireless/rt2x00pci.c +4 -3
index bf62dd0..c54b30f 100644
@@ -124,6 +124,7 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
 	struct data_entry *entry;
 	struct data_desc *rxd;
 	u32 desc;
+	int retval;
 	int signal;
 	int rssi;
 	int ofdm;
@@ -137,9 +138,9 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
 		if (rt2x00_get_field32(desc, RXD_ENTRY_OWNER_NIC))
 			break;
 
-		size = rt2x00dev->ops->lib->fill_rxdone(entry, &signal,
-							&rssi, &ofdm);
-		if (size < 0)
+		retval = rt2x00dev->ops->lib->fill_rxdone(entry, &signal,
+							  &rssi, &ofdm, &size);
+		if (retval)
 			goto skip_entry;
 
 		/*
drivers/net/wireless/rt2x00usb.c +4 -2
index 05ae870..6dd0801 100644
@@ -295,6 +295,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
 	struct data_entry *entry = (struct data_entry *)urb->context;
 	struct data_ring *ring = entry->ring;
 	struct rt2x00_dev *rt2x00dev = ring->rt2x00dev;
+	int retval;
 	int signal;
 	int rssi;
 	int ofdm;
@@ -312,8 +313,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
 	if (urb->actual_length < entry->ring->desc_size || urb->status)
 		goto skip_entry;
 
-	size = rt2x00dev->ops->lib->fill_rxdone(entry, &signal, &rssi, &ofdm);
-	if (size < 0)
+	retval = rt2x00dev->ops->lib->fill_rxdone(entry, &signal, &rssi,
+						  &ofdm, &size);
+	if (retval)
 		goto skip_entry;
 
 	/*
drivers/net/wireless/rt61pci.c +4 -5
index 7f3a00b..e292572 100644
@@ -1797,7 +1797,7 @@ static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 }
 
 static int rt61pci_fill_rxdone(struct data_entry *entry,
-			       int *signal, int *rssi, int *ofdm)
+			       int *signal, int *rssi, int *ofdm, int *size)
 {
 	struct data_desc *rxd = entry->priv;
 	u32 word0;
@@ -1807,10 +1807,8 @@ static int rt61pci_fill_rxdone(struct data_entry *entry,
 	rt2x00_desc_read(rxd, 1, &word1);
 
 	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR) ||
-	    rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR)) {
-		entry->ring->rt2x00dev->link.rx_failed++;
+	    rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR))
 		return -EINVAL;
-	}
 
 	/*
 	 * Obtain the status about this packet.
@@ -1818,8 +1816,9 @@ static int rt61pci_fill_rxdone(struct data_entry *entry,
 	*signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);
 	*rssi = rt61pci_agc_to_rssi(entry->ring->rt2x00dev, word1);
 	*ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
+	*size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
-	return rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
+	return 0;
 }
 
 /*
drivers/net/wireless/rt73usb.c +4 -5
index 90e2b29..149f5ee 100644
@@ -1432,7 +1432,7 @@ static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 }
 
 static int rt73usb_fill_rxdone(struct data_entry *entry,
-			       int *signal, int *rssi, int *ofdm)
+			       int *signal, int *rssi, int *ofdm, int *size)
 {
 	struct data_desc *rxd = (struct data_desc *)entry->skb->data;
 	u32 word0;
@@ -1442,10 +1442,8 @@ static int rt73usb_fill_rxdone(struct data_entry *entry,
 	rt2x00_desc_read(rxd, 1, &word1);
 
 	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR) ||
-	    rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR)) {
-		entry->ring->rt2x00dev->link.rx_failed++;
+	    rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR))
 		return -EINVAL;
-	}
 
 	/*
 	 * Obtain the status about this packet.
@@ -1453,13 +1451,14 @@ static int rt73usb_fill_rxdone(struct data_entry *entry,
 	*signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);
 	*rssi = rt73usb_agc_to_rssi(entry->ring->rt2x00dev, word1);
 	*ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
+	*size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
 	/*
 	 * Pull the skb to clear the descriptor area.
 	 */
 	skb_pull(entry->skb, entry->ring->desc_size);
 
-	return rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
+	return 0;
 }
 
 /*
Signature · 1 line
1.5.3.rc5
#6 lore raw

PATCH 6/30 rt2x00: Set vgc_level during reset_tuner

In reply to Ivo van Doorn
Quoted 1 line

From dc0c67691b4f794fcaad97ddc36f4e9354658d6e Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 12:55:51 +0200
Subject: [PATCH 06/30] rt2x00: Set vgc_level during reset_tuner

Reset the vgc_level to the correct AGC VGC value that has just been written to the register during reset_tuner.
This will assure that the value will be valid when it is used during the link tuner.

---
 drivers/net/wireless/rt2400pci.c |    1 +
 drivers/net/wireless/rt2500pci.c |    1 +
 drivers/net/wireless/rt2500usb.c |    4 +++-
 drivers/net/wireless/rt61pci.c   |    1 +
 drivers/net/wireless/rt73usb.c   |    1 +
 5 files changed, 7 insertions(+), 1 deletions(-)
drivers/net/wireless/rt2400pci.c +1 -0
index 1506666..d8628e6 100644
@@ -655,6 +655,7 @@ static void rt2400pci_link_stats(struct rt2x00_dev *rt2x00dev)
 static void rt2400pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
 	rt2400pci_bbp_write(rt2x00dev, 13, 0x08);
+	rt2x00dev->link.vgc_level = 0x08;
 }
 
 static void rt2400pci_link_tuner(struct rt2x00_dev *rt2x00dev)
drivers/net/wireless/rt2500pci.c +1 -0
index 445ec3e..4d195de 100644
@@ -755,6 +755,7 @@ static void rt2500pci_link_stats(struct rt2x00_dev *rt2x00dev)
 static void rt2500pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
 	rt2500pci_bbp_write(rt2x00dev, 17, 0x48);
+	rt2x00dev->link.vgc_level = 0x48;
 }
 
 static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
drivers/net/wireless/rt2500usb.c +3 -1
index 29b675c..581cc6f 100644
@@ -728,6 +728,8 @@ static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev)
 	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_VGC, &eeprom);
 	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_VGCUPPER);
 	rt2500usb_bbp_write(rt2x00dev, 17, value);
+
+	rt2x00dev->link.vgc_level = value;
 }
 
 static void rt2500usb_link_tuner(struct rt2x00_dev *rt2x00dev)
@@ -1204,7 +1206,7 @@ static int rt2500usb_fill_rxdone(struct data_entry *entry,
 	*ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
 	*size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
-	return;
+	return 0;
 }
 
 /*
drivers/net/wireless/rt61pci.c +1 -0
index e292572..7c52a4e 100644
@@ -968,6 +968,7 @@ static void rt61pci_link_stats(struct rt2x00_dev *rt2x00dev)
 static void rt61pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
 	rt61pci_bbp_write(rt2x00dev, 17, 0x20);
+	rt2x00dev->link.vgc_level = 0x20;
 }
 
 static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
drivers/net/wireless/rt73usb.c +1 -0
index 149f5ee..74e4173 100644
@@ -858,6 +858,7 @@ static void rt73usb_link_stats(struct rt2x00_dev *rt2x00dev)
 static void rt73usb_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
 	rt73usb_bbp_write(rt2x00dev, 17, 0x20);
+	rt2x00dev->link.vgc_level = 0x20;
 }
 
 static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
Signature · 1 line
1.5.3.rc5
#7 lore raw

PATCH 7/30 rt2x00: Schedule beacon update

In reply to Ivo van Doorn
Quoted 1 line

From ddf86b88ab735fac340b1fae078a6433ed1a8fce Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 12:56:18 +0200
Subject: [PATCH 07/30] rt2x00: Schedule beacon update

ieee80211_beacon_get Doesn't allow to be called from interrupt context. Schedule the call using a workqueue.

---
 drivers/net/wireless/rt2400pci.c |    2 +-
 drivers/net/wireless/rt2500pci.c |    2 +-
 drivers/net/wireless/rt2x00.h    |    7 ++++++-
 drivers/net/wireless/rt2x00dev.c |   25 +++++++++++++++++++++----
 drivers/net/wireless/rt2x00mac.c |    2 +-
 drivers/net/wireless/rt61pci.c   |    2 +-
 6 files changed, 31 insertions(+), 9 deletions(-)
drivers/net/wireless/rt2400pci.c +1 -1
index d8628e6..8365171 100644
@@ -1306,7 +1306,7 @@ static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance)
 	 * 1 - Beacon timer expired interrupt.
 	 */
 	if (rt2x00_get_field32(reg, CSR7_TBCN_EXPIRE))
-		rt2x00lib_beacondone(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);
+		rt2x00lib_beacondone(rt2x00dev);
 
 	/*
 	 * 2 - Rx ring done interrupt.
drivers/net/wireless/rt2500pci.c +1 -1
index 4d195de..a794989 100644
@@ -1482,7 +1482,7 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
 	 * 1 - Beacon timer expired interrupt.
 	 */
 	if (rt2x00_get_field32(reg, CSR7_TBCN_EXPIRE))
-		rt2x00lib_beacondone(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);
+		rt2x00lib_beacondone(rt2x00dev);
 
 	/*
 	 * 2 - Rx ring done interrupt.
drivers/net/wireless/rt2x00.h +6 -1
index 4b8906e..31f8a13 100644
@@ -589,6 +589,11 @@ struct rt2x00_dev {
 	struct ieee80211_rx_status rx_status;
 
 	/*
+	 * Beacon scheduled work.
+	 */
+	struct work_struct beacon_work;
+
+	/*
 	 * Data ring arrays for RX, TX and Beacon.
 	 * The Beacon array also contains the Atim ring
 	 * if that is supported by the device.
@@ -725,7 +730,7 @@ struct data_ring *rt2x00lib_get_ring(struct rt2x00_dev *rt2x00dev,
 /*
  * Interrupt context handlers.
  */
-void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev, const int queue);
+void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev);
 void rt2x00lib_txdone(struct data_entry *entry,
 		      const int status, const int retry);
 void rt2x00lib_rxdone(struct data_entry *entry, char *data,
drivers/net/wireless/rt2x00dev.c +21 -4
index b7191cc..7f3eaf1 100644
@@ -90,8 +90,7 @@ static void rt2x00_start_link_tune(struct rt2x00_dev *rt2x00dev)
 static void rt2x00_stop_link_tune(struct rt2x00_dev *rt2x00dev)
 {
 	if (delayed_work_pending(&rt2x00dev->link.work))
-		cancel_rearming_delayed_workqueue(rt2x00dev->hw->workqueue,
-						  &rt2x00dev->link.work);
+		cancel_rearming_delayed_work(&rt2x00dev->link.work);
 }
 
 /*
@@ -139,6 +138,12 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev)
 		return;
 
 	/*
+	 * Stop beacon generation.
+	 */
+	if (work_pending(&rt2x00dev->beacon_work))
+		cancel_work_sync(&rt2x00dev->beacon_work);
+
+	/*
 	 * Stop the TX queues.
 	 */
 	ieee80211_stop_queues(rt2x00dev->hw);
@@ -252,9 +257,12 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
 /*
  * Interrupt context handlers.
  */
-void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev, const int queue)
+static void rt2x00lib_beacondone_scheduled(struct work_struct *work)
 {
-	struct data_ring *ring = rt2x00lib_get_ring(rt2x00dev, queue);
+	struct rt2x00_dev *rt2x00dev =
+	    container_of(work, struct rt2x00_dev, beacon_work);
+	struct data_ring *ring =
+	    rt2x00lib_get_ring(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);
 	struct data_entry *entry = rt2x00_get_data_entry(ring);
 	struct sk_buff *skb;
 
@@ -269,6 +277,14 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev, const int queue)
 
 	dev_kfree_skb(skb);
 }
+
+void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
+{
+	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
+		return;
+
+	queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->beacon_work);
+}
 EXPORT_SYMBOL_GPL(rt2x00lib_beacondone);
 
 void rt2x00lib_txdone(struct data_entry *entry,
@@ -1012,6 +1028,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Initialize configuration work.
 	 */
+	INIT_WORK(&rt2x00dev->beacon_work, rt2x00lib_beacondone_scheduled);
 	INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner);
 
 	/*
drivers/net/wireless/rt2x00mac.c +1 -1
index 31fe0f1..2b1b910 100644
@@ -157,7 +157,7 @@ int rt2x00mac_reset(struct ieee80211_hw *hw)
 	 */
 	if (intf->type == IEEE80211_IF_TYPE_AP ||
 	    intf->type == IEEE80211_IF_TYPE_IBSS)
-		rt2x00lib_beacondone(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);
+		rt2x00lib_beacondone(rt2x00dev);
 
 exit:
 	__clear_bit(INTERFACE_RESET, &rt2x00dev->flags);
drivers/net/wireless/rt61pci.c +1 -1
index 7c52a4e..edacb46 100644
@@ -1927,7 +1927,7 @@ static irqreturn_t rt61pci_interrupt(int irq, void *dev_instance)
 	 * 1 - Beacon timer expired interrupt.
 	 */
 	if (rt2x00_get_field32(reg, INT_SOURCE_CSR_BEACON_DONE))
-		rt2x00lib_beacondone(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);
+		rt2x00lib_beacondone(rt2x00dev);
 
 	/*
 	 * 2 - Rx ring done interrupt.
Signature · 1 line
1.5.3.rc5
#8 lore raw

PATCH 8/30 rt2x00: Fix width of filter field.

In reply to Ivo van Doorn
Quoted 1 line

From 47c06acef36889c67594dadb4a29879d28c8415b Mon Sep 17 00:00:00 2001

From: Mattias Nissler <[email protected]>
Date: Sat, 4 Aug 2007 19:18:44 +0200
Subject: [PATCH 08/30] rt2x00: Fix width of filter field.

The filter field needs to be declared unsigned short instead of char in order to hold all relevant IFF_* flags.

---
 drivers/net/wireless/rt2x00.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/wireless/rt2x00.h +1 -1
index 31f8a13..0db81eb 100644
@@ -304,7 +304,7 @@ struct interface {
 	 * the monitor mode interfaces are removed, while a
 	 * non-monitor mode interface remains.
 	 */
-	char filter;
+	unsigned short filter;
 
 	/*
 	 * Monitor mode count, the number of interfaces
Signature · 1 line
1.5.3.rc5
#9 lore raw

PATCH 9/30 rt2x00: Be consistent with unsigned

In reply to Ivo van Doorn
Quoted 1 line

From cdc01c652d3b058111e8a2567649e198c7c77cc5 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:00:39 +0200
Subject: [PATCH 09/30] rt2x00: Be consistent with unsigned

unsigned should be used consistently,
all values used as flags should be unsigned
and the ring identifier should also be unsigned everywhere.

char is not consistently signed over all platforms,
make the signedness more explicit where it is demanded
so we resolve some warnings of the type:
"warning: comparison is always false due to limited range of data type"

---
 drivers/net/wireless/rt2400pci.c |    8 +++++---
 drivers/net/wireless/rt2500pci.c |    8 +++++---
 drivers/net/wireless/rt2500usb.c |    8 +++++---
 drivers/net/wireless/rt2x00.h    |    9 +++++----
 drivers/net/wireless/rt61pci.c   |   14 ++++++++------
 drivers/net/wireless/rt73usb.c   |   14 ++++++++------
 6 files changed, 36 insertions(+), 25 deletions(-)
drivers/net/wireless/rt2400pci.c +5 -3
index 8365171..aa1209b 100644
@@ -278,7 +278,7 @@ static void rt2400pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 }
 
 static void rt2400pci_config_packet_filter(struct rt2x00_dev *rt2x00dev,
-					   const int filter)
+					   const unsigned int filter)
 {
 	int promisc = !!(filter & IFF_PROMISC);
 	u32 reg;
@@ -561,7 +561,8 @@ static void rt2400pci_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2x00pci_register_write(rt2x00dev, CSR12, reg);
 }
 
-static void rt2400pci_config(struct rt2x00_dev *rt2x00dev, const int flags,
+static void rt2400pci_config(struct rt2x00_dev *rt2x00dev,
+			     const unsigned int flags,
 			     struct ieee80211_conf *conf)
 {
 	int short_slot_time = conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME;
@@ -1177,7 +1178,8 @@ static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 /*
  * TX data initialization
  */
-static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
+static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
+				    unsigned int queue)
 {
 	u32 reg;
 
drivers/net/wireless/rt2500pci.c +5 -3
index a794989..3a1da1f 100644
@@ -278,7 +278,7 @@ static void rt2500pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 }
 
 static void rt2500pci_config_packet_filter(struct rt2x00_dev *rt2x00dev,
-					   const int filter)
+					   const unsigned int filter)
 {
 	int promisc = !!(filter & IFF_PROMISC);
 	int multicast = !!(filter & IFF_MULTICAST);
@@ -672,7 +672,8 @@ static void rt2500pci_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2x00pci_register_write(rt2x00dev, CSR12, reg);
 }
 
-static void rt2500pci_config(struct rt2x00_dev *rt2x00dev, const int flags,
+static void rt2500pci_config(struct rt2x00_dev *rt2x00dev,
+			     const unsigned int flags,
 			     struct ieee80211_conf *conf)
 {
 	int short_slot_time = conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME;
@@ -1355,7 +1356,8 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 /*
  * TX data initialization
  */
-static void rt2500pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
+static void rt2500pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
+				    unsigned int queue)
 {
 	u32 reg;
 
drivers/net/wireless/rt2500usb.c +5 -3
index 581cc6f..71b7bf2 100644
@@ -283,7 +283,7 @@ static void rt2500usb_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 }
 
 static void rt2500usb_config_packet_filter(struct rt2x00_dev *rt2x00dev,
-					   const int filter)
+					   const unsigned int filter)
 {
 	int promisc = !!(filter & IFF_PROMISC);
 	int multicast = !!(filter & IFF_MULTICAST);
@@ -625,7 +625,8 @@ static void rt2500usb_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
 }
 
-static void rt2500usb_config(struct rt2x00_dev *rt2x00dev, const int flags,
+static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,
+			     const unsigned int flags,
 			     struct ieee80211_conf *conf)
 {
 	int short_slot_time = conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME;
@@ -1153,7 +1154,8 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 /*
  * TX data initialization
  */
-static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
+static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
+				    unsigned int queue)
 {
 	u16 reg;
 
drivers/net/wireless/rt2x00.h +5 -4
index 0db81eb..5c6d7d0 100644
@@ -310,7 +310,7 @@ struct interface {
 	 * Monitor mode count, the number of interfaces
 	 * in monitor mode that that have been added.
 	 */
-	char monitor_count;
+	unsigned short monitor_count;
 };
 
 static inline int is_interface_present(struct interface *intf)
@@ -396,7 +396,8 @@ struct rt2x00lib_ops {
 	int (*write_tx_data) (struct rt2x00_dev *rt2x00dev,
 			      struct data_ring *ring, struct sk_buff *skb,
 			      struct ieee80211_tx_control *control);
-	void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev, int queue);
+	void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev,
+			       unsigned int queue);
 
 	/*
 	 * RX control handlers
@@ -410,9 +411,9 @@ struct rt2x00lib_ops {
 	void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, u8 *mac);
 	void (*config_bssid) (struct rt2x00_dev *rt2x00dev, u8 *bssid);
 	void (*config_packet_filter) (struct rt2x00_dev *rt2x00dev,
-				      const int filter);
+				      const unsigned int filter);
 	void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type);
-	void (*config) (struct rt2x00_dev *rt2x00dev, const int flags,
+	void (*config) (struct rt2x00_dev *rt2x00dev, const unsigned int flags,
 			struct ieee80211_conf *conf);
 #define CONFIG_UPDATE_PHYMODE		( 1 << 1 )
 #define CONFIG_UPDATE_CHANNEL		( 1 << 2 )
drivers/net/wireless/rt61pci.c +8 -6
index edacb46..f592397 100644
@@ -307,7 +307,7 @@ static void rt61pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 }
 
 static void rt61pci_config_packet_filter(struct rt2x00_dev *rt2x00dev,
-					 const int filter)
+					 const unsigned int filter)
 {
 	int promisc = !!(filter & IFF_PROMISC);
 	int multicast = !!(filter & IFF_MULTICAST);
@@ -846,7 +846,8 @@ static void rt61pci_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
 }
 
-static void rt61pci_config(struct rt2x00_dev *rt2x00dev, const int flags,
+static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
+			   const unsigned int flags,
 			   struct ieee80211_conf *conf)
 {
 	int short_slot_time = conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME;
@@ -1726,7 +1727,8 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 /*
  * TX data initialization
  */
-static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
+static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
+				  unsigned int queue)
 {
 	u32 reg;
 
@@ -1759,8 +1761,8 @@ static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
 static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 {
 	u16 eeprom;
-	char offset;
-	char lna;
+	u8 offset;
+	u8 lna;
 
 	lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA);
 	switch (lna) {
@@ -1960,7 +1962,7 @@ static int rt61pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 	u32 reg;
 	u16 word;
 	u8 *mac;
-	char value;
+	s8 value;
 
 	rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, &reg);
 
drivers/net/wireless/rt73usb.c +8 -6
index 74e4173..9f059ce 100644
@@ -282,7 +282,7 @@ static void rt73usb_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 }
 
 static void rt73usb_config_packet_filter(struct rt2x00_dev *rt2x00dev,
-					 const int filter)
+					 const unsigned int filter)
 {
 	int promisc = !!(filter & IFF_PROMISC);
 	int multicast = !!(filter & IFF_MULTICAST);
@@ -742,7 +742,8 @@ static void rt73usb_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg);
 }
 
-static void rt73usb_config(struct rt2x00_dev *rt2x00dev, const int flags,
+static void rt73usb_config(struct rt2x00_dev *rt2x00dev,
+			   const unsigned int flags,
 			   struct ieee80211_conf *conf)
 {
 	int short_slot_time = conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME;
@@ -1370,7 +1371,8 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 /*
  * TX data initialization
  */
-static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
+static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
+				  unsigned int queue)
 {
 	u32 reg;
 
@@ -1390,8 +1392,8 @@ static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, int queue)
 static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 {
 	u16 eeprom;
-	char offset;
-	char lna;
+	u8 offset;
+	u8 lna;
 
 	lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA);
 	switch (lna) {
@@ -1469,7 +1471,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 {
 	u16 word;
 	u8 *mac;
-	char value;
+	s8 value;
 
 	rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom, EEPROM_SIZE);
 
Signature · 1 line
1.5.3.rc5
#10 lore raw

PATCH 10/30 rt2x00: Correctly reset TX/RX success/failed counters

In reply to Ivo van Doorn
Quoted 1 line

From 9e26ed7c8a87978caf02f8c6510bab37007c5259 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:01:14 +0200
Subject: [PATCH 10/30] rt2x00: Correctly reset TX/RX success/failed counters

The TX/RX Success/Failed counters should be reset _before_ updating the statistics. Otherwise all signal quality calculations will be done with a rx_failed count of 0.

---
 drivers/net/wireless/rt2400pci.c |    5 +----
 drivers/net/wireless/rt2500pci.c |    5 +----
 drivers/net/wireless/rt2500usb.c |    5 +----
 drivers/net/wireless/rt2x00dev.c |   22 ++++++++++++----------
 drivers/net/wireless/rt61pci.c   |    5 +----
 drivers/net/wireless/rt73usb.c   |    5 +----
 6 files changed, 17 insertions(+), 30 deletions(-)
drivers/net/wireless/rt2400pci.c +1 -4
index aa1209b..8ebfae8 100644
@@ -634,7 +634,6 @@ static void rt2400pci_disable_led(struct rt2x00_dev *rt2x00dev)
  */
 static void rt2400pci_link_stats(struct rt2x00_dev *rt2x00dev)
 {
-	int fcs;
 	u32 reg;
 	u8 bbp;
 
@@ -642,9 +641,7 @@ static void rt2400pci_link_stats(struct rt2x00_dev *rt2x00dev)
 	 * Update FCS error count from register.
 	 */
 	rt2x00pci_register_read(rt2x00dev, CNT0, &reg);
-	fcs = rt2x00_get_field32(reg, CNT0_FCS_ERROR);
-	rt2x00dev->link.rx_failed += fcs;
-	rt2x00dev->low_level_stats.dot11FCSErrorCount += fcs;
+	rt2x00dev->link.rx_failed = rt2x00_get_field32(reg, CNT0_FCS_ERROR);
 
 	/*
 	 * Update False CCA count from register.
drivers/net/wireless/rt2500pci.c +1 -4
index 3a1da1f..a5bfb00 100644
@@ -735,16 +735,13 @@ static void rt2500pci_disable_led(struct rt2x00_dev *rt2x00dev)
  */
 static void rt2500pci_link_stats(struct rt2x00_dev *rt2x00dev)
 {
-	int fcs;
 	u32 reg;
 
 	/*
 	 * Update FCS error count from register.
 	 */
 	rt2x00pci_register_read(rt2x00dev, CNT0, &reg);
-	fcs = rt2x00_get_field32(reg, CNT0_FCS_ERROR);
-	rt2x00dev->link.rx_failed += fcs;
-	rt2x00dev->low_level_stats.dot11FCSErrorCount += fcs;
+	rt2x00dev->link.rx_failed = rt2x00_get_field32(reg, CNT0_FCS_ERROR);
 
 	/*
 	 * Update False CCA count from register.
drivers/net/wireless/rt2500usb.c +1 -4
index 71b7bf2..e9f6747 100644
@@ -690,16 +690,13 @@ static void rt2500usb_disable_led(struct rt2x00_dev *rt2x00dev)
  */
 static void rt2500usb_link_stats(struct rt2x00_dev *rt2x00dev)
 {
-	int fcs;
 	u16 reg;
 
 	/*
 	 * Update FCS error count from register.
 	 */
 	rt2500usb_register_read(rt2x00dev, STA_CSR0, &reg);
-	fcs = rt2x00_get_field16(reg, STA_CSR0_FCS_ERROR);
-	rt2x00dev->link.rx_failed += fcs;
-	rt2x00dev->low_level_stats.dot11FCSErrorCount += fcs;
+	rt2x00dev->link.rx_failed = rt2x00_get_field16(reg, STA_CSR0_FCS_ERROR);
 
 	/*
 	 * Update False CCA count from register.
drivers/net/wireless/rt2x00dev.c +12 -10
index 7f3eaf1..f952595 100644
@@ -225,9 +225,21 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
 	    container_of(work, struct rt2x00_dev, link.work.work);
 
 	/*
+	 * Reset statistics.
+	 * This will cause the signal value to be
+	 * based on the statistics of the last second.
+	 */
+	rt2x00dev->link.rx_success = 0;
+	rt2x00dev->link.rx_failed = 0;
+	rt2x00dev->link.tx_success = 0;
+	rt2x00dev->link.tx_failed = 0;
+
+	/*
 	 * Update statistics.
 	 */
 	rt2x00dev->ops->lib->link_stats(rt2x00dev);
+	rt2x00dev->low_level_stats.dot11FCSErrorCount +=
+	    rt2x00dev->link.rx_failed;
 
 	/*
 	 * Only perform the link tuning when Link tuning
@@ -237,16 +249,6 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
 		rt2x00dev->ops->lib->link_tuner(rt2x00dev);
 
 	/*
-	 * Reset statistics.
-	 * This will cause the signal value to be
-	 * based on the statistics of the last second.
-	 */
-	rt2x00dev->link.rx_success = 0;
-	rt2x00dev->link.rx_failed = 0;
-	rt2x00dev->link.tx_success = 0;
-	rt2x00dev->link.tx_failed = 0;
-
-	/*
 	 * Increase tuner counter, and reschedule the next link tuner run.
 	 */
 	rt2x00dev->link.count++;
drivers/net/wireless/rt61pci.c +1 -4
index f592397..8c6c778 100644
@@ -947,16 +947,13 @@ static void rt61pci_activity_led(struct rt2x00_dev *rt2x00dev, int rssi)
  */
 static void rt61pci_link_stats(struct rt2x00_dev *rt2x00dev)
 {
-	int fcs;
 	u32 reg;
 
 	/*
 	 * Update FCS error count from register.
 	 */
 	rt2x00pci_register_read(rt2x00dev, STA_CSR0, &reg);
-	fcs = rt2x00_get_field32(reg, STA_CSR0_FCS_ERROR);
-	rt2x00dev->link.rx_failed += fcs;
-	rt2x00dev->low_level_stats.dot11FCSErrorCount += fcs;
+	rt2x00dev->link.rx_failed = rt2x00_get_field32(reg, STA_CSR0_FCS_ERROR);
 
 	/*
 	 * Update False CCA count from register.
drivers/net/wireless/rt73usb.c +1 -4
index 9f059ce..30d4189 100644
@@ -836,16 +836,13 @@ static void rt73usb_activity_led(struct rt2x00_dev *rt2x00dev, int rssi)
  */
 static void rt73usb_link_stats(struct rt2x00_dev *rt2x00dev)
 {
-	int fcs;
 	u32 reg;
 
 	/*
 	 * Update FCS error count from register.
 	 */
 	rt73usb_register_read(rt2x00dev, STA_CSR0, &reg);
-	fcs = rt2x00_get_field32(reg, STA_CSR0_FCS_ERROR);
-	rt2x00dev->link.rx_failed += fcs;
-	rt2x00dev->low_level_stats.dot11FCSErrorCount += fcs;
+	rt2x00dev->link.rx_failed = rt2x00_get_field32(reg, STA_CSR0_FCS_ERROR);
 
 	/*
 	 * Update False CCA count from register.
Signature · 1 line
1.5.3.rc5
#11 lore raw

PATCH 11/30 rt2x00: Rework RF register handling

In reply to Ivo van Doorn
Quoted 1 line

From bd6c96f98df0e85bf9985bee8df71750e3ec2f20 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:01:58 +0200
Subject: [PATCH 11/30] rt2x00: Rework RF register handling

Move RF registers inside static constant arrays.
This has several benefits:
- We can easily inform rt2x00lib which channels we support
- We don't have to use lots of if/switch statements
- Easy comparison against legacy driver values
- Bug fix for rt73usb: Some chips have 21bit RF values.

---
 drivers/net/wireless/rt2400pci.c |   44 +++---
 drivers/net/wireless/rt2500pci.c |  256 ++++++++++++++++++-----------
 drivers/net/wireless/rt2500usb.c |  266 ++++++++++++++++++-------------
 drivers/net/wireless/rt2x00.h    |    9 +-
 drivers/net/wireless/rt2x00dev.c |   34 ++---
 drivers/net/wireless/rt61pci.c   |  332 ++++++++++++++------------------------
 drivers/net/wireless/rt73usb.c   |  281 +++++++++++++++++---------------
 7 files changed, 619 insertions(+), 603 deletions(-)
drivers/net/wireless/rt2400pci.c +21 -23
index 8ebfae8..7bd975d 100644
@@ -419,28 +419,15 @@ static void rt2400pci_config_phymode(struct rt2x00_dev *rt2x00dev,
 	rt2400pci_config_rate(rt2x00dev, rate->val2);
 }
 
-static void rt2400pci_get_rf_vals(struct rt2x00_dev *rt2x00dev,
-				  const int value, const int channel,
-				  struct rf_reg *reg)
-{
-	reg->rf1 = 0x00022058;
-	reg->rf2 = value;
-	if (rt2x00_rf(&rt2x00dev->chip, RF2420))
-		reg->rf3 = 0x00000111;
-	else
-		reg->rf3 = 0x00000101;
-	reg->rf4 = 0;
-}
-
 static void rt2400pci_config_channel(struct rt2x00_dev *rt2x00dev,
-				     const int value, const int channel)
+				     const int index, const int channel)
 {
-	struct rf_reg reg;
+	struct rf_channel reg;
 
 	/*
 	 * Fill rf_reg structure.
 	 */
-	rt2400pci_get_rf_vals(rt2x00dev, value, channel, &reg);
+	memcpy(&reg, &rt2x00dev->spec.channels[index], sizeof(reg));
 
 	/*
 	 * Switch on tuning bits.
@@ -1434,10 +1421,21 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
  * RF value list for RF2420 & RF2421
  * Supports: 2.4 GHz
  */
-static const u32 rf_vals_bg[] = {
-	0x000c1fda, 0x000c1fee, 0x000c2002, 0x000c2016, 0x000c202a,
-	0x000c203e, 0x000c2052, 0x000c2066, 0x000c207a, 0x000c208e,
-	0x000c20a2, 0x000c20b6, 0x000c20ca, 0x000c20fa
+static const struct rf_channel rf_vals_bg[] = {
+	{ 1,  0x00022058, 0x000c1fda, 0x00000101, 0 },
+	{ 2,  0x00022058, 0x000c1fee, 0x00000101, 0 },
+	{ 3,  0x00022058, 0x000c2002, 0x00000101, 0 },
+	{ 4,  0x00022058, 0x000c2016, 0x00000101, 0 },
+	{ 5,  0x00022058, 0x000c202a, 0x00000101, 0 },
+	{ 6,  0x00022058, 0x000c203e, 0x00000101, 0 },
+	{ 7,  0x00022058, 0x000c2052, 0x00000101, 0 },
+	{ 8,  0x00022058, 0x000c2066, 0x00000101, 0 },
+	{ 9,  0x00022058, 0x000c207a, 0x00000101, 0 },
+	{ 10, 0x00022058, 0x000c208e, 0x00000101, 0 },
+	{ 11, 0x00022058, 0x000c20a2, 0x00000101, 0 },
+	{ 12, 0x00022058, 0x000c20b6, 0x00000101, 0 },
+	{ 13, 0x00022058, 0x000c20ca, 0x00000101, 0 },
+	{ 14, 0x00022058, 0x000c20fa, 0x00000101, 0 },
 };
 
 static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
@@ -1479,12 +1477,12 @@ static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	 */
 	spec->num_modes = 1;
 	spec->num_rates = 4;
-	spec->num_channels = 14;
 	spec->tx_power_a = NULL;
 	spec->tx_power_bg = txpower;
 	spec->tx_power_default = DEFAULT_TXPOWER;
-	spec->chan_val_a = NULL;
-	spec->chan_val_bg = rf_vals_bg;
+
+	spec->num_channels = ARRAY_SIZE(rf_vals_bg);
+	spec->channels = rf_vals_bg;
 }
 
 static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
drivers/net/wireless/rt2500pci.c +157 -99

300 lines not on this page · raw message

drivers/net/wireless/rt2500usb.c +155 -111

311 lines not on this page · raw message

drivers/net/wireless/rt2x00.h +4 -5
index 5c6d7d0..cfd5384 100644
@@ -168,10 +168,10 @@ struct rt2x00_chip {
 };
 
 /*
- * RF register collection structure
- * This structure contains the value for all RF register words.
+ * RF register values that belong to a particular channel.
  */
-struct rf_reg {
+struct rf_channel {
+	int channel;
 	u32 rf1;
 	u32 rf2;
 	u32 rf3;
@@ -346,8 +346,7 @@ struct hw_mode_spec {
 	/*
 	 * Device/chipset specific value.
 	 */
-	const u32 *chan_val_a;
-	const u32 *chan_val_bg;
+	const struct rf_channel *channels;
 };
 
 /*
drivers/net/wireless/rt2x00dev.c +11 -23
index f952595..3671f74 100644
@@ -611,29 +611,17 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
 	/*
 	 * Initialize Channel list.
 	 */
-	for (i = 0; i < 14; i++)
-		rt2x00lib_channel(&channels[i], i + 1,
-				  spec->tx_power_bg[i], spec->chan_val_bg[i]);
-
-	if (spec->num_channels > 14) {
-		for (i = 14; i < spec->num_channels; i++) {
-			if (i < 22)
-				channels[i].chan = 36;
-			else if (i < 33)
-				channels[i].chan = 100;
-			else
-				channels[i].chan = 149;
-			channels[i].chan += ((i - 14) * 4);
-
-			if (spec->tx_power_a)
-				tx_power = spec->tx_power_a[i];
-			else
-				tx_power = spec->tx_power_default;
-
-			rt2x00lib_channel(&channels[i],
-					  channels[i].chan, tx_power,
-					  spec->chan_val_a[i]);
-		}
+	for (i = 0; i < spec->num_channels; i++) {
+		if (spec->channels[i].channel <= 14)
+			tx_power = spec->tx_power_bg[i];
+		else if (spec->tx_power_a)
+			tx_power = spec->tx_power_a[i];
+		else
+			tx_power = spec->tx_power_default;
+
+		rt2x00lib_channel(&channels[i],
+				  spec->channels[i].channel,
+				  tx_power, i);
 	}
 
 	/*
drivers/net/wireless/rt61pci.c +119 -213

382 lines not on this page · raw message

drivers/net/wireless/rt73usb.c +152 -129

340 lines not on this page · raw message

Signature · 1 line
1.5.3.rc5
#12 lore raw

PATCH 12/30 rt2x00: Store firmware in memory

In reply to Ivo van Doorn
Quoted 1 line

From 6d620c9670f54eb0ce06bd771556e4ac413a2c48 Mon Sep 17 00:00:00 2001

From: Mattias Nissler <[email protected]>
Date: Sun, 5 Aug 2007 15:32:38 +0200
Subject: [PATCH 12/30] rt2x00: Store firmware in memory

Because hard disks are likely not yet up when resuming, we cannot load the firmware image from disk then. Work around this problem by keeping the firmware image in memory once it is loaded.

---
 drivers/net/wireless/rt2x00.h         |    6 ++++
 drivers/net/wireless/rt2x00dev.c      |    5 ++++
 drivers/net/wireless/rt2x00firmware.c |   43 +++++++++++++++++++++++++-------
 drivers/net/wireless/rt2x00lib.h      |    4 +++
 4 files changed, 48 insertions(+), 10 deletions(-)
drivers/net/wireless/rt2x00.h +6 -0
index cfd5384..de1365f 100644
@@ -30,6 +30,7 @@
 #include <linux/prefetch.h>
 #include <linux/skbuff.h>
 #include <linux/workqueue.h>
+#include <linux/firmware.h>
 
 #include <net/mac80211.h>
 
@@ -601,6 +602,11 @@ struct rt2x00_dev {
 	struct data_ring *rx;
 	struct data_ring *tx;
 	struct data_ring *bcn;
+
+	/*
+	 * Firmware image.
+	 */
+	const struct firmware *fw;
 };
 
 /*
drivers/net/wireless/rt2x00dev.c +5 -0
index 3671f74..50c604c 100644
@@ -1091,6 +1091,11 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
 	rt2x00lib_remove_hw(rt2x00dev);
 
 	/*
+	 * Free firmware image.
+	 */
+	rt2x00lib_free_firmware(rt2x00dev);
+
+	/*
 	 * Free ring structures.
 	 */
 	rt2x00lib_free_rings(rt2x00dev);
drivers/net/wireless/rt2x00firmware.c +33 -10

66 lines not on this page · raw message

drivers/net/wireless/rt2x00lib.h +4 -0
index 1a28292..1560f73 100644
@@ -59,11 +59,15 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, struct ieee80211_conf *conf)
  */
 #ifdef CONFIG_RT2X00_LIB_FIRMWARE
 int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev);
+void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev);
 #else
 static inline int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev)
 {
 	return 0;
 }
+static inline void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev)
+{
+}
 #endif /* CONFIG_RT2X00_LIB_FIRMWARE */
 
 /*
Signature · 1 line
1.5.3.rc5
#13 lore raw

Re: [PATCH 12/30] rt2x00: Store firmware in memory

drivers/net/wireless/rt2x00firmware.c int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev) · line 121

Quoted 3 lines · On Sunday 19 August 2007 20:25:39 Ivo van Doorn wrote:
drivers/net/wireless/rt2x00firmware.c +3 -0
+void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev)
+{
+	if (rt2x00dev->fw) {

No !=NULL check is needed.

Quoted 4 lines
drivers/net/wireless/rt2x00firmware.c +4 -0
+		release_firmware(rt2x00dev->fw);
+		rt2x00dev->fw = NULL;
+	}
+}
Signature · 1 line
Greetings Michael.
#14 lore raw

Re: [PATCH 12/30] rt2x00: Store firmware in memory

Quoted 6 lines · Michael Buesch

drivers/net/wireless/rt2x00firmware.c int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev) · line 121

Quoted 3 lines · On Sunday 19 August 2007 20:25:39 Ivo van Doorn wrote:
drivers/net/wireless/rt2x00firmware.c +3 -0
+void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev)
+{
+	if (rt2x00dev->fw) {

No !=NULL check is needed.

I'll fix this.

Thanks :)

Ivo

Quoted 5 lines
Quoted 4 lines
drivers/net/wireless/rt2x00firmware.c +4 -0
+		release_firmware(rt2x00dev->fw);
+		rt2x00dev->fw = NULL;
+	}
+}
#15 lore raw

PATCH 13/30 rt2x00: rt2x00_ring_free returns invalid length

In reply to Ivo van Doorn
Quoted 1 line

From 038b4a505c82c91a84caaf7832967ffac2faf93b Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:03:32 +0200
Subject: [PATCH 13/30] rt2x00: rt2x00_ring_free returns invalid length

rt2x00_ring_free returned the incorrect number of available entries because it accidently used ring->stats.len minus
the number of used entries. This always results in 0 available entries, obviously this in turn would lead to problems regarding the TX handling.

We can fix and optimize the code quite simply by
doing the limit - length

---
 drivers/net/wireless/rt2x00ring.h |    4 +---
 1 files changed, 1 insertions(+), 3 deletions(-)
drivers/net/wireless/rt2x00ring.h +1 -3
index 2adc8e5..9c94d06 100644
@@ -219,9 +219,7 @@ static inline int rt2x00_ring_full(struct data_ring *ring)
 
 static inline int rt2x00_ring_free(struct data_ring *ring)
 {
-	if (ring->index_done >= ring->index)
-		return ring->index_done - ring->index;
-	return ring->stats.len - (ring->index - ring->index_done);
+	return ring->stats.limit - ring->stats.len;
 }
 
 /*
Signature · 1 line
1.5.3.rc5
#16 lore raw

PATCH 14/30 Fix off-by-one error in debugfs helpers

In reply to Ivo van Doorn
Quoted 1 line

From 089bfb50f6f9426f1dfd48bfb07455224484b847 Mon Sep 17 00:00:00 2001

From: Luca Tettamanti <[email protected]>
Date: Thu, 9 Aug 2007 21:19:49 +0200
Subject: [PATCH 14/30] Fix off-by-one error in debugfs helpers

Fix an off-by-on error in debugfs code which may lead to read/write past the end of the data.

---
 drivers/net/wireless/rt2x00debug.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00debug.c +2 -2
index d6c4cfe..c7b331c 100644
@@ -127,7 +127,7 @@ static ssize_t rt2x00debug_read_##__name(struct file *file,	\
 	if (*offset)						\
 		return 0;					\
 								\
-	if (intf->offset_##__name > debug->__name.word_count)	\
+	if (intf->offset_##__name >= debug->__name.word_count)	\
 		return -EINVAL;					\
 								\
 	debug->__name.read(intf->rt2x00dev,			\
@@ -160,7 +160,7 @@ static ssize_t rt2x00debug_write_##__name(struct file *file,	\
 	if (!capable(CAP_NET_ADMIN))				\
 		return -EPERM;					\
 								\
-	if (intf->offset_##__name > debug->__name.word_count)	\
+	if (intf->offset_##__name >= debug->__name.word_count)	\
 		return -EINVAL;					\
 								\
 	if (copy_from_user(line, buf, length))			\
Signature · 1 line
1.5.3.rc5
#17 lore raw

PATCH 15/30 rt2x00: Use caching for USB transfers

In reply to Ivo van Doorn
Quoted 1 line

From b75e79133fbff5d1b4cde7fc2ec362ad433c019f Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:07:27 +0200
Subject: [PATCH 15/30] rt2x00: Use caching for USB transfers

The kernel USB layer demands that the buffer argument
to usb_control_msg must point to something allocated using kmalloc. Failure to do so will lead to unexpected results depending on the running architecture.
This will add a cache to rt2x00_dev to be used by rt2x00usb for all data transfers to the host. This will also require some new wrapper functions for easier handling this.
For the rt73usb firmware loader this also means it is better to allocate the memory instead of using a 64byte array, besides that this was a direct attack on the stack size it is also safer.

---
 drivers/net/wireless/rt2500usb.c |   38 +++++++--------
 drivers/net/wireless/rt2x00.h    |    5 ++-
 drivers/net/wireless/rt2x00usb.c |   92 +++++++++++++++++++++++++++++++-------
 drivers/net/wireless/rt2x00usb.h |   60 ++++++++++++++++++++++---
 drivers/net/wireless/rt73usb.c   |   92 +++++++++++++++++++++-----------------
 5 files changed, 202 insertions(+), 85 deletions(-)
drivers/net/wireless/rt2500usb.c +18 -20
index 25d0aec..5e3cdf5 100644
@@ -58,9 +58,9 @@ static inline void rt2500usb_register_read(const struct rt2x00_dev *rt2x00dev,
 					   u16 *value)
 {
 	__le16 reg;
-	rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_READ,
-				 USB_VENDOR_REQUEST_IN, offset, 0x00,
-				 &reg, sizeof(u16), REGISTER_TIMEOUT);
+	rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ,
+				      USB_VENDOR_REQUEST_IN, offset,
+				      &reg, sizeof(u16), REGISTER_TIMEOUT);
 	*value = le16_to_cpu(reg);
 }
 
@@ -69,10 +69,10 @@ static inline void rt2500usb_register_multiread(const struct rt2x00_dev
 						const unsigned int offset,
 						void *value, const u16 length)
 {
-	rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_READ,
-				 USB_VENDOR_REQUEST_IN, offset, 0x00,
-				 value, length,
-				 REGISTER_TIMEOUT * (length / sizeof(u16)));
+	int timeout = REGISTER_TIMEOUT * (length / sizeof(u16));
+	rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ,
+				      USB_VENDOR_REQUEST_IN, offset,
+				      value, length, timeout);
 }
 
 static inline void rt2500usb_register_write(const struct rt2x00_dev *rt2x00dev,
@@ -80,9 +80,9 @@ static inline void rt2500usb_register_write(const struct rt2x00_dev *rt2x00dev,
 					    u16 value)
 {
 	__le16 reg = cpu_to_le16(value);
-	rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE,
-				 USB_VENDOR_REQUEST_OUT, offset, 0x00,
-				 &reg, sizeof(u16), REGISTER_TIMEOUT);
+	rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE,
+				      USB_VENDOR_REQUEST_OUT, offset,
+				      &reg, sizeof(u16), REGISTER_TIMEOUT);
 }
 
 static inline void rt2500usb_register_multiwrite(const struct rt2x00_dev
@@ -90,10 +90,10 @@ static inline void rt2500usb_register_multiwrite(const struct rt2x00_dev
 						 const unsigned int offset,
 						 void *value, const u16 length)
 {
-	rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE,
-				 USB_VENDOR_REQUEST_OUT, offset, 0x00,
-				 value, length,
-				 REGISTER_TIMEOUT * (length / sizeof(u16)));
+	int timeout = REGISTER_TIMEOUT * (length / sizeof(u16));
+	rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE,
+				      USB_VENDOR_REQUEST_OUT, offset,
+				      value, length, timeout);
 }
 
 static u16 rt2500usb_bbp_check(const struct rt2x00_dev *rt2x00dev)
@@ -774,12 +774,10 @@ static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev)
 {
 	u16 reg;
 
-	rt2x00usb_vendor_request(rt2x00dev, USB_DEVICE_MODE,
-				 USB_VENDOR_REQUEST_OUT, 0x0001,
-				 USB_MODE_TEST, NULL, 0, REGISTER_TIMEOUT);
-	rt2x00usb_vendor_request(rt2x00dev, USB_SINGLE_WRITE,
-				 USB_VENDOR_REQUEST_OUT, 0x0308,
-				 0xf0, NULL, 0, REGISTER_TIMEOUT);
+	rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0x0001,
+				    USB_MODE_TEST, REGISTER_TIMEOUT);
+	rt2x00usb_vendor_request_sw(rt2x00dev, USB_SINGLE_WRITE, 0x0308,
+				    0x00f0, REGISTER_TIMEOUT);
 
 	rt2500usb_register_read(rt2x00dev, TXRX_CSR2, &reg);
 	rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX, 1);
drivers/net/wireless/rt2x00.h +4 -1
index de1365f..24ad264 100644
@@ -524,9 +524,12 @@ struct rt2x00_dev {
 	struct hw_mode_spec spec;
 
 	/*
-	 * Base address of device registers (PCI devices only).
+	 * Register pointers
+	 * csr_addr: Base register address. (PCI)
+	 * csr_cache: CSR cache for usb_control_msg. (USB)
 	 */
 	void __iomem *csr_addr;
+	void *csr_cache;
 
 	/*
 	 * Interface configuration.
drivers/net/wireless/rt2x00usb.c +75 -17

171 lines not on this page · raw message

drivers/net/wireless/rt2x00usb.h +54 -6

81 lines not on this page · raw message

drivers/net/wireless/rt73usb.c +51 -41

168 lines not on this page · raw message

Signature · 1 line
1.5.3.rc5
#18 lore raw

PATCH 16/30 rt2x00: Cleanup set_state for rt61 and rt73

In reply to Ivo van Doorn
Quoted 1 line

From 252c0576e50c72fed7a52777b5a4abf962b8ae43 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:08:09 +0200
Subject: [PATCH 16/30] rt2x00: Cleanup set_state for rt61 and rt73

The set_state was doing too much work for rt61 and rt73, the additional registers that were set should be used for Power Saving management and _not_ suspend/resume. Since at the moment we don't support power management we should remove the additional calls.

---
 drivers/net/wireless/rt61pci.c |   12 ------------
 drivers/net/wireless/rt73usb.c |    8 --------
 2 files changed, 0 insertions(+), 20 deletions(-)
drivers/net/wireless/rt61pci.c +0 -12
index d0c2323..1a4957b 100644
@@ -1423,18 +1423,6 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
 	rt2x00_set_field32(&reg, MAC_CSR12_PUT_TO_SLEEP, put_to_sleep);
 	rt2x00pci_register_write(rt2x00dev, MAC_CSR12, reg);
 
-	if (put_to_sleep) {
-		rt2x00pci_register_write(rt2x00dev, SOFT_RESET_CSR, 0x00000005);
-		rt2x00pci_register_write(rt2x00dev, IO_CNTL_CSR, 0x0000001c);
-		rt2x00pci_register_write(rt2x00dev, PCI_USEC_CSR, 0x00000060);
-		rt61pci_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0x00, 0x00);
-	} else {
-		rt2x00pci_register_write(rt2x00dev, SOFT_RESET_CSR, 0x00000007);
-		rt2x00pci_register_write(rt2x00dev, IO_CNTL_CSR, 0x00000018);
-		rt2x00pci_register_write(rt2x00dev, PCI_USEC_CSR, 0x00000020);
-		rt61pci_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0x00, 0x00);
-	}
-
 	/*
 	 * Device is not guaranteed to be in the requested state yet.
 	 * We must wait until the register indicates that the
drivers/net/wireless/rt73usb.c +0 -8
index 0d9c1b9..85dfc58 100644
@@ -1156,19 +1156,11 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
 
 	put_to_sleep = (state != STATE_AWAKE);
 
-	if (!put_to_sleep)
-		rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0x0000,
-					    USB_MODE_WAKEUP, REGISTER_TIMEOUT);
-
 	rt73usb_register_read(rt2x00dev, MAC_CSR12, &reg);
 	rt2x00_set_field32(&reg, MAC_CSR12_FORCE_WAKEUP, !put_to_sleep);
 	rt2x00_set_field32(&reg, MAC_CSR12_PUT_TO_SLEEP, put_to_sleep);
 	rt73usb_register_write(rt2x00dev, MAC_CSR12, reg);
 
-	if (put_to_sleep)
-		rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0x0000,
-					    USB_MODE_SLEEP, REGISTER_TIMEOUT);
-
 	/*
 	 * Device is not guaranteed to be in the requested state yet.
 	 * We must wait until the register indicates that the
Signature · 1 line
1.5.3.rc5
#19 lore raw

PATCH 17/30 rt2x00: Fix register initialization ordering

In reply to Ivo van Doorn
Quoted 1 line

From 34548ad3e92237fb9ce91be9d09a5877f782c321 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:08:29 +0200
Subject: [PATCH 17/30] rt2x00: Fix register initialization ordering

Change the order in which the registers are being initialized to reflect the same order in which the legacy drivers initialize the registers. This should prevent problems caused by incorrect register initialization. Especially the SLEEP/AWAKE state registers are very sensitive to this.

---
 drivers/net/wireless/rt2400pci.c |   44 +++++++++----------
 drivers/net/wireless/rt2500pci.c |   89 ++++++++++++++++++--------------------
 drivers/net/wireless/rt2500usb.c |   17 ++++---
 drivers/net/wireless/rt61pci.c   |   42 ++++++++---------
 drivers/net/wireless/rt73usb.c   |   18 ++++----
 5 files changed, 101 insertions(+), 109 deletions(-)
drivers/net/wireless/rt2400pci.c +21 -23
index 7bd975d..b673d61 100644
@@ -796,11 +796,6 @@ static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev)
 {
 	u32 reg;
 
-	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
-		return -EBUSY;
-
-	rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100);
-
 	rt2x00pci_register_write(rt2x00dev, PSCSR0, 0x00020002);
 	rt2x00pci_register_write(rt2x00dev, PSCSR1, 0x00000002);
 	rt2x00pci_register_write(rt2x00dev, PSCSR2, 0x00023f20);
@@ -819,31 +814,34 @@ static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
 	rt2x00pci_register_write(rt2x00dev, CNT3, 0x3f080000);
 
-	rt2x00pci_register_write(rt2x00dev, MACCSR0, 0x00217223);
-	rt2x00pci_register_write(rt2x00dev, MACCSR1, 0x00235518);
-
-	rt2x00pci_register_read(rt2x00dev, MACCSR2, &reg);
-	rt2x00_set_field32(&reg, MACCSR2_DELAY, 64);
-	rt2x00pci_register_write(rt2x00dev, MACCSR2, reg);
+	rt2x00pci_register_read(rt2x00dev, ARCSR0, &reg);
+	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_DATA0, 133);
+	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_ID0, 134);
+	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_DATA1, 136);
+	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_ID1, 135);
+	rt2x00pci_register_write(rt2x00dev, ARCSR0, reg);
 
 	rt2x00pci_register_read(rt2x00dev, RXCSR3, &reg);
-	/*
-	 * Tx power.
-	 */
-	rt2x00_set_field32(&reg, RXCSR3_BBP_ID0, 3);
+	rt2x00_set_field32(&reg, RXCSR3_BBP_ID0, 3); /* Tx power.*/
 	rt2x00_set_field32(&reg, RXCSR3_BBP_ID0_VALID, 1);
-	/*
-	 * Signal.
-	 */
-	rt2x00_set_field32(&reg, RXCSR3_BBP_ID1, 32);
+	rt2x00_set_field32(&reg, RXCSR3_BBP_ID1, 32); /* Signal */
 	rt2x00_set_field32(&reg, RXCSR3_BBP_ID1_VALID, 1);
-	/*
-	 * Rssi.
-	 */
-	rt2x00_set_field32(&reg, RXCSR3_BBP_ID2, 36);
+	rt2x00_set_field32(&reg, RXCSR3_BBP_ID2, 36); /* Rssi */
 	rt2x00_set_field32(&reg, RXCSR3_BBP_ID2_VALID, 1);
 	rt2x00pci_register_write(rt2x00dev, RXCSR3, reg);
 
+	rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100);
+
+	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
+		return -EBUSY;
+
+	rt2x00pci_register_write(rt2x00dev, MACCSR0, 0x00217223);
+	rt2x00pci_register_write(rt2x00dev, MACCSR1, 0x00235518);
+
+	rt2x00pci_register_read(rt2x00dev, MACCSR2, &reg);
+	rt2x00_set_field32(&reg, MACCSR2_DELAY, 64);
+	rt2x00pci_register_write(rt2x00dev, MACCSR2, reg);
+
 	rt2x00pci_register_read(rt2x00dev, RALINKCSR, &reg);
 	rt2x00_set_field32(&reg, RALINKCSR_AR_BBP_DATA0, 17);
 	rt2x00_set_field32(&reg, RALINKCSR_AR_BBP_ID0, 154);
drivers/net/wireless/rt2500pci.c +42 -47

120 lines not on this page · raw message

drivers/net/wireless/rt2500usb.c +9 -8
index 5e3cdf5..f29dbe9 100644
@@ -788,6 +788,7 @@ static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev)
 
 	rt2500usb_register_write(rt2x00dev, MAC_CSR1, 0x0003);
 	rt2500usb_register_write(rt2x00dev, MAC_CSR1, 0x0000);
+
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR5, 0x8c8d);
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR6, 0x8b8a);
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR7, 0x8687);
@@ -813,27 +814,27 @@ static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev)
 	rt2500usb_register_write(rt2x00dev, MAC_CSR15, 0x01ee);
 	rt2500usb_register_write(rt2x00dev, MAC_CSR16, 0x0000);
 
-	rt2500usb_register_read(rt2x00dev, TXRX_CSR0, &reg);
-	rt2x00_set_field16(&reg, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER);
-	rt2x00_set_field16(&reg, TXRX_CSR0_KEY_ID, 0xff);
-	rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg);
-
 	rt2500usb_register_read(rt2x00dev, MAC_CSR8, &reg);
 	rt2x00_set_field16(&reg, MAC_CSR8_MAX_FRAME_UNIT,
 			   rt2x00dev->rx->data_size);
 	rt2500usb_register_write(rt2x00dev, MAC_CSR8, reg);
 
+	rt2500usb_register_read(rt2x00dev, TXRX_CSR0, &reg);
+	rt2x00_set_field16(&reg, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER);
+	rt2x00_set_field16(&reg, TXRX_CSR0_KEY_ID, 0xff);
+	rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg);
+
 	rt2500usb_register_read(rt2x00dev, MAC_CSR18, &reg);
 	rt2x00_set_field16(&reg, MAC_CSR18_DELAY_AFTER_BEACON, 0x5a);
 	rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
 
+	rt2500usb_register_read(rt2x00dev, PHY_CSR4, &reg);
+	rt2500usb_register_write(rt2x00dev, PHY_CSR4, reg | 0x0001);
+
 	rt2500usb_register_read(rt2x00dev, TXRX_CSR1, &reg);
 	rt2x00_set_field16(&reg, TXRX_CSR1_AUTO_SEQUENCE, 1);
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg);
 
-	rt2500usb_register_read(rt2x00dev, PHY_CSR4, &reg);
-	rt2500usb_register_write(rt2x00dev, PHY_CSR4, reg | 0x0001);
-
 	return 0;
 }
 
drivers/net/wireless/rt61pci.c +20 -22

78 lines not on this page · raw message

drivers/net/wireless/rt73usb.c +9 -9
index 85dfc58..7b1d8e1 100644
@@ -952,11 +952,6 @@ static int rt73usb_init_registers(struct rt2x00_dev *rt2x00dev)
 {
 	u32 reg;
 
-	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
-		return -EBUSY;
-
-	rt73usb_register_write(rt2x00dev, MAC_CSR10, 0x00000718);
-
 	rt73usb_register_read(rt2x00dev, TXRX_CSR0, &reg);
 	rt2x00_set_field32(&reg, TXRX_CSR0_AUTO_TX_SEQ, 1);
 	rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX, 0);
@@ -966,13 +961,18 @@ static int rt73usb_init_registers(struct rt2x00_dev *rt2x00dev)
 	rt73usb_register_write(rt2x00dev, TXRX_CSR1, 0x9eaa9eaf);
 	rt73usb_register_write(rt2x00dev, TXRX_CSR2, 0x8a8b8c8d);
 	rt73usb_register_write(rt2x00dev, TXRX_CSR3, 0x00858687);
-
 	rt73usb_register_write(rt2x00dev, TXRX_CSR7, 0x2e31353b);
 	rt73usb_register_write(rt2x00dev, TXRX_CSR8, 0x2a2a2a2c);
-
 	rt73usb_register_write(rt2x00dev, TXRX_CSR15, 0x0000000f);
 
-	rt73usb_register_write(rt2x00dev, MAC_CSR6, 0x00000fff);
+	rt73usb_register_read(rt2x00dev, MAC_CSR6, &reg);
+	rt2x00_set_field32(&reg, MAC_CSR6_MAX_FRAME_UNIT, 0xfff);
+	rt73usb_register_write(rt2x00dev, MAC_CSR6, reg);
+
+	rt73usb_register_write(rt2x00dev, MAC_CSR10, 0x00000718);
+
+	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))
+		return -EBUSY;
 
 	rt73usb_register_write(rt2x00dev, MAC_CSR13, 0x00007f00);
 
@@ -1016,7 +1016,7 @@ static int rt73usb_init_registers(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Reset MAC and BBP registers.
 	 */
-	reg = 0;
+	rt73usb_register_read(rt2x00dev, MAC_CSR1, &reg);
 	rt2x00_set_field32(&reg, MAC_CSR1_SOFT_RESET, 1);
 	rt2x00_set_field32(&reg, MAC_CSR1_BBP_RESET, 1);
 	rt73usb_register_write(rt2x00dev, MAC_CSR1, reg);
Signature · 1 line
1.5.3.rc5
#20 lore raw

PATCH 18/30 rt2x00: memset descriptor before use

In reply to Ivo van Doorn
Quoted 1 line

From 1273bba4e38352cfe5b15c1c7cad742e41f00a96 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:08:49 +0200
Subject: [PATCH 18/30] rt2x00: memset descriptor before use

For rt2x00usb, when skb_push() is called the descriptor is added in front of the frame. The contents however is random data. This should be correctly cleared to prevent garbage to be send to the device...

---
 drivers/net/wireless/rt2x00usb.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)
drivers/net/wireless/rt2x00usb.c +7 -3
index d832d5f..c763606 100644
@@ -268,7 +268,6 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
 	    interface_to_usbdev(rt2x00dev_usb(rt2x00dev));
 	struct ieee80211_hdr *ieee80211hdr = (struct ieee80211_hdr *)skb->data;
 	struct data_entry *entry = rt2x00_get_data_entry(ring);
-	struct data_desc *txd;
 	u32 length = skb->len;
 
 	if (rt2x00_ring_full(ring)) {
@@ -285,9 +284,14 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
 		return -EINVAL;
 	}
 
+	/*
+	 * Add the descriptor in front of the skb.
+	 */
 	skb_push(skb, rt2x00dev->hw->extra_tx_headroom);
-	txd = (struct data_desc *)skb->data;
-	rt2x00lib_write_tx_desc(rt2x00dev, entry, txd, ieee80211hdr,
+	memset(skb->data, 0x00, rt2x00dev->hw->extra_tx_headroom);
+
+	rt2x00lib_write_tx_desc(rt2x00dev, entry,
+				(struct data_desc *)skb->data, ieee80211hdr,
 				length, control);
 	memcpy(&entry->tx_status.control, control, sizeof(*control));
 	entry->skb = skb;
Signature · 1 line
1.5.3.rc5
#21 lore raw

PATCH 19/30 rt2x00: Remove IEEE80211_HW_WEP_INCLUDE_IV flag

In reply to Ivo van Doorn
Quoted 1 line

From ca00a3af4a65db963b2ca268d4de11276208f8b1 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:10:26 +0200
Subject: [PATCH 19/30] rt2x00: Remove IEEE80211_HW_WEP_INCLUDE_IV flag

The IEEE80211_HW_WEP_INCLUDE_IV flag implies that the device has done arc4 and has passed the rest on to mac80211. Since rt2x00 doesn't perform hardware encryption this flag should not be set.

---
 drivers/net/wireless/rt2400pci.c |    1 -
 drivers/net/wireless/rt2500pci.c |    1 -
 drivers/net/wireless/rt2500usb.c |    1 -
 drivers/net/wireless/rt61pci.c   |    1 -
 drivers/net/wireless/rt73usb.c   |    1 -
 5 files changed, 0 insertions(+), 5 deletions(-)
drivers/net/wireless/rt2400pci.c +0 -1
index b673d61..1e935fd 100644
@@ -1448,7 +1448,6 @@ static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	rt2x00dev->hw->flags =
 	    IEEE80211_HW_HOST_GEN_BEACON |
 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-	    IEEE80211_HW_WEP_INCLUDE_IV |
 	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
 	    IEEE80211_HW_MONITOR_DURING_OPER |
drivers/net/wireless/rt2500pci.c +0 -1
index bfd6426..28b2c73 100644
@@ -1747,7 +1747,6 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	rt2x00dev->hw->flags =
 	    IEEE80211_HW_HOST_GEN_BEACON |
 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-	    IEEE80211_HW_WEP_INCLUDE_IV |
 	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
 	    IEEE80211_HW_MONITOR_DURING_OPER |
drivers/net/wireless/rt2500usb.c +0 -1
index f29dbe9..0c0076c 100644
@@ -1469,7 +1469,6 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
 	    IEEE80211_HW_RX_INCLUDES_FCS |
 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-	    IEEE80211_HW_WEP_INCLUDE_IV |
 	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
 	    IEEE80211_HW_MONITOR_DURING_OPER |
drivers/net/wireless/rt61pci.c +0 -1
index 47a915d..a6fcef7 100644
@@ -2112,7 +2112,6 @@ static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	rt2x00dev->hw->flags =
 	    IEEE80211_HW_HOST_GEN_BEACON |
 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-	    IEEE80211_HW_WEP_INCLUDE_IV |
 	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
 	    IEEE80211_HW_MONITOR_DURING_OPER |
drivers/net/wireless/rt73usb.c +0 -1
index 7b1d8e1..98d3acc 100644
@@ -1703,7 +1703,6 @@ static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 	rt2x00dev->hw->flags =
 	    IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |
 	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-	    IEEE80211_HW_WEP_INCLUDE_IV |
 	    IEEE80211_HW_DATA_NULLFUNC_ACK |
 	    IEEE80211_HW_NO_TKIP_WMM_HWACCEL |
 	    IEEE80211_HW_MONITOR_DURING_OPER |
Signature · 1 line
1.5.3.rc5
#22 lore raw

PATCH 20/30 rt2x00: Cleanup TXD flags

In reply to Ivo van Doorn
Quoted 1 line

From c46e24be398993af9bb4ad153f5f98dd42f86cd3 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:19:21 +0200
Subject: [PATCH 20/30] rt2x00: Cleanup TXD flags

Add a new TXD flag to indicate if this frame is part of the same burst series (CTS/RTS + Fragments).

Also remove the TXD_ACK flag since we can use the control->flags variable directly. So no point in copying flags.

And lastly fix the check for the NEW_SEQ bit in rt2500usb, the check for the flag was not converted to a boolean causing the value always to be set to 0.

---
 drivers/net/wireless/rt2400pci.c  |    2 +-
 drivers/net/wireless/rt2500pci.c  |    2 +-
 drivers/net/wireless/rt2500usb.c  |    4 ++--
 drivers/net/wireless/rt2x00dev.c  |   11 ++++-------
 drivers/net/wireless/rt2x00ring.h |    2 +-
 drivers/net/wireless/rt61pci.c    |    4 +++-
 drivers/net/wireless/rt73usb.c    |    6 +++++-
 7 files changed, 17 insertions(+), 14 deletions(-)
drivers/net/wireless/rt2400pci.c +1 -1
index 1e935fd..e5622d6 100644
@@ -1147,7 +1147,7 @@ static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_MORE_FRAG,
 			   test_bit(ENTRY_TXD_MORE_FRAG, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_ACK,
-			   test_bit(ENTRY_TXD_REQ_ACK, &entry->flags));
+			   !(control->flags & IEEE80211_TXCTL_NO_ACK));
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_RTS,
drivers/net/wireless/rt2500pci.c +1 -1
index 28b2c73..bfcedfd 100644
@@ -1274,7 +1274,7 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_MORE_FRAG,
 			   test_bit(ENTRY_TXD_MORE_FRAG, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_ACK,
-			   test_bit(ENTRY_TXD_REQ_ACK, &entry->flags));
+			   !(control->flags & IEEE80211_TXCTL_NO_ACK));
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
drivers/net/wireless/rt2500usb.c +2 -2
index 0c0076c..9670330 100644
@@ -1066,13 +1066,13 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_MORE_FRAG,
 			   test_bit(ENTRY_TXD_MORE_FRAG, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_ACK,
-			   test_bit(ENTRY_TXD_REQ_ACK, &entry->flags));
+			   !(control->flags & IEEE80211_TXCTL_NO_ACK));
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
 			   test_bit(ENTRY_TXD_OFDM_RATE, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_NEW_SEQ,
-			   control->flags & IEEE80211_TXCTL_FIRST_FRAGMENT);
+			   !!(control->flags & IEEE80211_TXCTL_FIRST_FRAGMENT));
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
 	rt2x00_set_field32(&word, TXD_W0_CIPHER, CIPHER_NONE);
drivers/net/wireless/rt2x00dev.c +4 -7
index 50c604c..36b522b 100644
@@ -439,6 +439,7 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	 * Check if this is a RTS/CTS frame
 	 */
 	if (is_rts_frame(frame_control) || is_cts_frame(frame_control)) {
+		__set_bit(ENTRY_TXD_BURST, &entry->flags);
 		if (is_rts_frame(frame_control))
 			__set_bit(ENTRY_TXD_RTS_FRAME, &entry->flags);
 		if (control->rts_cts_rate)
@@ -454,8 +455,10 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	/*
 	 * Check if more fragments are pending
 	 */
-	if (ieee80211_get_morefrag(ieee80211hdr))
+	if (ieee80211_get_morefrag(ieee80211hdr)) {
+		__set_bit(ENTRY_TXD_BURST, &entry->flags);
 		__set_bit(ENTRY_TXD_MORE_FRAG, &entry->flags);
+	}
 
 	/*
 	 * Beacons and probe responses require the tsf timestamp
@@ -466,12 +469,6 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 		__set_bit(ENTRY_TXD_REQ_TIMESTAMP, &entry->flags);
 
 	/*
-	 * Check if ACK is required
-	 */
-	if (!(control->flags & IEEE80211_TXCTL_NO_ACK))
-		__set_bit(ENTRY_TXD_REQ_ACK, &entry->flags);
-
-	/*
 	 * Determine with what IFS priority this frame should be send.
 	 * Set ifs to IFS_SIFS when the this is not the first fragment,
 	 * or this fragment came after RTS/CTS.
drivers/net/wireless/rt2x00ring.h +1 -1
index 9c94d06..143ad6d 100644
@@ -76,7 +76,7 @@ struct data_entry {
 #define ENTRY_TXD_OFDM_RATE	4
 #define ENTRY_TXD_MORE_FRAG	5
 #define ENTRY_TXD_REQ_TIMESTAMP	6
-#define ENTRY_TXD_REQ_ACK	7
+#define ENTRY_TXD_BURST		7
 
 	/*
 	 * Ring we belong to.
drivers/net/wireless/rt61pci.c +3 -1
index a6fcef7..e179702 100644
@@ -1519,7 +1519,7 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_MORE_FRAG,
 			   test_bit(ENTRY_TXD_MORE_FRAG, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_ACK,
-			   test_bit(ENTRY_TXD_REQ_ACK, &entry->flags));
+			   !(control->flags & IEEE80211_TXCTL_NO_ACK));
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
@@ -1528,6 +1528,8 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 0);
 	rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
+	rt2x00_set_field32(&word, TXD_W0_BURST,
+			   test_bit(ENTRY_TXD_BURST, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
 	rt2x00_desc_write(txd, 0, word);
 }
drivers/net/wireless/rt73usb.c +5 -1
index 98d3acc..1e8b88e 100644
@@ -1250,11 +1250,13 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_desc_write(txd, 5, word);
 
 	rt2x00_desc_read(txd, 0, &word);
+	rt2x00_set_field32(&word, TXD_W0_BURST,
+			   test_bit(ENTRY_TXD_BURST, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_VALID, 1);
 	rt2x00_set_field32(&word, TXD_W0_MORE_FRAG,
 			   test_bit(ENTRY_TXD_MORE_FRAG, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_ACK,
-			   test_bit(ENTRY_TXD_REQ_ACK, &entry->flags));
+			   !(control->flags & IEEE80211_TXCTL_NO_ACK));
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
@@ -1263,6 +1265,8 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 0);
 	rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
+	rt2x00_set_field32(&word, TXD_W0_BURST2,
+			   test_bit(ENTRY_TXD_BURST, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
 	rt2x00_desc_write(txd, 0, word);
 }
Signature · 1 line
1.5.3.rc5
#23 lore raw

PATCH 21/30 rt2x00: Add byte-ordering annotation for MAC and BSSID

In reply to Ivo van Doorn
Quoted 1 line

From 3194744aba3738ec948c338ed488b4b4639063b9 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:22:01 +0200
Subject: [PATCH 21/30] rt2x00: Add byte-ordering annotation for MAC and BSSID

By adding byte-ordering annotation for the temporary register values for MAC and BSSID writing we enhance typesafety and uncover a bug:
When rt73usb and rt61 touch the MAC/BSSID and treat it as a register they need to perform byteordering to prevent the bytes to get mixed up.

---
 drivers/net/wireless/rt2400pci.c |    4 ++--
 drivers/net/wireless/rt2500pci.c |    4 ++--
 drivers/net/wireless/rt2500usb.c |    4 ++--
 drivers/net/wireless/rt61pci.c   |   14 ++++++++++----
 drivers/net/wireless/rt73usb.c   |   14 ++++++++++----
 5 files changed, 26 insertions(+), 14 deletions(-)
drivers/net/wireless/rt2400pci.c +2 -2
index e5622d6..ffd41a6 100644
@@ -251,7 +251,7 @@ static int rt2400pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
  */
 static void rt2400pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 {
-	u32 reg[2];
+	__le32 reg[2];
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, addr, ETH_ALEN);
@@ -265,7 +265,7 @@ static void rt2400pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 
 static void rt2400pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 {
-	u32 reg[2];
+	__le32 reg[2];
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, bssid, ETH_ALEN);
drivers/net/wireless/rt2500pci.c +2 -2
index bfcedfd..fce91ed 100644
@@ -251,7 +251,7 @@ static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
  */
 static void rt2500pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 {
-	u32 reg[2];
+	__le32 reg[2];
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, addr, ETH_ALEN);
@@ -265,7 +265,7 @@ static void rt2500pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 
 static void rt2500pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 {
-	u32 reg[2];
+	__le32 reg[2];
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, bssid, ETH_ALEN);
drivers/net/wireless/rt2500usb.c +2 -2
index 9670330..9ece4af 100644
@@ -256,7 +256,7 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = {
  */
 static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 {
-	u16 reg[3];
+	__le16 reg[3];
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, addr, ETH_ALEN);
@@ -270,7 +270,7 @@ static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 
 static void rt2500usb_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 {
-	u16 reg[3];
+	__le16 reg[3];
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, bssid, ETH_ALEN);
drivers/net/wireless/rt61pci.c +10 -4
index e179702..0e7a528 100644
@@ -276,12 +276,15 @@ static int rt61pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
  */
 static void rt61pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 {
-	u32 reg[2];
+	__le32 reg[2];
+	u32 tmp;
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, addr, ETH_ALEN);
 
-	rt2x00_set_field32(&reg[1], MAC_CSR3_UNICAST_TO_ME_MASK, 0xff);
+	tmp = le32_to_cpu(reg[1]);
+	rt2x00_set_field32(&tmp, MAC_CSR3_UNICAST_TO_ME_MASK, 0xff);
+	reg[1] = cpu_to_le32(tmp);
 
 	/*
 	 * The MAC address is passed to us as an array of bytes,
@@ -292,12 +295,15 @@ static void rt61pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 
 static void rt61pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 {
-	u32 reg[2];
+	__le32 reg[2];
+	u32 tmp;
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, bssid, ETH_ALEN);
 
-	rt2x00_set_field32(&reg[1], MAC_CSR5_BSS_ID_MASK, 3);
+	tmp = le32_to_cpu(reg[1]);
+	rt2x00_set_field32(&tmp, MAC_CSR5_BSS_ID_MASK, 3);
+	reg[1] = cpu_to_le32(tmp);
 
 	/*
 	 * The BSSID is passed to us as an array of bytes,
drivers/net/wireless/rt73usb.c +10 -4
index 1e8b88e..057e5a0 100644
@@ -257,12 +257,15 @@ static const struct rt2x00debug rt73usb_rt2x00debug = {
  */
 static void rt73usb_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 {
-	u32 reg[2];
+	__le32 reg[2];
+	u32 tmp;
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, addr, ETH_ALEN);
 
-	rt2x00_set_field32(&reg[1], MAC_CSR3_UNICAST_TO_ME_MASK, 0xff);
+	tmp = le32_to_cpu(reg[1]);
+	rt2x00_set_field32(&tmp, MAC_CSR3_UNICAST_TO_ME_MASK, 0xff);
+	reg[1] = cpu_to_le32(tmp);
 
 	/*
 	 * The MAC address is passed to us as an array of bytes,
@@ -273,12 +276,15 @@ static void rt73usb_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
 
 static void rt73usb_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 {
-	u32 reg[2];
+	__le32 reg[2];
+	u32 tmp;
 
 	memset(&reg, 0, sizeof(reg));
 	memcpy(&reg, bssid, ETH_ALEN);
 
-	rt2x00_set_field32(&reg[1], MAC_CSR5_BSS_ID_MASK, 3);
+	tmp = le32_to_cpu(reg[1]);
+	rt2x00_set_field32(&tmp, MAC_CSR5_BSS_ID_MASK, 3);
+	reg[1] = cpu_to_le32(tmp);
 
 	/*
 	 * The BSSID is passed to us as an array of bytes,
Signature · 1 line
1.5.3.rc5
#24 lore raw

PATCH 22/30 rt2x00: Correctly set TXD retry flag

In reply to Ivo van Doorn
Quoted 1 line

From 0bb0e744139fd77b627cca3faf82897914d6dae9 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 13:25:26 +0200
Subject: [PATCH 22/30] rt2x00: Correctly set TXD retry flag

Check for the IEEE80211_TXCTL_LONG_RETRY_LIMIT flag to determine the correct RETRY mode.
Only rt2500usb is capable of setting the exact number of maximum retries. All other chipsets can only set the LONG or SHORT retry mode.

---
 drivers/net/wireless/rt2400pci.c |    3 ++-
 drivers/net/wireless/rt2500pci.c |    3 ++-
 drivers/net/wireless/rt61pci.c   |    3 ++-
 drivers/net/wireless/rt73usb.c   |    3 ++-
 4 files changed, 8 insertions(+), 4 deletions(-)
drivers/net/wireless/rt2400pci.c +2 -1
index ffd41a6..b851571 100644
@@ -1153,7 +1153,8 @@ static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_RTS,
 			   test_bit(ENTRY_TXD_RTS_FRAME, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
-	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 0);
+	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
+			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_desc_write(txd, 0, word);
 }
 
drivers/net/wireless/rt2500pci.c +2 -1
index fce91ed..1000525 100644
@@ -1281,7 +1281,8 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 			   test_bit(ENTRY_TXD_OFDM_RATE, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_CIPHER_OWNER, 1);
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
-	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 0);
+	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
+			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
 	rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
 	rt2x00_desc_write(txd, 0, word);
drivers/net/wireless/rt61pci.c +2 -1
index 0e7a528..efa6c25 100644
@@ -1531,7 +1531,8 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
 			   test_bit(ENTRY_TXD_OFDM_RATE, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
-	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 0);
+	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
+			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
 	rt2x00_set_field32(&word, TXD_W0_BURST,
drivers/net/wireless/rt73usb.c +2 -1
index 057e5a0..9e8c049 100644
@@ -1268,7 +1268,8 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
 			   test_bit(ENTRY_TXD_OFDM_RATE, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
-	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 0);
+	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
+			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
 	rt2x00_set_field32(&word, TXD_W0_BURST2,
Signature · 1 line
1.5.3.rc5
#25 lore raw

PATCH 23/30 rt2x00: Move rt2x00 files into rt2x00 folder

In reply to Ivo van Doorn
Quoted 1 line

From 0ad22000ea988cd69bccaa49823163e5658dd293 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 14:03:15 +0200
Subject: [PATCH 23/30] rt2x00: Move rt2x00 files into rt2x00 folder

rt2x00 covers quite a lot of files (at the moment 25 but more will be added with new drivers), to properly group them together and making management of the files easier they should be put into a new rt2x00 folder.

---
Patch trimmed, Only Makefile and Kconfig difference has been added. All other files have been moved (without changes) using:
mkdir drivers/net/wireless/rt2x00

git mv drivers/net/wireless/rt2400pci.c drivers/net/wireless/rt2x00/rt2400pci.c git mv drivers/net/wireless/rt2400pci.h drivers/net/wireless/rt2x00/rt2400pci.h git mv drivers/net/wireless/rt2500pci.c drivers/net/wireless/rt2x00/rt2500pci.c git mv drivers/net/wireless/rt2500pci.h drivers/net/wireless/rt2x00/rt2500pci.h git mv drivers/net/wireless/rt2500usb.c drivers/net/wireless/rt2x00/rt2500usb.c git mv drivers/net/wireless/rt2500usb.h drivers/net/wireless/rt2x00/rt2500usb.h git mv drivers/net/wireless/rt2x00.h drivers/net/wireless/rt2x00/rt2x00.h git mv drivers/net/wireless/rt2x00config.c drivers/net/wireless/rt2x00/rt2x00config.c git mv drivers/net/wireless/rt2x00debug.c drivers/net/wireless/rt2x00/rt2x00debug.c git mv drivers/net/wireless/rt2x00debug.h drivers/net/wireless/rt2x00/rt2x00debug.h git mv drivers/net/wireless/rt2x00dev.c drivers/net/wireless/rt2x00/rt2x00dev.c git mv drivers/net/wireless/rt2x00firmware.c drivers/net/wireless/rt2x00/rt2x00firmware.c git mv drivers/net/wireless/rt2x00lib.h drivers/net/wireless/rt2x00/rt2x00lib.h git mv drivers/net/wireless/rt2x00mac.c drivers/net/wireless/rt2x00/rt2x00mac.c git mv drivers/net/wireless/rt2x00pci.c drivers/net/wireless/rt2x00/rt2x00pci.c git mv drivers/net/wireless/rt2x00pci.h drivers/net/wireless/rt2x00/rt2x00pci.h git mv drivers/net/wireless/rt2x00reg.h drivers/net/wireless/rt2x00/rt2x00reg.h git mv drivers/net/wireless/rt2x00rfkill.c drivers/net/wireless/rt2x00/rt2x00rfkill.c git mv drivers/net/wireless/rt2x00ring.h drivers/net/wireless/rt2x00/rt2x00ring.h git mv drivers/net/wireless/rt2x00usb.c drivers/net/wireless/rt2x00/rt2x00usb.c git mv drivers/net/wireless/rt2x00usb.h drivers/net/wireless/rt2x00/rt2x00usb.h git mv drivers/net/wireless/rt61pci.c drivers/net/wireless/rt2x00/rt61pci.c git mv drivers/net/wireless/rt61pci.h drivers/net/wireless/rt2x00/rt61pci.h git mv drivers/net/wireless/rt73usb.c drivers/net/wireless/rt2x00/rt73usb.c git mv drivers/net/wireless/rt73usb.h drivers/net/wireless/rt2x00/rt73usb.h

 drivers/net/wireless/Kconfig                 |  131 +--
 drivers/net/wireless/Makefile                |   23 +-
 drivers/net/wireless/rt2400pci.c             | 1683 ------------------
 drivers/net/wireless/rt2400pci.h             |  943 -----------
 drivers/net/wireless/rt2500pci.c             | 1975 ----------------------
 drivers/net/wireless/rt2500pci.h             | 1218 -------------
 drivers/net/wireless/rt2500usb.c             | 1687 ------------------
 drivers/net/wireless/rt2500usb.h             |  767 ---------
 drivers/net/wireless/rt2x00.h                |  788 ---------
 drivers/net/wireless/rt2x00/Kconfig          |  130 ++
 drivers/net/wireless/rt2x00/Makefile         |   22 +
 drivers/net/wireless/rt2x00/rt2400pci.c      | 1683 ++++++++++++++++++
 drivers/net/wireless/rt2x00/rt2400pci.h      |  943 +++++++++++
 drivers/net/wireless/rt2x00/rt2500pci.c      | 1975 ++++++++++++++++++++++
 drivers/net/wireless/rt2x00/rt2500pci.h      | 1218 +++++++++++++
 drivers/net/wireless/rt2x00/rt2500usb.c      | 1687 ++++++++++++++++++
 drivers/net/wireless/rt2x00/rt2500usb.h      |  767 +++++++++
 drivers/net/wireless/rt2x00/rt2x00.h         |  788 +++++++++
 drivers/net/wireless/rt2x00/rt2x00config.c   |  165 ++
 drivers/net/wireless/rt2x00/rt2x00debug.c    |  328 ++++
 drivers/net/wireless/rt2x00/rt2x00debug.h    |   57 +
 drivers/net/wireless/rt2x00/rt2x00dev.c      | 1153 +++++++++++++
 drivers/net/wireless/rt2x00/rt2x00firmware.c |  126 ++
 drivers/net/wireless/rt2x00/rt2x00lib.h      |  124 ++
 drivers/net/wireless/rt2x00/rt2x00mac.c      |  418 +++++
 drivers/net/wireless/rt2x00/rt2x00pci.c      |  512 ++++++
 drivers/net/wireless/rt2x00/rt2x00pci.h      |  124 ++
 drivers/net/wireless/rt2x00/rt2x00reg.h      |  270 +++
 drivers/net/wireless/rt2x00/rt2x00rfkill.c   |  146 ++
 drivers/net/wireless/rt2x00/rt2x00ring.h     |  240 +++
 drivers/net/wireless/rt2x00/rt2x00usb.c      |  724 ++++++++
 drivers/net/wireless/rt2x00/rt2x00usb.h      |  183 ++
 drivers/net/wireless/rt2x00/rt61pci.c        | 2348 ++++++++++++++++++++++++++
 drivers/net/wireless/rt2x00/rt61pci.h        | 1382 +++++++++++++++
 drivers/net/wireless/rt2x00/rt73usb.c        | 2002 ++++++++++++++++++++++
 drivers/net/wireless/rt2x00/rt73usb.h        |  967 +++++++++++
 drivers/net/wireless/rt2x00config.c          |  165 --
 drivers/net/wireless/rt2x00debug.c           |  328 ----
 drivers/net/wireless/rt2x00debug.h           |   57 -
 drivers/net/wireless/rt2x00dev.c             | 1153 -------------
 drivers/net/wireless/rt2x00firmware.c        |  126 --
 drivers/net/wireless/rt2x00lib.h             |  124 --
 drivers/net/wireless/rt2x00mac.c             |  418 -----
 drivers/net/wireless/rt2x00pci.c             |  512 ------
 drivers/net/wireless/rt2x00pci.h             |  124 --
 drivers/net/wireless/rt2x00reg.h             |  270 ---
 drivers/net/wireless/rt2x00rfkill.c          |  146 --
 drivers/net/wireless/rt2x00ring.h            |  240 ---
 drivers/net/wireless/rt2x00usb.c             |  724 --------
 drivers/net/wireless/rt2x00usb.h             |  183 --
 drivers/net/wireless/rt61pci.c               | 2348 --------------------------
 drivers/net/wireless/rt61pci.h               | 1382 ---------------
 drivers/net/wireless/rt73usb.c               | 2002 ----------------------
 drivers/net/wireless/rt73usb.h               |  967 -----------
 54 files changed, 20484 insertions(+), 20482 deletions(-)
 delete mode 100644 drivers/net/wireless/rt2400pci.c
 delete mode 100644 drivers/net/wireless/rt2400pci.h
 delete mode 100644 drivers/net/wireless/rt2500pci.c
 delete mode 100644 drivers/net/wireless/rt2500pci.h
 delete mode 100644 drivers/net/wireless/rt2500usb.c
 delete mode 100644 drivers/net/wireless/rt2500usb.h
 delete mode 100644 drivers/net/wireless/rt2x00.h
 create mode 100644 drivers/net/wireless/rt2x00/Kconfig
 create mode 100644 drivers/net/wireless/rt2x00/Makefile
 create mode 100644 drivers/net/wireless/rt2x00/rt2400pci.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2400pci.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2500pci.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2500pci.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2500usb.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2500usb.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00config.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00debug.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00debug.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00dev.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00firmware.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00lib.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00mac.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00pci.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00pci.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00reg.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00rfkill.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00ring.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00usb.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00usb.h
 create mode 100644 drivers/net/wireless/rt2x00/rt61pci.c
 create mode 100644 drivers/net/wireless/rt2x00/rt61pci.h
 create mode 100644 drivers/net/wireless/rt2x00/rt73usb.c
 create mode 100644 drivers/net/wireless/rt2x00/rt73usb.h
 delete mode 100644 drivers/net/wireless/rt2x00config.c
 delete mode 100644 drivers/net/wireless/rt2x00debug.c
 delete mode 100644 drivers/net/wireless/rt2x00debug.h
 delete mode 100644 drivers/net/wireless/rt2x00dev.c
 delete mode 100644 drivers/net/wireless/rt2x00firmware.c
 delete mode 100644 drivers/net/wireless/rt2x00lib.h
 delete mode 100644 drivers/net/wireless/rt2x00mac.c
 delete mode 100644 drivers/net/wireless/rt2x00pci.c
 delete mode 100644 drivers/net/wireless/rt2x00pci.h
 delete mode 100644 drivers/net/wireless/rt2x00reg.h
 delete mode 100644 drivers/net/wireless/rt2x00rfkill.c
 delete mode 100644 drivers/net/wireless/rt2x00ring.h
 delete mode 100644 drivers/net/wireless/rt2x00usb.c
 delete mode 100644 drivers/net/wireless/rt2x00usb.h
 delete mode 100644 drivers/net/wireless/rt61pci.c
 delete mode 100644 drivers/net/wireless/rt61pci.h
 delete mode 100644 drivers/net/wireless/rt73usb.c
 delete mode 100644 drivers/net/wireless/rt73usb.h
drivers/net/wireless/Kconfig +1 -130
index 366263e..dee7a4f 100644
@@ -589,136 +589,6 @@ config P54_PCI
 	tristate "Prism54 PCI support"
 	depends on P54_COMMON && PCI
 
-config RT2X00
-	tristate "Ralink driver support"
-	depends on MAC80211 && WLAN_80211 && EXPERIMENTAL
-	---help---
-	  This will enable the experimental support for the Ralink drivers,
-	  developed in the rt2x00 project <http://rt2x00.serialmonkey.com>.
-
-	  These drivers will make use of the Devicescape ieee80211 stack.
-
-	  When building one of the individual drivers, the rt2x00 library
-	  will also be created. That library (when the driver is built as
-	  a module) will be called "rt2x00lib.ko".
-
-config RT2X00_LIB
-	tristate
-	depends on RT2X00
-
-config RT2X00_LIB_PCI
-	tristate
-	depends on RT2X00
-	select RT2X00_LIB
-
-config RT2X00_LIB_USB
-	tristate
-	depends on RT2X00
-	select RT2X00_LIB
-
-config RT2X00_LIB_FIRMWARE
-	boolean
-	depends on RT2X00_LIB
-	select CRC_ITU_T
-	select FW_LOADER
-
-config RT2X00_LIB_RFKILL
-	boolean
-	depends on RT2X00_LIB
-	select RFKILL
-	select INPUT_POLLDEV
-
-config RT2400PCI
-	tristate "Ralink rt2400 pci/pcmcia support"
-	depends on RT2X00 && PCI
-	select RT2X00_LIB_PCI
-	select EEPROM_93CX6
-	---help---
-	  This is an experimental driver for the Ralink rt2400 wireless chip.
-
-	  When compiled as a module, this driver will be called "rt2400pci.ko".
-
-config RT2400PCI_RFKILL
-	bool "RT2400 rfkill support"
-	depends on RT2400PCI
-	select RT2X00_LIB_RFKILL
-	---help---
-	  This adds support for integrated rt2400 devices that feature a
-	  hardware button to control the radio state.
-	  This feature depends on the RF switch subsystem rfkill.
-
-config RT2500PCI
-	tristate "Ralink rt2500 pci/pcmcia support"
-	depends on RT2X00 && PCI
-	select RT2X00_LIB_PCI
-	select EEPROM_93CX6
-	---help---
-	  This is an experimental driver for the Ralink rt2500 wireless chip.
-
-	  When compiled as a module, this driver will be called "rt2500pci.ko".
-
-config RT2500PCI_RFKILL
-	bool "RT2500 rfkill support"
-	depends on RT2500PCI
-	select RT2X00_LIB_RFKILL
-	---help---
-	  This adds support for integrated rt2500 devices that feature a
-	  hardware button to control the radio state.
-	  This feature depends on the RF switch subsystem rfkill.
-
-config RT61PCI
-	tristate "Ralink rt61 pci/pcmcia support"
-	depends on RT2X00 && PCI
-	select RT2X00_LIB_PCI
-	select RT2X00_LIB_FIRMWARE
-	select EEPROM_93CX6
-	---help---
-	  This is an experimental driver for the Ralink rt61 wireless chip.
-
-	  When compiled as a module, this driver will be called "rt61pci.ko".
-
-config RT61PCI_RFKILL
-	bool "RT61 rfkill support"
-	depends on RT61PCI
-	select RT2X00_LIB_RFKILL
-	---help---
-	  This adds support for integrated rt61 devices that feature a
-	  hardware button to control the radio state.
-	  This feature depends on the RF switch subsystem rfkill.
-
-config RT2500USB
-	tristate "Ralink rt2500 usb support"
-	depends on RT2X00 && USB
-	select RT2X00_LIB_USB
-	---help---
-	  This is an experimental driver for the Ralink rt2500 wireless chip.
-
-	  When compiled as a module, this driver will be called "rt2500usb.ko".
-
-config RT73USB
-	tristate "Ralink rt73 usb support"
-	depends on RT2X00 && USB
-	select RT2X00_LIB_USB
-	select RT2X00_LIB_FIRMWARE
-	---help---
-	  This is an experimental driver for the Ralink rt73 wireless chip.
-
-	  When compiled as a module, this driver will be called "rt73usb.ko".
-
-config RT2X00_LIB_DEBUGFS
-	bool "Ralink debugfs support"
-	depends on RT2X00_LIB && MAC80211_DEBUGFS
-	---help---
-	  Enable creation of debugfs files for the rt2x00 drivers.
-	  These debugfs files support both reading and writing of the
-	  most important register types of the rt2x00 devices.
-
-config RT2X00_DEBUG
-	bool "Ralink debug output"
-	depends on RT2X00_LIB
-	---help---
-	  Enable debugging output for all rt2x00 modules
-
 config IWLWIFI
 	bool "Intel Wireless WiFi Link Drivers"
 	depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
@@ -853,5 +723,6 @@ source "drivers/net/wireless/bcm43xx/Kconfig"
 source "drivers/net/wireless/b43/Kconfig"
 source "drivers/net/wireless/zd1211rw/Kconfig"
 source "drivers/net/wireless/zd1211rw-mac80211/Kconfig"
+source "drivers/net/wireless/rt2x00/Kconfig"
 
 endmenu
drivers/net/wireless/Makefile +1 -22
index b3427bb..e28b067 100644
@@ -56,28 +56,7 @@ obj-$(CONFIG_P54_COMMON)	+= p54common.o
 obj-$(CONFIG_P54_USB)		+= p54usb.o
 obj-$(CONFIG_P54_PCI)		+= p54pci.o
 
-rt2x00lib-objs := rt2x00dev.o rt2x00mac.o rt2x00config.o
-
-ifeq ($(CONFIG_RT2X00_LIB_DEBUGFS),y)
-	rt2x00lib-objs += rt2x00debug.o
-endif
-
-ifeq ($(CONFIG_RT2X00_LIB_RFKILL),y)
-	rt2x00lib-objs += rt2x00rfkill.o
-endif
-
-ifeq ($(CONFIG_RT2X00_LIB_FIRMWARE),y)
-	rt2x00lib-objs += rt2x00firmware.o
-endif
-
-obj-$(CONFIG_RT2X00_LIB)	+= rt2x00lib.o
-obj-$(CONFIG_RT2X00_LIB_PCI)	+= rt2x00pci.o
-obj-$(CONFIG_RT2X00_LIB_USB)	+= rt2x00usb.o
-obj-$(CONFIG_RT2400PCI)		+= rt2400pci.o
-obj-$(CONFIG_RT2500PCI)		+= rt2500pci.o
-obj-$(CONFIG_RT61PCI)		+= rt61pci.o
-obj-$(CONFIG_RT2500USB)		+= rt2500usb.o
-obj-$(CONFIG_RT73USB)		+= rt73usb.o
+obj-$(CONFIG_RT2X00)		+= rt2x00/
 
 # NOTE:  We use common code from iwl-base.c to build driver
 # specific binaries based on the #define IWL -- the target
drivers/net/wireless/rt2x00/Kconfig new file +130 -0

130 lines not on this page · raw message

drivers/net/wireless/rt2x00/Makefile new file +22 -0
new file mode 100644
index 0000000..30d654a
@@ -0,0 +1,22 @@
+rt2x00lib-objs := rt2x00dev.o rt2x00mac.o rt2x00config.o
+
+ifeq ($(CONFIG_RT2X00_LIB_DEBUGFS),y)
+	rt2x00lib-objs += rt2x00debug.o
+endif
+
+ifeq ($(CONFIG_RT2X00_LIB_RFKILL),y)
+	rt2x00lib-objs += rt2x00rfkill.o
+endif
+
+ifeq ($(CONFIG_RT2X00_LIB_FIRMWARE),y)
+	rt2x00lib-objs += rt2x00firmware.o
+endif
+
+obj-$(CONFIG_RT2X00_LIB)	+= rt2x00lib.o
+obj-$(CONFIG_RT2X00_LIB_PCI)	+= rt2x00pci.o
+obj-$(CONFIG_RT2X00_LIB_USB)	+= rt2x00usb.o
+obj-$(CONFIG_RT2400PCI)		+= rt2400pci.o
+obj-$(CONFIG_RT2500PCI)		+= rt2500pci.o
+obj-$(CONFIG_RT61PCI)		+= rt61pci.o
+obj-$(CONFIG_RT2500USB)		+= rt2500usb.o
+obj-$(CONFIG_RT73USB)		+= rt73usb.o
#26 lore raw

PATCH 24/30 rt2x00: Add file pattern to MAINTAINER entry

In reply to Ivo van Doorn
Quoted 1 line

From 316723f1a0e726defbc2403647a9f81e383c45bb Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 14:04:26 +0200
Subject: [PATCH 24/30] rt2x00: Add file pattern to MAINTAINER entry

Add file pattern to MAINTAINER entry

---
 MAINTAINERS |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
MAINTAINERS +1 -0
index d22d562..f7a67a5 100644
@@ -3135,6 +3135,7 @@ L:	[email protected]
 L:	[email protected]
 W:	http://rt2x00.serialmonkey.com/
 S:	Maintained
+F:	drivers/net/wireless/rt2x00/
 
 RANDOM NUMBER DRIVER
 P:	Matt Mackall
Signature · 1 line
1.5.3.rc5
#27 lore raw

PATCH 25/30 rt2x00: Fix PLCP setup

In reply to Ivo van Doorn
Quoted 1 line

From b545a9a3b8ff04a2c6f62923cf01043aeb9ec599 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 16:09:25 +0200
Subject: [PATCH 25/30] rt2x00: Fix PLCP setup

The Length extension bit should only be set when using the 11Mbs rate and when the residual is <= 3. (value comes from zd1211rw, ralink legacy driver was unclear)

---
 drivers/net/wireless/rt2x00/rt2x00dev.c |   36 +++++++++++++++++-------------
 1 files changed, 20 insertions(+), 16 deletions(-)
drivers/net/wireless/rt2x00/rt2x00dev.c +20 -16
index 36b522b..a0fcd05 100644
@@ -480,14 +480,15 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 		desc.ifs = IFS_BACKOFF;
 
 	/*
-	 * How the length should be processed depends
-	 * on if we are working with OFDM rates or not.
+	 * PLCP setup
+	 * Length calculation depends on OFDM/CCK rate.
 	 */
+	desc.signal = DEVICE_GET_RATE_FIELD(tx_rate, PLCP);
+	desc.service = 0x04;
+
 	if (test_bit(ENTRY_TXD_OFDM_RATE, &entry->flags)) {
-		residual = 0;
 		desc.length_high = ((length + FCS_LEN) >> 6) & 0x3f;
 		desc.length_low = ((length + FCS_LEN) & 0x3f);
-
 	} else {
 		bitrate = DEVICE_GET_RATE_FIELD(tx_rate, RATE);
 
@@ -497,23 +498,26 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 		residual = get_duration_res(length + FCS_LEN, bitrate);
 		duration = get_duration(length + FCS_LEN, bitrate);
 
-		if (residual != 0)
+		if (residual != 0) {
 			duration++;
 
+			/*
+			 * Check if we need to set the Length Extension
+			 */
+			if (bitrate == 110 && residual <= 3)
+				desc.service |= 0x80;
+		}
+
 		desc.length_high = (duration >> 8) & 0xff;
 		desc.length_low = duration & 0xff;
-	}
 
-	/*
-	 * Create the signal and service values.
-	 */
-	desc.signal = DEVICE_GET_RATE_FIELD(tx_rate, PLCP);
-	if (DEVICE_GET_RATE_FIELD(tx_rate, PREAMBLE))
-		desc.signal |= 0x08;
-
-	desc.service = 0x04;
-	if (residual <= (8 % 11))
-		desc.service |= 0x80;
+		/*
+		 * When preamble is enabled we should set the
+		 * preamble bit for the signal.
+		 */
+		if (DEVICE_GET_RATE_FIELD(tx_rate, PREAMBLE))
+			desc.signal |= 0x08;
+	}
 
 	rt2x00dev->ops->lib->write_tx_desc(rt2x00dev, entry, txd, &desc,
 					   ieee80211hdr, length, control);
Signature · 1 line
1.5.3.rc5
#28 lore raw

PATCH 26/30 rt2x00: Clean up RATEMASK handling

In reply to Ivo van Doorn
Quoted 1 line

From 295b7e7bc2a2081714a071c3946f1c0262b6e503 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 16:31:38 +0200
Subject: [PATCH 26/30] rt2x00: Clean up RATEMASK handling

Rate handling needs some cleaning up to clear up the meaning of the variables.

- Rename DEV_RATE_* to DEV_RATEBIT_*
- Add DEV_RATEMASK_* to remove "magical values" passed to rt2x00lib_rate
- CCK_RATEMASK is alias for DEV_RATEMASK_11MB
- OFDM_RATEMASK is alias for DEV_RATE_MASK_54MB - CCK_RATEMASK

---
 drivers/net/wireless/rt2x00/rt2400pci.c |    2 +-
 drivers/net/wireless/rt2x00/rt2500pci.c |    2 +-
 drivers/net/wireless/rt2x00/rt2500usb.c |    2 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c |   44 ++++++++++++++----------
 drivers/net/wireless/rt2x00/rt2x00reg.h |   56 +++++++++++++++++++------------
 drivers/net/wireless/rt2x00/rt61pci.c   |    2 +-
 drivers/net/wireless/rt2x00/rt73usb.c   |    2 +-
 7 files changed, 64 insertions(+), 46 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +1 -1
index b851571..524f529 100644
@@ -366,7 +366,7 @@ static void rt2400pci_config_rate(struct rt2x00_dev *rt2x00dev, const int rate)
 	else
 		preamble = PREAMBLE;
 
-	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATE;
+	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATEMASK;
 	rt2x00pci_register_write(rt2x00dev, ARCSR1, reg);
 
 	rt2x00pci_register_read(rt2x00dev, TXCSR1, &reg);
drivers/net/wireless/rt2x00/rt2500pci.c +1 -1
index 1000525..cc90597 100644
@@ -374,7 +374,7 @@ static void rt2500pci_config_rate(struct rt2x00_dev *rt2x00dev, const int rate)
 	else
 		preamble = PREAMBLE;
 
-	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATE;
+	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATEMASK;
 	rt2x00pci_register_write(rt2x00dev, ARCSR1, reg);
 
 	rt2x00pci_register_read(rt2x00dev, TXCSR1, &reg);
drivers/net/wireless/rt2x00/rt2500usb.c +1 -1
index 9ece4af..ba6c099 100644
@@ -383,7 +383,7 @@ static void rt2500usb_config_rate(struct rt2x00_dev *rt2x00dev, const int rate)
 	else
 		preamble = PREAMBLE;
 
-	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATE;
+	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATEMASK;
 
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR11, reg);
 
drivers/net/wireless/rt2x00/rt2x00dev.c +25 -19

58 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt2x00reg.h +34 -22

68 lines not on this page · raw message

drivers/net/wireless/rt2x00/rt61pci.c +1 -1
index efa6c25..0dacd59 100644
@@ -404,7 +404,7 @@ static void rt61pci_config_rate(struct rt2x00_dev *rt2x00dev, const int rate)
 	 * We need to set TXRX_CSR5 to the basic rate mask so we need to mask
 	 * off the non-basic rates.
 	 */
-	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATE;
+	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATEMASK;
 
 	rt2x00pci_register_write(rt2x00dev, TXRX_CSR5, reg);
 
drivers/net/wireless/rt2x00/rt73usb.c +1 -1
index 9e8c049..7eb1f02 100644
@@ -380,7 +380,7 @@ static void rt73usb_config_rate(struct rt2x00_dev *rt2x00dev, const int rate)
 	else
 		preamble = PREAMBLE;
 
-	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATE;
+	reg = DEVICE_GET_RATE_FIELD(rate, RATEMASK) & DEV_BASIC_RATEMASK;
 
 	rt73usb_register_write(rt2x00dev, TXRX_CSR5, reg);
 
Signature · 1 line
1.5.3.rc5
#29 lore raw

PATCH 27/30 rt2x00: Add rt2x00lib_reset_link_tuner()

In reply to Ivo van Doorn
Quoted 1 line

From d6188297893be7023e0cec4b0132e64ec96de884 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 16:41:58 +0200
Subject: [PATCH 27/30] rt2x00: Add rt2x00lib_reset_link_tuner()

When rt2x00config needs the link tuner to be reset, this means that also all statistics need to be reset _and_ that the link tuner timer is being reset. In short: when resetting the link tuner, the link tuner should be stopped and restarted.

---
 drivers/net/wireless/rt2x00/rt2x00config.c |    2 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   14 ++++++++++----
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    1 +
 3 files changed, 12 insertions(+), 5 deletions(-)
drivers/net/wireless/rt2x00/rt2x00config.c +1 -1
index 4fec0af..b5075b5 100644
@@ -155,7 +155,7 @@ config:
 	 * which means we need to reset the link tuner.
 	 */
 	if (flags & (CONFIG_UPDATE_CHANNEL | CONFIG_UPDATE_ANTENNA))
-		rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
+		rt2x00lib_reset_link_tuner(rt2x00dev);
 
 	rt2x00dev->rx_status.phymode = conf->phymode;
 	rt2x00dev->rx_status.freq = conf->freq;
drivers/net/wireless/rt2x00/rt2x00dev.c +10 -4
index 8e7fc2a..14968ef 100644
@@ -67,7 +67,7 @@ EXPORT_SYMBOL_GPL(rt2x00lib_get_ring);
 /*
  * Link tuning handlers
  */
-static void rt2x00_start_link_tune(struct rt2x00_dev *rt2x00dev)
+static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
 	rt2x00dev->link.count = 0;
 	rt2x00dev->link.avg_rssi = 0;
@@ -87,12 +87,18 @@ static void rt2x00_start_link_tune(struct rt2x00_dev *rt2x00dev)
 			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
 }
 
-static void rt2x00_stop_link_tune(struct rt2x00_dev *rt2x00dev)
+static void rt2x00lib_stop_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
 	if (delayed_work_pending(&rt2x00dev->link.work))
 		cancel_rearming_delayed_work(&rt2x00dev->link.work);
 }
 
+void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
+{
+	rt2x00lib_stop_link_tuner(rt2x00dev);
+	rt2x00lib_start_link_tuner(rt2x00dev);
+}
+
 /*
  * Radio control handlers.
  */
@@ -167,7 +173,7 @@ void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, int enable)
 	 * When we are disabling the RX, we should also stop the link tuner.
 	 */
 	if (!enable)
-		rt2x00_stop_link_tune(rt2x00dev);
+		rt2x00lib_stop_link_tuner(rt2x00dev);
 
 	rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
 
@@ -175,7 +181,7 @@ void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, int enable)
 	 * When we are enabling the RX, we should also start the link tuner.
 	 */
 	if (enable && is_interface_present(&rt2x00dev->interface))
-		rt2x00_start_link_tune(rt2x00dev);
+		rt2x00lib_start_link_tuner(rt2x00dev);
 }
 
 static int rt2x00lib_calculate_link_signal(struct rt2x00_dev *rt2x00dev)
drivers/net/wireless/rt2x00/rt2x00lib.h +1 -0
index 1560f73..454e022 100644
@@ -38,6 +38,7 @@
 int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev);
 void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev);
 void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, int enable);
+void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev);
 
 /*
  * Initialization handlers.
Signature · 1 line
1.5.3.rc5
#30 lore raw

PATCH 28/30 rt2x00: Always check if mac80211 requested TX status update

In reply to Ivo van Doorn
Quoted 1 line

From cbf01c4f3f1810f0ba98238aa7900a523a044e66 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 17:43:23 +0200
Subject: [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update

During txdone always check for the IEEE80211_TXCTL_REQ_TX_STATUS flag to determine if ieee80211_tx_status_irqsafe should be called or not. When the flag is not set, just cleanup the skb and don't bother mac80211 with it.

---
 drivers/net/wireless/rt2x00/rt2x00dev.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)
drivers/net/wireless/rt2x00/rt2x00dev.c +7 -3
index 14968ef..75888ea 100644
@@ -333,10 +333,14 @@ void rt2x00lib_txdone(struct data_entry *entry,
 	}
 
 	/*
-	 * Send the tx_status to mac80211,
-	 * that method also cleans up the skb structure.
+	 * Check if mac80211 wants to be updated or not,
+	 * if it wants the update it will cleanup the skb structure,
+	 * else then we should cleanup the skb structure.
 	 */
-	ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb, tx_status);
+	if (tx_status->control.flags & IEEE80211_TXCTL_REQ_TX_STATUS)
+		ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb, tx_status);
+	else
+		dev_kfree_skb_any(entry->skb);
 
 	entry->skb = NULL;
 }
Signature · 1 line
1.5.3.rc5
maintainer
#31 lore raw

Re: [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update

Quoted 4 lines · Ivo van Doorn

During txdone always check for the IEEE80211_TXCTL_REQ_TX_STATUS flag to determine if ieee80211_tx_status_irqsafe should be called or not. When the flag is not set, just cleanup the skb and don't bother mac80211 with it.

Never mind that I'd love to remove the REQ_TX_STATUS flag, this is not really the best thing to do since rate control will basically ignore this frame if you don't hand it back to mac80211.

johannes

#32 lore raw

Re: [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update

Quoted 10 lines · Johannes Berg
Quoted 4 lines · Ivo van Doorn

During txdone always check for the IEEE80211_TXCTL_REQ_TX_STATUS flag to determine if ieee80211_tx_status_irqsafe should be called or not. When the flag is not set, just cleanup the skb and don't bother mac80211 with it.

Never mind that I'd love to remove the REQ_TX_STATUS flag, this is not really the best thing to do since rate control will basically ignore this frame if you don't hand it back to mac80211.

Ok, I'll revert that check for rt2x00 2.0.8

Thanks,

Ivo

#33 lore raw

PATCH 29/30 rt2x00: Lindent

In reply to Ivo van Doorn
Quoted 1 line

From f88ee9f3e67bd509f14e07f0dfcfe32649694e10 Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sat, 18 Aug 2007 18:24:23 +0200
Subject: [PATCH 29/30] rt2x00: Lindent

Lindent still caught a few lines exceeding the 80 character limit, a few reduntant spaces, and some other minor things.

---
 drivers/net/wireless/rt2x00/rt2400pci.c   |    7 ++++---
 drivers/net/wireless/rt2x00/rt2500pci.c   |   10 +++++-----
 drivers/net/wireless/rt2x00/rt2500usb.c   |    7 +++----
 drivers/net/wireless/rt2x00/rt2x00.h      |   12 ++++++------
 drivers/net/wireless/rt2x00/rt2x00debug.c |   19 +++++++++++--------
 drivers/net/wireless/rt2x00/rt2x00dev.c   |   14 +++++++-------
 drivers/net/wireless/rt2x00/rt2x00mac.c   |    3 ++-
 drivers/net/wireless/rt2x00/rt2x00usb.c   |    2 +-
 drivers/net/wireless/rt2x00/rt61pci.c     |    6 +++---
 drivers/net/wireless/rt2x00/rt73usb.c     |    8 ++++----
 10 files changed, 46 insertions(+), 42 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +4 -3
index 524f529..d3ac1c1 100644
@@ -1154,7 +1154,8 @@ static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 			   test_bit(ENTRY_TXD_RTS_FRAME, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
-			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
+			   !!(control->flags &
+			      IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_desc_write(txd, 0, word);
 }
 
@@ -1398,8 +1399,8 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Store led mode, for correct led behaviour.
 	 */
-	rt2x00dev->led_mode = rt2x00_get_field16(eeprom,
-						 EEPROM_ANTENNA_LED_MODE);
+	rt2x00dev->led_mode =
+	    rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
 
 	/*
 	 * Detect if this device has an hardware controlled radio.
drivers/net/wireless/rt2x00/rt2500pci.c +5 -5
index cc90597..b6f9266 100644
@@ -625,8 +625,7 @@ static void rt2500pci_config(struct rt2x00_dev *rt2x00dev,
 	if (flags & CONFIG_UPDATE_CHANNEL)
 		rt2500pci_config_channel(rt2x00dev, conf->channel_val,
 					 conf->channel, conf->power_level);
-	if (!(flags & CONFIG_UPDATE_CHANNEL) &&
-	    flags & CONFIG_UPDATE_TXPOWER)
+	if ((flags & CONFIG_UPDATE_TXPOWER) && !(flags & CONFIG_UPDATE_CHANNEL))
 		rt2500pci_config_txpower(rt2x00dev, conf->power_level);
 	if (flags & CONFIG_UPDATE_ANTENNA)
 		rt2500pci_config_antenna(rt2x00dev, conf->antenna_sel_tx,
@@ -1282,7 +1281,8 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_CIPHER_OWNER, 1);
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
-			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
+			   !!(control->flags &
+			      IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
 	rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
 	rt2x00_desc_write(txd, 0, word);
@@ -1554,8 +1554,8 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Store led mode, for correct led behaviour.
 	 */
-	rt2x00dev->led_mode = rt2x00_get_field16(eeprom,
-						 EEPROM_ANTENNA_LED_MODE);
+	rt2x00dev->led_mode =
+	    rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
 
 	/*
 	 * Detect if this device has an hardware controlled radio.
drivers/net/wireless/rt2x00/rt2500usb.c +3 -4
index ba6c099..3c78a97 100644
@@ -568,8 +568,7 @@ static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,
 	if (flags & CONFIG_UPDATE_CHANNEL)
 		rt2500usb_config_channel(rt2x00dev, conf->channel_val,
 					 conf->channel, conf->power_level);
-	if (!(flags & CONFIG_UPDATE_CHANNEL) &&
-	    flags & CONFIG_UPDATE_TXPOWER)
+	if ((flags & CONFIG_UPDATE_TXPOWER) && !(flags & CONFIG_UPDATE_CHANNEL))
 		rt2500usb_config_txpower(rt2x00dev, conf->power_level);
 	if (flags & CONFIG_UPDATE_ANTENNA)
 		rt2500usb_config_antenna(rt2x00dev, conf->antenna_sel_tx,
@@ -1281,8 +1280,8 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Store led mode, for correct led behaviour.
 	 */
-	rt2x00dev->led_mode = rt2x00_get_field16(eeprom,
-						 EEPROM_ANTENNA_LED_MODE);
+	rt2x00dev->led_mode =
+	    rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE);
 
 	/*
 	 * Check if the BBP tuning should be disabled.
drivers/net/wireless/rt2x00/rt2x00.h +6 -6
index 24ad264..06738e4 100644
@@ -133,20 +133,20 @@
  */
 static inline int is_rts_frame(u16 fc)
 {
-	return !!(((fc &  IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
-		  ((fc &  IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_RTS));
+	return !!(((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
+		  ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_RTS));
 }
 
 static inline int is_cts_frame(u16 fc)
 {
-	return !!(((fc &  IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
-		  ((fc &  IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_CTS));
+	return !!(((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
+		  ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_CTS));
 }
 
 static inline int is_probe_resp(u16 fc)
 {
-	return !!(((fc &  IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
-		  ((fc &  IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP));
+	return !!(((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
+		  ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP));
 }
 
 /*
drivers/net/wireless/rt2x00/rt2x00debug.c +11 -8
index c7b331c..eaa4c54 100644
@@ -193,10 +193,11 @@ RT2X00DEBUGFS_OPS(eeprom, "0x%.4x\n", u16);
 RT2X00DEBUGFS_OPS(bbp, "0x%.2x\n", u8);
 RT2X00DEBUGFS_OPS(rf, "0x%.8x\n", u32);
 
-static struct dentry *
-rt2x00debug_create_file_driver(const char *name,
-			       struct rt2x00debug_intf *intf,
-			       struct debugfs_blob_wrapper *blob)
+static struct dentry *rt2x00debug_create_file_driver(const char *name,
+						     struct rt2x00debug_intf
+						     *intf,
+						     struct debugfs_blob_wrapper
+						     *blob)
 {
 	char *data;
 
@@ -213,10 +214,12 @@ rt2x00debug_create_file_driver(const char *name,
 	return debugfs_create_blob(name, S_IRUGO, intf->driver_folder, blob);
 }
 
-static struct dentry *
-rt2x00debug_create_file_chipset(const char *name,
-				struct rt2x00debug_intf *intf,
-				struct debugfs_blob_wrapper *blob)
+static struct dentry *rt2x00debug_create_file_chipset(const char *name,
+						      struct rt2x00debug_intf
+						      *intf,
+						      struct
+						      debugfs_blob_wrapper
+						      *blob)
 {
 	const struct rt2x00debug *debug = intf->debug;
 	char *data;
drivers/net/wireless/rt2x00/rt2x00dev.c +7 -7
index 75888ea..8c24797 100644
@@ -222,7 +222,7 @@ static int rt2x00lib_calculate_link_signal(struct rt2x00_dev *rt2x00dev)
 		  (WEIGHT_TX * tx_percentage) +
 		  (WEIGHT_RX * rx_percentage)) / 100;
 
-	return (signal > 100) ? 100 :  signal;
+	return (signal > 100) ? 100 : signal;
 }
 
 static void rt2x00lib_link_tuner(struct work_struct *work)
@@ -338,7 +338,8 @@ void rt2x00lib_txdone(struct data_entry *entry,
 	 * else then we should cleanup the skb structure.
 	 */
 	if (tx_status->control.flags & IEEE80211_TXCTL_REQ_TX_STATUS)
-		ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb, tx_status);
+		ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb,
+					    tx_status);
 	else
 		dev_kfree_skb_any(entry->skb);
 
@@ -561,9 +562,9 @@ static void rt2x00lib_rate(struct ieee80211_rate *entry,
 {
 	entry->rate = rate;
 	entry->val =
-		DEVICE_SET_RATE_FIELD(rate, RATE) |
-		DEVICE_SET_RATE_FIELD(mask, RATEMASK) |
-		DEVICE_SET_RATE_FIELD(plcp, PLCP);
+	    DEVICE_SET_RATE_FIELD(rate, RATE) |
+	    DEVICE_SET_RATE_FIELD(mask, RATEMASK) |
+	    DEVICE_SET_RATE_FIELD(plcp, PLCP);
 	entry->flags = flags;
 	entry->val2 = entry->val;
 	if (entry->flags & IEEE80211_RATE_PREAMBLE2)
@@ -637,8 +638,7 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
 			tx_power = spec->tx_power_default;
 
 		rt2x00lib_channel(&channels[i],
-				  spec->channels[i].channel,
-				  tx_power, i);
+				  spec->channels[i].channel, tx_power, i);
 	}
 
 	/*
drivers/net/wireless/rt2x00/rt2x00mac.c +2 -1
index 2b1b910..3ceb79d 100644
@@ -35,7 +35,8 @@
 #include "rt2x00lib.h"
 
 static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
-				struct data_ring *ring, struct sk_buff *frag_skb,
+				struct data_ring *ring,
+				struct sk_buff *frag_skb,
 				struct ieee80211_tx_control *control)
 {
 	struct sk_buff *skb;
drivers/net/wireless/rt2x00/rt2x00usb.c +1 -1
index c763606..03815b6 100644
@@ -50,7 +50,7 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev,
 	unsigned int i;
 	unsigned int pipe =
 	    (requesttype == USB_VENDOR_REQUEST_IN) ?
-	     usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
+	    usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
 
 	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
 		status = usb_control_msg(usb_dev, pipe, request, requesttype,
drivers/net/wireless/rt2x00/rt61pci.c +3 -3
index 0dacd59..0b4e757 100644
@@ -688,8 +688,7 @@ static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
 	if (flags & CONFIG_UPDATE_CHANNEL)
 		rt61pci_config_channel(rt2x00dev, conf->channel_val,
 				       conf->channel, conf->power_level);
-	if (!(flags & CONFIG_UPDATE_CHANNEL) &&
-	    flags & CONFIG_UPDATE_TXPOWER)
+	if ((flags & CONFIG_UPDATE_TXPOWER) && !(flags & CONFIG_UPDATE_CHANNEL))
 		rt61pci_config_txpower(rt2x00dev, conf->power_level);
 	if (flags & CONFIG_UPDATE_ANTENNA)
 		rt61pci_config_antenna(rt2x00dev, conf->antenna_sel_tx,
@@ -1532,7 +1531,8 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 			   test_bit(ENTRY_TXD_OFDM_RATE, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
-			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
+			   !!(control->flags &
+			      IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
 	rt2x00_set_field32(&word, TXD_W0_BURST,
drivers/net/wireless/rt2x00/rt73usb.c +4 -4
index 7eb1f02..ed05e4b 100644
@@ -659,8 +659,7 @@ static void rt73usb_config(struct rt2x00_dev *rt2x00dev,
 	if (flags & CONFIG_UPDATE_CHANNEL)
 		rt73usb_config_channel(rt2x00dev, conf->channel_val,
 				       conf->channel, conf->power_level);
-	if (!(flags & CONFIG_UPDATE_CHANNEL) &&
-	    flags & CONFIG_UPDATE_TXPOWER)
+	if ((flags & CONFIG_UPDATE_TXPOWER) && !(flags & CONFIG_UPDATE_CHANNEL))
 		rt73usb_config_txpower(rt2x00dev, conf->power_level);
 	if (flags & CONFIG_UPDATE_ANTENNA)
 		rt73usb_config_antenna(rt2x00dev, conf->antenna_sel_tx,
@@ -925,7 +924,7 @@ static int rt73usb_load_firmware(struct rt2x00_dev *rt2x00dev, void *data,
 		buflen = min_t(int, len - i, CSR_CACHE_SIZE_FIRMWARE);
 		timeout = REGISTER_TIMEOUT * (buflen / sizeof(u32));
 
-		memcpy(cache, ptr ,buflen);
+		memcpy(cache, ptr, buflen);
 
 		rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE,
 					 USB_VENDOR_REQUEST_OUT,
@@ -1269,7 +1268,8 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 			   test_bit(ENTRY_TXD_OFDM_RATE, &entry->flags));
 	rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
-			   !!(control->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT));
+			   !!(control->flags &
+			      IEEE80211_TXCTL_LONG_RETRY_LIMIT));
 	rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
 	rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, length);
 	rt2x00_set_field32(&word, TXD_W0_BURST2,
Signature · 1 line
1.5.3.rc5
#34 lore raw

PATCH 30/30 rt2x00: rt2x00 2.0.7

In reply to Ivo van Doorn
Quoted 1 line

From 7b429527e4460c4bc550ca71a47696d677b92e5f Mon Sep 17 00:00:00 2001

From: Ivo van Doorn <[email protected]>
Date: Sun, 19 Aug 2007 20:13:11 +0200
Subject: [PATCH 30/30] rt2x00: rt2x00 2.0.7

Release rt2x00 2.0.7

---
 drivers/net/wireless/rt2x00/rt2x00.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/wireless/rt2x00/rt2x00.h +1 -1
index 06738e4..2105f44 100644
@@ -42,7 +42,7 @@
  * Module information.
  * DRV_NAME should be set within the individual module source files.
  */
-#define DRV_VERSION	"2.0.6"
+#define DRV_VERSION	"2.0.7"
 #define DRV_PROJECT	"http://rt2x00.serialmonkey.com"
 
 /*
Signature · 1 line
1.5.3.rc5