* Please pull 'upstream' branch of rt2x00
@ 2007-08-19 18:18 Ivo van Doorn
2007-08-19 18:21 ` [PATCH 01/30] rt2x00: Correctly configure packet filter in monitor mode Ivo van Doorn
` (30 more replies)
0 siblings, 31 replies; 36+ messages in thread
From: Ivo van Doorn @ 2007-08-19 18:18 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, rt2400-devel
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%)
^ permalink raw reply [flat|nested] 36+ messages in thread* [PATCH 01/30] rt2x00: Correctly configure packet filter in monitor mode 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn @ 2007-08-19 18:21 ` Ivo van Doorn 2007-08-19 18:21 ` [PATCH 02/30] rt2x00: Clear MAC and BSSID when non-monitor interface goes down Ivo van Doorn ` (29 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:21 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From a065c6ce407b30a02777761794e77ee6cfa8663e Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index 757d749..d97fa31 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -305,15 +305,22 @@ static void rt2400pci_config_type(struct rt2x00_dev *rt2x00dev, int type) else rt2x00_set_field32(®, RXCSR0_DROP_TODS, 0); - rt2x00_set_field32(®, RXCSR0_DROP_CRC, 1); - if (is_monitor_present(&rt2x00dev->interface)) { - rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, 0); - rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, 0); - rt2x00_set_field32(®, 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(®, RXCSR0_DROP_CRC, 1); rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, 1); rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, 1); rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); + } else if (is_monitor_present(&rt2x00dev->interface)) { + rt2x00_set_field32(®, RXCSR0_DROP_CRC, 0); + rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, 0); + rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, 0); + rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 0); } rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index dd98aa4..0a0fa22 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -309,15 +309,22 @@ static void rt2500pci_config_type(struct rt2x00_dev *rt2x00dev, const int type) else rt2x00_set_field32(®, RXCSR0_DROP_TODS, 0); - rt2x00_set_field32(®, RXCSR0_DROP_CRC, 1); - if (is_monitor_present(&rt2x00dev->interface)) { - rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, 0); - rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, 0); - rt2x00_set_field32(®, 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(®, RXCSR0_DROP_CRC, 1); rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, 1); rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, 1); rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); + } else if (is_monitor_present(&rt2x00dev->interface)) { + rt2x00_set_field32(®, RXCSR0_DROP_CRC, 0); + rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, 0); + rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, 0); + rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 0); } rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index e09fb9f..ad400dd 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -314,15 +314,22 @@ static void rt2500usb_config_type(struct rt2x00_dev *rt2x00dev, const int type) else rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS, 0); - rt2x00_set_field16(®, TXRX_CSR2_DROP_CRC, 1); - if (is_monitor_present(&rt2x00dev->interface)) { - rt2x00_set_field16(®, TXRX_CSR2_DROP_PHYSICAL, 0); - rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL, 0); - rt2x00_set_field16(®, 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(®, TXRX_CSR2_DROP_CRC, 1); rt2x00_set_field16(®, TXRX_CSR2_DROP_PHYSICAL, 1); rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL, 1); rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1); + } else if (is_monitor_present(&rt2x00dev->interface)) { + rt2x00_set_field16(®, TXRX_CSR2_DROP_CRC, 0); + rt2x00_set_field16(®, TXRX_CSR2_DROP_PHYSICAL, 0); + rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL, 0); + rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 0); } rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); diff --git a/drivers/net/wireless/rt2x00config.c b/drivers/net/wireless/rt2x00config.c index 11d5646..4fec0af 100644 --- a/drivers/net/wireless/rt2x00config.c +++ b/drivers/net/wireless/rt2x00config.c @@ -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 diff --git a/drivers/net/wireless/rt2x00mac.c b/drivers/net/wireless/rt2x00mac.c index 205f10f..c384767 100644 --- a/drivers/net/wireless/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00mac.c @@ -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. */ diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index 00f66e0..7f3a00b 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -338,17 +338,24 @@ static void rt61pci_config_type(struct rt2x00_dev *rt2x00dev, const int type) else rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, 0); - rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, 1); - if (is_monitor_present(&rt2x00dev->interface)) { - rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, 0); - rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, 0); - rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 0); - rt2x00_set_field32(®, 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(®, TXRX_CSR0_DROP_CRC, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, 1); + } else if (is_monitor_present(&rt2x00dev->interface)) { + rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, 0); } rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg); diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 2f0bf29..90e2b29 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -313,17 +313,24 @@ static void rt73usb_config_type(struct rt2x00_dev *rt2x00dev, const int type) else rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, 0); - rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, 1); - if (is_monitor_present(&rt2x00dev->interface)) { - rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, 0); - rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, 0); - rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 0); - rt2x00_set_field32(®, 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(®, TXRX_CSR0_DROP_CRC, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, 1); + } else if (is_monitor_present(&rt2x00dev->interface)) { + rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 0); + rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, 0); } rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg); -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 02/30] rt2x00: Clear MAC and BSSID when non-monitor interface goes down 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn 2007-08-19 18:21 ` [PATCH 01/30] rt2x00: Correctly configure packet filter in monitor mode Ivo van Doorn @ 2007-08-19 18:21 ` Ivo van Doorn 2007-08-19 18:21 ` [PATCH 03/30] rt2x00: Check return value of usb_control_msg() Ivo van Doorn ` (28 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:21 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From f027057821e22cf353fd37e3c139dc908c85bffe Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index 77556fe..b06cda6 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -290,7 +290,7 @@ struct interface { /* * MAC of the device. */ - u8 *mac; + u8 mac[ETH_ALEN]; /* * BBSID of the AP to associate with. diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c index 28ddbe0..1597d2d 100644 --- a/drivers/net/wireless/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00dev.c @@ -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. diff --git a/drivers/net/wireless/rt2x00mac.c b/drivers/net/wireless/rt2x00mac.c index c384767..31fe0f1 100644 --- a/drivers/net/wireless/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00mac.c @@ -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; } -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 03/30] rt2x00: Check return value of usb_control_msg() 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn 2007-08-19 18:21 ` [PATCH 01/30] rt2x00: Correctly configure packet filter in monitor mode Ivo van Doorn 2007-08-19 18:21 ` [PATCH 02/30] rt2x00: Clear MAC and BSSID when non-monitor interface goes down Ivo van Doorn @ 2007-08-19 18:21 ` Ivo van Doorn 2007-08-19 18:22 ` [PATCH 04/30] rt2x00: Clear all fields on start_link_tune() Ivo van Doorn ` (27 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:21 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 91de0ebc5c8e4c6799b4de5b34301a0884c085d2 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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 Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00usb.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/drivers/net/wireless/rt2x00usb.c b/drivers/net/wireless/rt2x00usb.c index 38804d7..05ae870 100644 --- a/drivers/net/wireless/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00usb.c @@ -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, -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 04/30] rt2x00: Clear all fields on start_link_tune() 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (2 preceding siblings ...) 2007-08-19 18:21 ` [PATCH 03/30] rt2x00: Check return value of usb_control_msg() Ivo van Doorn @ 2007-08-19 18:22 ` Ivo van Doorn 2007-08-19 18:22 ` [PATCH 05/30] rt2x00: Don't increase rx_failed for individual frames Ivo van Doorn ` (26 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:22 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 643e88e4fca8b22d60f718226bede9f033b3e869 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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(). Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00dev.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c index 1597d2d..b7191cc 100644 --- a/drivers/net/wireless/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00dev.c @@ -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. -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 05/30] rt2x00: Don't increase rx_failed for individual frames 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (3 preceding siblings ...) 2007-08-19 18:22 ` [PATCH 04/30] rt2x00: Clear all fields on start_link_tune() Ivo van Doorn @ 2007-08-19 18:22 ` Ivo van Doorn 2007-08-19 18:23 ` [PATCH 06/30] rt2x00: Set vgc_level during reset_tuner Ivo van Doorn ` (25 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:22 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 53237308ec1ca8f3b3679c7e04cfe467bfeef077 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index d97fa31..1506666 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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; } /* diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index 0a0fa22..445ec3e 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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; } /* diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index ad400dd..29b675c 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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; } /* diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index b06cda6..4b8906e 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -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. diff --git a/drivers/net/wireless/rt2x00pci.c b/drivers/net/wireless/rt2x00pci.c index bf62dd0..c54b30f 100644 --- a/drivers/net/wireless/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00pci.c @@ -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; /* diff --git a/drivers/net/wireless/rt2x00usb.c b/drivers/net/wireless/rt2x00usb.c index 05ae870..6dd0801 100644 --- a/drivers/net/wireless/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00usb.c @@ -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; /* diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index 7f3a00b..e292572 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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; } /* diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 90e2b29..149f5ee 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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; } /* -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 06/30] rt2x00: Set vgc_level during reset_tuner 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (4 preceding siblings ...) 2007-08-19 18:22 ` [PATCH 05/30] rt2x00: Don't increase rx_failed for individual frames Ivo van Doorn @ 2007-08-19 18:23 ` Ivo van Doorn 2007-08-19 18:23 ` [PATCH 07/30] rt2x00: Schedule beacon update Ivo van Doorn ` (24 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:23 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From dc0c67691b4f794fcaad97ddc36f4e9354658d6e Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index 1506666..d8628e6 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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) diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index 445ec3e..4d195de 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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) diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index 29b675c..581cc6f 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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; } /* diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index e292572..7c52a4e 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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) diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 149f5ee..74e4173 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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) -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 07/30] rt2x00: Schedule beacon update 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (5 preceding siblings ...) 2007-08-19 18:23 ` [PATCH 06/30] rt2x00: Set vgc_level during reset_tuner Ivo van Doorn @ 2007-08-19 18:23 ` Ivo van Doorn 2007-08-19 18:24 ` [PATCH 08/30] rt2x00: Fix width of filter field Ivo van Doorn ` (23 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:23 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From ddf86b88ab735fac340b1fae078a6433ed1a8fce Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index d8628e6..8365171 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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. diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index 4d195de..a794989 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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. diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index 4b8906e..31f8a13 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -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, diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c index b7191cc..7f3eaf1 100644 --- a/drivers/net/wireless/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00dev.c @@ -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); /* diff --git a/drivers/net/wireless/rt2x00mac.c b/drivers/net/wireless/rt2x00mac.c index 31fe0f1..2b1b910 100644 --- a/drivers/net/wireless/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00mac.c @@ -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); diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index 7c52a4e..edacb46 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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. -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 08/30] rt2x00: Fix width of filter field. 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (6 preceding siblings ...) 2007-08-19 18:23 ` [PATCH 07/30] rt2x00: Schedule beacon update Ivo van Doorn @ 2007-08-19 18:24 ` Ivo van Doorn 2007-08-19 18:24 ` [PATCH 09/30] rt2x00: Be consistent with unsigned Ivo van Doorn ` (22 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:24 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 47c06acef36889c67594dadb4a29879d28c8415b Mon Sep 17 00:00:00 2001 From: Mattias Nissler <mattias.nissler@gmx.de> 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. Signed-off-by: Mattias Nissler <mattias.nissler@gmx.de> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index 31f8a13..0db81eb 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -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 -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 09/30] rt2x00: Be consistent with unsigned 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (7 preceding siblings ...) 2007-08-19 18:24 ` [PATCH 08/30] rt2x00: Fix width of filter field Ivo van Doorn @ 2007-08-19 18:24 ` Ivo van Doorn 2007-08-19 18:24 ` [PATCH 10/30] rt2x00: Correctly reset TX/RX success/failed counters Ivo van Doorn ` (21 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:24 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From cdc01c652d3b058111e8a2567649e198c7c77cc5 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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" Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index 8365171..aa1209b 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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; diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index a794989..3a1da1f 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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; diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index 581cc6f..71b7bf2 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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; diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index 0db81eb..5c6d7d0 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -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 ) diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index edacb46..f592397 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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, ®); diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 74e4173..9f059ce 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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); -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 10/30] rt2x00: Correctly reset TX/RX success/failed counters 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (8 preceding siblings ...) 2007-08-19 18:24 ` [PATCH 09/30] rt2x00: Be consistent with unsigned Ivo van Doorn @ 2007-08-19 18:24 ` Ivo van Doorn 2007-08-19 18:25 ` [PATCH 11/30] rt2x00: Rework RF register handling Ivo van Doorn ` (20 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:24 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 9e26ed7c8a87978caf02f8c6510bab37007c5259 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index aa1209b..8ebfae8 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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, ®); - 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. diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index 3a1da1f..a5bfb00 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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, ®); - 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. diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index 71b7bf2..e9f6747 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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, ®); - 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. diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c index 7f3eaf1..f952595 100644 --- a/drivers/net/wireless/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00dev.c @@ -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++; diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index f592397..8c6c778 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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, ®); - 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. diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 9f059ce..30d4189 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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, ®); - 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. -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 11/30] rt2x00: Rework RF register handling 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (9 preceding siblings ...) 2007-08-19 18:24 ` [PATCH 10/30] rt2x00: Correctly reset TX/RX success/failed counters Ivo van Doorn @ 2007-08-19 18:25 ` Ivo van Doorn 2007-08-19 18:25 ` [PATCH 12/30] rt2x00: Store firmware in memory Ivo van Doorn ` (19 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:25 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From bd6c96f98df0e85bf9985bee8df71750e3ec2f20 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index 8ebfae8..7bd975d 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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, ®); + memcpy(®, &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) diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index a5bfb00..d6b88f6 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -432,75 +432,17 @@ static void rt2500pci_config_phymode(struct rt2x00_dev *rt2x00dev, rt2500pci_config_rate(rt2x00dev, rate->val2); } -static const struct { - unsigned int chip; - u32 val[3]; -} rf_vals[] = { - { RF2522, { 0x00002050, 0x00000101, 0x00000000 } }, - { RF2523, { 0x00022010, 0x000e0111, 0x00000a1b } }, - { RF2524, { 0x00032020, 0x00000101, 0x00000a1b } }, - { RF2525, { 0x00022020, 0x00060111, 0x00000a1b } }, - { RF2525E, { 0x00022020, 0x00060111, 0x00000a0b } }, -}; - -static void rt2500pci_get_rf_vals(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, - struct rf_reg *reg) -{ - unsigned int i; - - reg->rf1 = 0; - reg->rf2 = value; - reg->rf3 = 0; - reg->rf4 = 0; - - if (rt2x00_rf(&rt2x00dev->chip, RF5222)) { - reg->rf3 = 0x00000101; - if (channel < 14) { - reg->rf1 = 0x00022020; - reg->rf4 = 0x00000a0b; - } else if (channel == 14) { - reg->rf1 = 0x00022010; - reg->rf4 = 0x00000a1b; - } else if (channel < 64) { - reg->rf1 = 0x00022010; - reg->rf4 = 0x00000a1f; - } else if (channel < 140) { - reg->rf1 = 0x00022010; - reg->rf4 = 0x00000a0f; - } else if (channel < 161) { - reg->rf1 = 0x00022020; - reg->rf4 = 0x00000a07; - } - } else { - if (rt2x00_rf(&rt2x00dev->chip, RF2525) || - rt2x00_rf(&rt2x00dev->chip, RF2525E)) - reg->rf2 |= 0x00080000; - - for (i = 0; i < ARRAY_SIZE(rf_vals); i++) { - if (rt2x00_rf(&rt2x00dev->chip, rf_vals[i].chip)) { - reg->rf1 = rf_vals[i].val[0]; - reg->rf3 = rf_vals[i].val[1]; - reg->rf4 = rf_vals[i].val[2]; - } - } - - if (rt2x00_rf(&rt2x00dev->chip, RF2525E) && channel == 14) - reg->rf4 |= 0x00000010; - } -} - static void rt2500pci_config_channel(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, + const int index, const int channel, const int txpower) { - struct rf_reg reg; + struct rf_channel reg; u8 r70; /* * Fill rf_reg structure. */ - rt2500pci_get_rf_vals(rt2x00dev, value, channel, ®); + memcpy(®, &rt2x00dev->spec.channels[index], sizeof(reg)); /* * Set TXpower. @@ -1647,42 +1589,155 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev) * RF value list for RF2522 * Supports: 2.4 GHz */ -static const u32 rf_vals_bg_2522[] = { - 0x000c1fda, 0x000c1fee, 0x000c2002, 0x000c2016, 0x000c202a, - 0x000c203e, 0x000c2052, 0x000c2066, 0x000c207a, 0x000c208e, - 0x000c20a2, 0x000c20b6, 0x000c20ca, 0x000c20fa +static const struct rf_channel rf_vals_bg_2522[] = { + { 1, 0x00002050, 0x000c1fda, 0x00000101, 0 }, + { 2, 0x00002050, 0x000c1fee, 0x00000101, 0 }, + { 3, 0x00002050, 0x000c2002, 0x00000101, 0 }, + { 4, 0x00002050, 0x000c2016, 0x00000101, 0 }, + { 5, 0x00002050, 0x000c202a, 0x00000101, 0 }, + { 6, 0x00002050, 0x000c203e, 0x00000101, 0 }, + { 7, 0x00002050, 0x000c2052, 0x00000101, 0 }, + { 8, 0x00002050, 0x000c2066, 0x00000101, 0 }, + { 9, 0x00002050, 0x000c207a, 0x00000101, 0 }, + { 10, 0x00002050, 0x000c208e, 0x00000101, 0 }, + { 11, 0x00002050, 0x000c20a2, 0x00000101, 0 }, + { 12, 0x00002050, 0x000c20b6, 0x00000101, 0 }, + { 13, 0x00002050, 0x000c20ca, 0x00000101, 0 }, + { 14, 0x00002050, 0x000c20fa, 0x00000101, 0 }, }; /* - * RF value list for RF2523, RF2524 & RF2525 + * RF value list for RF2523 * Supports: 2.4 GHz */ -static const u32 rf_vals_bg_252x[] = { - 0x00000c9e, 0x00000ca2, 0x00000ca6, 0x00000caa, 0x00000cae, - 0x00000cb2, 0x00000cb6, 0x00000cba, 0x00000cbe, 0x00000d02, - 0x00000d06, 0x00000d0a, 0x00000d0e, 0x00000d1a +static const struct rf_channel rf_vals_bg_2523[] = { + { 1, 0x00022010, 0x00000c9e, 0x000e0111, 0x00000a1b }, + { 2, 0x00022010, 0x00000ca2, 0x000e0111, 0x00000a1b }, + { 3, 0x00022010, 0x00000ca6, 0x000e0111, 0x00000a1b }, + { 4, 0x00022010, 0x00000caa, 0x000e0111, 0x00000a1b }, + { 5, 0x00022010, 0x00000cae, 0x000e0111, 0x00000a1b }, + { 6, 0x00022010, 0x00000cb2, 0x000e0111, 0x00000a1b }, + { 7, 0x00022010, 0x00000cb6, 0x000e0111, 0x00000a1b }, + { 8, 0x00022010, 0x00000cba, 0x000e0111, 0x00000a1b }, + { 9, 0x00022010, 0x00000cbe, 0x000e0111, 0x00000a1b }, + { 10, 0x00022010, 0x00000d02, 0x000e0111, 0x00000a1b }, + { 11, 0x00022010, 0x00000d06, 0x000e0111, 0x00000a1b }, + { 12, 0x00022010, 0x00000d0a, 0x000e0111, 0x00000a1b }, + { 13, 0x00022010, 0x00000d0e, 0x000e0111, 0x00000a1b }, + { 14, 0x00022010, 0x00000d1a, 0x000e0111, 0x00000a03 }, }; /* - * RF value list for RF2525E & RF5222 + * RF value list for RF2524 * Supports: 2.4 GHz */ -static const u32 rf_vals_bg_5x[] = { - 0x00001136, 0x0000113a, 0x0000113e, 0x00001182, 0x00001186, - 0x0000118a, 0x0000118e, 0x00001192, 0x00001196, 0x0000119a, - 0x0000119e, 0x000011a2, 0x000011a6, 0x000011ae +static const struct rf_channel rf_vals_bg_2524[] = { + { 1, 0x00032020, 0x00000c9e, 0x00000101, 0x00000a1b }, + { 2, 0x00032020, 0x00000ca2, 0x00000101, 0x00000a1b }, + { 3, 0x00032020, 0x00000ca6, 0x00000101, 0x00000a1b }, + { 4, 0x00032020, 0x00000caa, 0x00000101, 0x00000a1b }, + { 5, 0x00032020, 0x00000cae, 0x00000101, 0x00000a1b }, + { 6, 0x00032020, 0x00000cb2, 0x00000101, 0x00000a1b }, + { 7, 0x00032020, 0x00000cb6, 0x00000101, 0x00000a1b }, + { 8, 0x00032020, 0x00000cba, 0x00000101, 0x00000a1b }, + { 9, 0x00032020, 0x00000cbe, 0x00000101, 0x00000a1b }, + { 10, 0x00032020, 0x00000d02, 0x00000101, 0x00000a1b }, + { 11, 0x00032020, 0x00000d06, 0x00000101, 0x00000a1b }, + { 12, 0x00032020, 0x00000d0a, 0x00000101, 0x00000a1b }, + { 13, 0x00032020, 0x00000d0e, 0x00000101, 0x00000a1b }, + { 14, 0x00032020, 0x00000d1a, 0x00000101, 0x00000a03 }, }; /* - * RF value list for RF5222 (supplement to rf_vals_bg_5x) - * Supports: 5.2 GHz + * RF value list for RF2525 + * Supports: 2.4 GHz + */ +static const struct rf_channel rf_vals_bg_2525[] = { + { 1, 0x00022020, 0x00080c9e, 0x00060111, 0x00000a1b }, + { 2, 0x00022020, 0x00080ca2, 0x00060111, 0x00000a1b }, + { 3, 0x00022020, 0x00080ca6, 0x00060111, 0x00000a1b }, + { 4, 0x00022020, 0x00080caa, 0x00060111, 0x00000a1b }, + { 5, 0x00022020, 0x00080cae, 0x00060111, 0x00000a1b }, + { 6, 0x00022020, 0x00080cb2, 0x00060111, 0x00000a1b }, + { 7, 0x00022020, 0x00080cb6, 0x00060111, 0x00000a1b }, + { 8, 0x00022020, 0x00080cba, 0x00060111, 0x00000a1b }, + { 9, 0x00022020, 0x00080cbe, 0x00060111, 0x00000a1b }, + { 10, 0x00022020, 0x00080d02, 0x00060111, 0x00000a1b }, + { 11, 0x00022020, 0x00080d06, 0x00060111, 0x00000a1b }, + { 12, 0x00022020, 0x00080d0a, 0x00060111, 0x00000a1b }, + { 13, 0x00022020, 0x00080d0e, 0x00060111, 0x00000a1b }, + { 14, 0x00022020, 0x00080d1a, 0x00060111, 0x00000a03 }, +}; + +/* + * RF value list for RF2525e + * Supports: 2.4 GHz */ -static const u32 rf_vals_a_5x[] = { - 0x00018896, 0x0001889a, 0x0001889e, 0x000188a2, 0x000188a6, - 0x000188aa, 0x000188ae, 0x000188b2, 0x00008802, 0x00008806, - 0x0000880a, 0x0000880e, 0x00008812, 0x00008816, 0x0000881a, - 0x0000881e, 0x00008822, 0x00008826, 0x0000882a, 0x000090a6, - 0x000090ae, 0x000090b6, 0x000090be +static const struct rf_channel rf_vals_bg_2525e[] = { + { 1, 0x00022020, 0x00081136, 0x00060111, 0x00000a0b }, + { 2, 0x00022020, 0x0008113a, 0x00060111, 0x00000a0b }, + { 3, 0x00022020, 0x0008113e, 0x00060111, 0x00000a0b }, + { 4, 0x00022020, 0x00081182, 0x00060111, 0x00000a0b }, + { 5, 0x00022020, 0x00081186, 0x00060111, 0x00000a0b }, + { 6, 0x00022020, 0x0008118a, 0x00060111, 0x00000a0b }, + { 7, 0x00022020, 0x0008118e, 0x00060111, 0x00000a0b }, + { 8, 0x00022020, 0x00081192, 0x00060111, 0x00000a0b }, + { 9, 0x00022020, 0x00081196, 0x00060111, 0x00000a0b }, + { 10, 0x00022020, 0x0008119a, 0x00060111, 0x00000a0b }, + { 11, 0x00022020, 0x0008119e, 0x00060111, 0x00000a0b }, + { 12, 0x00022020, 0x000811a2, 0x00060111, 0x00000a0b }, + { 13, 0x00022020, 0x000811a6, 0x00060111, 0x00000a0b }, + { 14, 0x00022020, 0x000811ae, 0x00060111, 0x00000a1b }, +}; + +/* + * RF value list for RF5222 + * Supports: 2.4 GHz & 5.2 GHz + */ +static const struct rf_channel rf_vals_5222[] = { + { 1, 0x00022020, 0x00001136, 0x00000101, 0x00000a0b }, + { 2, 0x00022020, 0x0000113a, 0x00000101, 0x00000a0b }, + { 3, 0x00022020, 0x0000113e, 0x00000101, 0x00000a0b }, + { 4, 0x00022020, 0x00001182, 0x00000101, 0x00000a0b }, + { 5, 0x00022020, 0x00001186, 0x00000101, 0x00000a0b }, + { 6, 0x00022020, 0x0000118a, 0x00000101, 0x00000a0b }, + { 7, 0x00022020, 0x0000118e, 0x00000101, 0x00000a0b }, + { 8, 0x00022020, 0x00001192, 0x00000101, 0x00000a0b }, + { 9, 0x00022020, 0x00001196, 0x00000101, 0x00000a0b }, + { 10, 0x00022020, 0x0000119a, 0x00000101, 0x00000a0b }, + { 11, 0x00022020, 0x0000119e, 0x00000101, 0x00000a0b }, + { 12, 0x00022020, 0x000011a2, 0x00000101, 0x00000a0b }, + { 13, 0x00022020, 0x000011a6, 0x00000101, 0x00000a0b }, + { 14, 0x00022020, 0x000011ae, 0x00000101, 0x00000a1b }, + + /* 802.11 UNI / HyperLan 2 */ + { 36, 0x00022010, 0x00018896, 0x00000101, 0x00000a1f }, + { 40, 0x00022010, 0x0001889a, 0x00000101, 0x00000a1f }, + { 44, 0x00022010, 0x0001889e, 0x00000101, 0x00000a1f }, + { 48, 0x00022010, 0x000188a2, 0x00000101, 0x00000a1f }, + { 52, 0x00022010, 0x000188a6, 0x00000101, 0x00000a1f }, + { 66, 0x00022010, 0x000188aa, 0x00000101, 0x00000a1f }, + { 60, 0x00022010, 0x000188ae, 0x00000101, 0x00000a1f }, + { 64, 0x00022010, 0x000188b2, 0x00000101, 0x00000a1f }, + + /* 802.11 HyperLan 2 */ + { 100, 0x00022010, 0x00008802, 0x00000101, 0x00000a0f }, + { 104, 0x00022010, 0x00008806, 0x00000101, 0x00000a0f }, + { 108, 0x00022010, 0x0000880a, 0x00000101, 0x00000a0f }, + { 112, 0x00022010, 0x0000880e, 0x00000101, 0x00000a0f }, + { 116, 0x00022010, 0x00008812, 0x00000101, 0x00000a0f }, + { 120, 0x00022010, 0x00008816, 0x00000101, 0x00000a0f }, + { 124, 0x00022010, 0x0000881a, 0x00000101, 0x00000a0f }, + { 128, 0x00022010, 0x0000881e, 0x00000101, 0x00000a0f }, + { 132, 0x00022010, 0x00008822, 0x00000101, 0x00000a0f }, + { 136, 0x00022010, 0x00008826, 0x00000101, 0x00000a0f }, + + /* 802.11 UNII */ + { 140, 0x00022010, 0x0000882a, 0x00000101, 0x00000a0f }, + { 149, 0x00022020, 0x000090a6, 0x00000101, 0x00000a07 }, + { 153, 0x00022020, 0x000090ae, 0x00000101, 0x00000a07 }, + { 157, 0x00022020, 0x000090b6, 0x00000101, 0x00000a07 }, + { 161, 0x00022020, 0x000090be, 0x00000101, 0x00000a07 }, }; static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) @@ -1724,26 +1779,29 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) */ spec->num_modes = 2; spec->num_rates = 12; - 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; - - if (rt2x00_rf(&rt2x00dev->chip, RF2522)) - spec->chan_val_bg = rf_vals_bg_2522; - else if (rt2x00_rf(&rt2x00dev->chip, RF2523) || - rt2x00_rf(&rt2x00dev->chip, RF2524) || - rt2x00_rf(&rt2x00dev->chip, RF2525)) - spec->chan_val_bg = rf_vals_bg_252x; - else if (rt2x00_rf(&rt2x00dev->chip, RF2525E) || - rt2x00_rf(&rt2x00dev->chip, RF5222)) - spec->chan_val_bg = rf_vals_bg_5x; - - if (rt2x00_rf(&rt2x00dev->chip, RF5222)) { + + if (rt2x00_rf(&rt2x00dev->chip, RF2522)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522); + spec->channels = rf_vals_bg_2522; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2523)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2523); + spec->channels = rf_vals_bg_2523; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2524)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2524); + spec->channels = rf_vals_bg_2524; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2525)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525); + spec->channels = rf_vals_bg_2525; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2525E)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e); + spec->channels = rf_vals_bg_2525e; + } else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) { + spec->num_channels = ARRAY_SIZE(rf_vals_5222); + spec->channels = rf_vals_5222; spec->num_modes = 3; - spec->num_channels += 23; - spec->chan_val_a = rf_vals_a_5x; } } diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index e9f6747..25d0aec 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -429,84 +429,16 @@ static void rt2500usb_config_phymode(struct rt2x00_dev *rt2x00dev, } } -static const struct { - unsigned int chip; - u32 val[3]; -} rf_vals[] = { - { RF2522, { 0x00002050, 0x00000101, 0x00000000 } }, - { RF2523, { 0x00022010, 0x000e0111, 0x00000a1b } }, - { RF2524, { 0x00032020, 0x00000101, 0x00000a1b } }, - { RF2525, { 0x00022020, 0x00060111, 0x00000a1b } }, - { RF2525E, { 0x00022010, 0x00060111, 0x00000000 } }, -}; - -static void rt2500usb_get_rf_vals(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, - struct rf_reg *reg) -{ - unsigned int i; - - reg->rf1 = 0; - reg->rf2 = value; - reg->rf3 = 0; - reg->rf4 = 0; - - if (rt2x00_rf(&rt2x00dev->chip, RF5222)) { - reg->rf3 = 0x00000101; - if (channel < 14) { - reg->rf1 = 0x00022020; - reg->rf4 = 0x00000a0b; - } else if (channel == 14) { - reg->rf1 = 0x00022010; - reg->rf4 = 0x00000a1b; - } else if (channel < 64) { - reg->rf1 = 0x00022010; - reg->rf4 = 0x00000a1f; - } else if (channel < 140) { - reg->rf1 = 0x00022010; - reg->rf4 = 0x00000a0f; - } else if (channel < 161) { - reg->rf1 = 0x00022020; - reg->rf4 = 0x00000a07; - } - } else { - if (rt2x00_rf(&rt2x00dev->chip, RF2525)) - reg->rf2 |= 0x00080000; - - for (i = 0; i < ARRAY_SIZE(rf_vals); i++) { - if (rt2x00_rf(&rt2x00dev->chip, rf_vals[i].chip)) { - reg->rf1 = rf_vals[i].val[0]; - reg->rf3 = rf_vals[i].val[1]; - reg->rf4 = rf_vals[i].val[2]; - } - } - - if ((rt2x00_rf(&rt2x00dev->chip, RF2523) || - rt2x00_rf(&rt2x00dev->chip, RF2524) || - rt2x00_rf(&rt2x00dev->chip, RF2525)) && - channel == 14) - reg->rf4 &= ~0x00000018; - else if (rt2x00_rf(&rt2x00dev->chip, RF2525E)) { - if (channel & 0x01) - reg->rf4 = 0x00000e1b; - else - reg->rf4 = 0x00000e07; - if (channel == 14) - reg->rf4 = 0x00000e23; - } - } -} - static void rt2500usb_config_channel(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, + const int index, const int channel, const int txpower) { - struct rf_reg reg; + struct rf_channel reg; /* * Fill rf_reg structure. */ - rt2500usb_get_rf_vals(rt2x00dev, value, channel, ®); + memcpy(®, &rt2x00dev->spec.channels[index], sizeof(reg)); /* * Set TXpower. @@ -1374,45 +1306,155 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev) * RF value list for RF2522 * Supports: 2.4 GHz */ -static const u32 rf_vals_bg_2522[] = { - 0x000c1fda, 0x000c1fee, 0x000c2002, 0x000c2016, 0x000c202a, - 0x000c203e, 0x000c2052, 0x000c2066, 0x000c207a, 0x000c208e, - 0x000c20a2, 0x000c20b6, 0x000c20ca, 0x000c20fa +static const struct rf_channel rf_vals_bg_2522[] = { + { 1, 0x00002050, 0x000c1fda, 0x00000101, 0 }, + { 2, 0x00002050, 0x000c1fee, 0x00000101, 0 }, + { 3, 0x00002050, 0x000c2002, 0x00000101, 0 }, + { 4, 0x00002050, 0x000c2016, 0x00000101, 0 }, + { 5, 0x00002050, 0x000c202a, 0x00000101, 0 }, + { 6, 0x00002050, 0x000c203e, 0x00000101, 0 }, + { 7, 0x00002050, 0x000c2052, 0x00000101, 0 }, + { 8, 0x00002050, 0x000c2066, 0x00000101, 0 }, + { 9, 0x00002050, 0x000c207a, 0x00000101, 0 }, + { 10, 0x00002050, 0x000c208e, 0x00000101, 0 }, + { 11, 0x00002050, 0x000c20a2, 0x00000101, 0 }, + { 12, 0x00002050, 0x000c20b6, 0x00000101, 0 }, + { 13, 0x00002050, 0x000c20ca, 0x00000101, 0 }, + { 14, 0x00002050, 0x000c20fa, 0x00000101, 0 }, +}; + +/* + * RF value list for RF2523 + * Supports: 2.4 GHz + */ +static const struct rf_channel rf_vals_bg_2523[] = { + { 1, 0x00022010, 0x00000c9e, 0x000e0111, 0x00000a1b }, + { 2, 0x00022010, 0x00000ca2, 0x000e0111, 0x00000a1b }, + { 3, 0x00022010, 0x00000ca6, 0x000e0111, 0x00000a1b }, + { 4, 0x00022010, 0x00000caa, 0x000e0111, 0x00000a1b }, + { 5, 0x00022010, 0x00000cae, 0x000e0111, 0x00000a1b }, + { 6, 0x00022010, 0x00000cb2, 0x000e0111, 0x00000a1b }, + { 7, 0x00022010, 0x00000cb6, 0x000e0111, 0x00000a1b }, + { 8, 0x00022010, 0x00000cba, 0x000e0111, 0x00000a1b }, + { 9, 0x00022010, 0x00000cbe, 0x000e0111, 0x00000a1b }, + { 10, 0x00022010, 0x00000d02, 0x000e0111, 0x00000a1b }, + { 11, 0x00022010, 0x00000d06, 0x000e0111, 0x00000a1b }, + { 12, 0x00022010, 0x00000d0a, 0x000e0111, 0x00000a1b }, + { 13, 0x00022010, 0x00000d0e, 0x000e0111, 0x00000a1b }, + { 14, 0x00022010, 0x00000d1a, 0x000e0111, 0x00000a03 }, }; /* - * RF value list for RF2523, RF2524 & RF2525 + * RF value list for RF2524 * Supports: 2.4 GHz */ -static const u32 rf_vals_bg_252x[] = { - 0x00000c9e, 0x00000ca2, 0x00000ca6, 0x00000caa, 0x00000cae, - 0x00000cb2, 0x00000cb6, 0x00000cba, 0x00000cbe, 0x00000d02, - 0x00000d06, 0x00000d0a, 0x00000d0e, 0x00000d1a +static const struct rf_channel rf_vals_bg_2524[] = { + { 1, 0x00032020, 0x00000c9e, 0x00000101, 0x00000a1b }, + { 2, 0x00032020, 0x00000ca2, 0x00000101, 0x00000a1b }, + { 3, 0x00032020, 0x00000ca6, 0x00000101, 0x00000a1b }, + { 4, 0x00032020, 0x00000caa, 0x00000101, 0x00000a1b }, + { 5, 0x00032020, 0x00000cae, 0x00000101, 0x00000a1b }, + { 6, 0x00032020, 0x00000cb2, 0x00000101, 0x00000a1b }, + { 7, 0x00032020, 0x00000cb6, 0x00000101, 0x00000a1b }, + { 8, 0x00032020, 0x00000cba, 0x00000101, 0x00000a1b }, + { 9, 0x00032020, 0x00000cbe, 0x00000101, 0x00000a1b }, + { 10, 0x00032020, 0x00000d02, 0x00000101, 0x00000a1b }, + { 11, 0x00032020, 0x00000d06, 0x00000101, 0x00000a1b }, + { 12, 0x00032020, 0x00000d0a, 0x00000101, 0x00000a1b }, + { 13, 0x00032020, 0x00000d0e, 0x00000101, 0x00000a1b }, + { 14, 0x00032020, 0x00000d1a, 0x00000101, 0x00000a03 }, }; /* - * RF value list for RF2525E + * RF value list for RF2525 * Supports: 2.4 GHz */ -static const u32 rf_vals_bg_2525e[] = { - 0x0000089a, 0x0000089e, 0x0000089e, 0x000008a2, 0x000008a2, - 0x000008a6, 0x000008a6, 0x000008aa, 0x000008aa, 0x000008ae, - 0x000008ae, 0x000008b2, 0x000008b2, 0x000008b6 +static const struct rf_channel rf_vals_bg_2525[] = { + { 1, 0x00022020, 0x00080c9e, 0x00060111, 0x00000a1b }, + { 2, 0x00022020, 0x00080ca2, 0x00060111, 0x00000a1b }, + { 3, 0x00022020, 0x00080ca6, 0x00060111, 0x00000a1b }, + { 4, 0x00022020, 0x00080caa, 0x00060111, 0x00000a1b }, + { 5, 0x00022020, 0x00080cae, 0x00060111, 0x00000a1b }, + { 6, 0x00022020, 0x00080cb2, 0x00060111, 0x00000a1b }, + { 7, 0x00022020, 0x00080cb6, 0x00060111, 0x00000a1b }, + { 8, 0x00022020, 0x00080cba, 0x00060111, 0x00000a1b }, + { 9, 0x00022020, 0x00080cbe, 0x00060111, 0x00000a1b }, + { 10, 0x00022020, 0x00080d02, 0x00060111, 0x00000a1b }, + { 11, 0x00022020, 0x00080d06, 0x00060111, 0x00000a1b }, + { 12, 0x00022020, 0x00080d0a, 0x00060111, 0x00000a1b }, + { 13, 0x00022020, 0x00080d0e, 0x00060111, 0x00000a1b }, + { 14, 0x00022020, 0x00080d1a, 0x00060111, 0x00000a03 }, +}; + +/* + * RF value list for RF2525e + * Supports: 2.4 GHz + */ +static const struct rf_channel rf_vals_bg_2525e[] = { + { 1, 0x00022010, 0x0000089a, 0x00060111, 0x00000e1b }, + { 2, 0x00022010, 0x0000089e, 0x00060111, 0x00000e07 }, + { 3, 0x00022010, 0x0000089e, 0x00060111, 0x00000e1b }, + { 4, 0x00022010, 0x000008a2, 0x00060111, 0x00000e07 }, + { 5, 0x00022010, 0x000008a2, 0x00060111, 0x00000e1b }, + { 6, 0x00022010, 0x000008a6, 0x00060111, 0x00000e07 }, + { 7, 0x00022010, 0x000008a6, 0x00060111, 0x00000e1b }, + { 8, 0x00022010, 0x000008aa, 0x00060111, 0x00000e07 }, + { 9, 0x00022010, 0x000008aa, 0x00060111, 0x00000e1b }, + { 10, 0x00022010, 0x000008ae, 0x00060111, 0x00000e07 }, + { 11, 0x00022010, 0x000008ae, 0x00060111, 0x00000e1b }, + { 12, 0x00022010, 0x000008b2, 0x00060111, 0x00000e07 }, + { 13, 0x00022010, 0x000008b2, 0x00060111, 0x00000e1b }, + { 14, 0x00022010, 0x000008b6, 0x00060111, 0x00000e23 }, }; /* * RF value list for RF5222 * Supports: 2.4 GHz & 5.2 GHz */ -static const u32 rf_vals_abg_5222[] = { - 0x00001136, 0x0000113a, 0x0000113e, 0x00001182, 0x00001186, - 0x0000118a, 0x0000118e, 0x00001192, 0x00001196, 0x0000119a, - 0x0000119e, 0x000011a2, 0x000011a6, 0x000011ae, 0x0001889a, - 0x0001889a, 0x0001889e, 0x000188a2, 0x000188a6, 0x000188aa, - 0x000188ae, 0x000188b2, 0x00008802, 0x00008806, 0x0000880a, - 0x0000880e, 0x00008812, 0x00008816, 0x0000881a, 0x0000881e, - 0x00008822, 0x00008826, 0x0000882a, 0x000090a6, 0x000090ae, - 0x000090b6, 0x000090be +static const struct rf_channel rf_vals_5222[] = { + { 1, 0x00022020, 0x00001136, 0x00000101, 0x00000a0b }, + { 2, 0x00022020, 0x0000113a, 0x00000101, 0x00000a0b }, + { 3, 0x00022020, 0x0000113e, 0x00000101, 0x00000a0b }, + { 4, 0x00022020, 0x00001182, 0x00000101, 0x00000a0b }, + { 5, 0x00022020, 0x00001186, 0x00000101, 0x00000a0b }, + { 6, 0x00022020, 0x0000118a, 0x00000101, 0x00000a0b }, + { 7, 0x00022020, 0x0000118e, 0x00000101, 0x00000a0b }, + { 8, 0x00022020, 0x00001192, 0x00000101, 0x00000a0b }, + { 9, 0x00022020, 0x00001196, 0x00000101, 0x00000a0b }, + { 10, 0x00022020, 0x0000119a, 0x00000101, 0x00000a0b }, + { 11, 0x00022020, 0x0000119e, 0x00000101, 0x00000a0b }, + { 12, 0x00022020, 0x000011a2, 0x00000101, 0x00000a0b }, + { 13, 0x00022020, 0x000011a6, 0x00000101, 0x00000a0b }, + { 14, 0x00022020, 0x000011ae, 0x00000101, 0x00000a1b }, + + /* 802.11 UNI / HyperLan 2 */ + { 36, 0x00022010, 0x00018896, 0x00000101, 0x00000a1f }, + { 40, 0x00022010, 0x0001889a, 0x00000101, 0x00000a1f }, + { 44, 0x00022010, 0x0001889e, 0x00000101, 0x00000a1f }, + { 48, 0x00022010, 0x000188a2, 0x00000101, 0x00000a1f }, + { 52, 0x00022010, 0x000188a6, 0x00000101, 0x00000a1f }, + { 66, 0x00022010, 0x000188aa, 0x00000101, 0x00000a1f }, + { 60, 0x00022010, 0x000188ae, 0x00000101, 0x00000a1f }, + { 64, 0x00022010, 0x000188b2, 0x00000101, 0x00000a1f }, + + /* 802.11 HyperLan 2 */ + { 100, 0x00022010, 0x00008802, 0x00000101, 0x00000a0f }, + { 104, 0x00022010, 0x00008806, 0x00000101, 0x00000a0f }, + { 108, 0x00022010, 0x0000880a, 0x00000101, 0x00000a0f }, + { 112, 0x00022010, 0x0000880e, 0x00000101, 0x00000a0f }, + { 116, 0x00022010, 0x00008812, 0x00000101, 0x00000a0f }, + { 120, 0x00022010, 0x00008816, 0x00000101, 0x00000a0f }, + { 124, 0x00022010, 0x0000881a, 0x00000101, 0x00000a0f }, + { 128, 0x00022010, 0x0000881e, 0x00000101, 0x00000a0f }, + { 132, 0x00022010, 0x00008822, 0x00000101, 0x00000a0f }, + { 136, 0x00022010, 0x00008826, 0x00000101, 0x00000a0f }, + + /* 802.11 UNII */ + { 140, 0x00022010, 0x0000882a, 0x00000101, 0x00000a0f }, + { 149, 0x00022020, 0x000090a6, 0x00000101, 0x00000a07 }, + { 153, 0x00022020, 0x000090ae, 0x00000101, 0x00000a07 }, + { 157, 0x00022020, 0x000090b6, 0x00000101, 0x00000a07 }, + { 161, 0x00022020, 0x000090be, 0x00000101, 0x00000a07 }, }; static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) @@ -1455,27 +1497,29 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) */ spec->num_modes = 2; spec->num_rates = 12; - 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; - - if (rt2x00_rf(&rt2x00dev->chip, RF2522)) - spec->chan_val_bg = rf_vals_bg_2522; - else if (rt2x00_rf(&rt2x00dev->chip, RF2523) || - rt2x00_rf(&rt2x00dev->chip, RF2524) || - rt2x00_rf(&rt2x00dev->chip, RF2525)) - spec->chan_val_bg = rf_vals_bg_252x; - else if (rt2x00_rf(&rt2x00dev->chip, RF2525E)) - spec->chan_val_bg = rf_vals_bg_2525e; - else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) - spec->chan_val_bg = rf_vals_abg_5222; - - if (rt2x00_rf(&rt2x00dev->chip, RF5222)) { + + if (rt2x00_rf(&rt2x00dev->chip, RF2522)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522); + spec->channels = rf_vals_bg_2522; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2523)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2523); + spec->channels = rf_vals_bg_2523; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2524)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2524); + spec->channels = rf_vals_bg_2524; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2525)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525); + spec->channels = rf_vals_bg_2525; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2525E)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e); + spec->channels = rf_vals_bg_2525e; + } else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) { + spec->num_channels = ARRAY_SIZE(rf_vals_5222); + spec->channels = rf_vals_5222; spec->num_modes = 3; - spec->num_channels += 23; - spec->chan_val_a = &rf_vals_abg_5222[14]; } } diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index 5c6d7d0..cfd5384 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -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; }; /* diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c index f952595..3671f74 100644 --- a/drivers/net/wireless/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00dev.c @@ -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); } /* diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index 8c6c778..d0c2323 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -436,192 +436,17 @@ static void rt61pci_config_phymode(struct rt2x00_dev *rt2x00dev, rt61pci_config_rate(rt2x00dev, rate->val2); } -static void rt61pci_get_rf_vals(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, - struct rf_reg *reg) -{ - reg->rf1 = 0; - reg->rf2 = value; - reg->rf3 = 0; - reg->rf4 = 0; - - if (!test_bit(CONFIG_RF_SEQUENCE, &rt2x00dev->flags) || channel <= 14) - reg->rf1 = 0x00002ccc; - else if (channel == 36 || - (channel >= 100 && channel <= 116) || - channel >= 157) - reg->rf1 = 0x00002cd4; - else - reg->rf1 = 0x00002cd0; - - if (channel <= 14) { - reg->rf3 = 0x00068455; - } else if (!test_bit(CONFIG_RF_SEQUENCE, &rt2x00dev->flags)) { - if (channel >= 36 && channel <= 48) - reg->rf3 = 0x0009be55; - else if (channel >= 52 && channel <= 64) - reg->rf3 = 0x0009ae55; - else if (channel >= 100 && channel <= 112) - reg->rf3 = 0x000bae55; - else - reg->rf3 = 0x000bbe55; - } else { - switch (channel) { - case 36: - case 40: - case 44: - reg->rf3 = 0x00098455; - break; - case 48: - reg->rf3 = 0x00098655; - break; - case 52: - reg->rf3 = 0x00098855; - break; - case 56: - reg->rf3 = 0x00098c55; - case 60: - reg->rf3 = 0x00098e55; - break; - case 64: - reg->rf3 = 0x00099255; - break; - case 100: - case 104: - case 108: - reg->rf3 = 0x000b9855; - break; - case 112: - case 116: - case 120: - case 124: - reg->rf3 = 0x000b9a55; - break; - case 128: - case 132: - reg->rf3 = 0x000b9c55; - break; - case 136: - case 140: - reg->rf3 = 0x000b9e55; - break; - case 149: - case 153: - case 157: - case 161: - case 165: - reg->rf3 = 0x000ba255; - break; - } - } - - if (channel < 14) { - if (channel & 1) - reg->rf4 = 0x000ffa0b; - else - reg->rf4 = 0x000ffa1f; - } else if (channel == 14) { - reg->rf4 = 0x000ffa13; - } else if (!test_bit(CONFIG_RF_SEQUENCE, &rt2x00dev->flags)) { - switch (channel) { - case 36: - case 56: - case 116: - case 136: - reg->rf4 = 0x000ffa23; - break; - case 40: - case 60: - case 100: - case 120: - case 140: - reg->rf4 = 0x000ffa03; - break; - case 44: - case 64: - case 104: - case 124: - reg->rf4 = 0x000ffa0b; - break; - case 48: - case 108: - case 128: - reg->rf4 = 0x000ffa13; - break; - case 52: - case 112: - case 132: - reg->rf4 = 0x000ffa1b; - break; - case 149: - reg->rf4 = 0x000ffa1f; - break; - case 153: - reg->rf4 = 0x000ffa27; - break; - case 157: - reg->rf4 = 0x000ffa07; - break; - case 161: - reg->rf4 = 0x000ffa0f; - break; - case 165: - reg->rf4 = 0x000ffa17; - break; - } - } else { - switch (channel) { - case 36: - case 40: - case 60: - case 140: - case 100: - case 104: - case 108: - case 112: - case 116: - case 120: - reg->rf4 = 0x000c0a03; - break; - case 44: - case 64: - case 124: - case 149: - reg->rf4 = 0x000c0a1b; - break; - case 48: - case 128: - case 153: - reg->rf4 = 0x000c0a0b; - break; - case 52: - case 132: - reg->rf4 = 0x000c0a23; - break; - case 56: - case 136: - reg->rf4 = 0x000c0a13; - break; - case 157: - case 161: - case 165: - reg->rf4 = 0x000c0a17; - break; - } - } -} - static void rt61pci_config_channel(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, + const int index, const int channel, const int txpower) { - struct rf_reg reg; + struct rf_channel reg; u8 bbp = 0; /* * Fill rf_reg structure. */ - rt61pci_get_rf_vals(rt2x00dev, value, channel, ®); + memcpy(®, &rt2x00dev->spec.channels[index], sizeof(reg)); /* * Set TXpower. @@ -666,7 +491,7 @@ static void rt61pci_config_channel(struct rt2x00_dev *rt2x00dev, static void rt61pci_config_txpower(struct rt2x00_dev *rt2x00dev, const int txpower) { - struct rf_reg rf; + struct rf_channel rf; rt2x00_rf_read(rt2x00dev, 1, &rf.rf1); rt2x00_rf_read(rt2x00dev, 2, &rf.rf2); @@ -2176,37 +2001,117 @@ static int rt61pci_init_eeprom(struct rt2x00_dev *rt2x00dev) } /* - * RF value list for RF5225, RF5325, RF2527 & RF2529 - * Supports: 2.4 GHz + * RF value list for RF5225 & RF5325 + * Supports: 2.4 GHz & 5.2 GHz, rf_sequence disabled */ -static const u32 rf_vals_bg[] = { - 0x00004786, 0x00004786, 0x0000478a, 0x0000478a, 0x0000478e, - 0x0000478e, 0x00004792, 0x00004792, 0x00004796, 0x00004796, - 0x0000479a, 0x0000479a, 0x0000479e, 0x000047a2 +static const struct rf_channel rf_vals_noseq[] = { + { 1, 0x00002ccc, 0x00004786, 0x00068455, 0x000ffa0b }, + { 2, 0x00002ccc, 0x00004786, 0x00068455, 0x000ffa1f }, + { 3, 0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa0b }, + { 4, 0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa1f }, + { 5, 0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa0b }, + { 6, 0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa1f }, + { 7, 0x00002ccc, 0x00004792, 0x00068455, 0x000ffa0b }, + { 8, 0x00002ccc, 0x00004792, 0x00068455, 0x000ffa1f }, + { 9, 0x00002ccc, 0x00004796, 0x00068455, 0x000ffa0b }, + { 10, 0x00002ccc, 0x00004796, 0x00068455, 0x000ffa1f }, + { 11, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa0b }, + { 12, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa1f }, + { 13, 0x00002ccc, 0x0000479e, 0x00068455, 0x000ffa0b }, + { 14, 0x00002ccc, 0x000047a2, 0x00068455, 0x000ffa13 }, + + /* 802.11 UNI / HyperLan 2 */ + { 36, 0x00002ccc, 0x0000499a, 0x0009be55, 0x000ffa23 }, + { 40, 0x00002ccc, 0x000049a2, 0x0009be55, 0x000ffa03 }, + { 44, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000ffa0b }, + { 48, 0x00002ccc, 0x000049aa, 0x0009be55, 0x000ffa13 }, + { 52, 0x00002ccc, 0x000049ae, 0x0009ae55, 0x000ffa1b }, + { 56, 0x00002ccc, 0x000049b2, 0x0009ae55, 0x000ffa23 }, + { 60, 0x00002ccc, 0x000049ba, 0x0009ae55, 0x000ffa03 }, + { 64, 0x00002ccc, 0x000049be, 0x0009ae55, 0x000ffa0b }, + + /* 802.11 HyperLan 2 */ + { 100, 0x00002ccc, 0x00004a2a, 0x000bae55, 0x000ffa03 }, + { 104, 0x00002ccc, 0x00004a2e, 0x000bae55, 0x000ffa0b }, + { 108, 0x00002ccc, 0x00004a32, 0x000bae55, 0x000ffa13 }, + { 112, 0x00002ccc, 0x00004a36, 0x000bae55, 0x000ffa1b }, + { 116, 0x00002ccc, 0x00004a3a, 0x000bbe55, 0x000ffa23 }, + { 120, 0x00002ccc, 0x00004a82, 0x000bbe55, 0x000ffa03 }, + { 124, 0x00002ccc, 0x00004a86, 0x000bbe55, 0x000ffa0b }, + { 128, 0x00002ccc, 0x00004a8a, 0x000bbe55, 0x000ffa13 }, + { 132, 0x00002ccc, 0x00004a8e, 0x000bbe55, 0x000ffa1b }, + { 136, 0x00002ccc, 0x00004a92, 0x000bbe55, 0x000ffa23 }, + + /* 802.11 UNII */ + { 140, 0x00002ccc, 0x00004a9a, 0x000bbe55, 0x000ffa03 }, + { 149, 0x00002ccc, 0x00004aa2, 0x000bbe55, 0x000ffa1f }, + { 153, 0x00002ccc, 0x00004aa6, 0x000bbe55, 0x000ffa27 }, + { 157, 0x00002ccc, 0x00004aae, 0x000bbe55, 0x000ffa07 }, + { 161, 0x00002ccc, 0x00004ab2, 0x000bbe55, 0x000ffa0f }, + { 165, 0x00002ccc, 0x00004ab6, 0x000bbe55, 0x000ffa17 }, + + /* MMAC(Japan)J52 ch 34,38,42,46 */ + { 34, 0x00002ccc, 0x0000499a, 0x0009be55, 0x000ffa0b }, + { 38, 0x00002ccc, 0x0000499e, 0x0009be55, 0x000ffa13 }, + { 42, 0x00002ccc, 0x000049a2, 0x0009be55, 0x000ffa1b }, + { 46, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000ffa23 }, }; /* - * RF value list for RF5225 & RF5325 (supplement to vals_bg) - * Supports: 5.2 GHz, rf_sequence disabled + * RF value list for RF5225 & RF5325 + * Supports: 2.4 GHz & 5.2 GHz, rf_sequence enabled */ -static const u32 rf_vals_a_5x_noseq[] = { - 0x0000499a, 0x000049a2, 0x000049a6, 0x000049aa, 0x000049ae, - 0x000049b2, 0x000049ba, 0x000049be, 0x00004a2a, 0x00004a2e, - 0x00004a32, 0x00004a36, 0x00004a3a, 0x00004a82, 0x00004a86, - 0x00004a8a, 0x00004a8e, 0x00004a92, 0x00004a9a, 0x00004aa2, - 0x00004aa6, 0x00004aae, 0x00004ab2, 0x00004ab6 -}; - -/* - * RF value list for RF5225 & RF5325 (supplement to vals_bg) - * Supports: 5.2 GHz, rf_sequence enabled - */ -static const u32 rf_vals_a_5x_seq[] = { - 0x0004481a, 0x00044682, 0x00044686, 0x0004468e, 0x00044692, - 0x0004469a, 0x000446a2, 0x000446a6, 0x0004489a, 0x000448a2, - 0x000448aa, 0x000448b2, 0x000448ba, 0x00044702, 0x00044706, - 0x0004470e, 0x00044712, 0x0004471a, 0x00044722, 0x0004472e, - 0x00044736, 0x0004490a, 0x00044912, 0x0004491a +static const struct rf_channel rf_vals_seq[] = { + { 1, 0x00002ccc, 0x00004786, 0x00068455, 0x000ffa0b }, + { 2, 0x00002ccc, 0x00004786, 0x00068455, 0x000ffa1f }, + { 3, 0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa0b }, + { 4, 0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa1f }, + { 5, 0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa0b }, + { 6, 0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa1f }, + { 7, 0x00002ccc, 0x00004792, 0x00068455, 0x000ffa0b }, + { 8, 0x00002ccc, 0x00004792, 0x00068455, 0x000ffa1f }, + { 9, 0x00002ccc, 0x00004796, 0x00068455, 0x000ffa0b }, + { 10, 0x00002ccc, 0x00004796, 0x00068455, 0x000ffa1f }, + { 11, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa0b }, + { 12, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa1f }, + { 13, 0x00002ccc, 0x0000479e, 0x00068455, 0x000ffa0b }, + { 14, 0x00002ccc, 0x000047a2, 0x00068455, 0x000ffa13 }, + + /* 802.11 UNI / HyperLan 2 */ + { 36, 0x00002cd4, 0x0004481a, 0x00098455, 0x000c0a03 }, + { 40, 0x00002cd0, 0x00044682, 0x00098455, 0x000c0a03 }, + { 44, 0x00002cd0, 0x00044686, 0x00098455, 0x000c0a1b }, + { 48, 0x00002cd0, 0x0004468e, 0x00098655, 0x000c0a0b }, + { 52, 0x00002cd0, 0x00044692, 0x00098855, 0x000c0a23 }, + { 56, 0x00002cd0, 0x0004469a, 0x00098c55, 0x000c0a13 }, + { 60, 0x00002cd0, 0x000446a2, 0x00098e55, 0x000c0a03 }, + { 64, 0x00002cd0, 0x000446a6, 0x00099255, 0x000c0a1b }, + + /* 802.11 HyperLan 2 */ + { 100, 0x00002cd4, 0x0004489a, 0x000b9855, 0x000c0a03 }, + { 104, 0x00002cd4, 0x000448a2, 0x000b9855, 0x000c0a03 }, + { 108, 0x00002cd4, 0x000448aa, 0x000b9855, 0x000c0a03 }, + { 112, 0x00002cd4, 0x000448b2, 0x000b9a55, 0x000c0a03 }, + { 116, 0x00002cd4, 0x000448ba, 0x000b9a55, 0x000c0a03 }, + { 120, 0x00002cd0, 0x00044702, 0x000b9a55, 0x000c0a03 }, + { 124, 0x00002cd0, 0x00044706, 0x000b9a55, 0x000c0a1b }, + { 128, 0x00002cd0, 0x0004470e, 0x000b9c55, 0x000c0a0b }, + { 132, 0x00002cd0, 0x00044712, 0x000b9c55, 0x000c0a23 }, + { 136, 0x00002cd0, 0x0004471a, 0x000b9e55, 0x000c0a13 }, + + /* 802.11 UNII */ + { 140, 0x00002cd0, 0x00044722, 0x000b9e55, 0x000c0a03 }, + { 149, 0x00002cd0, 0x0004472e, 0x000ba255, 0x000c0a1b }, + { 153, 0x00002cd0, 0x00044736, 0x000ba255, 0x000c0a0b }, + { 157, 0x00002cd4, 0x0004490a, 0x000ba255, 0x000c0a17 }, + { 161, 0x00002cd4, 0x00044912, 0x000ba255, 0x000c0a17 }, + { 165, 0x00002cd4, 0x0004491a, 0x000ba255, 0x000c0a17 }, + + /* MMAC(Japan)J52 ch 34,38,42,46 */ + { 34, 0x00002ccc, 0x0000499a, 0x0009be55, 0x000c0a0b }, + { 38, 0x00002ccc, 0x0000499e, 0x0009be55, 0x000c0a13 }, + { 42, 0x00002ccc, 0x000049a2, 0x0009be55, 0x000c0a1b }, + { 46, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000c0a23 }, }; static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) @@ -2248,27 +2153,28 @@ static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) */ spec->num_modes = 2; spec->num_rates = 12; - 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; + + if (!test_bit(CONFIG_RF_SEQUENCE, &rt2x00dev->flags)) { + spec->num_channels = 14; + spec->channels = rf_vals_noseq; + } else { + spec->num_channels = 14; + spec->channels = rf_vals_seq; + } if (rt2x00_rf(&rt2x00dev->chip, RF5225) || rt2x00_rf(&rt2x00dev->chip, RF5325)) { spec->num_modes = 3; - spec->num_channels += 24; + spec->num_channels = ARRAY_SIZE(rf_vals_seq); txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START); for (i = 0; i < 14; i++) txpower[i] = TXPOWER_FROM_DEV(txpower[i]); spec->tx_power_a = txpower; - if (!test_bit(CONFIG_RF_SEQUENCE, &rt2x00dev->flags)) - spec->chan_val_a = rf_vals_a_5x_noseq; - else - spec->chan_val_a = rf_vals_a_5x_seq; } } diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 30d4189..413725c 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -194,7 +194,13 @@ static void rt73usb_rf_write(const struct rt2x00_dev *rt2x00dev, rf_write: reg = 0; rt2x00_set_field32(®, PHY_CSR4_VALUE, value); - rt2x00_set_field32(®, PHY_CSR4_NUMBER_OF_BITS, 20); + + if (rt2x00_rf(&rt2x00dev->chip, RF5225) || + rt2x00_rf(&rt2x00dev->chip, RF2527)) + rt2x00_set_field32(®, PHY_CSR4_NUMBER_OF_BITS, 21); + else + rt2x00_set_field32(®, PHY_CSR4_NUMBER_OF_BITS, 20); + rt2x00_set_field32(®, PHY_CSR4_IF_SELECT, 0); rt2x00_set_field32(®, PHY_CSR4_BUSY, 1); @@ -406,123 +412,17 @@ static void rt73usb_config_phymode(struct rt2x00_dev *rt2x00dev, rt73usb_config_rate(rt2x00dev, rate->val2); } -static const struct { - unsigned int chip; - u32 val[3]; -} rf_vals[] = { - { RF5226, { 0x00002c0c, 0x00068255 } }, - { RF2528, { 0x00002c0c, 0x00068255 } }, - { RF5225, { 0x00002ccc, 0x00000000 } }, - { RF2527, { 0x00002ccc, 0x00068455 } }, -}; - -static void rt73usb_get_rf_vals(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, - struct rf_reg *reg) -{ - unsigned int i; - - reg->rf1 = 0; - reg->rf2 = value; - reg->rf3 = 0; - reg->rf4 = 0; - - for (i = 0; i < ARRAY_SIZE(rf_vals); i++) { - if (rt2x00_rf(&rt2x00dev->chip, rf_vals[i].chip)) { - reg->rf1 = rf_vals[i].val[0]; - reg->rf3 = rf_vals[i].val[1]; - } - } - - if (rt2x00_rf(&rt2x00dev->chip, RF5225) || - rt2x00_rf(&rt2x00dev->chip, RF2527)) - reg->rf2 |= 0x00004000; - - if (rt2x00_rf(&rt2x00dev->chip, RF5225)) { - if (channel <= 14) - reg->rf3 = 0x00068455; - else if (channel >= 36 && channel <= 48) - reg->rf3 = 0x0009be55; - else if (channel >= 52 && channel <= 64) - reg->rf3 = 0x0009ae55; - else if (channel >= 100 && channel <= 112) - reg->rf3 = 0x000bae55; - else - reg->rf3 = 0x000bbe55; - } - - if (channel < 14) { - if (channel & 0x01) - reg->rf4 = 0x000fea0b; - else - reg->rf4 = 0x000fea1f; - } else if (channel == 14) { - reg->rf4 = 0x000fea13; - } else { - switch (channel) { - case 36: - case 56: - case 116: - case 136: - reg->rf4 = 0x000fea23; - break; - case 40: - case 60: - case 100: - case 120: - case 140: - reg->rf4 = 0x000fea03; - break; - case 44: - case 64: - case 104: - case 124: - reg->rf4 = 0x000fea0b; - break; - case 48: - case 108: - case 128: - reg->rf4 = 0x000fea13; - break; - case 52: - case 112: - case 132: - reg->rf4 = 0x000fea1b; - break; - case 149: - reg->rf4 = 0x000fea1f; - break; - case 153: - reg->rf4 = 0x000fea27; - break; - case 157: - reg->rf4 = 0x000fea07; - break; - case 161: - reg->rf4 = 0x000fea0f; - break; - case 165: - reg->rf4 = 0x000fea17; - break; - } - } - - if (rt2x00_rf(&rt2x00dev->chip, RF2527) || - rt2x00_rf(&rt2x00dev->chip, RF5225)) - reg->rf4 |= 0x00010000; -} - static void rt73usb_config_channel(struct rt2x00_dev *rt2x00dev, - const int value, const int channel, + const int index, const int channel, const int txpower) { - struct rf_reg reg; + struct rf_channel reg; u8 bbp = 0; /* * Fill rf_reg structure. */ - rt73usb_get_rf_vals(rt2x00dev, value, channel, ®); + memcpy(®, &rt2x00dev->spec.channels[index], sizeof(reg)); /* * Set TXpower. @@ -563,7 +463,7 @@ static void rt73usb_config_channel(struct rt2x00_dev *rt2x00dev, static void rt73usb_config_txpower(struct rt2x00_dev *rt2x00dev, const int txpower) { - struct rf_reg rf; + struct rf_channel rf; rt2x00_rf_read(rt2x00dev, 1, &rf.rf1); rt2x00_rf_read(rt2x00dev, 2, &rf.rf2); @@ -1654,27 +1554,141 @@ static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev) } /* - * RF value list for RF5226, RF2528, RF5225 & RF2527 + * RF value list for RF2528 * Supports: 2.4 GHz */ -static const u32 rf_vals_bg[] = { - 0x00000786, 0x00000786, 0x0000078a, 0x0000078a, 0x0000078e, - 0x0000078e, 0x00000792, 0x00000792, 0x00000796, 0x00000796, - 0x0000079a, 0x0000079a, 0x0000079e, 0x000007a2 +static const struct rf_channel rf_vals_bg_2528[] = { + { 1, 0x00002c0c, 0x00000786, 0x00068255, 0x000fea0b }, + { 2, 0x00002c0c, 0x00000786, 0x00068255, 0x000fea1f }, + { 3, 0x00002c0c, 0x0000078a, 0x00068255, 0x000fea0b }, + { 4, 0x00002c0c, 0x0000078a, 0x00068255, 0x000fea1f }, + { 5, 0x00002c0c, 0x0000078e, 0x00068255, 0x000fea0b }, + { 6, 0x00002c0c, 0x0000078e, 0x00068255, 0x000fea1f }, + { 7, 0x00002c0c, 0x00000792, 0x00068255, 0x000fea0b }, + { 8, 0x00002c0c, 0x00000792, 0x00068255, 0x000fea1f }, + { 9, 0x00002c0c, 0x00000796, 0x00068255, 0x000fea0b }, + { 10, 0x00002c0c, 0x00000796, 0x00068255, 0x000fea1f }, + { 11, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea0b }, + { 12, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea1f }, + { 13, 0x00002c0c, 0x0000079e, 0x00068255, 0x000fea0b }, + { 14, 0x00002c0c, 0x000007a2, 0x00068255, 0x000fea13 }, +}; + +/* + * RF value list for RF5226 + * Supports: 2.4 GHz & 5.2 GHz + */ +static const struct rf_channel rf_vals_5226[] = { + { 1, 0x00002c0c, 0x00000786, 0x00068255, 0x000fea0b }, + { 2, 0x00002c0c, 0x00000786, 0x00068255, 0x000fea1f }, + { 3, 0x00002c0c, 0x0000078a, 0x00068255, 0x000fea0b }, + { 4, 0x00002c0c, 0x0000078a, 0x00068255, 0x000fea1f }, + { 5, 0x00002c0c, 0x0000078e, 0x00068255, 0x000fea0b }, + { 6, 0x00002c0c, 0x0000078e, 0x00068255, 0x000fea1f }, + { 7, 0x00002c0c, 0x00000792, 0x00068255, 0x000fea0b }, + { 8, 0x00002c0c, 0x00000792, 0x00068255, 0x000fea1f }, + { 9, 0x00002c0c, 0x00000796, 0x00068255, 0x000fea0b }, + { 10, 0x00002c0c, 0x00000796, 0x00068255, 0x000fea1f }, + { 11, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea0b }, + { 12, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea1f }, + { 13, 0x00002c0c, 0x0000079e, 0x00068255, 0x000fea0b }, + { 14, 0x00002c0c, 0x000007a2, 0x00068255, 0x000fea13 }, + + /* 802.11 UNI / HyperLan 2 */ + { 36, 0x00002c0c, 0x0000099a, 0x00098255, 0x000fea23 }, + { 40, 0x00002c0c, 0x000009a2, 0x00098255, 0x000fea03 }, + { 44, 0x00002c0c, 0x000009a6, 0x00098255, 0x000fea0b }, + { 48, 0x00002c0c, 0x000009aa, 0x00098255, 0x000fea13 }, + { 52, 0x00002c0c, 0x000009ae, 0x00098255, 0x000fea1b }, + { 56, 0x00002c0c, 0x000009b2, 0x00098255, 0x000fea23 }, + { 60, 0x00002c0c, 0x000009ba, 0x00098255, 0x000fea03 }, + { 64, 0x00002c0c, 0x000009be, 0x00098255, 0x000fea0b }, + + /* 802.11 HyperLan 2 */ + { 100, 0x00002c0c, 0x00000a2a, 0x000b8255, 0x000fea03 }, + { 104, 0x00002c0c, 0x00000a2e, 0x000b8255, 0x000fea0b }, + { 108, 0x00002c0c, 0x00000a32, 0x000b8255, 0x000fea13 }, + { 112, 0x00002c0c, 0x00000a36, 0x000b8255, 0x000fea1b }, + { 116, 0x00002c0c, 0x00000a3a, 0x000b8255, 0x000fea23 }, + { 120, 0x00002c0c, 0x00000a82, 0x000b8255, 0x000fea03 }, + { 124, 0x00002c0c, 0x00000a86, 0x000b8255, 0x000fea0b }, + { 128, 0x00002c0c, 0x00000a8a, 0x000b8255, 0x000fea13 }, + { 132, 0x00002c0c, 0x00000a8e, 0x000b8255, 0x000fea1b }, + { 136, 0x00002c0c, 0x00000a92, 0x000b8255, 0x000fea23 }, + + /* 802.11 UNII */ + { 140, 0x00002c0c, 0x00000a9a, 0x000b8255, 0x000fea03 }, + { 149, 0x00002c0c, 0x00000aa2, 0x000b8255, 0x000fea1f }, + { 153, 0x00002c0c, 0x00000aa6, 0x000b8255, 0x000fea27 }, + { 157, 0x00002c0c, 0x00000aae, 0x000b8255, 0x000fea07 }, + { 161, 0x00002c0c, 0x00000ab2, 0x000b8255, 0x000fea0f }, + { 165, 0x00002c0c, 0x00000ab6, 0x000b8255, 0x000fea17 }, + + /* MMAC(Japan)J52 ch 34,38,42,46 */ + { 34, 0x00002c0c, 0x0008099a, 0x000da255, 0x000d3a0b }, + { 38, 0x00002c0c, 0x0008099e, 0x000da255, 0x000d3a13 }, + { 42, 0x00002c0c, 0x000809a2, 0x000da255, 0x000d3a1b }, + { 46, 0x00002c0c, 0x000809a6, 0x000da255, 0x000d3a23 }, }; /* - * RF value list for RF5226 & RF5225 (supplement to vals_bg) - * Supports: 5.2 GHz + * RF value list for RF5225 & RF2527 + * Supports: 2.4 GHz & 5.2 GHz */ -static const u32 rf_vals_a_5x[] = { - 0x0000099a, 0x000009a2, 0x000009a6, 0x000009aa, 0x000009ae, - 0x000009b2, 0x000009ba, 0x000009be, 0x00000a2a, 0x00000a2e, - 0x00000a32, 0x00000a36, 0x00000a3a, 0x00000a82, 0x00000a86, - 0x00000a8a, 0x00000a8e, 0x00000a92, 0x00000a9a, 0x00000aa2, - 0x00000aa6, 0x00000aae, 0x00000ab2, 0x00000ab6 +static const struct rf_channel rf_vals_5225_2527[] = { + { 1, 0x00002ccc, 0x00004786, 0x00068455, 0x000ffa0b }, + { 2, 0x00002ccc, 0x00004786, 0x00068455, 0x000ffa1f }, + { 3, 0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa0b }, + { 4, 0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa1f }, + { 5, 0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa0b }, + { 6, 0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa1f }, + { 7, 0x00002ccc, 0x00004792, 0x00068455, 0x000ffa0b }, + { 8, 0x00002ccc, 0x00004792, 0x00068455, 0x000ffa1f }, + { 9, 0x00002ccc, 0x00004796, 0x00068455, 0x000ffa0b }, + { 10, 0x00002ccc, 0x00004796, 0x00068455, 0x000ffa1f }, + { 11, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa0b }, + { 12, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa1f }, + { 13, 0x00002ccc, 0x0000479e, 0x00068455, 0x000ffa0b }, + { 14, 0x00002ccc, 0x000047a2, 0x00068455, 0x000ffa13 }, + + /* 802.11 UNI / HyperLan 2 */ + { 36, 0x00002ccc, 0x0000499a, 0x0009be55, 0x000ffa23 }, + { 40, 0x00002ccc, 0x000049a2, 0x0009be55, 0x000ffa03 }, + { 44, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000ffa0b }, + { 48, 0x00002ccc, 0x000049aa, 0x0009be55, 0x000ffa13 }, + { 52, 0x00002ccc, 0x000049ae, 0x0009ae55, 0x000ffa1b }, + { 56, 0x00002ccc, 0x000049b2, 0x0009ae55, 0x000ffa23 }, + { 60, 0x00002ccc, 0x000049ba, 0x0009ae55, 0x000ffa03 }, + { 64, 0x00002ccc, 0x000049be, 0x0009ae55, 0x000ffa0b }, + + /* 802.11 HyperLan 2 */ + { 100, 0x00002ccc, 0x00004a2a, 0x000bae55, 0x000ffa03 }, + { 104, 0x00002ccc, 0x00004a2e, 0x000bae55, 0x000ffa0b }, + { 108, 0x00002ccc, 0x00004a32, 0x000bae55, 0x000ffa13 }, + { 112, 0x00002ccc, 0x00004a36, 0x000bae55, 0x000ffa1b }, + { 116, 0x00002ccc, 0x00004a3a, 0x000bbe55, 0x000ffa23 }, + { 120, 0x00002ccc, 0x00004a82, 0x000bbe55, 0x000ffa03 }, + { 124, 0x00002ccc, 0x00004a86, 0x000bbe55, 0x000ffa0b }, + { 128, 0x00002ccc, 0x00004a8a, 0x000bbe55, 0x000ffa13 }, + { 132, 0x00002ccc, 0x00004a8e, 0x000bbe55, 0x000ffa1b }, + { 136, 0x00002ccc, 0x00004a92, 0x000bbe55, 0x000ffa23 }, + + /* 802.11 UNII */ + { 140, 0x00002ccc, 0x00004a9a, 0x000bbe55, 0x000ffa03 }, + { 149, 0x00002ccc, 0x00004aa2, 0x000bbe55, 0x000ffa1f }, + { 153, 0x00002ccc, 0x00004aa6, 0x000bbe55, 0x000ffa27 }, + { 157, 0x00002ccc, 0x00004aae, 0x000bbe55, 0x000ffa07 }, + { 161, 0x00002ccc, 0x00004ab2, 0x000bbe55, 0x000ffa0f }, + { 165, 0x00002ccc, 0x00004ab6, 0x000bbe55, 0x000ffa17 }, + + /* MMAC(Japan)J52 ch 34,38,42,46 */ + { 34, 0x00002ccc, 0x0000499a, 0x0009be55, 0x000ffa0b }, + { 38, 0x00002ccc, 0x0000499e, 0x0009be55, 0x000ffa13 }, + { 42, 0x00002ccc, 0x000049a2, 0x0009be55, 0x000ffa1b }, + { 46, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000ffa23 }, }; + static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) { struct hw_mode_spec *spec = &rt2x00dev->spec; @@ -1714,24 +1728,33 @@ static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) */ spec->num_modes = 2; spec->num_rates = 12; - 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; + + if (rt2x00_rf(&rt2x00dev->chip, RF2528)) { + spec->num_channels = ARRAY_SIZE(rf_vals_bg_2528); + spec->channels = rf_vals_bg_2528; + } else if (rt2x00_rf(&rt2x00dev->chip, RF5226)) { + spec->num_channels = ARRAY_SIZE(rf_vals_5226); + spec->channels = rf_vals_5226; + } else if (rt2x00_rf(&rt2x00dev->chip, RF2527)) { + spec->num_channels = 14; + spec->channels = rf_vals_5225_2527; + } else if (rt2x00_rf(&rt2x00dev->chip, RF5225)) { + spec->num_channels = ARRAY_SIZE(rf_vals_5225_2527); + spec->channels = rf_vals_5225_2527; + } if (rt2x00_rf(&rt2x00dev->chip, RF5225) || rt2x00_rf(&rt2x00dev->chip, RF5226)) { spec->num_modes = 3; - spec->num_channels += 24; txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START); for (i = 0; i < 14; i++) txpower[i] = TXPOWER_FROM_DEV(txpower[i]); spec->tx_power_a = txpower; - spec->chan_val_a = rf_vals_a_5x; } } -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 12/30] rt2x00: Store firmware in memory 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (10 preceding siblings ...) 2007-08-19 18:25 ` [PATCH 11/30] rt2x00: Rework RF register handling Ivo van Doorn @ 2007-08-19 18:25 ` Ivo van Doorn 2007-08-19 18:54 ` Michael Buesch 2007-08-19 18:26 ` [PATCH 13/30] rt2x00: rt2x00_ring_free returns invalid length Ivo van Doorn ` (18 subsequent siblings) 30 siblings, 1 reply; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:25 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 6d620c9670f54eb0ce06bd771556e4ac413a2c48 Mon Sep 17 00:00:00 2001 From: Mattias Nissler <mattias.nissler@gmx.de> 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. Signed-off-by: Mattias Nissler <mattias.nissler@gmx.de> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index cfd5384..de1365f 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -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; }; /* diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c index 3671f74..50c604c 100644 --- a/drivers/net/wireless/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00dev.c @@ -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); diff --git a/drivers/net/wireless/rt2x00firmware.c b/drivers/net/wireless/rt2x00firmware.c index 63834f9..143e793 100644 --- a/drivers/net/wireless/rt2x00firmware.c +++ b/drivers/net/wireless/rt2x00firmware.c @@ -29,14 +29,13 @@ #define DRV_NAME "rt2x00lib" #include <linux/crc-itu-t.h> -#include <linux/firmware.h> #include <linux/kernel.h> #include <linux/module.h> #include "rt2x00.h" #include "rt2x00lib.h" -int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev) +static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev) { struct device *device = wiphy_dev(rt2x00dev->hw->wiphy); const struct firmware *fw; @@ -85,19 +84,43 @@ int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev) goto exit; } - /* - * Send firmware to the device. - */ - retval = rt2x00dev->ops->lib->load_firmware(rt2x00dev, - fw->data, fw->size); - if (retval) - goto exit; - INFO(rt2x00dev, "Firmware detected - version: %d.%d.\n", fw->data[fw->size - 4], fw->data[fw->size - 3]); + rt2x00dev->fw = fw; + + return 0; + exit: release_firmware(fw); return retval; } + +int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev) +{ + int retval; + + if (!rt2x00dev->fw) { + retval = rt2x00lib_request_firmware(rt2x00dev); + if (retval) + return retval; + } + + /* + * Send firmware to the device. + */ + retval = rt2x00dev->ops->lib->load_firmware(rt2x00dev, + rt2x00dev->fw->data, + rt2x00dev->fw->size); + return retval; +} + +void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev) +{ + if (rt2x00dev->fw) { + release_firmware(rt2x00dev->fw); + rt2x00dev->fw = NULL; + } +} + diff --git a/drivers/net/wireless/rt2x00lib.h b/drivers/net/wireless/rt2x00lib.h index 1a28292..1560f73 100644 --- a/drivers/net/wireless/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00lib.h @@ -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 */ /* -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH 12/30] rt2x00: Store firmware in memory 2007-08-19 18:25 ` [PATCH 12/30] rt2x00: Store firmware in memory Ivo van Doorn @ 2007-08-19 18:54 ` Michael Buesch 2007-08-19 20:44 ` Ivo van Doorn 0 siblings, 1 reply; 36+ messages in thread From: Michael Buesch @ 2007-08-19 18:54 UTC (permalink / raw) To: Ivo van Doorn; +Cc: John W. Linville, linux-wireless, rt2400-devel On Sunday 19 August 2007 20:25:39 Ivo van Doorn wrote: > +void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev) > +{ > + if (rt2x00dev->fw) { No !=NULL check is needed. > + release_firmware(rt2x00dev->fw); > + rt2x00dev->fw = NULL; > + } > +} -- Greetings Michael. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 12/30] rt2x00: Store firmware in memory 2007-08-19 18:54 ` Michael Buesch @ 2007-08-19 20:44 ` Ivo van Doorn 0 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 20:44 UTC (permalink / raw) To: Michael Buesch; +Cc: John W. Linville, linux-wireless, rt2400-devel On Sunday 19 August 2007, Michael Buesch wrote: > On Sunday 19 August 2007 20:25:39 Ivo van Doorn wrote: > > +void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev) > > +{ > > + if (rt2x00dev->fw) { > > No !=NULL check is needed. I'll fix this. Thanks :) Ivo > > + release_firmware(rt2x00dev->fw); > > + rt2x00dev->fw = NULL; > > + } > > +} > ^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH 13/30] rt2x00: rt2x00_ring_free returns invalid length 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (11 preceding siblings ...) 2007-08-19 18:25 ` [PATCH 12/30] rt2x00: Store firmware in memory Ivo van Doorn @ 2007-08-19 18:26 ` Ivo van Doorn 2007-08-19 18:26 ` [PATCH 14/30] Fix off-by-one error in debugfs helpers Ivo van Doorn ` (17 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:26 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 038b4a505c82c91a84caaf7832967ffac2faf93b Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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 Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00ring.h | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/rt2x00ring.h b/drivers/net/wireless/rt2x00ring.h index 2adc8e5..9c94d06 100644 --- a/drivers/net/wireless/rt2x00ring.h +++ b/drivers/net/wireless/rt2x00ring.h @@ -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; } /* -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 14/30] Fix off-by-one error in debugfs helpers 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (12 preceding siblings ...) 2007-08-19 18:26 ` [PATCH 13/30] rt2x00: rt2x00_ring_free returns invalid length Ivo van Doorn @ 2007-08-19 18:26 ` Ivo van Doorn 2007-08-19 18:26 ` [PATCH 15/30] rt2x00: Use caching for USB transfers Ivo van Doorn ` (16 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:26 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 089bfb50f6f9426f1dfd48bfb07455224484b847 Mon Sep 17 00:00:00 2001 From: Luca Tettamanti <kronos.it@gmail.com> 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. Signed-Off-By: Luca Tettamanti <kronos.it@gmail.com> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00debug.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/rt2x00debug.c b/drivers/net/wireless/rt2x00debug.c index d6c4cfe..c7b331c 100644 --- a/drivers/net/wireless/rt2x00debug.c +++ b/drivers/net/wireless/rt2x00debug.c @@ -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)) \ -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 15/30] rt2x00: Use caching for USB transfers 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (13 preceding siblings ...) 2007-08-19 18:26 ` [PATCH 14/30] Fix off-by-one error in debugfs helpers Ivo van Doorn @ 2007-08-19 18:26 ` Ivo van Doorn 2007-08-19 18:27 ` [PATCH 16/30] rt2x00: Cleanup set_state for rt61 and rt73 Ivo van Doorn ` (15 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:26 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From b75e79133fbff5d1b4cde7fc2ec362ad433c019f Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index 25d0aec..5e3cdf5 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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, - ®, sizeof(u16), REGISTER_TIMEOUT); + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, + USB_VENDOR_REQUEST_IN, offset, + ®, 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, - ®, sizeof(u16), REGISTER_TIMEOUT); + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE, + USB_VENDOR_REQUEST_OUT, offset, + ®, 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, ®); rt2x00_set_field16(®, TXRX_CSR2_DISABLE_RX, 1); diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h index de1365f..24ad264 100644 --- a/drivers/net/wireless/rt2x00.h +++ b/drivers/net/wireless/rt2x00.h @@ -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. diff --git a/drivers/net/wireless/rt2x00usb.c b/drivers/net/wireless/rt2x00usb.c index 6dd0801..d832d5f 100644 --- a/drivers/net/wireless/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00usb.c @@ -39,24 +39,23 @@ * Interfacing with the HW. */ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev, - const u8 request, const u8 type, const u16 offset, - u32 value, void *buffer, const u16 buffer_length, - const u16 timeout) + const u8 request, const u8 requesttype, + const u16 offset, const u16 value, + void *buffer, const u16 buffer_length, + u16 timeout) { struct usb_device *usb_dev = interface_to_usbdev(rt2x00dev_usb(rt2x00dev)); int status; unsigned int i; - unsigned int time = timeout; + unsigned int pipe = + (requesttype == USB_VENDOR_REQUEST_IN) ? + usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0); for (i = 0; i < REGISTER_BUSY_COUNT; i++) { - status = usb_control_msg(usb_dev, - ((type == USB_VENDOR_REQUEST_IN) ? - usb_rcvctrlpipe(usb_dev, 0) : - usb_sndctrlpipe(usb_dev, 0)), - request, type, value, offset, - buffer, buffer_length, time); - + status = usb_control_msg(usb_dev, pipe, request, requesttype, + value, offset, buffer, buffer_length, + timeout); if (status >= 0) return 0; @@ -66,7 +65,7 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev, * -ENODEV: Device has disappeared, no point continuing. */ if (status == -ETIMEDOUT) - time *= 2; + timeout *= 2; else if (status == -ENODEV) break; } @@ -79,6 +78,35 @@ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev, } EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request); +int rt2x00usb_vendor_request_buff(const struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, void *buffer, + const u16 buffer_length, u16 timeout) +{ + int status; + + /* + * Check for Cache availability. + */ + if (unlikely(!rt2x00dev->csr_cache || buffer_length > CSR_CACHE_SIZE)) { + ERROR(rt2x00dev, "CSR cache not available.\n"); + return -ENOMEM; + } + + if (requesttype == USB_VENDOR_REQUEST_OUT) + memcpy(rt2x00dev->csr_cache, buffer, buffer_length); + + status = rt2x00usb_vendor_request(rt2x00dev, request, requesttype, + offset, 0, rt2x00dev->csr_cache, + buffer_length, timeout); + + if (!status && requesttype == USB_VENDOR_REQUEST_IN) + memcpy(buffer, rt2x00dev->csr_cache, buffer_length); + + return status; +} +EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_buff); + /* * Beacon handlers. */ @@ -386,9 +414,8 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev) struct data_ring *ring; unsigned int i; - rt2x00usb_vendor_request(rt2x00dev, USB_RX_CONTROL, - USB_VENDOR_REQUEST_OUT, 0x00, 0x00, - NULL, 0, REGISTER_TIMEOUT); + rt2x00usb_vendor_request_sw(rt2x00dev, USB_RX_CONTROL, 0x0000, 0x0000, + REGISTER_TIMEOUT); /* * Cancel all rings. @@ -489,6 +516,21 @@ EXPORT_SYMBOL_GPL(rt2x00usb_uninitialize); /* * USB driver handlers. */ +static int rt2x00usb_alloc_csr(struct rt2x00_dev *rt2x00dev) +{ + rt2x00dev->csr_cache = kzalloc(CSR_CACHE_SIZE, GFP_KERNEL); + if (!rt2x00dev->csr_cache) + return -ENOMEM; + + return 0; +} + +static void rt2x00usb_free_csr(struct rt2x00_dev *rt2x00dev) +{ + kfree(rt2x00dev->csr_cache); + rt2x00dev->csr_cache = NULL; +} + static int rt2x00usb_alloc_eeprom(struct rt2x00_dev *rt2x00dev) { rt2x00dev->eeprom = kzalloc(rt2x00dev->ops->eeprom_size, GFP_KERNEL); @@ -544,10 +586,14 @@ int rt2x00usb_probe(struct usb_interface *usb_intf, rt2x00dev->ops = ops; rt2x00dev->hw = hw; - retval = rt2x00usb_alloc_eeprom(rt2x00dev); + retval = rt2x00usb_alloc_csr(rt2x00dev); if (retval) goto exit_free_device; + retval = rt2x00usb_alloc_eeprom(rt2x00dev); + if (retval) + goto exit_free_cr; + retval = rt2x00usb_alloc_rf(rt2x00dev); if (retval) goto exit_free_eeprom; @@ -564,6 +610,9 @@ exit_free_rf: exit_free_eeprom: rt2x00usb_free_eeprom(rt2x00dev); +exit_free_cr: + rt2x00usb_free_csr(rt2x00dev); + exit_free_device: ieee80211_free_hw(hw); @@ -587,6 +636,7 @@ void rt2x00usb_disconnect(struct usb_interface *usb_intf) rt2x00lib_remove_dev(rt2x00dev); rt2x00usb_free_rf(rt2x00dev); rt2x00usb_free_eeprom(rt2x00dev); + rt2x00usb_free_csr(rt2x00dev); ieee80211_free_hw(hw); /* @@ -610,6 +660,7 @@ int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state) rt2x00usb_free_rf(rt2x00dev); rt2x00usb_free_eeprom(rt2x00dev); + rt2x00usb_free_csr(rt2x00dev); /* * Decrease usbdev refcount. @@ -628,10 +679,14 @@ int rt2x00usb_resume(struct usb_interface *usb_intf) usb_get_dev(interface_to_usbdev(usb_intf)); - retval = rt2x00usb_alloc_eeprom(rt2x00dev); + retval = rt2x00usb_alloc_csr(rt2x00dev); if (retval) return retval; + retval = rt2x00usb_alloc_eeprom(rt2x00dev); + if (retval) + goto exit_free_csr; + retval = rt2x00usb_alloc_rf(rt2x00dev); if (retval) goto exit_free_eeprom; @@ -648,6 +703,9 @@ exit_free_rf: exit_free_eeprom: rt2x00usb_free_eeprom(rt2x00dev); +exit_free_csr: + rt2x00usb_free_csr(rt2x00dev); + return retval; } EXPORT_SYMBOL_GPL(rt2x00usb_resume); diff --git a/drivers/net/wireless/rt2x00usb.h b/drivers/net/wireless/rt2x00usb.h index 56044f6..eb410d2 100644 --- a/drivers/net/wireless/rt2x00usb.h +++ b/drivers/net/wireless/rt2x00usb.h @@ -48,6 +48,12 @@ #define REGISTER_TIMEOUT_FIRMWARE 1000 /* + * Cache size + */ +#define CSR_CACHE_SIZE 8 +#define CSR_CACHE_SIZE_FIRMWARE 64 + +/* * USB request types. */ #define USB_VENDOR_REQUEST ( USB_TYPE_VENDOR | USB_RECIP_DEVICE ) @@ -79,21 +85,63 @@ #define USB_MODE_WAKEUP 0x09 /* RT73USB */ /* - * Register access. + * Used to read/write from/to the device. + * This is the main function to communicate with the device, + * the buffer argument _must_ either be NULL or point to + * a buffer allocated by kmalloc. Failure to do so can lead + * to unexpected behavior depending on the architecture. */ int rt2x00usb_vendor_request(const struct rt2x00_dev *rt2x00dev, - const u8 request, const u8 type, const u16 offset, - u32 value, void *buffer, const u16 buffer_length, - const u16 timeout); + const u8 request, const u8 requesttype, + const u16 offset, const u16 value, + void *buffer, const u16 buffer_length, + u16 timeout); +/* + * Used to read/write from/to the device. + * This function will use a previously with kmalloc allocated cache + * to communicate with the device. The contents of the buffer pointer + * will be copied to this cache when writing, or read from the cache + * when reading. + * Buffers send to rt2x00usb_vendor_request _must_ be allocated with + * kmalloc. Hence the reason for using a previously allocated cache + * which has been allocated properly. + */ +int rt2x00usb_vendor_request_buff(const struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, void *buffer, + const u16 buffer_length, u16 timeout); + +/* + * Simple wrapper around rt2x00usb_vendor_request to write a single + * command to the device. Since we don't use the buffer argument we + * don't have to worry about kmalloc here. + */ +static inline int rt2x00usb_vendor_request_sw(const struct rt2x00_dev + *rt2x00dev, + const u8 request, + const u16 offset, + const u16 value, + int timeout) +{ + return rt2x00usb_vendor_request(rt2x00dev, request, + USB_VENDOR_REQUEST_OUT, offset, + value, NULL, 0, timeout); +} + +/* + * Simple wrapper around rt2x00usb_vendor_request to read the eeprom + * from the device. Note that the eeprom argument _must_ be allocated using + * kmalloc for correct handling inside the kernel USB layer. + */ static inline int rt2x00usb_eeprom_read(const struct rt2x00_dev *rt2x00dev, __le16 *eeprom, const u16 lenght) { int timeout = REGISTER_TIMEOUT * (lenght / sizeof(u16)); return rt2x00usb_vendor_request(rt2x00dev, USB_EEPROM_READ, - USB_VENDOR_REQUEST_IN, 0x00, 0x00, - eeprom, lenght, timeout); + USB_VENDOR_REQUEST_IN, 0x0000, + 0x0000, eeprom, lenght, timeout); } /* diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 413725c..0d9c1b9 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -57,9 +57,9 @@ static inline void rt73usb_register_read(const struct rt2x00_dev *rt2x00dev, const unsigned int offset, u32 *value) { __le32 reg; - rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_READ, - USB_VENDOR_REQUEST_IN, offset, 0x00, - ®, sizeof(u32), REGISTER_TIMEOUT); + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, + USB_VENDOR_REQUEST_IN, offset, + ®, sizeof(u32), REGISTER_TIMEOUT); *value = le32_to_cpu(reg); } @@ -68,19 +68,19 @@ static inline void rt73usb_register_multiread(const struct rt2x00_dev const unsigned int offset, void *value, const u32 length) { - rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_READ, - USB_VENDOR_REQUEST_IN, offset, 0x00, - value, length, - REGISTER_TIMEOUT * (length / sizeof(u32))); + int timeout = REGISTER_TIMEOUT * (length / sizeof(u32)); + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, + USB_VENDOR_REQUEST_IN, offset, + value, length, timeout); } static inline void rt73usb_register_write(const struct rt2x00_dev *rt2x00dev, const unsigned int offset, u32 value) { __le32 reg = cpu_to_le32(value); - rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE, - USB_VENDOR_REQUEST_OUT, offset, 0x00, - ®, sizeof(u32), REGISTER_TIMEOUT); + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE, + USB_VENDOR_REQUEST_OUT, offset, + ®, sizeof(u32), REGISTER_TIMEOUT); } static inline void rt73usb_register_multiwrite(const struct rt2x00_dev @@ -88,10 +88,10 @@ static inline void rt73usb_register_multiwrite(const struct rt2x00_dev const unsigned int offset, void *value, const u32 length) { - rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE, - USB_VENDOR_REQUEST_OUT, offset, 0x00, - value, length, - REGISTER_TIMEOUT * (length / sizeof(u32))); + int timeout = REGISTER_TIMEOUT * (length / sizeof(u32)); + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE, + USB_VENDOR_REQUEST_OUT, offset, + value, length, timeout); } static u32 rt73usb_bbp_check(const struct rt2x00_dev *rt2x00dev) @@ -684,9 +684,8 @@ static void rt73usb_enable_led(struct rt2x00_dev *rt2x00dev) rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_LINK_BG_STATUS, 1); - rt2x00usb_vendor_request(rt2x00dev, USB_LED_CONTROL, - USB_VENDOR_REQUEST_OUT, 0x00, - rt2x00dev->led_reg, NULL, 0, REGISTER_TIMEOUT); + rt2x00usb_vendor_request_sw(rt2x00dev, USB_LED_CONTROL, 0x0000, + rt2x00dev->led_reg, REGISTER_TIMEOUT); } static void rt73usb_disable_led(struct rt2x00_dev *rt2x00dev) @@ -695,9 +694,8 @@ static void rt73usb_disable_led(struct rt2x00_dev *rt2x00dev) rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_LINK_BG_STATUS, 0); rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_LINK_A_STATUS, 0); - rt2x00usb_vendor_request(rt2x00dev, USB_LED_CONTROL, - USB_VENDOR_REQUEST_OUT, 0x00, - rt2x00dev->led_reg, NULL, 0, REGISTER_TIMEOUT); + rt2x00usb_vendor_request_sw(rt2x00dev, USB_LED_CONTROL, 0x0000, + rt2x00dev->led_reg, REGISTER_TIMEOUT); } static void rt73usb_activity_led(struct rt2x00_dev *rt2x00dev, int rssi) @@ -726,9 +724,8 @@ static void rt73usb_activity_led(struct rt2x00_dev *rt2x00dev, int rssi) else led = 5; - rt2x00usb_vendor_request(rt2x00dev, USB_LED_CONTROL, - USB_VENDOR_REQUEST_OUT, led, - rt2x00dev->led_reg, NULL, 0, REGISTER_TIMEOUT); + rt2x00usb_vendor_request_sw(rt2x00dev, USB_LED_CONTROL, led, + rt2x00dev->led_reg, REGISTER_TIMEOUT); } /* @@ -886,9 +883,10 @@ static int rt73usb_load_firmware(struct rt2x00_dev *rt2x00dev, void *data, unsigned int i; int status; u32 reg; - char buf[64]; char *ptr = data; + char *cache; int buflen; + int timeout; /* * Wait for stable hardware. @@ -907,23 +905,39 @@ static int rt73usb_load_firmware(struct rt2x00_dev *rt2x00dev, void *data, /* * Write firmware to device. + * We setup a seperate cache for this action, + * since we are going to write larger chunks of data + * then normally used cache size. */ - for (i = 0; i < len; i += sizeof(buf)) { - buflen = min(len - i, sizeof(buf)); - memcpy(buf, ptr, buflen); - rt73usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE + i, - buf, buflen); + cache = kmalloc(CSR_CACHE_SIZE_FIRMWARE, GFP_KERNEL); + if (!cache) { + ERROR(rt2x00dev, "Failed to allocate firmware cache.\n"); + return -ENOMEM; + } + + for (i = 0; i < len; i += CSR_CACHE_SIZE_FIRMWARE) { + buflen = min_t(int, len - i, CSR_CACHE_SIZE_FIRMWARE); + timeout = REGISTER_TIMEOUT * (buflen / sizeof(u32)); + + memcpy(cache, ptr ,buflen); + + rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE, + USB_VENDOR_REQUEST_OUT, + FIRMWARE_IMAGE_BASE + i, 0x0000, + cache, buflen, timeout); + ptr += buflen; } + kfree(cache); + /* * Send firmware request to device to load firmware, * we need to specify a long timeout time. */ - status = rt2x00usb_vendor_request(rt2x00dev, USB_DEVICE_MODE, - USB_VENDOR_REQUEST_OUT, 0x00, - USB_MODE_FIRMWARE, NULL, 0, - REGISTER_TIMEOUT_FIRMWARE); + status = rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, + 0x0000, USB_MODE_FIRMWARE, + REGISTER_TIMEOUT_FIRMWARE); if (status < 0) { ERROR(rt2x00dev, "Failed to write Firmware to device.\n"); return status; @@ -1143,10 +1157,8 @@ 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(rt2x00dev, USB_DEVICE_MODE, - USB_VENDOR_REQUEST_OUT, 0x00, - USB_MODE_WAKEUP, NULL, 0, - REGISTER_TIMEOUT); + rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0x0000, + USB_MODE_WAKEUP, REGISTER_TIMEOUT); rt73usb_register_read(rt2x00dev, MAC_CSR12, ®); rt2x00_set_field32(®, MAC_CSR12_FORCE_WAKEUP, !put_to_sleep); @@ -1154,10 +1166,8 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state) rt73usb_register_write(rt2x00dev, MAC_CSR12, reg); if (put_to_sleep) - rt2x00usb_vendor_request(rt2x00dev, USB_DEVICE_MODE, - USB_VENDOR_REQUEST_OUT, 0x00, - USB_MODE_SLEEP, NULL, 0, - REGISTER_TIMEOUT); + 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. -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 16/30] rt2x00: Cleanup set_state for rt61 and rt73 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (14 preceding siblings ...) 2007-08-19 18:26 ` [PATCH 15/30] rt2x00: Use caching for USB transfers Ivo van Doorn @ 2007-08-19 18:27 ` Ivo van Doorn 2007-08-19 18:27 ` [PATCH 17/30] rt2x00: Fix register initialization ordering Ivo van Doorn ` (14 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:27 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 252c0576e50c72fed7a52777b5a4abf962b8ae43 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt61pci.c | 12 ------------ drivers/net/wireless/rt73usb.c | 8 -------- 2 files changed, 0 insertions(+), 20 deletions(-) diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index d0c2323..1a4957b 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -1423,18 +1423,6 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state) rt2x00_set_field32(®, 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 diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 0d9c1b9..85dfc58 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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, ®); rt2x00_set_field32(®, MAC_CSR12_FORCE_WAKEUP, !put_to_sleep); rt2x00_set_field32(®, 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 -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 17/30] rt2x00: Fix register initialization ordering 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (15 preceding siblings ...) 2007-08-19 18:27 ` [PATCH 16/30] rt2x00: Cleanup set_state for rt61 and rt73 Ivo van Doorn @ 2007-08-19 18:27 ` Ivo van Doorn 2007-08-19 18:27 ` [PATCH 18/30] rt2x00: memset descriptor before use Ivo van Doorn ` (13 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:27 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 34548ad3e92237fb9ce91be9d09a5877f782c321 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index 7bd975d..b673d61 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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, ®); - rt2x00_set_field32(®, MACCSR2_DELAY, 64); - rt2x00pci_register_write(rt2x00dev, MACCSR2, reg); + rt2x00pci_register_read(rt2x00dev, ARCSR0, ®); + rt2x00_set_field32(®, ARCSR0_AR_BBP_DATA0, 133); + rt2x00_set_field32(®, ARCSR0_AR_BBP_ID0, 134); + rt2x00_set_field32(®, ARCSR0_AR_BBP_DATA1, 136); + rt2x00_set_field32(®, ARCSR0_AR_BBP_ID1, 135); + rt2x00pci_register_write(rt2x00dev, ARCSR0, reg); rt2x00pci_register_read(rt2x00dev, RXCSR3, ®); - /* - * Tx power. - */ - rt2x00_set_field32(®, RXCSR3_BBP_ID0, 3); + rt2x00_set_field32(®, RXCSR3_BBP_ID0, 3); /* Tx power.*/ rt2x00_set_field32(®, RXCSR3_BBP_ID0_VALID, 1); - /* - * Signal. - */ - rt2x00_set_field32(®, RXCSR3_BBP_ID1, 32); + rt2x00_set_field32(®, RXCSR3_BBP_ID1, 32); /* Signal */ rt2x00_set_field32(®, RXCSR3_BBP_ID1_VALID, 1); - /* - * Rssi. - */ - rt2x00_set_field32(®, RXCSR3_BBP_ID2, 36); + rt2x00_set_field32(®, RXCSR3_BBP_ID2, 36); /* Rssi */ rt2x00_set_field32(®, 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, ®); + rt2x00_set_field32(®, MACCSR2_DELAY, 64); + rt2x00pci_register_write(rt2x00dev, MACCSR2, reg); + rt2x00pci_register_read(rt2x00dev, RALINKCSR, ®); rt2x00_set_field32(®, RALINKCSR_AR_BBP_DATA0, 17); rt2x00_set_field32(®, RALINKCSR_AR_BBP_ID0, 154); diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index d6b88f6..bfd6426 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -894,21 +894,6 @@ static int rt2500pci_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_read(rt2x00dev, PCICSR, ®); - rt2x00_set_field32(®, PCICSR_BIG_ENDIAN, 0); - rt2x00_set_field32(®, PCICSR_RX_TRESHOLD, 0); - rt2x00_set_field32(®, PCICSR_TX_TRESHOLD, 3); - rt2x00_set_field32(®, PCICSR_BURST_LENTH, 1); - rt2x00_set_field32(®, PCICSR_ENABLE_CLK, 1); - rt2x00_set_field32(®, PCICSR_READ_MULTIPLE, 1); - rt2x00_set_field32(®, PCICSR_WRITE_INVALID, 1); - rt2x00pci_register_write(rt2x00dev, PCICSR, reg); - rt2x00pci_register_write(rt2x00dev, PSCSR0, 0x00020002); rt2x00pci_register_write(rt2x00dev, PSCSR1, 0x00000002); rt2x00pci_register_write(rt2x00dev, PSCSR2, 0x00020002); @@ -925,18 +910,6 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev) rt2x00dev->rx->data_size / 128); rt2x00pci_register_write(rt2x00dev, CSR9, reg); - rt2x00pci_register_write(rt2x00dev, CNT3, 0); - - rt2x00pci_register_write(rt2x00dev, GPIOCSR, 0x0000ff00); - rt2x00pci_register_write(rt2x00dev, TESTCSR, 0x000000f0); - - rt2x00pci_register_write(rt2x00dev, MACCSR0, 0x00213223); - rt2x00pci_register_write(rt2x00dev, MACCSR1, 0x00235518); - - rt2x00pci_register_read(rt2x00dev, MACCSR2, ®); - rt2x00_set_field32(®, MACCSR2_DELAY, 64); - rt2x00pci_register_write(rt2x00dev, MACCSR2, reg); - /* * Always use CWmin and CWmax set in descriptor. */ @@ -944,29 +917,55 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev) rt2x00_set_field32(®, CSR11_CW_SELECT, 0); rt2x00pci_register_write(rt2x00dev, CSR11, reg); + rt2x00pci_register_write(rt2x00dev, CNT3, 0); + + rt2x00pci_register_read(rt2x00dev, TXCSR8, ®); + rt2x00_set_field32(®, TXCSR8_CCK_SIGNAL, 0x8a); + rt2x00_set_field32(®, TXCSR8_CCK_SERVICE, 0x8b); + rt2x00_set_field32(®, TXCSR8_CCK_LENGTH_LOW, 0x8d); + rt2x00_set_field32(®, TXCSR8_CCK_LENGTH_HIGH, 0x8c); + rt2x00pci_register_write(rt2x00dev, TXCSR8, reg); + + rt2x00pci_register_write(rt2x00dev, ARTCSR0, 0x7038140a); + rt2x00pci_register_write(rt2x00dev, ARTCSR1, 0x1d21252d); + rt2x00pci_register_write(rt2x00dev, ARTCSR2, 0x1919191d); + rt2x00pci_register_read(rt2x00dev, RXCSR3, ®); - /* - * Signal. - */ - rt2x00_set_field32(®, RXCSR3_BBP_ID0, 47); + rt2x00_set_field32(®, RXCSR3_BBP_ID0, 47); /* Signal */ rt2x00_set_field32(®, RXCSR3_BBP_ID0_VALID, 1); - /* - * Rssi. - */ - rt2x00_set_field32(®, RXCSR3_BBP_ID1, 51); + rt2x00_set_field32(®, RXCSR3_BBP_ID1, 51); /* Rssi */ rt2x00_set_field32(®, RXCSR3_BBP_ID1_VALID, 1); - /* - * OFDM Rate. - */ - rt2x00_set_field32(®, RXCSR3_BBP_ID2, 42); + rt2x00_set_field32(®, RXCSR3_BBP_ID2, 42); /* OFDM Rate */ rt2x00_set_field32(®, RXCSR3_BBP_ID2_VALID, 1); - /* - * OFDM. - */ - rt2x00_set_field32(®, RXCSR3_BBP_ID3, 51); + rt2x00_set_field32(®, RXCSR3_BBP_ID3, 51); /* OFDM */ rt2x00_set_field32(®, RXCSR3_BBP_ID3_VALID, 1); rt2x00pci_register_write(rt2x00dev, RXCSR3, reg); + rt2x00pci_register_read(rt2x00dev, PCICSR, ®); + rt2x00_set_field32(®, PCICSR_BIG_ENDIAN, 0); + rt2x00_set_field32(®, PCICSR_RX_TRESHOLD, 0); + rt2x00_set_field32(®, PCICSR_TX_TRESHOLD, 3); + rt2x00_set_field32(®, PCICSR_BURST_LENTH, 1); + rt2x00_set_field32(®, PCICSR_ENABLE_CLK, 1); + rt2x00_set_field32(®, PCICSR_READ_MULTIPLE, 1); + rt2x00_set_field32(®, PCICSR_WRITE_INVALID, 1); + rt2x00pci_register_write(rt2x00dev, PCICSR, reg); + + rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100); + + rt2x00pci_register_write(rt2x00dev, GPIOCSR, 0x0000ff00); + rt2x00pci_register_write(rt2x00dev, TESTCSR, 0x000000f0); + + if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE)) + return -EBUSY; + + rt2x00pci_register_write(rt2x00dev, MACCSR0, 0x00213223); + rt2x00pci_register_write(rt2x00dev, MACCSR1, 0x00235518); + + rt2x00pci_register_read(rt2x00dev, MACCSR2, ®); + rt2x00_set_field32(®, MACCSR2_DELAY, 64); + rt2x00pci_register_write(rt2x00dev, MACCSR2, reg); + rt2x00pci_register_read(rt2x00dev, RALINKCSR, ®); rt2x00_set_field32(®, RALINKCSR_AR_BBP_DATA0, 17); rt2x00_set_field32(®, RALINKCSR_AR_BBP_ID0, 26); @@ -980,10 +979,6 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev) rt2x00pci_register_write(rt2x00dev, TXACKCSR0, 0x00000020); - rt2x00pci_register_write(rt2x00dev, ARTCSR0, 0x7038140a); - rt2x00pci_register_write(rt2x00dev, ARTCSR1, 0x1d21252d); - rt2x00pci_register_write(rt2x00dev, ARTCSR2, 0x1919191d); - rt2x00pci_register_read(rt2x00dev, CSR1, ®); rt2x00_set_field32(®, CSR1_SOFT_RESET, 1); rt2x00_set_field32(®, CSR1_BBP_RESET, 0); diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index 5e3cdf5..f29dbe9 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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, ®); - rt2x00_set_field16(®, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER); - rt2x00_set_field16(®, TXRX_CSR0_KEY_ID, 0xff); - rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg); - rt2500usb_register_read(rt2x00dev, MAC_CSR8, ®); rt2x00_set_field16(®, MAC_CSR8_MAX_FRAME_UNIT, rt2x00dev->rx->data_size); rt2500usb_register_write(rt2x00dev, MAC_CSR8, reg); + rt2500usb_register_read(rt2x00dev, TXRX_CSR0, ®); + rt2x00_set_field16(®, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER); + rt2x00_set_field16(®, TXRX_CSR0_KEY_ID, 0xff); + rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg); + rt2500usb_register_read(rt2x00dev, MAC_CSR18, ®); rt2x00_set_field16(®, MAC_CSR18_DELAY_AFTER_BEACON, 0x5a); rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg); + rt2500usb_register_read(rt2x00dev, PHY_CSR4, ®); + rt2500usb_register_write(rt2x00dev, PHY_CSR4, reg | 0x0001); + rt2500usb_register_read(rt2x00dev, TXRX_CSR1, ®); rt2x00_set_field16(®, TXRX_CSR1_AUTO_SEQUENCE, 1); rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg); - rt2500usb_register_read(rt2x00dev, PHY_CSR4, ®); - rt2500usb_register_write(rt2x00dev, PHY_CSR4, reg | 0x0001); - return 0; } diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index 1a4957b..47a915d 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -1147,11 +1147,6 @@ static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev) { u32 reg; - if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE)) - return -EBUSY; - - rt2x00pci_register_write(rt2x00dev, MAC_CSR10, 0x00000718); - rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, ®); rt2x00_set_field32(®, TXRX_CSR0_AUTO_TX_SEQ, 1); rt2x00_set_field32(®, TXRX_CSR0_DISABLE_RX, 0); @@ -1161,34 +1156,27 @@ static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev) rt2x00pci_register_write(rt2x00dev, TXRX_CSR1, 0x9eb39eb3); rt2x00pci_register_write(rt2x00dev, TXRX_CSR2, 0x8a8b8c8d); rt2x00pci_register_write(rt2x00dev, TXRX_CSR3, 0x00858687); - rt2x00pci_register_write(rt2x00dev, TXRX_CSR7, 0x2e31353b); rt2x00pci_register_write(rt2x00dev, TXRX_CSR8, 0x2a2a2a2c); - rt2x00pci_register_write(rt2x00dev, TXRX_CSR15, 0x0000000f); rt2x00pci_register_write(rt2x00dev, MAC_CSR6, 0x00000fff); + rt2x00pci_register_read(rt2x00dev, MAC_CSR9, ®); + rt2x00_set_field32(®, MAC_CSR9_CW_SELECT, 0); + rt2x00pci_register_write(rt2x00dev, MAC_CSR9, reg); + + rt2x00pci_register_write(rt2x00dev, MAC_CSR10, 0x0000071c); + + if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE)) + return -EBUSY; + rt2x00pci_register_write(rt2x00dev, MAC_CSR13, 0x0000e000); rt2x00pci_register_write(rt2x00dev, SEC_CSR0, 0x00000000); rt2x00pci_register_write(rt2x00dev, SEC_CSR1, 0x00000000); rt2x00pci_register_write(rt2x00dev, SEC_CSR5, 0x00000000); - rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR0, ®); - rt2x00_set_field32(®, AC_TXOP_CSR0_AC0_TX_OP, 0); - rt2x00_set_field32(®, AC_TXOP_CSR0_AC1_TX_OP, 0); - rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR0, reg); - - rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR1, ®); - rt2x00_set_field32(®, AC_TXOP_CSR1_AC2_TX_OP, 192); - rt2x00_set_field32(®, AC_TXOP_CSR1_AC3_TX_OP, 48); - rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR1, reg); - - rt2x00pci_register_read(rt2x00dev, MAC_CSR9, ®); - rt2x00_set_field32(®, MAC_CSR9_CW_SELECT, 0); - rt2x00pci_register_write(rt2x00dev, MAC_CSR9, reg); - rt2x00pci_register_write(rt2x00dev, PHY_CSR1, 0x000023b0); rt2x00pci_register_write(rt2x00dev, PHY_CSR5, 0x060a100c); rt2x00pci_register_write(rt2x00dev, PHY_CSR6, 0x00080606); @@ -1200,6 +1188,16 @@ static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev) rt2x00pci_register_write(rt2x00dev, M2H_CMD_DONE_CSR, 0xffffffff); + rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR0, ®); + rt2x00_set_field32(®, AC_TXOP_CSR0_AC0_TX_OP, 0); + rt2x00_set_field32(®, AC_TXOP_CSR0_AC1_TX_OP, 0); + rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR0, reg); + + rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR1, ®); + rt2x00_set_field32(®, AC_TXOP_CSR1_AC2_TX_OP, 192); + rt2x00_set_field32(®, AC_TXOP_CSR1_AC3_TX_OP, 48); + rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR1, reg); + /* * We must clear the error counters. * These registers are cleared on read, @@ -1212,7 +1210,7 @@ static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev) /* * Reset MAC and BBP registers. */ - reg = 0; + rt2x00pci_register_read(rt2x00dev, MAC_CSR1, ®); rt2x00_set_field32(®, MAC_CSR1_SOFT_RESET, 1); rt2x00_set_field32(®, MAC_CSR1_BBP_RESET, 1); rt2x00pci_register_write(rt2x00dev, MAC_CSR1, reg); diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 85dfc58..7b1d8e1 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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, ®); rt2x00_set_field32(®, TXRX_CSR0_AUTO_TX_SEQ, 1); rt2x00_set_field32(®, 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, ®); + rt2x00_set_field32(®, 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, ®); rt2x00_set_field32(®, MAC_CSR1_SOFT_RESET, 1); rt2x00_set_field32(®, MAC_CSR1_BBP_RESET, 1); rt73usb_register_write(rt2x00dev, MAC_CSR1, reg); -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 18/30] rt2x00: memset descriptor before use 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (16 preceding siblings ...) 2007-08-19 18:27 ` [PATCH 17/30] rt2x00: Fix register initialization ordering Ivo van Doorn @ 2007-08-19 18:27 ` Ivo van Doorn 2007-08-19 18:28 ` [PATCH 19/30] rt2x00: Remove IEEE80211_HW_WEP_INCLUDE_IV flag Ivo van Doorn ` (12 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:27 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 1273bba4e38352cfe5b15c1c7cad742e41f00a96 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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... Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00usb.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/rt2x00usb.c b/drivers/net/wireless/rt2x00usb.c index d832d5f..c763606 100644 --- a/drivers/net/wireless/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00usb.c @@ -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; -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 19/30] rt2x00: Remove IEEE80211_HW_WEP_INCLUDE_IV flag 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (17 preceding siblings ...) 2007-08-19 18:27 ` [PATCH 18/30] rt2x00: memset descriptor before use Ivo van Doorn @ 2007-08-19 18:28 ` Ivo van Doorn 2007-08-19 18:28 ` [PATCH 20/30] rt2x00: Cleanup TXD flags Ivo van Doorn ` (11 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:28 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From ca00a3af4a65db963b2ca268d4de11276208f8b1 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index b673d61..1e935fd 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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 | diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index bfd6426..28b2c73 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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 | diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index f29dbe9..0c0076c 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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 | diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index 47a915d..a6fcef7 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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 | diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 7b1d8e1..98d3acc 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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 | -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 20/30] rt2x00: Cleanup TXD flags 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (18 preceding siblings ...) 2007-08-19 18:28 ` [PATCH 19/30] rt2x00: Remove IEEE80211_HW_WEP_INCLUDE_IV flag Ivo van Doorn @ 2007-08-19 18:28 ` Ivo van Doorn 2007-08-19 18:28 ` [PATCH 21/30] rt2x00: Add byte-ordering annotation for MAC and BSSID Ivo van Doorn ` (10 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:28 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From c46e24be398993af9bb4ad153f5f98dd42f86cd3 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index 1e935fd..e5622d6 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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, diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index 28b2c73..bfcedfd 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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, diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index 0c0076c..9670330 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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); diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c index 50c604c..36b522b 100644 --- a/drivers/net/wireless/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00dev.c @@ -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. diff --git a/drivers/net/wireless/rt2x00ring.h b/drivers/net/wireless/rt2x00ring.h index 9c94d06..143ad6d 100644 --- a/drivers/net/wireless/rt2x00ring.h +++ b/drivers/net/wireless/rt2x00ring.h @@ -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. diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index a6fcef7..e179702 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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); } diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 98d3acc..1e8b88e 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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); } -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 21/30] rt2x00: Add byte-ordering annotation for MAC and BSSID 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (19 preceding siblings ...) 2007-08-19 18:28 ` [PATCH 20/30] rt2x00: Cleanup TXD flags Ivo van Doorn @ 2007-08-19 18:28 ` Ivo van Doorn 2007-08-19 18:29 ` [PATCH 22/30] rt2x00: Correctly set TXD retry flag Ivo van Doorn ` (9 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:28 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 3194744aba3738ec948c338ed488b4b4639063b9 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index e5622d6..ffd41a6 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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(®, 0, sizeof(reg)); memcpy(®, 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(®, 0, sizeof(reg)); memcpy(®, bssid, ETH_ALEN); diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index bfcedfd..fce91ed 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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(®, 0, sizeof(reg)); memcpy(®, 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(®, 0, sizeof(reg)); memcpy(®, bssid, ETH_ALEN); diff --git a/drivers/net/wireless/rt2500usb.c b/drivers/net/wireless/rt2500usb.c index 9670330..9ece4af 100644 --- a/drivers/net/wireless/rt2500usb.c +++ b/drivers/net/wireless/rt2500usb.c @@ -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(®, 0, sizeof(reg)); memcpy(®, 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(®, 0, sizeof(reg)); memcpy(®, bssid, ETH_ALEN); diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index e179702..0e7a528 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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(®, 0, sizeof(reg)); memcpy(®, addr, ETH_ALEN); - rt2x00_set_field32(®[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(®, 0, sizeof(reg)); memcpy(®, bssid, ETH_ALEN); - rt2x00_set_field32(®[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, diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 1e8b88e..057e5a0 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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(®, 0, sizeof(reg)); memcpy(®, addr, ETH_ALEN); - rt2x00_set_field32(®[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(®, 0, sizeof(reg)); memcpy(®, bssid, ETH_ALEN); - rt2x00_set_field32(®[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, -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 22/30] rt2x00: Correctly set TXD retry flag 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (20 preceding siblings ...) 2007-08-19 18:28 ` [PATCH 21/30] rt2x00: Add byte-ordering annotation for MAC and BSSID Ivo van Doorn @ 2007-08-19 18:29 ` Ivo van Doorn 2007-08-19 18:35 ` [PATCH 23/30] rt2x00: Move rt2x00 files into rt2x00 folder Ivo van Doorn ` (8 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:29 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 0bb0e744139fd77b627cca3faf82897914d6dae9 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2400pci.c b/drivers/net/wireless/rt2400pci.c index ffd41a6..b851571 100644 --- a/drivers/net/wireless/rt2400pci.c +++ b/drivers/net/wireless/rt2400pci.c @@ -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); } diff --git a/drivers/net/wireless/rt2500pci.c b/drivers/net/wireless/rt2500pci.c index fce91ed..1000525 100644 --- a/drivers/net/wireless/rt2500pci.c +++ b/drivers/net/wireless/rt2500pci.c @@ -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); diff --git a/drivers/net/wireless/rt61pci.c b/drivers/net/wireless/rt61pci.c index 0e7a528..efa6c25 100644 --- a/drivers/net/wireless/rt61pci.c +++ b/drivers/net/wireless/rt61pci.c @@ -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, diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c index 057e5a0..9e8c049 100644 --- a/drivers/net/wireless/rt73usb.c +++ b/drivers/net/wireless/rt73usb.c @@ -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, -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 23/30] rt2x00: Move rt2x00 files into rt2x00 folder 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (21 preceding siblings ...) 2007-08-19 18:29 ` [PATCH 22/30] rt2x00: Correctly set TXD retry flag Ivo van Doorn @ 2007-08-19 18:35 ` Ivo van Doorn 2007-08-19 18:35 ` [PATCH 24/30] rt2x00: Add file pattern to MAINTAINER entry Ivo van Doorn ` (7 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:35 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 0ad22000ea988cd69bccaa49823163e5658dd293 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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 diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index 366263e..dee7a4f 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig @@ -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 diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile index b3427bb..e28b067 100644 --- a/drivers/net/wireless/Makefile +++ b/drivers/net/wireless/Makefile @@ -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 diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig new file mode 100644 index 0000000..da05b1f --- /dev/null +++ b/drivers/net/wireless/rt2x00/Kconfig @@ -0,0 +1,130 @@ +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 + diff --git a/drivers/net/wireless/rt2x00/Makefile b/drivers/net/wireless/rt2x00/Makefile new file mode 100644 index 0000000..30d654a --- /dev/null +++ b/drivers/net/wireless/rt2x00/Makefile @@ -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 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 24/30] rt2x00: Add file pattern to MAINTAINER entry 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (22 preceding siblings ...) 2007-08-19 18:35 ` [PATCH 23/30] rt2x00: Move rt2x00 files into rt2x00 folder Ivo van Doorn @ 2007-08-19 18:35 ` Ivo van Doorn 2007-08-19 18:35 ` [PATCH 25/30] rt2x00: Fix PLCP setup Ivo van Doorn ` (6 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:35 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 316723f1a0e726defbc2403647a9f81e383c45bb Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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 Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- MAINTAINERS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index d22d562..f7a67a5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3135,6 +3135,7 @@ L: linux-wireless@vger.kernel.org L: rt2400-devel@lists.sourceforge.net W: http://rt2x00.serialmonkey.com/ S: Maintained +F: drivers/net/wireless/rt2x00/ RANDOM NUMBER DRIVER P: Matt Mackall -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 25/30] rt2x00: Fix PLCP setup 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (23 preceding siblings ...) 2007-08-19 18:35 ` [PATCH 24/30] rt2x00: Add file pattern to MAINTAINER entry Ivo van Doorn @ 2007-08-19 18:35 ` Ivo van Doorn 2007-08-19 18:36 ` [PATCH 26/30] rt2x00: Clean up RATEMASK handling Ivo van Doorn ` (5 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:35 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From b545a9a3b8ff04a2c6f62923cf01043aeb9ec599 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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) Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00/rt2x00dev.c | 36 +++++++++++++++++------------- 1 files changed, 20 insertions(+), 16 deletions(-) diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 36b522b..a0fcd05 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -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); -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 26/30] rt2x00: Clean up RATEMASK handling 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (24 preceding siblings ...) 2007-08-19 18:35 ` [PATCH 25/30] rt2x00: Fix PLCP setup Ivo van Doorn @ 2007-08-19 18:36 ` Ivo van Doorn 2007-08-19 18:36 ` [PATCH 27/30] rt2x00: Add rt2x00lib_reset_link_tuner() Ivo van Doorn ` (4 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:36 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 295b7e7bc2a2081714a071c3946f1c0262b6e503 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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 Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index b851571..524f529 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c @@ -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, ®); diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 1000525..cc90597 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c @@ -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, ®); diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 9ece4af..ba6c099 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c @@ -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); diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index a0fcd05..8e7fc2a 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -449,7 +449,7 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev, /* * Check for OFDM */ - if (DEVICE_GET_RATE_FIELD(tx_rate, RATEMASK) & DEV_OFDM_RATE) + if (DEVICE_GET_RATE_FIELD(tx_rate, RATEMASK) & DEV_OFDM_RATEMASK) __set_bit(ENTRY_TXD_OFDM_RATE, &entry->flags); /* @@ -587,26 +587,32 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev, /* * Initialize Rate list. */ - rt2x00lib_rate(&rates[0], 10, 0x001, 0x00, IEEE80211_RATE_CCK); - rt2x00lib_rate(&rates[1], 20, 0x003, 0x01, IEEE80211_RATE_CCK_2); - rt2x00lib_rate(&rates[2], 55, 0x007, 0x02, IEEE80211_RATE_CCK_2); - rt2x00lib_rate(&rates[3], 110, 0x00f, 0x03, IEEE80211_RATE_CCK_2); + rt2x00lib_rate(&rates[0], 10, DEV_RATEMASK_1MB, + 0x00, IEEE80211_RATE_CCK); + rt2x00lib_rate(&rates[1], 20, DEV_RATEMASK_2MB, + 0x01, IEEE80211_RATE_CCK_2); + rt2x00lib_rate(&rates[2], 55, DEV_RATEMASK_5_5MB, + 0x02, IEEE80211_RATE_CCK_2); + rt2x00lib_rate(&rates[3], 110, DEV_RATEMASK_11MB, + 0x03, IEEE80211_RATE_CCK_2); if (spec->num_rates > 4) { - rt2x00lib_rate(&rates[4], 60, 0x01f, 0x0b, IEEE80211_RATE_OFDM); - rt2x00lib_rate(&rates[5], 90, 0x03f, 0x0f, IEEE80211_RATE_OFDM); - rt2x00lib_rate(&rates[6], 120, 0x07f, 0x0a, - IEEE80211_RATE_OFDM); - rt2x00lib_rate(&rates[7], 180, 0x0ff, 0x0e, - IEEE80211_RATE_OFDM); - rt2x00lib_rate(&rates[8], 240, 0x1ff, 0x09, - IEEE80211_RATE_OFDM); - rt2x00lib_rate(&rates[9], 360, 0x3ff, 0x0d, - IEEE80211_RATE_OFDM); - rt2x00lib_rate(&rates[10], 480, 0x7ff, 0x08, - IEEE80211_RATE_OFDM); - rt2x00lib_rate(&rates[11], 540, 0xfff, 0x0c, - IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[4], 60, DEV_RATEMASK_6MB, + 0x0b, IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[5], 90, DEV_RATEMASK_9MB, + 0x0f, IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[6], 120, DEV_RATEMASK_12MB, + 0x0a, IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[7], 180, DEV_RATEMASK_18MB, + 0x0e, IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[8], 240, DEV_RATEMASK_24MB, + 0x09, IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[9], 360, DEV_RATEMASK_36MB, + 0x0d, IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[10], 480, DEV_RATEMASK_48MB, + 0x08, IEEE80211_RATE_OFDM); + rt2x00lib_rate(&rates[11], 540, DEV_RATEMASK_54MB, + 0x0c, IEEE80211_RATE_OFDM); } /* diff --git a/drivers/net/wireless/rt2x00/rt2x00reg.h b/drivers/net/wireless/rt2x00/rt2x00reg.h index 10a4a42..690356f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00reg.h +++ b/drivers/net/wireless/rt2x00/rt2x00reg.h @@ -228,34 +228,46 @@ static inline u8 rt2x00_get_field8(const u8 reg, #define DEV_PLCP FIELD32(0xff000000) /* - * Bitmask for MASK_RATE + * Bitfields */ -#define DEV_RATE_1MB ( 1 << 1 ) -#define DEV_RATE_2MB ( 1 << 2 ) -#define DEV_RATE_5_5MB ( 1 << 3 ) -#define DEV_RATE_11MB ( 1 << 4 ) -#define DEV_RATE_6MB ( 1 << 5 ) -#define DEV_RATE_9MB ( 1 << 6 ) -#define DEV_RATE_12MB ( 1 << 7 ) -#define DEV_RATE_18MB ( 1 << 8 ) -#define DEV_RATE_24MB ( 1 << 9 ) -#define DEV_RATE_36MB ( 1 << 10 ) -#define DEV_RATE_48MB ( 1 << 11 ) -#define DEV_RATE_54MB ( 1 << 12 ) +#define DEV_RATEBIT_1MB ( 1 << 1 ) +#define DEV_RATEBIT_2MB ( 1 << 2 ) +#define DEV_RATEBIT_5_5MB ( 1 << 3 ) +#define DEV_RATEBIT_11MB ( 1 << 4 ) +#define DEV_RATEBIT_6MB ( 1 << 5 ) +#define DEV_RATEBIT_9MB ( 1 << 6 ) +#define DEV_RATEBIT_12MB ( 1 << 7 ) +#define DEV_RATEBIT_18MB ( 1 << 8 ) +#define DEV_RATEBIT_24MB ( 1 << 9 ) +#define DEV_RATEBIT_36MB ( 1 << 10 ) +#define DEV_RATEBIT_48MB ( 1 << 11 ) +#define DEV_RATEBIT_54MB ( 1 << 12 ) /* - * Bitmask groups of bitrates + * Bitmasks for DEV_RATEMASK */ -#define DEV_BASIC_RATE \ - ( DEV_RATE_1MB | DEV_RATE_2MB | DEV_RATE_5_5MB | DEV_RATE_11MB | \ - DEV_RATE_6MB | DEV_RATE_12MB | DEV_RATE_24MB ) +#define DEV_RATEMASK_1MB ( (DEV_RATEBIT_1MB << 1) -1 ) +#define DEV_RATEMASK_2MB ( (DEV_RATEBIT_2MB << 1) -1 ) +#define DEV_RATEMASK_5_5MB ( (DEV_RATEBIT_5_5MB << 1) -1 ) +#define DEV_RATEMASK_11MB ( (DEV_RATEBIT_11MB << 1) -1 ) +#define DEV_RATEMASK_6MB ( (DEV_RATEBIT_6MB << 1) -1 ) +#define DEV_RATEMASK_9MB ( (DEV_RATEBIT_9MB << 1) -1 ) +#define DEV_RATEMASK_12MB ( (DEV_RATEBIT_12MB << 1) -1 ) +#define DEV_RATEMASK_18MB ( (DEV_RATEBIT_18MB << 1) -1 ) +#define DEV_RATEMASK_24MB ( (DEV_RATEBIT_24MB << 1) -1 ) +#define DEV_RATEMASK_36MB ( (DEV_RATEBIT_36MB << 1) -1 ) +#define DEV_RATEMASK_48MB ( (DEV_RATEBIT_48MB << 1) -1 ) +#define DEV_RATEMASK_54MB ( (DEV_RATEBIT_54MB << 1) -1 ) -#define DEV_CCK_RATE \ - ( DEV_RATE_1MB | DEV_RATE_2MB | DEV_RATE_5_5MB | DEV_RATE_11MB ) +/* + * Bitmask groups of bitrates + */ +#define DEV_BASIC_RATEMASK \ + ( DEV_RATEMASK_11MB | \ + DEV_RATEBIT_6MB | DEV_RATEBIT_12MB | DEV_RATEBIT_24MB ) -#define DEV_OFDM_RATE \ - ( DEV_RATE_6MB | DEV_RATE_9MB | DEV_RATE_12MB | DEV_RATE_18MB | \ - DEV_RATE_24MB | DEV_RATE_36MB | DEV_RATE_48MB | DEV_RATE_54MB ) +#define DEV_CCK_RATEMASK ( DEV_RATEMASK_11MB ) +#define DEV_OFDM_RATEMASK ( DEV_RATEMASK_54MB & ~DEV_CCK_RATEMASK ) /* * Macro's to set and get specific fields from the device specific val and val2 diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index efa6c25..0dacd59 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c @@ -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); diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 9e8c049..7eb1f02 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c @@ -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); -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 27/30] rt2x00: Add rt2x00lib_reset_link_tuner() 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (25 preceding siblings ...) 2007-08-19 18:36 ` [PATCH 26/30] rt2x00: Clean up RATEMASK handling Ivo van Doorn @ 2007-08-19 18:36 ` Ivo van Doorn 2007-08-19 18:36 ` [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update Ivo van Doorn ` (3 subsequent siblings) 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:36 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From d6188297893be7023e0cec4b0132e64ec96de884 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c index 4fec0af..b5075b5 100644 --- a/drivers/net/wireless/rt2x00/rt2x00config.c +++ b/drivers/net/wireless/rt2x00/rt2x00config.c @@ -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; diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 8e7fc2a..14968ef 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -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) diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index 1560f73..454e022 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h @@ -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. -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (26 preceding siblings ...) 2007-08-19 18:36 ` [PATCH 27/30] rt2x00: Add rt2x00lib_reset_link_tuner() Ivo van Doorn @ 2007-08-19 18:36 ` Ivo van Doorn 2007-08-20 17:21 ` Johannes Berg 2007-08-19 18:36 ` [PATCH 29/30] rt2x00: Lindent Ivo van Doorn ` (2 subsequent siblings) 30 siblings, 1 reply; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:36 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From cbf01c4f3f1810f0ba98238aa7900a523a044e66 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00/rt2x00dev.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 14968ef..75888ea 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -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; } -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update 2007-08-19 18:36 ` [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update Ivo van Doorn @ 2007-08-20 17:21 ` Johannes Berg 2007-08-21 10:21 ` Ivo van Doorn 0 siblings, 1 reply; 36+ messages in thread From: Johannes Berg @ 2007-08-20 17:21 UTC (permalink / raw) To: Ivo van Doorn; +Cc: John W. Linville, linux-wireless, rt2400-devel [-- Attachment #1: Type: text/plain, Size: 499 bytes --] On Sun, 2007-08-19 at 20:36 +0200, Ivo van Doorn wrote: > 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 [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 190 bytes --] ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update 2007-08-20 17:21 ` Johannes Berg @ 2007-08-21 10:21 ` Ivo van Doorn 0 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-21 10:21 UTC (permalink / raw) To: Johannes Berg; +Cc: John W. Linville, linux-wireless, rt2400-devel On Monday 20 August 2007, Johannes Berg wrote: > On Sun, 2007-08-19 at 20:36 +0200, Ivo van Doorn wrote: > > > 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 ^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH 29/30] rt2x00: Lindent 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (27 preceding siblings ...) 2007-08-19 18:36 ` [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update Ivo van Doorn @ 2007-08-19 18:36 ` Ivo van Doorn 2007-08-19 18:37 ` [PATCH 30/30] rt2x00: rt2x00 2.0.7 Ivo van Doorn 2007-08-23 20:55 ` [Rt2400-devel] Please pull 'upstream' branch of rt2x00 John W. Linville 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:36 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From f88ee9f3e67bd509f14e07f0dfcfe32649694e10 Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> 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. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- 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(-) diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index 524f529..d3ac1c1 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c @@ -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. diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index cc90597..b6f9266 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c @@ -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. diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index ba6c099..3c78a97 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c @@ -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. diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 24ad264..06738e4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h @@ -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)); } /* diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c index c7b331c..eaa4c54 100644 --- a/drivers/net/wireless/rt2x00/rt2x00debug.c +++ b/drivers/net/wireless/rt2x00/rt2x00debug.c @@ -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; diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 75888ea..8c24797 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -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); } /* diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index 2b1b910..3ceb79d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c @@ -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; diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index c763606..03815b6 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c @@ -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, diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 0dacd59..0b4e757 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c @@ -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, diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 7eb1f02..ed05e4b 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c @@ -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, -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH 30/30] rt2x00: rt2x00 2.0.7 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (28 preceding siblings ...) 2007-08-19 18:36 ` [PATCH 29/30] rt2x00: Lindent Ivo van Doorn @ 2007-08-19 18:37 ` Ivo van Doorn 2007-08-23 20:55 ` [Rt2400-devel] Please pull 'upstream' branch of rt2x00 John W. Linville 30 siblings, 0 replies; 36+ messages in thread From: Ivo van Doorn @ 2007-08-19 18:37 UTC (permalink / raw) To: John W. Linville; +Cc: linux-wireless, rt2400-devel >From 7b429527e4460c4bc550ca71a47696d677b92e5f Mon Sep 17 00:00:00 2001 From: Ivo van Doorn <IvDoorn@gmail.com> Date: Sun, 19 Aug 2007 20:13:11 +0200 Subject: [PATCH 30/30] rt2x00: rt2x00 2.0.7 Release rt2x00 2.0.7 Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> --- drivers/net/wireless/rt2x00/rt2x00.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 06738e4..2105f44 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h @@ -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" /* -- 1.5.3.rc5 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [Rt2400-devel] Please pull 'upstream' branch of rt2x00 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn ` (29 preceding siblings ...) 2007-08-19 18:37 ` [PATCH 30/30] rt2x00: rt2x00 2.0.7 Ivo van Doorn @ 2007-08-23 20:55 ` John W. Linville 30 siblings, 0 replies; 36+ messages in thread From: John W. Linville @ 2007-08-23 20:55 UTC (permalink / raw) To: Ivo van Doorn; +Cc: linux-wireless, rt2400-devel On Sun, Aug 19, 2007 at 08:18:30PM +0200, Ivo van Doorn wrote: > Well finally rt2x00 2.0.7 is released, unfortunately it will > not be the last release in the 2.0.* series as promised earlier. Merged to wireless-dev... -- John W. Linville linville@tuxdriver.com ^ permalink raw reply [flat|nested] 36+ messages in thread
end of thread, other threads:[~2007-08-23 21:14 UTC | newest] Thread overview: 36+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-08-19 18:18 Please pull 'upstream' branch of rt2x00 Ivo van Doorn 2007-08-19 18:21 ` [PATCH 01/30] rt2x00: Correctly configure packet filter in monitor mode Ivo van Doorn 2007-08-19 18:21 ` [PATCH 02/30] rt2x00: Clear MAC and BSSID when non-monitor interface goes down Ivo van Doorn 2007-08-19 18:21 ` [PATCH 03/30] rt2x00: Check return value of usb_control_msg() Ivo van Doorn 2007-08-19 18:22 ` [PATCH 04/30] rt2x00: Clear all fields on start_link_tune() Ivo van Doorn 2007-08-19 18:22 ` [PATCH 05/30] rt2x00: Don't increase rx_failed for individual frames Ivo van Doorn 2007-08-19 18:23 ` [PATCH 06/30] rt2x00: Set vgc_level during reset_tuner Ivo van Doorn 2007-08-19 18:23 ` [PATCH 07/30] rt2x00: Schedule beacon update Ivo van Doorn 2007-08-19 18:24 ` [PATCH 08/30] rt2x00: Fix width of filter field Ivo van Doorn 2007-08-19 18:24 ` [PATCH 09/30] rt2x00: Be consistent with unsigned Ivo van Doorn 2007-08-19 18:24 ` [PATCH 10/30] rt2x00: Correctly reset TX/RX success/failed counters Ivo van Doorn 2007-08-19 18:25 ` [PATCH 11/30] rt2x00: Rework RF register handling Ivo van Doorn 2007-08-19 18:25 ` [PATCH 12/30] rt2x00: Store firmware in memory Ivo van Doorn 2007-08-19 18:54 ` Michael Buesch 2007-08-19 20:44 ` Ivo van Doorn 2007-08-19 18:26 ` [PATCH 13/30] rt2x00: rt2x00_ring_free returns invalid length Ivo van Doorn 2007-08-19 18:26 ` [PATCH 14/30] Fix off-by-one error in debugfs helpers Ivo van Doorn 2007-08-19 18:26 ` [PATCH 15/30] rt2x00: Use caching for USB transfers Ivo van Doorn 2007-08-19 18:27 ` [PATCH 16/30] rt2x00: Cleanup set_state for rt61 and rt73 Ivo van Doorn 2007-08-19 18:27 ` [PATCH 17/30] rt2x00: Fix register initialization ordering Ivo van Doorn 2007-08-19 18:27 ` [PATCH 18/30] rt2x00: memset descriptor before use Ivo van Doorn 2007-08-19 18:28 ` [PATCH 19/30] rt2x00: Remove IEEE80211_HW_WEP_INCLUDE_IV flag Ivo van Doorn 2007-08-19 18:28 ` [PATCH 20/30] rt2x00: Cleanup TXD flags Ivo van Doorn 2007-08-19 18:28 ` [PATCH 21/30] rt2x00: Add byte-ordering annotation for MAC and BSSID Ivo van Doorn 2007-08-19 18:29 ` [PATCH 22/30] rt2x00: Correctly set TXD retry flag Ivo van Doorn 2007-08-19 18:35 ` [PATCH 23/30] rt2x00: Move rt2x00 files into rt2x00 folder Ivo van Doorn 2007-08-19 18:35 ` [PATCH 24/30] rt2x00: Add file pattern to MAINTAINER entry Ivo van Doorn 2007-08-19 18:35 ` [PATCH 25/30] rt2x00: Fix PLCP setup Ivo van Doorn 2007-08-19 18:36 ` [PATCH 26/30] rt2x00: Clean up RATEMASK handling Ivo van Doorn 2007-08-19 18:36 ` [PATCH 27/30] rt2x00: Add rt2x00lib_reset_link_tuner() Ivo van Doorn 2007-08-19 18:36 ` [PATCH 28/30] rt2x00: Always check if mac80211 requested TX status update Ivo van Doorn 2007-08-20 17:21 ` Johannes Berg 2007-08-21 10:21 ` Ivo van Doorn 2007-08-19 18:36 ` [PATCH 29/30] rt2x00: Lindent Ivo van Doorn 2007-08-19 18:37 ` [PATCH 30/30] rt2x00: rt2x00 2.0.7 Ivo van Doorn 2007-08-23 20:55 ` [Rt2400-devel] Please pull 'upstream' branch of rt2x00 John W. Linville
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).