linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Please pull 'upstream' branch of rt2x00
@ 2007-04-28 20:45 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-04-28 20:45 UTC (permalink / raw)
  To: John Linville, linux-wireless

Hi John,

A new update of rt2x00 is ready. :)

Perhaps the most interesting thing would be the removal
of passive scan support, because it was a purely software based
solution that (if really required) could best be resolved in mac80211
rather then the driver for devices that don't support such a thing in the
hardware.
The rest is just code being moved around, (more specifically code being moved
from the drivers toward rt2x00lib/pci/usb. There aren't any specific bugfixes made.

Ivo

---

The following changes since commit 9e4fd17309d0acddd1748c76f6bd35a0c85446b6:
  Johannes Berg (1):
        clarify locking comment in cfg80211

are found in the git repository at:

  http://git.serialmonkey.com/rt2x00.git/ upstream

Ivo van Doorn (38):
      rt2x00: Move beaconhandling into rt2x00{usb,pci} modules
      rt2x00: Fix rt2x00pci, rt2x00usb, rt2x00mac module/debug enviroment
      rt2x00: Move common rxdone and txdone code into rt2x00lib
      rt2x00: Set rf_base during channel configuration
      rt2x00: Move initialize() and uninitialize() into rt2x00pci/rt2x00usb
      rt2x00: Fix spellin error
      rt2x00: Move ieee80211_hw init & registration into rt2x00lib
      rt2x00: Fix hardware mode registration order
      rt2x00: Add struct debugsfs pointer to rt2x00dev
      rt2x00: Fix debugfs related compile problem
      rt2x00: Explicit return type for rt2x00debug_register
      rt2x00: Fix sparse errors
      rt2x00: Move alloc_rings into rt2x00lib
      rt2x00: Move device allocation into rt2x00lib
      rt2x00: Make rt2x00debug const
      rt2x00: Minor fixes (comment & headers)
      rt2x00: Create rt2x00_ops structure
      rt2x00: rt2x00pci shouldn't use DRV_NAME for irq registration
      rt2x00: Rename rt(25)73 identifications
      rt2x00: Move PCI/USB handlers into rt2x00pci/usb modules
      rt2x00: Fix hw mode registration
      rt2x00: Fix NULL pointer exeption during init_hw
      rt2x00: Fix sparse warnings
      rt2x00: Fix ERROR strings
      rt2x00: Move rf values outside functions
      rt2x00: Allocate enough rings
      rt2x00: Move write_tx_data functions into rt2x00pci/usb
      rt2x00: Fix compilation error when not selecting rt61pci and rt73usb
      rt2x00: Add return statement to rt2x00lib_alloc_dev
      rt2x00: Create dummy rt2x00lib_firmware_load_wait()
      rt2x00: Move write_tx_desc initialization into rt2x00lib
      rt2x00: Remove ENTRY_RTS_CTS_FRAME flag
      rt2x00: Fix check for Acked frames
      Merge branch 'wireless-dev'
      rt2x00: Remove passive scanning support
      rt2x00: Set channel_change_time to 0
      rt2x00: Move USB txdone handler into rt2x00usb
      rt2x00: rt61 should call ieee80211_wake_queue only for correct queues

 drivers/net/wireless/mac80211/rt2x00/Makefile      |    2 +
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.c   | 1303 +++------------
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.h   |    9 +-
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.c   | 1496 ++++--------------
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.h   |    7 -
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.c   | 1448 +++--------------
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.h   |    2 -
 drivers/net/wireless/mac80211/rt2x00/rt2x00.h      |  165 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00debug.c |   27 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00debug.h |    7 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c   |  689 +++++++-
 drivers/net/wireless/mac80211/rt2x00/rt2x00lib.h   |   70 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c   |  166 +--
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.c   |  587 +++++++
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.h   |   50 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.c   |  637 +++++++
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.h   |   44 +-
 drivers/net/wireless/mac80211/rt2x00/rt61pci.c     | 1731 ++++---------------
 drivers/net/wireless/mac80211/rt2x00/rt61pci.h     |    7 -
 drivers/net/wireless/mac80211/rt2x00/rt73usb.c     | 1597 ++++---------------
 drivers/net/wireless/mac80211/rt2x00/rt73usb.h     |    4 +-
 21 files changed, 3553 insertions(+), 6495 deletions(-)
 create mode 100644 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.c
 create mode 100644 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.c

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-05-07 14:44 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-05-07 14:44 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the latest rt2x00 update. It is a rather small one.
Only 1 real fix, and the second path is cosmetic since it
will start a proper versioning of rt2x00.

This will most likely be the last pull request for the next 1 or 2 months
due to developer/time/health shortage.

The TODO list for rt2x00 has been expanding over the last few days,
so as soon as I am fully back there will be quite a lot to do. ;)
(http://rt2x00.serialmonkey.com/wiki/index.php?title=Rt2x00_beta#rt2x00_beta_status_page)

Ivo

---

The following changes since commit 5209b1eff0b1891d8bb002eb067a11b4caa5f5bc:
  John W. Linville (1):
        Merge branch 'from-linus'

are found in the git repository at:

  http://git.serialmonkey.com/rt2x00.git/ upstream

Ivo van Doorn (2):
      rt2x00: release 2.0.0
      Merge branch 'wireless-dev'

Jan Kiszka (1):
      rt2x00: Fix master beacon setup

 drivers/net/wireless/mac80211/rt2x00/rt2400pci.c |    8 +++-----
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.c |    8 +++-----
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.c |    8 +++-----
 drivers/net/wireless/mac80211/rt2x00/rt2x00.h    |    3 +--
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c |   17 -----------------
 drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c |   14 +++++++++++++-
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.c |   17 -----------------
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.c |   19 +------------------
 drivers/net/wireless/mac80211/rt2x00/rt61pci.c   |    8 +++-----
 drivers/net/wireless/mac80211/rt2x00/rt73usb.c   |    8 +++-----
 10 files changed, 30 insertions(+), 80 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-06-03 12:25 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-06-03 12:25 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the new rt2x00 release: 2.0.1
It contains many patches since the previous release.
It doesn't address any major bugs that have been
reported, but the code has been cleaned up.

The most notable change is the addition of rfkill support. :)

Ivo

---

The following changes since commit 2e6c9eed7541f3e2a23a469f08e5be3ec28a129f:
  James Ketrenos (1):
        Add iwlwifi wireless drivers

are available in the git repository at:

  git://git.serialmonkey.com/rt2x00.git/ upstream

Gertjan van Wingerde (8):
      rt2x00: Move rxd_size and txd_size fields.
      rt2x00: Update firmware loading interface.
      rt2x00: Initialisation cleanup.
      Move firmware loading code out of main rt2x00lib source file.
      Fix debug support.
      Let lowlevel driver decide on firmware names.
      rt2x00: Provide cleaner firmware loading interface to lowlevel driver.
      rt2x00: Deregister debugs at firmware loading failure.

Ivo van Doorn (34):
      rt2x00: Add rfkill support
      rt2x00: Use MODULE_FIRMWARE
      rt2x00: cosmetic - rename CONFIG_RT2X00_DEBUGFS
      rt2x00: Move crc-itu-t usage into rt2x00lib
      rt2x00: Remove channel_change_time usage
      rt2x00: Apply the 80 character line rule
      rt2x00: Prevent forward declaration of functions
      rt2x00: When toggling RX the link tuner should also be toggled
      rt2x00: Move generic link_tuner code into rt2x00lib
      rt2x00: Make rt2400 link tuner work like legacy driver
      rt2x00: Remove activity_led
      rt2x00: Make sure link tuning follows Legacy guidelines
      rt2x00: Use correct values for r24, r25 and r26
      rt2x00: Add EEPROM recovery data
      rt2x00: Correctly initialize rt73usb PHY_CSR1
      rt2x00: Use defines for chipset assignments
      rt2x00: Merge kick_beacon_gen and kick_tx_queue
      rt2x00: Merge radio control functions into 1 callback function
      rt2x00: Make promisc mode available to USB devices
      rt2x00: Make use of open / stop handlers
      rt2x00: Cleanup flag handling
      rt2x00: Use linux/bitops.h
      rt2x00: Add FIELD8 and matching handlers
      rt2x00: Move drv_name field into rt2x00_ops
      rt2x00: rt2x00lib is in charge of forcing promisc mode
      rt2x00: Make debug messages more informative
      rt2x00: Fix rt61 typo
      rt2x00: Move CONFIG_RT2X00_LIB_DEBUGFS ifdef out of rt2x00dev.c
      rt2x00: Reduce indentation for txpower handlers
      rt2x00: Define ARCSR2, ARCSR3, ARCSR4 and ARCSR5 registers
      rt2x00: Fix compilation errors for rt2x00-rfkill
      Merge branch 'wireless-dev'
      rt2x00: Merge LENGTH_LOW and LENGTH_HIGH
      rt2x00: Release rt2x00 2.0.1

 drivers/net/wireless/mac80211/rt2x00/Kconfig       |   33 +-
 drivers/net/wireless/mac80211/rt2x00/Makefile      |   10 +-
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.c   |  401 +++++++------
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.h   |   65 ++-
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.c   |  486 +++++++++-------
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.h   |   61 ++-
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.c   |  542 +++++++++++-------
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.h   |   29 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00.h      |  407 +++++++------
 drivers/net/wireless/mac80211/rt2x00/rt2x00debug.c |   39 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00debug.h |   22 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c   |  264 ++++-----
 .../net/wireless/mac80211/rt2x00/rt2x00firmware.c  |  129 +++++
 .../net/wireless/mac80211/rt2x00/rt2x00firmware.h  |   49 ++
 drivers/net/wireless/mac80211/rt2x00/rt2x00lib.h   |   15 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c   |  179 +++---
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.c   |   98 ++--
 .../net/wireless/mac80211/rt2x00/rt2x00rfkill.c    |  133 +++++
 .../net/wireless/mac80211/rt2x00/rt2x00rfkill.h    |   51 ++
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.c   |   76 ++--
 drivers/net/wireless/mac80211/rt2x00/rt61pci.c     |  601 ++++++++++++--------
 drivers/net/wireless/mac80211/rt2x00/rt61pci.h     |   33 +-
 drivers/net/wireless/mac80211/rt2x00/rt73usb.c     |  589 +++++++++++--------
 drivers/net/wireless/mac80211/rt2x00/rt73usb.h     |   33 +-
 24 files changed, 2589 insertions(+), 1756 deletions(-)
 create mode 100644 drivers/net/wireless/mac80211/rt2x00/rt2x00firmware.c
 create mode 100644 drivers/net/wireless/mac80211/rt2x00/rt2x00firmware.h
 create mode 100644 drivers/net/wireless/mac80211/rt2x00/rt2x00rfkill.c
 create mode 100644 drivers/net/wireless/mac80211/rt2x00/rt2x00rfkill.h

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-06-19 18:18 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-06-19 18:18 UTC (permalink / raw)
  To: John Linville, linux-wireless, rt2400-devel

Hi John,

Here is the 2.0.2 release of rt2x00.
As usual most changes are code cleaning,
followed by code moving into the library modules.
Unfortunately, this round still does not contain real bugfixes.
Hopefully the next release will really bugfixes. ;)

The actuall diff is quite big, but that is mainly because
of the cleanup in the register access functions which caused
all register functions to be renamed (which prevents namespace
pollution).

Ivo

---

The following changes since commit 9181e959da76d85d688d8ec763702ed2f3b4edf9:
  John W. Linville (1):
        rt2x00firmware.c: include delay.h to avoid build error on ppc64

are available in the git repository at:

  git://git.serialmonkey.com/rt2x00.git/ upstream

Gertjan van Wingerde (1):
      rt2x00: Clean up register access functions.

Ivo van Doorn (32):
      rt2x00: Remove debug module parameter
      rt2x00: Cleanup header
      rt2x00: *_bbp_check should not return magic value
      rt2x00: rt2400pci - Use BBPCSR for txdesc
      rt2x00: Make antenna selection more transparent
      rt2x00: Don't hardcode beacon interval
      rt2x00: Move config requirement into rt2x00lib
      rt2x00: Remove pointless 0xff checks
      rt2x00: Correct *_bbp_check
      rt2x00: Correctly set the flags for the correct flags field
      rt2x00: Remove unsused structure
      rt2x00: Don't export config functions to outside rt2x00lib
      Merge branch 'wireless-dev'
      rt2x00: Constify txd_size and rxd_size
      rt2x00: rt2x00lib_disable_radio should call toggle_rx
      rt2x00: Move USB radio enabling/disabling into rt2x00usb
      rt2x00: Remove ring->type
      rt2x00: Split rings into tx and rx arrays
      rt2x00: Split tx ring array into tx and bcn
      rt2x00: Move rt2x00{pci,usb} shared code into rt2x00lib
      rt2x00: Move ring allocation into rt2x00lib
      Merge branch 'wireless-dev'
      rt2x00: Fix ring array iteration
      rt2x00: Remove huge macro functions
      rt2x00: Include rt2x00firmware.h
      rt2x00: Move ring allocation partially into rt2x00lib
      rt2x00: Remove unused library call fields
      rt2x00: rt61 and rt73 do not support Atim
      rt2x00: link_tuner should be toggled when the radio is toggled
      rt2x00: Add EEPROM recovery code for mac address
      Merge branch 'wireless-dev'
      rt2x00: Release rt2x00 2.0.2

Mattias Nissler (1):
      rt73: Prevent oops when usb device is disconnected.

 drivers/net/wireless/mac80211/rt2x00/rt2400pci.c   |  627 ++++++---------
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.h   |   28 +-
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.c   |  673 +++++++---------
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.h   |   34 +-
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.c   |  660 ++++++---------
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.h   |   38 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00.h      |  120 ++--
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c   |  540 ++++++++++---
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.h   |   60 ++
 .../net/wireless/mac80211/rt2x00/rt2x00firmware.c  |    7 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00lib.h   |   13 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c   |   52 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.c   |  283 +------
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.h   |   29 +
 .../net/wireless/mac80211/rt2x00/rt2x00rfkill.c    |    4 -
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.c   |  323 +++-----
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.h   |   14 +-
 drivers/net/wireless/mac80211/rt2x00/rt61pci.c     |  858 +++++++++-----------
 drivers/net/wireless/mac80211/rt2x00/rt61pci.h     |   43 +-
 drivers/net/wireless/mac80211/rt2x00/rt73usb.c     |  758 +++++++----------
 drivers/net/wireless/mac80211/rt2x00/rt73usb.h     |   43 +-
 21 files changed, 2363 insertions(+), 2844 deletions(-)
 create mode 100644 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.h

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-07-20  8:11 Ivo van Doorn
  2007-07-20  8:13 ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2007-07-20  8:11 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Finally the 2.0.3 release of rt2x00 is here :)

And as promised since actually contains bugfixes
The hightlights are a working link tuner which finally
makes sure all drivers come close to being actually
useable.

Also a small change in statistics, rt2x00 will now only report the RSSI to mac80211.
The reporting of Noise values have been removed,
since rt2x00 cannot measure the noise and previously
reported the sensitivity value determined by the link_tuner.
And I am not completely sure if that is a desired behavior, since the preference
would be a measured value I guess.

Also I still have to determine what a good value for the Signal reporting
should be. With only a RSSI reporting I feel rt2x00 isn't reporting all that it can...

Ivo

---

The following changes since commit a7008e4ecc4ec69a9868105ce7f805a6ab486d69:
  Johannes Berg (1):
        mac80211: regdomain.c needs to include ieee80211_i.h

are available in the git repository at:

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

Adam Baker (1):
      rt2x00: Set Maximum sensitivity when not receiving

Ivo van Doorn (42):
      rt2x00: Remove usage of open and stop callbacks
      rt2x00: Fix rfkill compilation
      rt2x00: rfkill should use input_poll device
      rt2x00: Fix promisc mode check
      rt2x00: Put debugfs_intf inbetween DEBUGFS defines
      rt2x00: Cleanup debug messages
      rt2x00: Remove ENTRY_TXD_NEW_SEQ flag
      rt2x00: Remove DRV_NAME define from rt2x00.h
      rt2x00: Remove device & mac_addr fields
      rt2x00: Use the mac80211 provided workqueue
      rt2x00: Don't wake device on resume
      rt2x00: Move interrupt toggling into seperate function
      rt2x00: Round LINK_TUNER_INTERVAL up
      rt2x00: Set the IEEE80211_HW_NO_PROBE_FILTERING flag
      rt2x00: Add rt2570 chipset revisions
      rt2x00: Split TXD_ENTRY_AVAILABLE
      rt2x00: rt61 should check the CIPHER_ERROR bit
      rt2x00: Fix reporting false rate during rx
      rt2x00: Correctly exit the firmware load function
      rt2x00: Fix link tuner limitation for rt2400pci
      rt2x00: Cleanup Kconfig dependencies and selects
      rt2x00: Defer firmware loading untill ifup
      rt2x00: Change register definition ordering
      rt2x00: Correctly initialize PSCSR2 in rt2400.
      rt2x00: Introduce the walking average
      rt2x00: Remove noise reporting
      rt2x00: Fix RSSI value reading / reporting / link tuning
      rt2x00: Use prefetch for ring loop
      rt2x00: Use the register field defines
      rt2x00: Move initialization of rings into rt2x00usb
      rt2x00: Move usb_interrupt_rxdone into rt2x00usb
      rt2x00: Fix RX skb allocation
      rt2x00: KConfig layout correction
      rt2x00: Set DEVICE_ENABLED_RADIO_HW when rfkill is disabled
      rt2x00: Change word argument for debug_access_t
      rt2x00: Suspend/Resume Don't register/reregister device
      Merge branch 'wireless-dev'
      rt2x00: Fix CTS frame requirement detection
      rt2x00: Don't cut FCS in RX frames
      rt2x00: Use delayed_work_pending
      rt2x00: Don't enable/disable link tuner twice
      rt2x00: Release 2.0.3

 drivers/net/wireless/mac80211/rt2x00/Kconfig       |   91 ++++----
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.c   |  167 ++++++-------
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.h   |   45 ++--
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.c   |  191 +++++++-------
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.h   |   54 +++--
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.c   |  176 ++++---------
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.h   |   61 +++--
 drivers/net/wireless/mac80211/rt2x00/rt2x00.h      |  141 +++++++----
 drivers/net/wireless/mac80211/rt2x00/rt2x00debug.h |    2 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c   |   86 +------
 .../net/wireless/mac80211/rt2x00/rt2x00firmware.c  |   77 ++----
 .../net/wireless/mac80211/rt2x00/rt2x00firmware.h  |    6 -
 drivers/net/wireless/mac80211/rt2x00/rt2x00lib.h   |    7 -
 drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c   |  131 ++++------
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.c   |   52 ++++-
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.h   |   16 +-
 .../net/wireless/mac80211/rt2x00/rt2x00rfkill.c    |   62 +++--
 .../net/wireless/mac80211/rt2x00/rt2x00rfkill.h    |    7 +
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.c   |  156 +++++++++---
 drivers/net/wireless/mac80211/rt2x00/rt61pci.c     |  264 +++++++++++++-------
 drivers/net/wireless/mac80211/rt2x00/rt61pci.h     |   77 ++++--
 drivers/net/wireless/mac80211/rt2x00/rt73usb.c     |  242 ++++++++++---------
 drivers/net/wireless/mac80211/rt2x00/rt73usb.h     |   81 ++++---
 23 files changed, 1166 insertions(+), 1026 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2007-07-20  8:11 Ivo van Doorn
@ 2007-07-20  8:13 ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-07-20  8:13 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Hi,

One additional note I forgot to mention:

> The following changes since commit a7008e4ecc4ec69a9868105ce7f805a6ab486d69:
>   Johannes Berg (1):
>         mac80211: regdomain.c needs to include ieee80211_i.h
> 
> are available in the git repository at:
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git/ master

Please note the new location of the Git repository ;)
Because of problems with the git.serialmonkey repository
we have now moved to git.kernel.org. :)

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-07-25 20:49 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-07-25 20:49 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Today a very quick release of 2.0.4,
reason for this quick followup on 2.0.3 are the fixes
regarding the USB ID and the rt61pci interrupts.

The latter one (hopefully) resolves an bugreport recently
raised in the Fedora Bugzilla. (I'll update the report in a few seconds)

And yes I have read the mails of today regarding patch submissions,
so I'll start sending the individual patches as well along with this pull request. ;)

Short note about the state of rt2x00:
  - Code cleaning is progressing, next version will probably contain
    the result of Lindent run. But after that I don't expect big changes regarding
    code style.

  - Writing "Magical" values to the registers has been reduced as much as possible,
    most values that are still magical are really magic and I have no clue on what they
    exactly mean, except that those values should be written. ;)

  - Suspend/resume is completely broken. I am not sure how the device should
    correctly suspend/resume. Most important points on this area are
    deregistering/registering ieee80211_hw and reassociation after resume.
    I am gathering some more info on this, and will post a bigger report on the mailinglist
    in a few days.

  - Statistics reading. Noise and Signal are still empty...
    It would really be nice to have some value to report for these statistics.

  - Bug reports show definite progress, rt2x00 doesn't really seem to break things,
    but neither is it doing a usefull things...

Ivo

---

The following changes since commit 9cc4f5142dd983d178b158e782d5e60900e48270:
  Michael Wu (1):
        mac80211: use more GFP_KERNEL instead of GFP_ATOMIC

are available in the git repository at:

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

Adam Baker (1):
      rt2x00: Don't export unneeded symbols

Ivo van Doorn (13):
      rt2x00: Check permissions on debugfs write
      Merge branch 'wireless-dev'
      rt2x00: Use rts_cts_rate for CTS frames
      rt2x00: Cleanup allocation/initialization
      rt2x00: rt61pci interrupts are called on MCU CMD done
      rt2x00: Reduce requirement for debugfs wrapper functions
      rt2x00: Don't toggle promisc mode in link_tuner
      rt2x00: Fix MAC address initialization for multiple interfaces
      Merge branch 'wireless-dev'
      rt2x00: Check for all errors on RXdone
      rt2x00: Parse chipset revision for RT chip validation
      rt2x00: Release 2.0.4
      Merge branch 'wireless-dev'

 drivers/net/wireless/mac80211/rt2x00/rt2400pci.c   |   83 +--
 drivers/net/wireless/mac80211/rt2x00/rt2400pci.h   |    2 +-
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.c   |   90 +---
 drivers/net/wireless/mac80211/rt2x00/rt2500pci.h   |    2 +-
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.c   |  105 ++---
 drivers/net/wireless/mac80211/rt2x00/rt2500usb.h   |    4 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00.h      |   17 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00debug.c |  237 +++------
 drivers/net/wireless/mac80211/rt2x00/rt2x00debug.h |   27 +-
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.c   |  560 ++++++++++----------
 drivers/net/wireless/mac80211/rt2x00/rt2x00dev.h   |    1 -
 drivers/net/wireless/mac80211/rt2x00/rt2x00mac.c   |   57 ++-
 drivers/net/wireless/mac80211/rt2x00/rt2x00pci.c   |   58 ++-
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.c   |  126 +++--
 drivers/net/wireless/mac80211/rt2x00/rt2x00usb.h   |    1 -
 drivers/net/wireless/mac80211/rt2x00/rt61pci.c     |   99 ++---
 drivers/net/wireless/mac80211/rt2x00/rt61pci.h     |    2 +-
 drivers/net/wireless/mac80211/rt2x00/rt73usb.c     |  100 ++---
 drivers/net/wireless/mac80211/rt2x00/rt73usb.h     |    2 +-
 19 files changed, 731 insertions(+), 842 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-07-31 18:36 Ivo van Doorn
  2007-08-01 17:05 ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2007-07-31 18:36 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is a new release of rt2x00: 2.0.5
Don't let the 25 patches fool you, there are 2 _very_ big patches among them. ;)
The 2 biggest are (as announced earlier) the results of a Lindent run,
and the result of a code cleanup. After those 2 patches the code is hopefully
clean enough to be accepted upstream when rt2x00 is a bit more stable.
In any case further code cleanup patches won't/shouldn't be so big anymore.

Some interesting features in this release:
 - rt73usb no longer crashes in adhoc mode (But neither does it work)
 - rf registers can now be read/written through debugfs
 - Monitor interfaces should now capture everything
 - Signal reporting
 - Correct suspend/resume handling

Ivo

---

The following changes since commit 6e46e62d22ed4b5282d3b9592483e901a9f2643f:
  Zhu Yi (1):
        iwlwifi: update version stamp to 0.1.5

are available in the git repository at:

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

Ivo van Doorn (25):
      rt2x00: Remove rt73usb_get_tsf
      rt2x00: Put rf register value detection in function
      rt2x00: Don't toggle tuner bit for non-RF2523 chips
      rt2x00: Add reset_tuner handler
      rt2x00: rt2500usb needs to reset BBP 24, 25 and 61
      rt2x00: Cleanup RF register reading/writing
      rt2x00: Add RF register contents to Debugfs
      rt2x00: Fix invalid RF array reading
      rt2x00: Increase RF_SIZE
      rt2x00: rt2x00pci should use rf_size
      rt2x00: Correctly handle RF 0 writing
      rt2x00: Rename init_hw -> probe_hw
      rt2x00: Move interface init/deinit into rt2x00dev
      rt2x00: Fix interface opening/closing on suspend/resume
      rt2x00: Lindent
      rt2x00: Call all configure handlers during resume
      rt2x00: Big rt2x00 cleanup
      rt2x00: Add Multicast/Broadcast filtering
      rt2x00: Include <linux/delay.h>
      rt2x00: Periodically read statistics
      rt2x00: Don't check for preamble in RXdone
      rt2x00: Configure type during add_interface
      rt2x00: Add Signal reporting
      rt2x00: rt2x00 2.0.5
      Merge branch 'wireless-dev'

 drivers/net/wireless/Makefile         |    2 +-
 drivers/net/wireless/rt2400pci.c      |  620 +++++++++++----------
 drivers/net/wireless/rt2400pci.h      |    3 +-
 drivers/net/wireless/rt2500pci.c      |  695 +++++++++++++-----------
 drivers/net/wireless/rt2500pci.h      |    2 +
 drivers/net/wireless/rt2500usb.c      |  686 +++++++++++++-----------
 drivers/net/wireless/rt2500usb.h      |   35 +-
 drivers/net/wireless/rt2x00.h         |  861 +++++++++---------------------
 drivers/net/wireless/rt2x00config.c   |  177 ++++++
 drivers/net/wireless/rt2x00debug.c    |  101 +++--
 drivers/net/wireless/rt2x00debug.h    |   32 +-
 drivers/net/wireless/rt2x00dev.c      |  470 +++++++++++------
 drivers/net/wireless/rt2x00dev.h      |   59 --
 drivers/net/wireless/rt2x00firmware.c |   45 +-
 drivers/net/wireless/rt2x00firmware.h |   43 --
 drivers/net/wireless/rt2x00lib.h      |  137 +++---
 drivers/net/wireless/rt2x00mac.c      |  283 +++++-----
 drivers/net/wireless/rt2x00pci.c      |  140 +++--
 drivers/net/wireless/rt2x00pci.h      |   38 +-
 drivers/net/wireless/rt2x00reg.h      |  270 +++++++++
 drivers/net/wireless/rt2x00rfkill.c   |   41 +-
 drivers/net/wireless/rt2x00rfkill.h   |   58 --
 drivers/net/wireless/rt2x00ring.h     |  242 ++++++++
 drivers/net/wireless/rt2x00usb.c      |  177 ++++---
 drivers/net/wireless/rt2x00usb.h      |   40 +-
 drivers/net/wireless/rt61pci.c        |  966 +++++++++++++++++----------------
 drivers/net/wireless/rt61pci.h        |    3 +-
 drivers/net/wireless/rt73usb.c        |  870 ++++++++++++++++--------------
 drivers/net/wireless/rt73usb.h        |    3 +-
 29 files changed, 3870 insertions(+), 3229 deletions(-)
 create mode 100644 drivers/net/wireless/rt2x00config.c
 delete mode 100644 drivers/net/wireless/rt2x00dev.h
 delete mode 100644 drivers/net/wireless/rt2x00firmware.h
 create mode 100644 drivers/net/wireless/rt2x00reg.h
 delete mode 100644 drivers/net/wireless/rt2x00rfkill.h
 create mode 100644 drivers/net/wireless/rt2x00ring.h

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2007-07-31 18:36 Ivo van Doorn
@ 2007-08-01 17:05 ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-08-01 17:05 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Thanks for the quick pull on rt2x00.git,
but I have a short question:

> Ivo van Doorn (25):
>       rt2x00: Remove rt73usb_get_tsf
>       rt2x00: Put rf register value detection in function
>       rt2x00: Don't toggle tuner bit for non-RF2523 chips
>       rt2x00: Add reset_tuner handler
>       rt2x00: rt2500usb needs to reset BBP 24, 25 and 61
>       rt2x00: Cleanup RF register reading/writing
>       rt2x00: Add RF register contents to Debugfs
>       rt2x00: Fix invalid RF array reading
>       rt2x00: Increase RF_SIZE
>       rt2x00: rt2x00pci should use rf_size
>       rt2x00: Correctly handle RF 0 writing
>       rt2x00: Rename init_hw -> probe_hw
>       rt2x00: Move interface init/deinit into rt2x00dev
>       rt2x00: Fix interface opening/closing on suspend/resume
>       rt2x00: Lindent
>       rt2x00: Call all configure handlers during resume
>       rt2x00: Big rt2x00 cleanup
>       rt2x00: Add Multicast/Broadcast filtering
>       rt2x00: Include <linux/delay.h>
>       rt2x00: Periodically read statistics
>       rt2x00: Don't check for preamble in RXdone
>       rt2x00: Configure type during add_interface
>       rt2x00: Add Signal reporting

The above have been merged nicely,
but where did the following patch go to?

>       rt2x00: rt2x00 2.0.5

Was this intentionally dropped,
or was there a weird git problem somewhere?

Thanks,

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-08-02 15:45 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-08-02 15:45 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is rt2x00 version 2.0.6,
unfortunately 2.0.5 was broken and unusable.

Problem has been found and fixed, so together with
some other small changes here is 2.0.6 :)

This one should be safe to be merged with FC kernels. ;)

Ivo

---

The following changes since commit 515c4dbee8271ff66fde61304309b1992e430502:
  John W. Linville (1):
        Merge branch 'upstream' of git://git.kernel.org/.../ivd/rt2x00

are available in the git repository at:

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

Ivo van Doorn (7):
      Merge branch 'wireless-dev'
      rt2x00: Add new USB ID for Buffalo rt73usb
      rt2x00: Update rssi before signal calculation
      rt2x00: Return 0 when the offset != 0
      rt2x00: rt2x00lib_config_mac_addr should call config_mac
      rt2x00: Release rt2x00 2.0.6
      Merge branch 'wireless-dev'

 drivers/net/wireless/rt2x00.h       |    2 +-
 drivers/net/wireless/rt2x00config.c |    4 ++--
 drivers/net/wireless/rt2x00debug.c  |    6 ++++++
 drivers/net/wireless/rt2x00dev.c    |    2 +-
 drivers/net/wireless/rt73usb.c      |    2 ++
 5 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/rt2x00.h b/drivers/net/wireless/rt2x00.h
index c5c1773..77556fe 100644
--- a/drivers/net/wireless/rt2x00.h
+++ b/drivers/net/wireless/rt2x00.h
@@ -41,7 +41,7 @@
  * Module information.
  * DRV_NAME should be set within the individual module source files.
  */
-#define DRV_VERSION	"2.0.5"
+#define DRV_VERSION	"2.0.6"
 #define DRV_PROJECT	"http://rt2x00.serialmonkey.com"
 
 /*
diff --git a/drivers/net/wireless/rt2x00config.c b/drivers/net/wireless/rt2x00config.c
index 3733a84..11d5646 100644
--- a/drivers/net/wireless/rt2x00config.c
+++ b/drivers/net/wireless/rt2x00config.c
@@ -37,13 +37,13 @@
 void rt2x00lib_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *mac)
 {
 	if (mac)
-		rt2x00dev->ops->lib->config_bssid(rt2x00dev, mac);
+		rt2x00dev->ops->lib->config_mac_addr(rt2x00dev, mac);
 }
 
 void rt2x00lib_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
 {
 	if (bssid)
-		rt2x00dev->ops->lib->config_mac_addr(rt2x00dev, bssid);
+		rt2x00dev->ops->lib->config_bssid(rt2x00dev, bssid);
 }
 
 void rt2x00lib_config_packet_filter(struct rt2x00_dev *rt2x00dev, int filter)
diff --git a/drivers/net/wireless/rt2x00debug.c b/drivers/net/wireless/rt2x00debug.c
index ffc95bb..d6c4cfe 100644
--- a/drivers/net/wireless/rt2x00debug.c
+++ b/drivers/net/wireless/rt2x00debug.c
@@ -124,6 +124,9 @@ static ssize_t rt2x00debug_read_##__name(struct file *file,	\
 	size_t size;						\
 	__type value;						\
 								\
+	if (*offset)						\
+		return 0;					\
+								\
 	if (intf->offset_##__name > debug->__name.word_count)	\
 		return -EINVAL;					\
 								\
@@ -151,6 +154,9 @@ static ssize_t rt2x00debug_write_##__name(struct file *file,	\
 	size_t size;						\
 	__type value;						\
 								\
+	if (*offset)						\
+		return 0;					\
+								\
 	if (!capable(CAP_NET_ADMIN))				\
 		return -EPERM;					\
 								\
diff --git a/drivers/net/wireless/rt2x00dev.c b/drivers/net/wireless/rt2x00dev.c
index a584fbe..28ddbe0 100644
--- a/drivers/net/wireless/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00dev.c
@@ -349,11 +349,11 @@ void rt2x00lib_rxdone(struct data_entry *entry, char *data,
 		}
 	}
 
+	rt2x00_update_link_rssi(&rt2x00dev->link, rssi);
 	rt2x00dev->link.rx_success++;
 	rx_status->rate = val;
 	rx_status->signal = rt2x00lib_calculate_link_signal(rt2x00dev);
 	rx_status->ssi = rssi;
-	rt2x00_update_link_rssi(&rt2x00dev->link, rssi);
 
 	/*
 	 * Let's allocate a sk_buff where we can store the received data in,
diff --git a/drivers/net/wireless/rt73usb.c b/drivers/net/wireless/rt73usb.c
index 48fb38e..2f0bf29 100644
--- a/drivers/net/wireless/rt73usb.c
+++ b/drivers/net/wireless/rt73usb.c
@@ -1884,6 +1884,8 @@ static struct usb_device_id rt73usb_device_table[] = {
 	{ USB_DEVICE(0x050d, 0x905b), USB_DEVICE_DATA(&rt73usb_ops) },
 	/* Billionton */
 	{ USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) },
+	/* Buffalo */
+	{ USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },
 	/* CNet */
 	{ USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) },
 	{ USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) },

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-08-19 18:18 Ivo van Doorn
  0 siblings, 0 replies; 74+ 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] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-09-16 12:17 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-09-16 12:17 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

It has taken some time to finally release this,
but it contains quite a lot of bugfixes of variating impact.

Overall the stability has been greatly improved,
although there are still some nasty bugs in there.

Note that even after this update rt2x00 in wireless-dev will still not work
for encrypted networks. This is because rt2x00 depends on the encryption
patches by Johannes which are pending for wireless-dev inclusion
(Most notably the patch that fixes the IEEE80211_HW_WEP_INCLUDE_IV
behavior is required to make it work again).

Ivo

---

The following changes since commit e6d77b902151278df6a670b460a32e7cc6b75e9e:
  Luis R. Rodriguez (1):
        Merge branch 'ath5k' 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 (24):
      rt2x00: Remove firmware not-NULL check
      rt2x00: Don't check for IEEE80211_TXCTL_REQ_TX_STATUS
      rt2x00: Cleanup rxdone
      rt2x00: Don't allow configuration calls when uninitialized
      rt2x00: Fix rt61pci and rt73usb beacon handling
      rt2x00: Recalculate link quality
      rt2x00: Cleanup entry->flags
      rt2x00: Reduce LNA flags
      rt2x00: Rework RT61 and RT73 Antenna handling
      rt2x00: Rename DEVICE_SUPPORT_ATIM to REQUIRE_BEACON_RING
      rt2x00: Remove rt2x00mac_reset()
      rt2x00: Fix system freeze on device removal
      rt2x00: Reduce magic value writing to device
      rt2x00: New USB ID's for rt73usb and rt2500usb
      rt2x00: Beacon ring entries should have QID_MGMT
      rt2x00: Fix DEV_RATEBIT_ definitions
      rt2x00: Fix rfkill handling
      rt2x00: Merge allocation/free register components
      rt2x00: macro's shouldn't use hidden arguments
      rt2x00: Fix channel initialization
      rt2x00: Add better CONFIG_PM checks
      rt2x00: Add start/stop handlers
      rt2x00: Add additional bit to MAX_FRAME_UNIT
      rt2x00: Release rt2x00 2.0.8

 drivers/net/wireless/rt2x00/rt2400pci.c      |   37 +-
 drivers/net/wireless/rt2x00/rt2500pci.c      |   83 +++--
 drivers/net/wireless/rt2x00/rt2500pci.h      |   40 ++-
 drivers/net/wireless/rt2x00/rt2500usb.c      |  208 ++++++++--
 drivers/net/wireless/rt2x00/rt2500usb.h      |   39 ++-
 drivers/net/wireless/rt2x00/rt2x00.h         |   47 ++-
 drivers/net/wireless/rt2x00/rt2x00config.c   |   12 +-
 drivers/net/wireless/rt2x00/rt2x00debug.c    |   26 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c      |  308 ++++++--------
 drivers/net/wireless/rt2x00/rt2x00firmware.c |    6 +-
 drivers/net/wireless/rt2x00/rt2x00lib.h      |    4 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c      |  111 ++++--
 drivers/net/wireless/rt2x00/rt2x00pci.c      |  127 ++----
 drivers/net/wireless/rt2x00/rt2x00pci.h      |    3 +
 drivers/net/wireless/rt2x00/rt2x00reg.h      |   27 +-
 drivers/net/wireless/rt2x00/rt2x00rfkill.c   |    6 +-
 drivers/net/wireless/rt2x00/rt2x00ring.h     |   29 +-
 drivers/net/wireless/rt2x00/rt2x00usb.c      |  235 +++--------
 drivers/net/wireless/rt2x00/rt2x00usb.h      |    9 +-
 drivers/net/wireless/rt2x00/rt61pci.c        |  617 ++++++++++++++++++--------
 drivers/net/wireless/rt2x00/rt61pci.h        |   87 ++++-
 drivers/net/wireless/rt2x00/rt73usb.c        |  471 +++++++++++++-------
 drivers/net/wireless/rt2x00/rt73usb.h        |   65 +++-
 23 files changed, 1615 insertions(+), 982 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-09-25 18:52 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-09-25 18:52 UTC (permalink / raw)
  To: John W. Linville, linux-wireless, rt2400-devel

Hi John,

(Finally) the rt2x00 2.0.9 release containing the patches
for the API changes from the mac80211-misc git tree.

NOTE: currently rt2x00.git is branched off from the mac80211-misc
tree to make the porting easier and to allow early testing.
So you might want to pull that tree before pulling rt2x00.

This release contains several bug fixes especially some kernel
panics during rmmod have been fixed by Modestas Vainius.

---

The following changes since commit 4cceb887147261d7fd9fe7ce3b6d6f236c8300bc:
  Michael Wu (1):
        adm8211: Adapt to filter configuration API

are available in the git repository at:

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

Ivo van Doorn (11):
      rt2x00: Correct error in calculating rssi for link tuner
      rt2x00: Make *_beacon_update static
      rt2x00: Increase rt2x00usb_vendor_request timeout.
      rt2x00: Correctly identify rt2561turbo
      rt2x00: adapt to filter configuration API
      rt2x00: Reorganize rt2x00dev->flags
      rt2x00: Add rt2x00dev->flags to debugfs
      rt2x00: Stop link tuning when radio is down
      rt2x00: Fix obvious typo in comment
      rt2x00: Fix panic on rmmod with rfkill enabled
      rt2x00: Release rt2x00 2.0.9

Modestas Vainius (1):
      rt2x00: make rt2x00lib_stop_link_tuner() reentrant with link_tuner work

 drivers/net/wireless/rt2x00/rt2400pci.c    |  159 +++++++++++++-----------
 drivers/net/wireless/rt2x00/rt2500pci.c    |  171 ++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2500usb.c    |  181 ++++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2x00.h       |   70 ++++-------
 drivers/net/wireless/rt2x00/rt2x00config.c |   75 +-----------
 drivers/net/wireless/rt2x00/rt2x00debug.c  |   37 ++++++
 drivers/net/wireless/rt2x00/rt2x00dev.c    |  109 +++++++++++++-----
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    4 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c    |  155 ++++++++----------------
 drivers/net/wireless/rt2x00/rt2x00pci.c    |   31 ++---
 drivers/net/wireless/rt2x00/rt2x00rfkill.c |   14 +--
 drivers/net/wireless/rt2x00/rt2x00ring.h   |   17 +++-
 drivers/net/wireless/rt2x00/rt2x00usb.c    |   26 ++---
 drivers/net/wireless/rt2x00/rt2x00usb.h    |    8 +-
 drivers/net/wireless/rt2x00/rt61pci.c      |  172 ++++++++++++++------------
 drivers/net/wireless/rt2x00/rt73usb.c      |  179 ++++++++++++++++------------
 drivers/net/wireless/rt2x00/rt73usb.h      |    2 +-
 17 files changed, 728 insertions(+), 682 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-10-06 12:19 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-10-06 12:19 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the rt2x00 2.0.10 update.
Some obvious bugs have been fixed, some not so obvious bugs,
and the code has been cleaned up a bit by moving more
into rt2x00lib.

Note that as of now rt2x00.git will be branched from the wireless-2.6
git tree. I see wireless-dev has already been removed/renamed so
I won't be using that anymore. ;)

All indivual patches can also be found here:
http://kernel.org//pub/linux/kernel/people/ivd/rt2x00-2.0.10/

Ivo

---

The following changes since commit f88cf9b6d7c8dad6eb64a972a753584b8006c545:
  John W. Linville (1):
        zd1211rw-mac80211: undo print_mac API stuff

are available in the git repository at:

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

Ivo van Doorn (16):
      rt2x00: Remove duplicate code in MAC & BSSID handling
      rt2x00: Remove radio check from rt2x00lib_toggle_rx
      rt2x00: Store "STARTED" state during suspend
      rt2x00: Move rt2x00dev flags into enumeration
      rt2x00: Don't use changed_flags inside configure_packet_filter
      rt2x00: Fix rfkill handling
      rt2x00: Move TSF sync values into rt2x00config
      rt2x00: get_duration expects values in 100kbs
      rt2x00: Cut lines down to 80 characters
      rt2x00: Add get_tx_data_len callback function
      rt2x00: Pass dev_state to rt2x00lib_toggle_rx
      rt2x00: Small optimizations
      rt2x00: Reorganize configuration handler
      rt2x00: Clean disabling of rt73usb_get_tsf
      rt2x00: Allways memset memory obtained from skb_push()
      rt2x00: Release 2.0.10

 drivers/net/wireless/rt2x00/rt2400pci.c    |  186 ++++++++++----------------
 drivers/net/wireless/rt2x00/rt2500pci.c    |  201 +++++++++++-----------------
 drivers/net/wireless/rt2x00/rt2500usb.c    |  200 ++++++++++++----------------
 drivers/net/wireless/rt2x00/rt2x00.h       |   93 ++++++++++---
 drivers/net/wireless/rt2x00/rt2x00config.c |  113 +++++++++++++++-
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   52 +++++---
 drivers/net/wireless/rt2x00/rt2x00lib.h    |   14 +--
 drivers/net/wireless/rt2x00/rt2x00mac.c    |   38 +++++-
 drivers/net/wireless/rt2x00/rt2x00reg.h    |    9 ++
 drivers/net/wireless/rt2x00/rt2x00rfkill.c |    4 +-
 drivers/net/wireless/rt2x00/rt2x00usb.c    |   29 +++--
 drivers/net/wireless/rt2x00/rt61pci.c      |  166 +++++++----------------
 drivers/net/wireless/rt2x00/rt73usb.c      |  195 +++++++++++----------------
 13 files changed, 642 insertions(+), 658 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-10-13 14:27 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-10-13 14:27 UTC (permalink / raw)
  To: John W. Linville; +Cc: rt2400-devel, linux-wireless

Hi John,

Here is the rt2x00 2.0.11 update.
Highlights for this release are the fix for the TX problems,
and the implementation of the Software Diversity Antenna.

All indivual patches can also be found here:
http://kernel.org//pub/linux/kernel/people/ivd/rt2x00-2.0.11/

Ivo

---

The following changes since commit 2d46d1e00056de79e54c622a60f7e6f8818f6cb4:
  Mattias Nissler (1):
        mac80211: Defer setting of RX_FLAG_DECRYPTED.

are available in the git repository at:

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

Ivo van Doorn (9):
      rt2x00: Move quality statistics into seperate structure
      rt2x00: Use enum defines
      rt2x00: Correctly translate mac80211 antenna setup to rt2x00
      rt2x00: SW diversity should default to antenna B
      rt2x00: Remove rt2x00_clear_link
      rt2x00: Implement SW diversity
      rt2x00: Cleanup if-statements
      rt2x00: Add new rt73usb USB ID
      rt2x00: Release rt2x00 2.0.11

Mattias Nissler (2):
      rt2x00: Fix residual check in PLCP calculations.
      rt2x00: Fix antenna selection.

 drivers/net/wireless/rt2x00/rt2400pci.c    |   80 +++++++-----
 drivers/net/wireless/rt2x00/rt2500pci.c    |   88 ++++++------
 drivers/net/wireless/rt2x00/rt2500usb.c    |   84 +++++++-----
 drivers/net/wireless/rt2x00/rt2500usb.h    |   13 ++-
 drivers/net/wireless/rt2x00/rt2x00.h       |  165 +++++++++++++++++------
 drivers/net/wireless/rt2x00/rt2x00config.c |   85 +++++++++++-
 drivers/net/wireless/rt2x00/rt2x00dev.c    |  201 ++++++++++++++++++++++++----
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    2 +
 drivers/net/wireless/rt2x00/rt61pci.c      |  116 +++++++++--------
 drivers/net/wireless/rt2x00/rt73usb.c      |   87 +++++++------
 10 files changed, 645 insertions(+), 276 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-10-27 11:34 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-10-27 11:34 UTC (permalink / raw)
  To: John W. Linville; +Cc: rt2400-devel, linux-wireless

Hi John,

Here is the 2.0.12 release of rt2x00.
I noticed you only pulled 2 patches from the 2.0.11 release,
and I don't know why you dropped the remaining patches.
This means that this pull requests also contains the remaining
2.0.11 patches...

Lots of bugfixes this time, finally rfkill is working, link speeds issues
have been resolved and some packet loss issues are gone.

All indivual patches can also be found here:
http://kernel.org//pub/linux/kernel/people/ivd/rt2x00-2.0.12/

Ivo

---

The following changes since commit 0119130478b1706232d79c768cb587c5e0c615de:
  John W. Linville (1):
        Merge branch 'fixes-jgarzik' into everything

are available in the git repository at:

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

Adam Baker (2):
      rt2x00: Unconstify rt2x00dev
      rt2x00: Place mutex around USB register access

Ivo van Doorn (15):
      rt2x00: Move quality statistics into seperate structure
      rt2x00: Use enum defines
      rt2x00: Correctly translate mac80211 antenna setup to rt2x00
      rt2x00: SW diversity should default to antenna B
      rt2x00: Remove rt2x00_clear_link
      rt2x00: Implement SW diversity
      rt2x00: Cleanup if-statements
      rt2x00: Release rt2x00 2.0.11
      rt2x00: Disable RX when switching antenna
      rt2x00: Split rt61/rt73 antenna selection into RX and TX antenna
      rt2x00: Input-polldev requires input device
      rt2x00: Detect initial rfkill state on register
      rt2x00: Remove unused variables
      rt2x00: Remove data_desc structure
      rt2x00: Release rt2x00 2.0.12

Mattias Nissler (4):
      rt2x00: Fix antenna selection.
      rt2x00: Rework rt61 antenna selection.
      rt2x00: Rework rt73 antenna selection
      rt2x00: Correctly set ACK bit in tx descriptors

 drivers/net/wireless/rt2x00/rt2400pci.c    |  104 +++++----
 drivers/net/wireless/rt2x00/rt2400pci.h    |    4 +-
 drivers/net/wireless/rt2x00/rt2500pci.c    |  112 +++++-----
 drivers/net/wireless/rt2x00/rt2500pci.h    |    4 +-
 drivers/net/wireless/rt2x00/rt2500usb.c    |  169 +++++++++-----
 drivers/net/wireless/rt2x00/rt2500usb.h    |   17 ++-
 drivers/net/wireless/rt2x00/rt2x00.h       |  192 ++++++++++++----
 drivers/net/wireless/rt2x00/rt2x00config.c |   95 ++++++++-
 drivers/net/wireless/rt2x00/rt2x00debug.h  |    4 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c    |  212 +++++++++++++++---
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    2 +
 drivers/net/wireless/rt2x00/rt2x00pci.c    |    4 +-
 drivers/net/wireless/rt2x00/rt2x00pci.h    |    8 +-
 drivers/net/wireless/rt2x00/rt2x00rfkill.c |   44 ++++-
 drivers/net/wireless/rt2x00/rt2x00ring.h   |   23 +--
 drivers/net/wireless/rt2x00/rt2x00usb.c    |   38 +++-
 drivers/net/wireless/rt2x00/rt2x00usb.h    |   19 +-
 drivers/net/wireless/rt2x00/rt61pci.c      |  332 ++++++++++++++--------------
 drivers/net/wireless/rt2x00/rt61pci.h      |   14 +-
 drivers/net/wireless/rt2x00/rt73usb.c      |  198 ++++++++++-------
 drivers/net/wireless/rt2x00/rt73usb.h      |   14 +-
 21 files changed, 1071 insertions(+), 538 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2007-11-27 20:46 Ivo van Doorn
  2007-11-27 20:54 ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2007-11-27 20:46 UTC (permalink / raw)
  To: John W. Linville, linux-wireless, rt2400-devel

Hi John,

Here is the latest version of rt2x00.

Please merge the patches for 2.6.24
09 - Only update rssi average approximation on receiving beacon frames.
10 - Remove redundant code in rfkill setup
11 - Cleanup rfkill

All other patches can wait for 2.6.25, since they are code cleanups and the
new TX/RX frame dumping facility through debugfs.

Ivo

---

The following changes since commit 301df40749bdf144c72637795ba93d82e4b84682:
  Johannes Berg (1):
        mac80211: remove more forgotten code

are available in the git repository at:

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

Ivo van Doorn (9):
      rt2x00: Replace DRV_NAME with KBUILD_MODNAME
      rt2x00: Extend PLCP descriptor definition for rt2400pci
      rt2x00: Move register value/offset files into new folder
      rt2x00: Add chipset version to chipset debugfs entry
      rt2x00: Add skb descriptor
      rt2x00: Add TX/RX frame dumping facility
      rt2x00: Use IEEE80211_IF_TYPE_INVALID directly
      rt2x00: Cleanup rfkill
      rt2x00: Release rt2x00 2.0.13

Larry Finger (1):
      rt2x00: Remove redundant code in rfkill setup

Mattias Nissler (1):
      rt2x00: Only update rssi average approximation on receiving beacon frames.

 drivers/net/wireless/rt2x00/rt2400pci.c      |   49 ++----
 drivers/net/wireless/rt2x00/rt2400pci.h      |   20 ++-
 drivers/net/wireless/rt2x00/rt2500pci.c      |    9 +-
 drivers/net/wireless/rt2x00/rt2500usb.c      |   39 +++--
 drivers/net/wireless/rt2x00/rt2x00.h         |   26 ++-
 drivers/net/wireless/rt2x00/rt2x00config.c   |    5 -
 drivers/net/wireless/rt2x00/rt2x00debug.c    |  240 +++++++++++++++++++++++---
 drivers/net/wireless/rt2x00/rt2x00dev.c      |   93 ++++++----
 drivers/net/wireless/rt2x00/rt2x00firmware.c |    5 -
 drivers/net/wireless/rt2x00/rt2x00lib.h      |    6 +
 drivers/net/wireless/rt2x00/rt2x00mac.c      |    7 +-
 drivers/net/wireless/rt2x00/rt2x00pci.c      |   59 +++++--
 drivers/net/wireless/rt2x00/rt2x00rfkill.c   |   15 --
 drivers/net/wireless/rt2x00/rt2x00ring.h     |   22 +++
 drivers/net/wireless/rt2x00/rt2x00usb.c      |   41 +++--
 drivers/net/wireless/rt2x00/rt61pci.c        |   36 +++--
 drivers/net/wireless/rt2x00/rt73usb.c        |   36 +++--
 17 files changed, 484 insertions(+), 224 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2007-11-27 20:46 Ivo van Doorn
@ 2007-11-27 20:54 ` Ivo van Doorn
  2007-11-29 22:26   ` John W. Linville
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2007-11-27 20:54 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi,

> Please merge the patches for 2.6.24
> 09 - Only update rssi average approximation on receiving beacon frames.
> 10 - Remove redundant code in rfkill setup
> 11 - Cleanup rfkill

Sorry that should be:
08 - Only update rssi average approximation on receiving beacon frames.
09 - Remove redundant code in rfkill setup
10 - Cleanup rfkill

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2007-11-27 20:54 ` Ivo van Doorn
@ 2007-11-29 22:26   ` John W. Linville
  2007-11-30  9:51     ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: John W. Linville @ 2007-11-29 22:26 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: linux-wireless, rt2400-devel

On Tue, Nov 27, 2007 at 09:54:29PM +0100, Ivo van Doorn wrote:

> > Please merge the patches for 2.6.24

> Sorry that should be:
> 08 - Only update rssi average approximation on receiving beacon frames.
> 09 - Remove redundant code in rfkill setup
> 10 - Cleanup rfkill

Actually it looks to me like 9 and 10 apply to code that isn't in
2.6.24.  8 looks like it is close, but it doesn't quite apply either.
I'll try to massage it in -- hopefully Jeff won't mind the extra
trouble when rebasing...

John
-- 
John W. Linville
linville@tuxdriver.com

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2007-11-29 22:26   ` John W. Linville
@ 2007-11-30  9:51     ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2007-11-30  9:51 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

On Thursday 29 November 2007, John W. Linville wrote:
> On Tue, Nov 27, 2007 at 09:54:29PM +0100, Ivo van Doorn wrote:
> 
> > > Please merge the patches for 2.6.24
> 
> > Sorry that should be:
> > 08 - Only update rssi average approximation on receiving beacon frames.
> > 09 - Remove redundant code in rfkill setup
> > 10 - Cleanup rfkill
> 
> Actually it looks to me like 9 and 10 apply to code that isn't in
> 2.6.24.  8 looks like it is close, but it doesn't quite apply either.
> I'll try to massage it in -- hopefully Jeff won't mind the extra
> trouble when rebasing...

9 and 10 should apply cleanly since the rfkill code hasn't changed for quite
some time now. In fact I believe it hasn't changed since the initial merge
to 2.6.24-rc.
Anyway, I'll try to create a patch for the upstream-jgarzik branch this weekend,
that would safe you and jeff some work. :)

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-01-06 22:37 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-01-06 22:37 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the 2.0.14 release of rt2x00. Again lots of bugfixes,
and unfortunately we are still not there yet. I am afraid
rt2500usb and rt61pci are lost causes for the 2.6.24 release,
they are both broken, and I haven't figured out what is causing
this.

Next release will contain more interesting stuff, most of those
patches are already done, but due to testing and fine tuning I
have kept those patches back for this release. They primarily
cover basic support for virtual interfaces, led triggers, and some
first patches to make rt2x00lib support rt2800 (Yes, work on those
drivers has begun).

All indivual patches can also be found here:
http://kernel.org//pub/linux/kernel/people/ivd/rt2x00-2.0.14/

Ivo

---
The following changes since commit 2d0811f5ed506397d85792abfd8ef0983f4e8b7c:
  John W. Linville (1):
        fixup 'everything' after 'upstream-davem' rebase and patch modification

are available in the git repository at:

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

Ivo van Doorn (12):
      rt2x00: Fix chipset debugfs file
      rt2x00: Always call ieee80211_stop_queue() when return NETDEV_TX_BUSY
      rt2x00: Only set the TBCN flag when the interface is configured to send beacons.
      rt2x00: Store queue idx and entry idx in data_ring and data_entry
      rt2x00: Move start() and stop() handlers into rt2x00lib.c
      rt2x00: Put 802.11 data on 4 byte boundary
      rt2x00: Move packet filter flags
      rt2x00: Cleanup write_tx_desc() arguments
      rt2x00: Determine MY_BSS from descriptor
      rt2x00: Move init_txring and init_rxring into rt2x00lib
      rt2x00: Correctly initialize data and desc pointer
      rt2x00: Release rt2x00 2.0.14

 drivers/net/wireless/rt2x00/rt2400pci.c   |  102 +++++++--------------
 drivers/net/wireless/rt2x00/rt2500pci.c   |   88 ++++++------------
 drivers/net/wireless/rt2x00/rt2500usb.c   |   36 +++++---
 drivers/net/wireless/rt2x00/rt2x00.h      |   32 ++++---
 drivers/net/wireless/rt2x00/rt2x00debug.c |   13 +--
 drivers/net/wireless/rt2x00/rt2x00dev.c   |  142 ++++++++++++++++++++++++-----
 drivers/net/wireless/rt2x00/rt2x00lib.h   |    4 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c   |   59 +++---------
 drivers/net/wireless/rt2x00/rt2x00pci.c   |   28 ++++--
 drivers/net/wireless/rt2x00/rt2x00ring.h  |   13 +++
 drivers/net/wireless/rt2x00/rt2x00usb.c   |   87 ++++++++----------
 drivers/net/wireless/rt2x00/rt2x00usb.h   |    5 +-
 drivers/net/wireless/rt2x00/rt61pci.c     |  114 +++++++++---------------
 drivers/net/wireless/rt2x00/rt73usb.c     |   35 ++++---
 14 files changed, 378 insertions(+), 380 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-02-03 14:41 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-02-03 14:41 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the 2.1.0 release of rt2x00.
The most important changes in this release:
 - Queue handling overhaul
 - Multiple virtual AP interfaces support for rt61 and rt73
 - LED class support
 - Adhoc & master mode enabled

Note that this patch series is _not_ intended for 2.6.25,
a lot might still be broken because the code has changed so much.
Adhoc and master mode is only enabled for testing purposes, in no way
it means that it is working for all drivers...

With these changes adding support for rt2800pci and rt2800usb will
be easier as well. Hopefully I can soon provide an initial version for
those 2 drivers as well.

All indivual patches can also be found here:
http://kernel.org//pub/linux/kernel/people/ivd/rt2x00-2.1.0/

Ivo

---

The following changes since commit e0e6138382c56aa99a1aabe5dddddbb332b5a4f8:
  Stefano Brivio (1):
        rc80211-pid: fix rate adjustment

are available in the git repository at:

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

Adam Baker (1):
      rt2x00: don't write past the end when writing short descriptors on rt61

Ivo van Doorn (18):
      rt2x00: Update copyright notice
      rt2x00: Queue handling overhaul
      rt2x00: Add new USB ID to rt2500usb
      rt2x00: Fix tx parameter initialization
      rt2x00: Enable master and adhoc mode again
      rt2x00: Driver requiring firmware should select crc algo
      rt2x00: Add per-interface structure
      rt2x00: Rate structure overhaul
      rt2x00: Remove HWMODE_{A,B,G}
      rt2x00: Remove TX_MGMT queue usage
      rt2x00: Initialize QID from queue->qid
      rt2x00: Use ieee80211_channel_to_frequency()
      rt2x00: Make use of MAC80211_LED_TRIGGERS
      rt2x00: Enable LED class support for rt2500usb/rt73usb
      rt2x00: Fix rate initialization
      rt2x00: Move beacon and atim queue defines into rt2x00
      rt2x00: Fix queue index handling
      rt2x00: Release rt2x00 2.1.0

 drivers/net/wireless/rt2x00/Kconfig          |   43 ++
 drivers/net/wireless/rt2x00/Makefile         |    6 +-
 drivers/net/wireless/rt2x00/rt2400pci.c      |  431 +++++++++------
 drivers/net/wireless/rt2x00/rt2400pci.h      |    2 +-
 drivers/net/wireless/rt2x00/rt2500pci.c      |  436 +++++++++------
 drivers/net/wireless/rt2x00/rt2500pci.h      |    2 +-
 drivers/net/wireless/rt2x00/rt2500usb.c      |  497 ++++++++++--------
 drivers/net/wireless/rt2x00/rt2500usb.h      |    5 +-
 drivers/net/wireless/rt2x00/rt2x00.h         |  288 ++++++-----
 drivers/net/wireless/rt2x00/rt2x00config.c   |  140 +++---
 drivers/net/wireless/rt2x00/rt2x00debug.c    |   34 +-
 drivers/net/wireless/rt2x00/rt2x00debug.h    |    2 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c      |  756 +++++++++++---------------
 drivers/net/wireless/rt2x00/rt2x00dump.h     |    8 +-
 drivers/net/wireless/rt2x00/rt2x00firmware.c |   43 ++-
 drivers/net/wireless/rt2x00/rt2x00leds.c     |  217 ++++++++
 drivers/net/wireless/rt2x00/rt2x00leds.h     |   63 +++
 drivers/net/wireless/rt2x00/rt2x00lib.h      |  100 ++++-
 drivers/net/wireless/rt2x00/rt2x00mac.c      |  221 +++++---
 drivers/net/wireless/rt2x00/rt2x00pci.c      |  238 ++++-----
 drivers/net/wireless/rt2x00/rt2x00pci.h      |   57 ++-
 drivers/net/wireless/rt2x00/rt2x00queue.c    |  295 ++++++++++
 drivers/net/wireless/rt2x00/rt2x00queue.h    |  447 +++++++++++++++
 drivers/net/wireless/rt2x00/rt2x00reg.h      |   75 +---
 drivers/net/wireless/rt2x00/rt2x00rfkill.c   |    2 +-
 drivers/net/wireless/rt2x00/rt2x00ring.h     |  290 ----------
 drivers/net/wireless/rt2x00/rt2x00usb.c      |  345 ++++++++-----
 drivers/net/wireless/rt2x00/rt2x00usb.h      |  179 +++++--
 drivers/net/wireless/rt2x00/rt61pci.c        |  601 +++++++++++----------
 drivers/net/wireless/rt2x00/rt61pci.h        |   21 +-
 drivers/net/wireless/rt2x00/rt73usb.c        |  468 +++++++++-------
 drivers/net/wireless/rt2x00/rt73usb.h        |   20 +-
 32 files changed, 3831 insertions(+), 2501 deletions(-)
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00leds.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00leds.h
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00queue.c
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00queue.h
 delete mode 100644 drivers/net/wireless/rt2x00/rt2x00ring.h

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-02-10 21:46 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-02-10 21:46 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is a quick followup release labeled 2.1.1. The previous release
contained many bugs as it was mostly untested. Result was there
were critical issues with it, of which some have now been fixed.

The most critical issues are random panics due to corrupt memory access,
at the moment none of the drivers are displaying any activity yet where
rt73usb is still crashing at random times.

Ivo

---

The following changes since commit d86916b7d36c4f0db8634fcc17fe2d747b317f17:
  John W. Linville (1):
        Merge branch 'at76' into everything

are available in the git repository at:

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

Adam Baker (1):
      rt2x00: correct address calc for queue private data

Ivo van Doorn (13):
      rt2x00: Fix invalid DMA free
      rt2x00: Make rt2x00 less verbose
      rt2x00: Remove MGMT ring initialization
      rt2x00: Select CONFIG_NEW_LEDS
      rt2x00: make csr_cache and csr_addr an union
      rt2x00: Fix scheduling while atomic errors in usb drivers
      rt2x00: Add queue statistics to debugfs
      rt2x00: Fix typo in debug statement
      rt2x00: Fix skbdesc->data_len initialization
      rt2x00: Fix queue->qid initialization
      rt2x00: Cleanup Makefile
      rt2x00: Kill guardian urb during disable_radio
      rt2x00: Release rt2x00 2.1.1

 drivers/net/wireless/rt2x00/Kconfig       |    1 +
 drivers/net/wireless/rt2x00/Makefile      |   41 +++++-------
 drivers/net/wireless/rt2x00/rt2400pci.c   |    4 -
 drivers/net/wireless/rt2x00/rt2500pci.c   |    4 -
 drivers/net/wireless/rt2x00/rt2500usb.c   |    6 +--
 drivers/net/wireless/rt2x00/rt2x00.h      |   12 ++--
 drivers/net/wireless/rt2x00/rt2x00debug.c |   90 ++++++++++++++++++++++----
 drivers/net/wireless/rt2x00/rt2x00mac.c   |    9 +++-
 drivers/net/wireless/rt2x00/rt2x00pci.c   |   99 +++++++++++++++++++---------
 drivers/net/wireless/rt2x00/rt2x00pci.h   |    8 +-
 drivers/net/wireless/rt2x00/rt2x00queue.c |   36 ++++++-----
 drivers/net/wireless/rt2x00/rt2x00usb.c   |   37 ++++++++---
 drivers/net/wireless/rt2x00/rt61pci.c     |    8 +--
 drivers/net/wireless/rt2x00/rt61pci.h     |    2 +-
 drivers/net/wireless/rt2x00/rt73usb.c     |    8 +--
 15 files changed, 231 insertions(+), 134 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-02-17 16:30 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-02-17 16:30 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the 2.1.2 release of rt2x00. Several important bugfixes like a
partial return of TX/RX activity in the PCI drivers.

Note that _none_ of the drivers (PCI or USB) are in a good shape since the
2.1.0 release. With partial RX/TX activity we are at least now on a similar
behavior as the 2.0.14 version inside kernel 2.6.25.

Speaking of the 2.6.25 kernel, it seems that rt2x00 is not in an all too good
shape in there. If more reports about broken TX/RX come in I will consider
reverting a lot of patches to make rt2x00 look a lot like the version in 2.6.24.
That version wasn't good either, but at least people can't complain about
regressions. ;)

Also note that the git pull request below also contains the patches from
previous pull request. But I noticed that you hadn't pulled in the 2.1.1 release yet.
I won't resent those patches to the list, since there aren't any changes in them
since last week. ;)

Ivo

---
The following changes since commit 2b78397a79d3daa2ba6c633526a7e3b455f9fc73:
  Stefano Brivio (1):
        b43legacy: Add driver load messages

are available in the git repository at:

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

Adam Baker (1):
      rt2x00: correct address calc for queue private data

Gertjan van Wingerde (1):
      Fix hw mode registration with mac80211.

Ivo van Doorn (23):
      rt2x00: Fix invalid DMA free
      rt2x00: Make rt2x00 less verbose
      rt2x00: Remove MGMT ring initialization
      rt2x00: Select CONFIG_NEW_LEDS
      rt2x00: make csr_cache and csr_addr an union
      rt2x00: Fix scheduling while atomic errors in usb drivers
      rt2x00: Add queue statistics to debugfs
      rt2x00: Fix typo in debug statement
      rt2x00: Fix skbdesc->data_len initialization
      rt2x00: Fix queue->qid initialization
      rt2x00: Cleanup Makefile
      rt2x00: Kill guardian urb during disable_radio
      rt2x00: Release rt2x00 2.1.1
      rt2x00: Send frames out with configured TX power
      rt2x00: Don't report driver generated frames to tx_status()
      rt2x00: Fix Descriptor DMA initialization
      rt2x00: Filter ACK_CTS based on FIF_CONTROL
      rt2x00: Remove reset_tsf()
      rt2x00: Rename dscape -> mac80211
      rt2x00: Cleanup mode registration
      rt2x00: Remove async vendor request calls from rt2x00usb
      rt2x00: Fix MAC address defines in rt61pci
      rt2x00: Release rt2x00 2.1.2

 drivers/net/wireless/rt2x00/Kconfig       |    3 +-
 drivers/net/wireless/rt2x00/Makefile      |   41 ++++-------
 drivers/net/wireless/rt2x00/rt2400pci.c   |   39 ++++------
 drivers/net/wireless/rt2x00/rt2400pci.h   |    6 +-
 drivers/net/wireless/rt2x00/rt2500pci.c   |   38 ++++------
 drivers/net/wireless/rt2x00/rt2500pci.h   |    4 +-
 drivers/net/wireless/rt2x00/rt2500usb.c   |   23 ++++---
 drivers/net/wireless/rt2x00/rt2500usb.h   |    4 +-
 drivers/net/wireless/rt2x00/rt2x00.h      |   50 ++++++++-----
 drivers/net/wireless/rt2x00/rt2x00debug.c |   90 ++++++++++++++++++++----
 drivers/net/wireless/rt2x00/rt2x00dev.c   |  100 +++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2x00lib.h   |    5 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c   |   24 ++++++-
 drivers/net/wireless/rt2x00/rt2x00pci.c   |  108 +++++++++++++++++++---------
 drivers/net/wireless/rt2x00/rt2x00pci.h   |   14 ++--
 drivers/net/wireless/rt2x00/rt2x00queue.c |   36 +++++----
 drivers/net/wireless/rt2x00/rt2x00queue.h |   12 +++-
 drivers/net/wireless/rt2x00/rt2x00usb.c   |   90 +++++++-----------------
 drivers/net/wireless/rt2x00/rt2x00usb.h   |   18 -----
 drivers/net/wireless/rt2x00/rt61pci.c     |   54 ++++++--------
 drivers/net/wireless/rt2x00/rt61pci.h     |   12 ++--
 drivers/net/wireless/rt2x00/rt73usb.c     |   56 +++++++--------
 drivers/net/wireless/rt2x00/rt73usb.h     |    4 +-
 23 files changed, 453 insertions(+), 378 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-02-25 22:20 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-02-25 22:20 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the 2.1.3 release of rt2x00.
Most bugfixes concentrate on the link tuner issues reported for
the rt2x00 2.0.14 version inside kernel 2.6.25.
One additional fix for rt61pci is present where the recent
"mode->band" changes in mac80211 contained a bug for rt61pci.

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-03-09 21:37 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-03-09 21:37 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

This is the latest version of rt2x00: 2.1.4

All drivers are now showing excellent progress, rt2400pci, rt2500pci, rt61pci and rt73usb
seem to be working as expected now. And only rt2500usb is spoiling things by having
only a working RX but no TX.

After this patch series, it is highly likely you can close a lot of rt2x00 related bugs
in the Fedora bugzilla. :)
Ivo

---
The following changes since commit 4f739cf30891f277a6353d61275489528fab64e3:
  Pavel Roskin (1):
        at76_usb: make the driver depend on MAC80211

are available in the git repository at:

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

Adam Baker (2):
      rt2x00: never disable multicast because it disables broadcast too
      rt2x00:correct rx packet length for USB devices

Ivo van Doorn (18):
      rt2x00: Align RX descriptor to 4 bytes
      rt2x00: Don't use uninitialized desc_len
      rt2x00: Use skbdesc fields for descriptor initialization
      rt2x00: Add new D-Link USB ID
      rt2x00: Only disable beaconing just before beacon update
      rt2x00: Upgrade queue->lock to use irqsave
      rt2x00: Move firmware checksumming to driver
      rt2x00: Start bugging when rt2x00lib doesn't filter SW diversity
      rt2x00: Check IEEE80211_TXCTL_SEND_AFTER_DTIM flag
      rt2x00: Rename config_preamble() to config_erp()
      rt2x00: Add suspend/resume handlers to rt2x00rfkill
      rt2x00: Make rt2x00leds_register return void
      rt2x00: Always enable TSF ticking
      rt2x00: Fix basic rate initialization
      rt2x00: Fix compile error when rfkill is disabled
      rt2x00: Fix RX DMA ring initialization
      rt2x00: Fix rt2400pci signal
      rt2x00: Release rt2x00 2.1.4

Luis Correia (1):
      rt2x00: Fix trivial log message

Mattias Nissler (3):
      rt2x00: Initialize TX control field in data entries
      rt2x00: Use the correct size when copying the control info in txdone
      rt2x00: Don't use unitialized rxdesc->size

 drivers/net/wireless/rt2x00/Kconfig          |    4 +-
 drivers/net/wireless/rt2x00/rt2400pci.c      |   67 +++++++------
 drivers/net/wireless/rt2x00/rt2400pci.h      |    6 +-
 drivers/net/wireless/rt2x00/rt2500pci.c      |   71 ++++++++------
 drivers/net/wireless/rt2x00/rt2500usb.c      |   97 ++++++++++---------
 drivers/net/wireless/rt2x00/rt2x00.h         |   31 ++++--
 drivers/net/wireless/rt2x00/rt2x00config.c   |   62 +++++++-----
 drivers/net/wireless/rt2x00/rt2x00debug.c    |    5 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c      |  108 +++++++++------------
 drivers/net/wireless/rt2x00/rt2x00firmware.c |   34 +-------
 drivers/net/wireless/rt2x00/rt2x00leds.c     |    7 +-
 drivers/net/wireless/rt2x00/rt2x00lib.h      |   45 ++++-----
 drivers/net/wireless/rt2x00/rt2x00mac.c      |   22 +++--
 drivers/net/wireless/rt2x00/rt2x00pci.c      |    1 +
 drivers/net/wireless/rt2x00/rt2x00queue.c    |   17 ++-
 drivers/net/wireless/rt2x00/rt2x00queue.h    |    3 +
 drivers/net/wireless/rt2x00/rt2x00rfkill.c   |  116 +++++++++++++++--------
 drivers/net/wireless/rt2x00/rt2x00usb.c      |   19 ++++-
 drivers/net/wireless/rt2x00/rt61pci.c        |  104 ++++++++++++--------
 drivers/net/wireless/rt2x00/rt73usb.c        |  131 +++++++++++++++-----------
 20 files changed, 524 insertions(+), 426 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-04-21 17:06 Ivo van Doorn
  2008-05-01  8:29 ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-04-21 17:06 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Finally a new official rt2x00 release,
off course I have send a lot of patches over the past few weeks
with several bugfixes, but now I am bumping the versions to 2.1.5.

Please consider this patch series for the 2.6.26 kernel,
they are all either bugfixes or minor cleanups.
with the exception of "[PATCH 4/9] rt2x00: Use rt2x00 queue numbering"
which besides a cleanup will also help with the pending mac80211
queue reorganization to QDisc.

Ivo

PS. Don't be alarmed over the "The following changes since commit"
line below which indicates "mac80211: Add IEEE80211_KEY_FLAG_PAIRWISE"
is used as basis. That patch is _not_ present in the rt2x00.git upstream branch
and none of the following patches depend on that patch.

---
The following changes since commit c8b29c460a389a8561189ad2a77fcb697ef35df9:
  Ivo van Doorn (1):
        mac80211: Add IEEE80211_KEY_FLAG_PAIRWISE

are available in the git repository at:

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

Ivo van Doorn (9):
      rt2x00: Support hardware RTS and CTS-to-self frames
      rt2x00: Remove DRIVER_SUPPORT_MIXED_INTERFACES
      rt2x00: Don't enable short preamble for 1MBs
      rt2x00: Use rt2x00 queue numbering
      rt2x00: Fix quality/activity led handling
      rt2x00: Clarify supported chipsets in Kconfig
      rt2x00: Add helper macros
      rt2x00: Fix kernel-doc
      rt2x00: Release rt2x00 2.1.5

 drivers/net/wireless/rt2x00/Kconfig       |   55 +++++++++++++++++------------
 drivers/net/wireless/rt2x00/rt2400pci.c   |   36 +++++++------------
 drivers/net/wireless/rt2x00/rt2500pci.c   |   39 +++++++-------------
 drivers/net/wireless/rt2x00/rt2500usb.c   |   22 ++++-------
 drivers/net/wireless/rt2x00/rt2x00.h      |   18 ++++-----
 drivers/net/wireless/rt2x00/rt2x00dev.c   |    5 ++-
 drivers/net/wireless/rt2x00/rt2x00leds.c  |   15 ++++++++
 drivers/net/wireless/rt2x00/rt2x00lib.h   |    6 +++
 drivers/net/wireless/rt2x00/rt2x00mac.c   |   31 +++++++++-------
 drivers/net/wireless/rt2x00/rt2x00pci.c   |    2 +-
 drivers/net/wireless/rt2x00/rt2x00pci.h   |    6 ++-
 drivers/net/wireless/rt2x00/rt2x00queue.c |    6 ++--
 drivers/net/wireless/rt2x00/rt2x00queue.h |   40 +++++++++++++-------
 drivers/net/wireless/rt2x00/rt2x00usb.c   |    4 +-
 drivers/net/wireless/rt2x00/rt2x00usb.h   |   21 +++++++++--
 drivers/net/wireless/rt2x00/rt61pci.c     |   29 +++++----------
 drivers/net/wireless/rt2x00/rt73usb.c     |   35 +++++++-----------
 17 files changed, 191 insertions(+), 179 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-04-21 17:06 Ivo van Doorn
@ 2008-05-01  8:29 ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-01  8:29 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, rt2400-devel

Hi John,

> Finally a new official rt2x00 release,
> off course I have send a lot of patches over the past few weeks
> with several bugfixes, but now I am bumping the versions to 2.1.5.
> 
> Please consider this patch series for the 2.6.26 kernel,

Was this patch series in time for the 2.6.26 merge window?

If not, please consider merging at least the following patches since
they are real bugfixes:

>       rt2x00: Don't enable short preamble for 1MBs
>       rt2x00: Fix quality/activity led handling
>       rt2x00: Clarify supported chipsets in Kconfig

The others are code cleanups which are "nice to have", but could otherwise
wait for 2.6.27.

>       rt2x00: Support hardware RTS and CTS-to-self frames
>       rt2x00: Remove DRIVER_SUPPORT_MIXED_INTERFACES
>       rt2x00: Use rt2x00 queue numbering
>       rt2x00: Add helper macros
>       rt2x00: Fix kernel-doc
>       rt2x00: Release rt2x00 2.1.5

Thanks,

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
@ 2008-05-02 21:04 Scott White
  2008-05-02 21:25 ` Ivo van Doorn
  2008-05-05 17:31 ` John W. Linville
  0 siblings, 2 replies; 74+ messages in thread
From: Scott White @ 2008-05-02 21:04 UTC (permalink / raw)
  To: linux-wireless


>Was this patch series in time for the 2.6.26 merge window?
>
>If not, please consider merging at least the following patches since
>they are real bugfixes:
>
>>       rt2x00: Don't enable short preamble for 1MBs
>>       rt2x00: Fix quality/activity led handling
>>       rt2x00: Clarify supported chipsets in Kconfig
>
>The others are code cleanups which are "nice to have", but could otherwise
>wait for 2.6.27.

The merge window is still open at this time.  I haven't seen a rc1 yet.  Anyway I saw that only the 3 bugfixes are currently in the queue.  As the owner of several (10 by the university and 2 personal) rt73 usb wireless cards, I would really like it if the latest version 2.1.5 made into 2.6.26.  As someone who has used 2.6.24 and finished compiling 2.6.25 two days ago I find that the driver in both kernels is not good.  Not good means I get a wireless signal and I get data transfers, but the speed fluctuates and have other issues.  However with each release, the problems I have are slowing decreasing.  I have been waiting patiently for 2.6.25-rc1 to have 2.1.5 since 2.1.5 was announced.  I really think all of 2.1.5 should get in 2.6.25-rc1.

Thanks,
_________________________________________________________________
Windows Live SkyDrive lets you share files with faraway friends.
http://www.windowslive.com/skydrive/overview.html?ocid=TXT_TAGLM_WL_Refresh_skydrive_052008

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-02 21:04 Scott White
@ 2008-05-02 21:25 ` Ivo van Doorn
  2008-05-03  6:19   ` Mattias Nissler
  2008-05-03 19:29   ` Scott White
  2008-05-05 17:31 ` John W. Linville
  1 sibling, 2 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-02 21:25 UTC (permalink / raw)
  To: Scott White; +Cc: linux-wireless

On Friday 02 May 2008, Scott White wrote:
> 
> >Was this patch series in time for the 2.6.26 merge window?
> >
> >If not, please consider merging at least the following patches since
> >they are real bugfixes:
> >
> >>       rt2x00: Don't enable short preamble for 1MBs
> >>       rt2x00: Fix quality/activity led handling
> >>       rt2x00: Clarify supported chipsets in Kconfig
> >
> >The others are code cleanups which are "nice to have", but could otherwise
> >wait for 2.6.27.
> 
> The merge window is still open at this time.  I haven't seen a rc1 yet.  Anyway I saw that only the 3 bugfixes are currently in the queue.  As the owner of several (10 by the university and 2 personal) rt73 usb wireless cards, I would really like it if the latest version 2.1.5 made into 2.6.26.  As someone who has used 2.6.24 and finished compiling 2.6.25 two days ago I find that the driver in both kernels is not good.  Not good means I get a wireless signal and I get data transfers, but the speed fluctuates and have other issues.  However with each release, the problems I have are slowing decreasing.  I have been waiting patiently for 2.6.25-rc1 to have 2.1.5 since 2.1.5 was announced.  I really think all of 2.1.5 should get in 2.6.25-rc1.

Have you tried forcing the rate to 54Mbit instead of letting the rate selection algorithm doing its work?
It seems to have helped with several other users.

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-02 21:25 ` Ivo van Doorn
@ 2008-05-03  6:19   ` Mattias Nissler
  2008-05-03  9:58     ` Ivo van Doorn
  2008-05-03 19:29   ` Scott White
  1 sibling, 1 reply; 74+ messages in thread
From: Mattias Nissler @ 2008-05-03  6:19 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: Scott White, linux-wireless

On Fri, 2008-05-02 at 23:25 +0200, Ivo van Doorn wrote:
> On Friday 02 May 2008, Scott White wrote:
> > 
> > >Was this patch series in time for the 2.6.26 merge window?
> > >
> > >If not, please consider merging at least the following patches since
> > >they are real bugfixes:
> > >
> > >>       rt2x00: Don't enable short preamble for 1MBs
> > >>       rt2x00: Fix quality/activity led handling
> > >>       rt2x00: Clarify supported chipsets in Kconfig
> > >
> > >The others are code cleanups which are "nice to have", but could otherwise
> > >wait for 2.6.27.
> > 
> > The merge window is still open at this time.  I haven't seen a rc1 yet.  Anyway I saw that only the 3 bugfixes are currently in the queue.  As the owner of several (10 by the university and 2 personal) rt73 usb wireless cards, I would really like it if the latest version 2.1.5 made into 2.6.26.  As someone who has used 2.6.24 and finished compiling 2.6.25 two days ago I find that the driver in both kernels is not good.  Not good means I get a wireless signal and I get data transfers, but the speed fluctuates and have other issues.  However with each release, the problems I have are slowing decreasing.  I have been waiting patiently for 2.6.25-rc1 to have 2.1.5 since 2.1.5 was announced.  I really think all of 2.1.5 should get in 2.6.25-rc1.
> 
> Have you tried forcing the rate to 54Mbit instead of letting the rate selection algorithm doing its work?
> It seems to have helped with several other users.

For rt73? IIRC the rate selection algo does not work at all for that
device, because we cannot report failed frames. Or have you done
anything about that I might have missed, Ivo? If not, the rate is
probably fixed at 54Mbit anyway.

Mattias


^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-03  6:19   ` Mattias Nissler
@ 2008-05-03  9:58     ` Ivo van Doorn
  2008-05-03 10:18       ` Mattias Nissler
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-03  9:58 UTC (permalink / raw)
  To: Mattias Nissler; +Cc: Scott White, linux-wireless

On Saturday 03 May 2008, Mattias Nissler wrote:
> On Fri, 2008-05-02 at 23:25 +0200, Ivo van Doorn wrote:
> > On Friday 02 May 2008, Scott White wrote:
> > > 
> > > >Was this patch series in time for the 2.6.26 merge window?
> > > >
> > > >If not, please consider merging at least the following patches since
> > > >they are real bugfixes:
> > > >
> > > >>       rt2x00: Don't enable short preamble for 1MBs
> > > >>       rt2x00: Fix quality/activity led handling
> > > >>       rt2x00: Clarify supported chipsets in Kconfig
> > > >
> > > >The others are code cleanups which are "nice to have", but could otherwise
> > > >wait for 2.6.27.
> > > 
> > > The merge window is still open at this time.  I haven't seen a rc1 yet.  Anyway I saw that only the 3 bugfixes are currently in the queue.  As the owner of several (10 by the university and 2 personal) rt73 usb wireless cards, I would really like it if the latest version 2.1.5 made into 2.6.26.  As someone who has used 2.6.24 and finished compiling 2.6.25 two days ago I find that the driver in both kernels is not good.  Not good means I get a wireless signal and I get data transfers, but the speed fluctuates and have other issues.  However with each release, the problems I have are slowing decreasing.  I have been waiting patiently for 2.6.25-rc1 to have 2.1.5 since 2.1.5 was announced.  I really think all of 2.1.5 should get in 2.6.25-rc1.
> > 
> > Have you tried forcing the rate to 54Mbit instead of letting the rate selection algorithm doing its work?
> > It seems to have helped with several other users.
> 
> For rt73? IIRC the rate selection algo does not work at all for that
> device, because we cannot report failed frames. Or have you done
> anything about that I might have missed, Ivo? If not, the rate is
> probably fixed at 54Mbit anyway.

Well I didn't do anything new, but this line will report rt2x00lib that the
frame was succesfully send or failed to send:
	txdesc.status = !urb->status ? TX_SUCCESS : TX_FAIL_RETRY;
What is missing is the retry count, since that is something that
the USB drivers cannot report. (Unless I grab the max retry count
as configured by mac80211 as the number of retries on failure)

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-03  9:58     ` Ivo van Doorn
@ 2008-05-03 10:18       ` Mattias Nissler
  2008-05-03 15:02         ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Mattias Nissler @ 2008-05-03 10:18 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: Scott White, linux-wireless

On Sat, 2008-05-03 at 11:58 +0200, Ivo van Doorn wrote:
> On Saturday 03 May 2008, Mattias Nissler wrote:
> > On Fri, 2008-05-02 at 23:25 +0200, Ivo van Doorn wrote:
> > > On Friday 02 May 2008, Scott White wrote:
> > > > 
> > > > >Was this patch series in time for the 2.6.26 merge window?
> > > > >
> > > > >If not, please consider merging at least the following patches since
> > > > >they are real bugfixes:
> > > > >
> > > > >>       rt2x00: Don't enable short preamble for 1MBs
> > > > >>       rt2x00: Fix quality/activity led handling
> > > > >>       rt2x00: Clarify supported chipsets in Kconfig
> > > > >
> > > > >The others are code cleanups which are "nice to have", but could otherwise
> > > > >wait for 2.6.27.
> > > > 
> > > > The merge window is still open at this time.  I haven't seen a rc1 yet.  Anyway I saw that only the 3 bugfixes are currently in the queue.  As the owner of several (10 by the university and 2 personal) rt73 usb wireless cards, I would really like it if the latest version 2.1.5 made into 2.6.26.  As someone who has used 2.6.24 and finished compiling 2.6.25 two days ago I find that the driver in both kernels is not good.  Not good means I get a wireless signal and I get data transfers, but the speed fluctuates and have other issues.  However with each release, the problems I have are slowing decreasing.  I have been waiting patiently for 2.6.25-rc1 to have 2.1.5 since 2.1.5 was announced.  I really think all of 2.1.5 should get in 2.6.25-rc1.
> > > 
> > > Have you tried forcing the rate to 54Mbit instead of letting the rate selection algorithm doing its work?
> > > It seems to have helped with several other users.
> > 
> > For rt73? IIRC the rate selection algo does not work at all for that
> > device, because we cannot report failed frames. Or have you done
> > anything about that I might have missed, Ivo? If not, the rate is
> > probably fixed at 54Mbit anyway.
> 
> Well I didn't do anything new, but this line will report rt2x00lib that the
> frame was succesfully send or failed to send:
> 	txdesc.status = !urb->status ? TX_SUCCESS : TX_FAIL_RETRY;
> What is missing is the retry count, since that is something that
> the USB drivers cannot report. (Unless I grab the max retry count
> as configured by mac80211 as the number of retries on failure)

Well, I have just put my rt73 into a metal box. Many frames do fail,
only very few get through pinging my AP. The rate control still keeps
the rate at 54Mbit/s :-) So it seems neither excessive_retries nor the
retry_count in the tx_status struct is set at all.

Mattias


^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-03 10:18       ` Mattias Nissler
@ 2008-05-03 15:02         ` Ivo van Doorn
  2008-05-03 15:27           ` Johannes Berg
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-03 15:02 UTC (permalink / raw)
  To: Mattias Nissler; +Cc: Scott White, linux-wireless

> > > For rt73? IIRC the rate selection algo does not work at all for that
> > > device, because we cannot report failed frames. Or have you done
> > > anything about that I might have missed, Ivo? If not, the rate is
> > > probably fixed at 54Mbit anyway.
> > 
> > Well I didn't do anything new, but this line will report rt2x00lib that the
> > frame was succesfully send or failed to send:
> > 	txdesc.status = !urb->status ? TX_SUCCESS : TX_FAIL_RETRY;
> > What is missing is the retry count, since that is something that
> > the USB drivers cannot report. (Unless I grab the max retry count
> > as configured by mac80211 as the number of retries on failure)
> 
> Well, I have just put my rt73 into a metal box. Many frames do fail,
> only very few get through pinging my AP. The rate control still keeps
> the rate at 54Mbit/s :-) So it seems neither excessive_retries nor the
> retry_count in the tx_status struct is set at all.

Hmm, perhaps we need some way the driver can inform the rate selection
module about statistics. I mean the hardware does measure the number
of failed TX frames, and the number of retries, but it doesn't set them
in the descriptor but in the hardware.

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-03 15:02         ` Ivo van Doorn
@ 2008-05-03 15:27           ` Johannes Berg
  2008-05-03 15:38             ` Mattias Nissler
  0 siblings, 1 reply; 74+ messages in thread
From: Johannes Berg @ 2008-05-03 15:27 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: Mattias Nissler, Scott White, linux-wireless

[-- Attachment #1: Type: text/plain, Size: 305 bytes --]


> Hmm, perhaps we need some way the driver can inform the rate selection
> module about statistics. I mean the hardware does measure the number
> of failed TX frames, and the number of retries, but it doesn't set them
> in the descriptor but in the hardware.

Yes we should have this.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-03 15:27           ` Johannes Berg
@ 2008-05-03 15:38             ` Mattias Nissler
  2008-05-03 16:56               ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Mattias Nissler @ 2008-05-03 15:38 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Ivo van Doorn, Scott White, linux-wireless

On Sat, 2008-05-03 at 17:27 +0200, Johannes Berg wrote:
> > Hmm, perhaps we need some way the driver can inform the rate selection
> > module about statistics. I mean the hardware does measure the number
> > of failed TX frames, and the number of retries, but it doesn't set them
> > in the descriptor but in the hardware.
> 
> Yes we should have this.

New rate control algorithm probably. Or even better: Split what is
currently the rate control algorithm into an link quality estimation
part (failed frames percentage and such) and the actual rate control
that interprets that value and acts accordingly.

Mattias


^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-03 15:38             ` Mattias Nissler
@ 2008-05-03 16:56               ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-03 16:56 UTC (permalink / raw)
  To: Mattias Nissler; +Cc: Johannes Berg, Scott White, linux-wireless

On Saturday 03 May 2008, Mattias Nissler wrote:
> On Sat, 2008-05-03 at 17:27 +0200, Johannes Berg wrote:
> > > Hmm, perhaps we need some way the driver can inform the rate selection
> > > module about statistics. I mean the hardware does measure the number
> > > of failed TX frames, and the number of retries, but it doesn't set them
> > > in the descriptor but in the hardware.
> > 
> > Yes we should have this.
> 
> New rate control algorithm probably. Or even better: Split what is
> currently the rate control algorithm into an link quality estimation
> part (failed frames percentage and such) and the actual rate control
> that interprets that value and acts accordingly.

Hmm, splitting that up would be nice, especially when the driver
will have access to those failed frame percentages directly.
rt2x00 currently keeps track of these statistics to perform link tuning,
I wouldn't be surprised if other drivers also keep similar statistics for
the same reason.

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* RE: Please pull 'upstream' branch of rt2x00
  2008-05-02 21:25 ` Ivo van Doorn
  2008-05-03  6:19   ` Mattias Nissler
@ 2008-05-03 19:29   ` Scott White
  1 sibling, 0 replies; 74+ messages in thread
From: Scott White @ 2008-05-03 19:29 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: linux-wireless


> To: nwi_sub@hotmail.com
> Subject: Re: Please pull 'upstream' branch of rt2x00
> Date: Fri, 2 May 2008 23:25:38 +0200
> CC: linux-wireless@vger.kernel.org
> From: ivdoorn@gmail.com
>
> On Friday 02 May 2008, Scott White wrote:
>>
>>>Was this patch series in time for the 2.6.26 merge window?
>>>
>>>If not, please consider merging at least the following patches since
>>>they are real bugfixes:
>>>
>>>> rt2x00: Don't enable short preamble for 1MBs
>>>> rt2x00: Fix quality/activity led handling
>>>> rt2x00: Clarify supported chipsets in Kconfig
>>>
>>>The others are code cleanups which are "nice to have", but could otherwise
>>>wait for 2.6.27.
>>
>> The merge window is still open at this time. I haven't seen a rc1 yet. Anyway I saw that only the 3 bugfixes are currently in the queue. As the owner of several (10 by the university and 2 personal) rt73 usb wireless cards, I would really like it if the latest version 2.1.5 made into 2.6.26. As someone who has used 2.6.24 and finished compiling 2.6.25 two days ago I find that the driver in both kernels is not good. Not good means I get a wireless signal and I get data transfers, but the speed fluctuates and have other issues. However with each release, the problems I have are slowing decreasing. I have been waiting patiently for 2.6.25-rc1 to have 2.1.5 since 2.1.5 was announced. I really think all of 2.1.5 should get in 2.6.25-rc1.
>
> Have you tried forcing the rate to 54Mbit instead of letting the rate selection algorithm doing its work?
> It seems to have helped with several other users.
>
> Ivo

No I haven't tried that.  However I have 54Mbit (g) at home, but only 11Mbit (b only) at work.  I guess I would have to change the rate when I change locations.

Thanks,

_________________________________________________________________
Make Windows Vista more reliable and secure with Windows Vista Service Pack 1.
http://www.windowsvista.com/SP1?WT.mc_id=hotmailvistasp1banner

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-05-05 15:23 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-05 15:23 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here are 3 patches for rt2x00, they are all intended for 2.6.26 since
they fix serious bugs. Patch 1 should prevent problems as reported by
Johannes Berg regarding skb->truesize by removing the only pskb_expand_head()
call in rt2x00 (and use a already existing buffer instead).

Patches 2 and 3 fix problems when DMA allocation fails, that usually doesn't happen,
hence the reason these problems have gone unnoticed for so long. :S

Ivo

---
The following changes since commit 0bacadffc86bcba2fdf2b989afc286a8184664a0:
  Ivo van Doorn (1):
        rt2x00: Fix quality/activity led handling

are available in the git repository at:

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

Gertjan van Wingerde (1):
      rt2x00: Clean up error handling of PCI queue DMA allocation.

Ivo van Doorn (2):
      rt2x00: Don't use pskb_expand_head()
      rt2x00: Fix broken recover-on-error path

 drivers/net/wireless/rt2x00/rt2x00dev.c |   11 ++++-------
 drivers/net/wireless/rt2x00/rt2x00pci.c |    5 +++--
 drivers/net/wireless/rt2x00/rt61pci.c   |   31 +++++++++++--------------------
 3 files changed, 18 insertions(+), 29 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-02 21:04 Scott White
  2008-05-02 21:25 ` Ivo van Doorn
@ 2008-05-05 17:31 ` John W. Linville
  1 sibling, 0 replies; 74+ messages in thread
From: John W. Linville @ 2008-05-05 17:31 UTC (permalink / raw)
  To: Scott White; +Cc: linux-wireless

On Fri, May 02, 2008 at 04:04:52PM -0500, Scott White wrote:
> 
> >Was this patch series in time for the 2.6.26 merge window?
> >
> >If not, please consider merging at least the following patches since
> >they are real bugfixes:
> >
> >>       rt2x00: Don't enable short preamble for 1MBs
> >>       rt2x00: Fix quality/activity led handling
> >>       rt2x00: Clarify supported chipsets in Kconfig
> >
> >The others are code cleanups which are "nice to have", but could otherwise
> >wait for 2.6.27.
> 
> The merge window is still open at this time.  I haven't seen
> a rc1 yet.  Anyway I saw that only the 3 bugfixes are currently
> in the queue.  As the owner of several (10 by the university and
> 2 personal) rt73 usb wireless cards, I would really like it if the
> latest version 2.1.5 made into 2.6.26.  As someone who has used 2.6.24
> and finished compiling 2.6.25 two days ago I find that the driver in
> both kernels is not good.  Not good means I get a wireless signal and
> I get data transfers, but the speed fluctuates and have other issues.
> However with each release, the problems I have are slowing decreasing.
> I have been waiting patiently for 2.6.25-rc1 to have 2.1.5 since 2.1.5
> was announced.  I really think all of 2.1.5 should get in 2.6.25-rc1.

I'm sorry, but this isn't how the merge window is used.  The merge
window is for merging code that is _already_ pending when the
window opens.  No one should wait for the merge window to open before
sending code to the upstream maintainers.  (I'm not suggesting that
Ivo delayed on purpose, I'm just stating the policy.)

Anything that fixes an actual bug can still go to 2.6.26 over the
next several weeks.  But code that is simply new development will
have to wait for 2.6.27's merge window before it gets to Linus.

Thanks,

John
-- 
John W. Linville
linville@tuxdriver.com

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-05-10 11:37 Ivo van Doorn
  2008-05-10 12:48 ` drago01
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-10 11:37 UTC (permalink / raw)
  To: linville; +Cc: linux-wireless, rt2400-devel, Johannes Berg

Hi John,

Here is a new rt2x00 release.
Please note that some patches have been send individually to linux-wireless before,
(including the 2 mac80211 patches) but for completeness I have added them to
this pull request.

This will bump rt2x00 to version 2.1.6, most patches are only intended to make
room for future patches like the mac80211 patch series from Johannes, HW crypto
and pci drivers without a preallocated big chunk of DMA.

Ivo

---
The following changes since commit d30d1674356e223c9f2c164ac9d0be35af8ee4e0:
  Johannes Berg (1):
        mac80211: fix wme code

are available in the git repository at:

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

Gertjan van Wingerde (3):
      rt2x00: Clean up error handling of PCI queue DMA allocation.
      rt2x00: Fix queue related oops in case of deselected mac80211 multi-queue feature.
      rt2x00: Only initialize the minimum needed fields of PCI TX descriptors.

Ivo van Doorn (13):
      rt2x00: Don't use pskb_expand_head()
      rt2x00: Fix broken recover-on-error path
      mac80211: Don't encrypt beacons
      mac80211: Add RTNL version of ieee80211_iterate_active_interfaces
      rt2x00: trim skb_frame_desc to 32 bytes
      rt2x00: Fix TX status reporting
      rt2x00: Remove ieee80211_tx_control argument from write_tx_desc()
      rt2x00: Preserve descriptor information after memmove()
      rt2x00: Split rt2x00lib_write_tx_desc()
      rt2x00: Remove redundant flags/dev_flags initializations
      rt2x00: Merge RX and TX entry private data
      rt2x00: Remove extra +
      rt2x00: Release rt2x00 2.1.6

 drivers/net/wireless/rt2x00/rt2400pci.c   |  126 +++++++++-------
 drivers/net/wireless/rt2x00/rt2400pci.h   |    5 +
 drivers/net/wireless/rt2x00/rt2500pci.c   |  114 ++++++++------
 drivers/net/wireless/rt2x00/rt2500pci.h   |    5 +
 drivers/net/wireless/rt2x00/rt2500usb.c   |   78 +++++-----
 drivers/net/wireless/rt2x00/rt2500usb.h   |    5 +
 drivers/net/wireless/rt2x00/rt2x00.h      |   48 +++++--
 drivers/net/wireless/rt2x00/rt2x00debug.c |    4 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c   |  190 +++---------------------
 drivers/net/wireless/rt2x00/rt2x00lib.h   |    6 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c   |    2 +-
 drivers/net/wireless/rt2x00/rt2x00pci.c   |  105 +++++--------
 drivers/net/wireless/rt2x00/rt2x00pci.h   |   22 +---
 drivers/net/wireless/rt2x00/rt2x00queue.c |  165 ++++++++++++++++++++-
 drivers/net/wireless/rt2x00/rt2x00queue.h |   45 ++++--
 drivers/net/wireless/rt2x00/rt2x00reg.h   |   11 --
 drivers/net/wireless/rt2x00/rt2x00usb.c   |  228 +++++++++++++++-------------
 drivers/net/wireless/rt2x00/rt2x00usb.h   |   17 +--
 drivers/net/wireless/rt2x00/rt61pci.c     |  146 ++++++++++---------
 drivers/net/wireless/rt2x00/rt61pci.h     |    5 +
 drivers/net/wireless/rt2x00/rt73usb.c     |   53 ++++----
 drivers/net/wireless/rt2x00/rt73usb.h     |    5 +
 include/net/mac80211.h                    |   25 +++-
 net/mac80211/tx.c                         |    1 +
 net/mac80211/util.c                       |   37 +++++-
 25 files changed, 794 insertions(+), 654 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-10 11:37 Ivo van Doorn
@ 2008-05-10 12:48 ` drago01
  2008-05-10 13:06   ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: drago01 @ 2008-05-10 12:48 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: linville, linux-wireless, rt2400-devel, Johannes Berg

On Sat, May 10, 2008 at 1:37 PM, Ivo van Doorn <ivdoorn@gmail.com> wrote:
> Hi John,
>
> Here is a new rt2x00 release.
> Please note that some patches have been send individually to linux-wireless before,
> (including the 2 mac80211 patches) but for completeness I have added them to
> this pull request.
>
> This will bump rt2x00 to version 2.1.6, most patches are only intended to make
> room for future patches like the mac80211 patch series from Johannes, HW crypto
> and pci drivers without a preallocated big chunk of DMA.
>
> Ivo

whats the current status of rt2860 support?

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-10 12:48 ` drago01
@ 2008-05-10 13:06   ` Ivo van Doorn
  2008-05-10 13:15     ` drago01
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-05-10 13:06 UTC (permalink / raw)
  To: drago01; +Cc: linville, linux-wireless, rt2400-devel, Johannes Berg

On Saturday 10 May 2008, drago01 wrote:
> On Sat, May 10, 2008 at 1:37 PM, Ivo van Doorn <ivdoorn@gmail.com> wrote:
> > Hi John,
> >
> > Here is a new rt2x00 release.
> > Please note that some patches have been send individually to linux-wireless before,
> > (including the 2 mac80211 patches) but for completeness I have added them to
> > this pull request.
> >
> > This will bump rt2x00 to version 2.1.6, most patches are only intended to make
> > room for future patches like the mac80211 patch series from Johannes, HW crypto
> > and pci drivers without a preallocated big chunk of DMA.
> >
> > Ivo
> 
> whats the current status of rt2860 support?

Under development.

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-05-10 13:06   ` Ivo van Doorn
@ 2008-05-10 13:15     ` drago01
  0 siblings, 0 replies; 74+ messages in thread
From: drago01 @ 2008-05-10 13:15 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: linville, linux-wireless, rt2400-devel, Johannes Berg

On Sat, May 10, 2008 at 3:06 PM, Ivo van Doorn <ivdoorn@gmail.com> wrote:
> On Saturday 10 May 2008, drago01 wrote:
>> On Sat, May 10, 2008 at 1:37 PM, Ivo van Doorn <ivdoorn@gmail.com> wrote:
>> > Hi John,
>> >
>> > Here is a new rt2x00 release.
>> > Please note that some patches have been send individually to linux-wireless before,
>> > (including the 2 mac80211 patches) but for completeness I have added them to
>> > this pull request.
>> >
>> > This will bump rt2x00 to version 2.1.6, most patches are only intended to make
>> > room for future patches like the mac80211 patch series from Johannes, HW crypto
>> > and pci drivers without a preallocated big chunk of DMA.
>> >
>> > Ivo
>>
>> whats the current status of rt2860 support?
>
> Under development.

well ok ;)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-06-08 21:41 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-06-08 21:41 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the official pull request for the latest rt2x00.git.
This contains all patches which I had send last tuesday
plus some additional patches intended for 2.6.27.

This series is mostly intended to get the fragmentation
done right. Up until now the drivers never behaved that
nicely with fragmentation or RTS/CTS-to-sellf which was
mostly due because each individual frame forced the
queue to be kicked immediately without waiting for the
other fragments.

It also contains some front work by Gertjan for reducing
DMA requirements in rt2x00 by making use of pci_map_single
on skbuffers instead of preallocating a chunk of DMA.

Ivo

P.S. I won't resend the patches I had send last tuesday
since nothing has changed with them. So only the 10
new patches will be send seperately. I am not sure
if that feature will be ready/stable for 2.6.27 but this
preperational work is harmless for normal operations
to it is better if that is already in.

---
The following changes since commit ef28eab0c928fe8277d7c3dca234c29f734d7f2e:
  Dan Williams (1):
        ipw2200: queue direct scans

are available in the git repository at:

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

Gertjan van Wingerde (5):
      rt2x00: Restrict DMA to 32-bit addresses.
      rt2x00: Cleanup struct skb_frame_desc.
      rt2x00: Centralize RX packet alignment handling in rt2x00lib.
      rt2x00: Fix double usage of skb->cb in USB RX path.
      rt2x00: Rework alignment check.

Ivo van Doorn (15):
      rt2x00: Calculate register offset during compile time
      rt2x00: Cleanup/optimize set_state() function callback function
      rt2x00: Move led initialization into function
      rt2x00: Remove CTS/RTS check in tx()
      rt2x00: Removed unused descriptor read in txdone
      rt2x00: Don't kill guardian_urb when it wasn't created
      rt2x00: Make rt2x00_set/get_field macros
      rt2x00: Release rt2x00 2.1.7
      rt2x00: Fix queue initialization
      rt2x00: Implement rt2x00usb_kick_tx_queue()
      rt2x00: Move generic TX frame writing code into rt2x00queue
      rt2x00: Don't kick TX queue after each frame
      rt2x00: Use __builtin_choose_expr() instead of ?:
      rt2x00: Clear IEEE80211_TX_CTL_USE_RTS_CTS flag for RTS frame
      rt2x00: Remove unused defines

 drivers/net/wireless/rt2x00/rt2400pci.c   |   95 ++++++++---------
 drivers/net/wireless/rt2x00/rt2400pci.h   |    2 -
 drivers/net/wireless/rt2x00/rt2500pci.c   |   91 +++++++--------
 drivers/net/wireless/rt2x00/rt2500pci.h   |    2 -
 drivers/net/wireless/rt2x00/rt2500usb.c   |   98 ++++++++--------
 drivers/net/wireless/rt2x00/rt2500usb.h   |    2 -
 drivers/net/wireless/rt2x00/rt2x00.h      |   13 ++-
 drivers/net/wireless/rt2x00/rt2x00debug.c |    6 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c   |   21 ++++
 drivers/net/wireless/rt2x00/rt2x00lib.h   |    1 +
 drivers/net/wireless/rt2x00/rt2x00mac.c   |   30 ++----
 drivers/net/wireless/rt2x00/rt2x00pci.c   |   75 ++++---------
 drivers/net/wireless/rt2x00/rt2x00pci.h   |   11 +-
 drivers/net/wireless/rt2x00/rt2x00queue.c |  111 ++++++++++++++++---
 drivers/net/wireless/rt2x00/rt2x00queue.h |   27 +++--
 drivers/net/wireless/rt2x00/rt2x00reg.h   |  134 +++++++++++++---------
 drivers/net/wireless/rt2x00/rt2x00usb.c   |  170 +++++++++++------------------
 drivers/net/wireless/rt2x00/rt2x00usb.h   |   22 +++-
 drivers/net/wireless/rt2x00/rt61pci.c     |  111 ++++++++-----------
 drivers/net/wireless/rt2x00/rt61pci.h     |    2 -
 drivers/net/wireless/rt2x00/rt73usb.c     |  112 +++++++++----------
 drivers/net/wireless/rt2x00/rt73usb.h     |    2 -
 22 files changed, 581 insertions(+), 557 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-06-16 17:58 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-06-16 17:58 UTC (permalink / raw)
  To: John W. Linville; +Cc: rt2400-devel, linux-wireless

Hi John,

Here is the latest version bump of rt2x00: 2.1.8

Most important patches are from Gertjan, which reduce
the amount of pre-allocated DMA for all TX queues.
All PCI drivers now TX/RX all frame data directly
from/to the skb buffer saving kilobytes of allocated DMA
and several memcpy() statements.

This also allows a lot of code to be moved out of rt2x00pci/rt2x00usb
and into rt2x00lib which in turn makes management of everything
much easier.

Ivo

---
The following changes since commit 7b57047e2d34c243c4cf2d778df0b34bfdd82c8e:
  John W. Linville (1):
        iwlwifi: fix build breakage

are available in the git repository at:

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

Gertjan van Wingerde (4):
      rt2x00: Properly clean up beacon skbs.
      rt2x00: Convert rt2x00 to use generic DMA-mapping API
      rt2x00: Centralize allocation of RX skbs.
      rt2x00: Replace statically allocated DMA buffers with mapped skb's.

Ivo van Doorn (5):
      rt2x00: Use ieee80211 fc handlers
      rt2x00: Cleanup symbol exports
      rt2x00: Fix sparse warning on nested container_of()
      rt2x00: Increase queue size
      rt2x00: Release rt2x00 2.1.8

 drivers/net/wireless/rt2x00/rt2400pci.c   |   17 ++--
 drivers/net/wireless/rt2x00/rt2500pci.c   |   14 ++-
 drivers/net/wireless/rt2x00/rt2500usb.c   |    4 +-
 drivers/net/wireless/rt2x00/rt2x00.h      |   59 ++---------
 drivers/net/wireless/rt2x00/rt2x00dev.c   |  100 +++++++++++++++----
 drivers/net/wireless/rt2x00/rt2x00lib.h   |   51 +++++++++-
 drivers/net/wireless/rt2x00/rt2x00pci.c   |  126 ++++--------------------
 drivers/net/wireless/rt2x00/rt2x00pci.h   |   12 --
 drivers/net/wireless/rt2x00/rt2x00queue.c |  157 +++++++++++++++++++++++------
 drivers/net/wireless/rt2x00/rt2x00queue.h |   35 ++++---
 drivers/net/wireless/rt2x00/rt2x00usb.c   |   94 +++---------------
 drivers/net/wireless/rt2x00/rt2x00usb.h   |    6 +
 drivers/net/wireless/rt2x00/rt61pci.c     |   23 +++--
 drivers/net/wireless/rt2x00/rt73usb.c     |    8 ++-
 14 files changed, 368 insertions(+), 338 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-07-18 18:43 Ivo van Doorn
  2008-07-19 13:55 ` Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-07-18 18:43 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the latest update for rt2x00

I think all patches qualify for 2.6.27, 
with the exception for first 2 patches:
      rt2x00: Remove duplicate declaration
      rt2x00: Fix EIFS timing value
but those are one-liners and have little impact.

The 3 patches from Iwo are the most important ones,
since that fixes a major bug in the beacon handling for the
USB drivers. The 3 patches are a bit big, but without them
beaconing simply won't work.

Ivo

---
The following changes since commit a520bdbe7d344296482f9355e29b0018ea58760f:
  John W. Linville (1):
        iwl-scan.c: fixup merge damage in wireless-testing#master

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git/ ..BRANCH.NOT.VERIFIED..

Ivo van Doorn (3):
      rt2x00: Remove duplicate declaration
      rt2x00: Fix EIFS timing value
      rt2x00: Fix GCC warning because aifs is now unsigned

Iwo Mergler (3):
      rt2x00: Support for large vendor requests
      rt2x00: Large vendor requests for rt73usb firmware upload and beacons
      rt2x00: Fix the beacon length bug

 drivers/net/wireless/rt2x00/rt2500usb.c |   12 +++++++
 drivers/net/wireless/rt2x00/rt2x00.h    |    2 +-
 drivers/net/wireless/rt2x00/rt2x00lib.h |    7 ----
 drivers/net/wireless/rt2x00/rt2x00mac.c |    5 +--
 drivers/net/wireless/rt2x00/rt2x00usb.c |   33 ++++++++++++++++++++
 drivers/net/wireless/rt2x00/rt2x00usb.h |   22 ++++++++++++-
 drivers/net/wireless/rt2x00/rt73usb.c   |   50 ++++++++++++------------------
 7 files changed, 87 insertions(+), 44 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: Please pull 'upstream' branch of rt2x00
  2008-07-18 18:43 Ivo van Doorn
@ 2008-07-19 13:55 ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-07-19 13:55 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Please wait with pulling from rt2x00.git,
updated patches are coming in a few moments,
I just noticed some cleanups which should be made
in several patches, and I'll incorporate the suggestion
from Johannes regarding the EIFS.

Sorry for the noise. ;)

Ivo

> Here is the latest update for rt2x00
> 
> I think all patches qualify for 2.6.27, 
> with the exception for first 2 patches:
>       rt2x00: Remove duplicate declaration
>       rt2x00: Fix EIFS timing value
> but those are one-liners and have little impact.
> 
> The 3 patches from Iwo are the most important ones,
> since that fixes a major bug in the beacon handling for the
> USB drivers. The 3 patches are a bit big, but without them
> beaconing simply won't work.
> 
> Ivo
> 
> ---
> The following changes since commit a520bdbe7d344296482f9355e29b0018ea58760f:
>   John W. Linville (1):
>         iwl-scan.c: fixup merge damage in wireless-testing#master
> 
> are available in the git repository at:
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git/ ..BRANCH.NOT.VERIFIED..
> 
> Ivo van Doorn (3):
>       rt2x00: Remove duplicate declaration
>       rt2x00: Fix EIFS timing value
>       rt2x00: Fix GCC warning because aifs is now unsigned
> 
> Iwo Mergler (3):
>       rt2x00: Support for large vendor requests
>       rt2x00: Large vendor requests for rt73usb firmware upload and beacons
>       rt2x00: Fix the beacon length bug
> 
>  drivers/net/wireless/rt2x00/rt2500usb.c |   12 +++++++
>  drivers/net/wireless/rt2x00/rt2x00.h    |    2 +-
>  drivers/net/wireless/rt2x00/rt2x00lib.h |    7 ----
>  drivers/net/wireless/rt2x00/rt2x00mac.c |    5 +--
>  drivers/net/wireless/rt2x00/rt2x00usb.c |   33 ++++++++++++++++++++
>  drivers/net/wireless/rt2x00/rt2x00usb.h |   22 ++++++++++++-
>  drivers/net/wireless/rt2x00/rt73usb.c   |   50 ++++++++++++------------------
>  7 files changed, 87 insertions(+), 44 deletions(-)
> 



^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-07-19 14:15 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-07-19 14:15 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the updated patch series,
I have dropped the compile warning patch because Johannes has
already send it before, the EIFS patch has been updated to use the
correct definition instead of hardcoding the value, and some
coding style fixes went into Iwo's patches.

Patches are still intended for 2.6.27

Ivo

---
The following changes since commit a520bdbe7d344296482f9355e29b0018ea58760f:
  John W. Linville (1):
        iwl-scan.c: fixup merge damage in wireless-testing#master

are available in the git repository at:

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

Ivo van Doorn (2):
      rt2x00: Remove duplicate declaration
      rt2x00: Fix EIFS timing value

Iwo Mergler (3):
      rt2x00: Support for large vendor requests
      rt2x00: Large vendor requests for rt73usb firmware upload and beacons
      rt2x00: Fix the beacon length bug

 drivers/net/wireless/rt2x00/rt2500usb.c    |   12 ++++++
 drivers/net/wireless/rt2x00/rt2x00.h       |    5 ++-
 drivers/net/wireless/rt2x00/rt2x00config.c |    2 +-
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    7 ----
 drivers/net/wireless/rt2x00/rt2x00usb.c    |   32 +++++++++++++++++
 drivers/net/wireless/rt2x00/rt2x00usb.h    |   22 +++++++++++-
 drivers/net/wireless/rt2x00/rt73usb.c      |   52 +++++++++++----------------
 7 files changed, 90 insertions(+), 42 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-08-04 14:36 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-08-04 14:36 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Only 5 patches, but they do bump rt2x00 to a new version: 2.2.0
This series will add HW crypto support to rt2x00, by default it
has been enabled for rt61pci and rt73usb.

rt2500usb has also been created, but currently does not work
since it requires different handling then rt61pci and rt73usb. Because
I am focussing on different areas in rt2x00 now, it will take some
time before I get back to rt2500usb HW crypto (if there are any volunteers
to take a shot at rt2500usb HW crypto, they are welcome).

rt2500pci supports HW crypto as well, but I won't implement it due
to the way it has to be enabled. It comes down to the fact that during
TX the key has to be provided, and after the encryption an interupt will
be raised after which the frame can be kicked to the air. In the RX path
the same happens, including that after RX the key has to be provided
as well. This will cause the number of IRQ events to double during HW
crypto, and several changes are required in mac80211 to make it possible.
Because of that I see no point in doing anything with it.

Ivo

----
The following changes since commit 2471b779e2f93d76bd4c041e4a8f5a27c859d7ce:
  John W. Linville (1):
        Revert "mac80211: add direct probe before association"

are available in the git repository at:

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

Ivo van Doorn (5):
      rt2x00: Implement HW encryption
      rt2x00: Implement HW encryption (rt61pci)
      rt2x00: Implement HW encryption (rt73usb)
      rt2x00: Gather channel information in structure
      rt2x00: Release rt2x00 2.2.0

 drivers/net/wireless/rt2x00/Kconfig        |    6 +
 drivers/net/wireless/rt2x00/Makefile       |    1 +
 drivers/net/wireless/rt2x00/rt2400pci.c    |   40 ++--
 drivers/net/wireless/rt2x00/rt2400pci.h    |   22 +--
 drivers/net/wireless/rt2x00/rt2500pci.c    |   39 +++--
 drivers/net/wireless/rt2x00/rt2500pci.h    |   17 +-
 drivers/net/wireless/rt2x00/rt2500usb.c    |   39 +++--
 drivers/net/wireless/rt2x00/rt2500usb.h    |   17 +-
 drivers/net/wireless/rt2x00/rt2x00.h       |   64 +++++-
 drivers/net/wireless/rt2x00/rt2x00config.c |    4 +
 drivers/net/wireless/rt2x00/rt2x00crypto.c |  215 +++++++++++++++++++
 drivers/net/wireless/rt2x00/rt2x00debug.c  |   97 +++++++++
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   48 +++--
 drivers/net/wireless/rt2x00/rt2x00lib.h    |   47 ++++
 drivers/net/wireless/rt2x00/rt2x00mac.c    |  110 +++++++++-
 drivers/net/wireless/rt2x00/rt2x00queue.c  |   81 +++++++-
 drivers/net/wireless/rt2x00/rt2x00queue.h  |   73 ++++++-
 drivers/net/wireless/rt2x00/rt2x00reg.h    |   19 ++-
 drivers/net/wireless/rt2x00/rt61pci.c      |  298 ++++++++++++++++++++++++--
 drivers/net/wireless/rt2x00/rt61pci.h      |   38 ++--
 drivers/net/wireless/rt2x00/rt73usb.c      |  314 +++++++++++++++++++++++++---
 drivers/net/wireless/rt2x00/rt73usb.h      |   38 ++--
 22 files changed, 1418 insertions(+), 209 deletions(-)
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00crypto.c

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-08-29 19:03 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-08-29 19:03 UTC (permalink / raw)
  To: John Linville; +Cc: rt2400-devel, linux-wireless

Hi John,

Here is another rt2x00 update for the 2.6.28 kernel,
I believe some patches have been send earlier, but
I lost my overview on my patches, so this bunch will
get rt2x00 completely up to date.

A few patches are needed for rt2800, but they are small,
and clean enough to be merged early.

Ivo

---
The following changes since commit b51f3c6077d59b41e3f9d2af33e2e2f94ecbbc39:
  John W. Linville (1):
        at76_usb: fix for removal of IEEE80211_TX_CTL_DO_NOT_ENCRYPT

are available in the git repository at:

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

Ivo van Doorn (5):
      rt2x00: Fix race conditions in flag handling
      rt2x00: Map extra_tx_headroom to DMA
      rt2x00: Initialize txop during conf_tx() callback
      rt2x00: Add Signal type flag
      rt2x00: Release rt2x00 2.2.1

Mattias Nissler (2):
      rt2x00: Only configure hardware when radio is enabled
      rt2x00: skb->data pointer should not include TX descriptor

 drivers/net/wireless/rt2x00/rt2400pci.c    |    2 +-
 drivers/net/wireless/rt2x00/rt2500pci.c    |    4 +-
 drivers/net/wireless/rt2x00/rt2500usb.c    |    7 ++-
 drivers/net/wireless/rt2x00/rt2x00.h       |   17 +++---
 drivers/net/wireless/rt2x00/rt2x00config.c |    4 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   68 +++++++++++--------------
 drivers/net/wireless/rt2x00/rt2x00mac.c    |   75 ++++++++++++++--------------
 drivers/net/wireless/rt2x00/rt2x00queue.c  |   31 +++++++++--
 drivers/net/wireless/rt2x00/rt2x00queue.h  |    9 ++-
 drivers/net/wireless/rt2x00/rt2x00rfkill.c |    6 +-
 drivers/net/wireless/rt2x00/rt2x00usb.c    |   21 ++++----
 drivers/net/wireless/rt2x00/rt61pci.c      |   73 ++++++++++++++++++++++-----
 drivers/net/wireless/rt2x00/rt73usb.c      |   74 ++++++++++++++++++++++-----
 13 files changed, 253 insertions(+), 138 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-10-29 16:16 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-10-29 16:16 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Well over a month since my last rt2x00 patches, but finally a real rt2x00 update.
The first 2 patches are updates based on recent mac80211 changes,
especially the configuration patch is important.

I also noticed that the recent Kconfig fixes introduced a possibility of a build error,
not sure if it was reported by somebody yet, but in any case it was possible to
build mac80211 as module and rt2x00 compiled into the kernel, causing obvious
problems.

Ivo

---
The following changes since commit 43288a0fdd6b970dec3017ceaffb70cf6347e5f0:
  John W. Linville (1):
        ath5k: fixup warnings created by "ath5k: Reset key cache..."

are available in the git repository at:

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

Ivo van Doorn (5):
      rt2x00: Optimize configuration handling
      rt2x00: Remove ieee80211_bss_conf from rt2x00_intf
      rt2x00: Improve interface_modes initialization
      rt2x00: Fix build error when mac80211=M rt2x00=Y
      rt2x00: Release rt2x00 2.2.2

 drivers/net/wireless/rt2x00/Kconfig        |    2 +-
 drivers/net/wireless/rt2x00/rt2400pci.c    |  167 ++++++++++-----------
 drivers/net/wireless/rt2x00/rt2500pci.c    |  206 ++++++++++++-------------
 drivers/net/wireless/rt2x00/rt2500usb.c    |  110 ++++++-------
 drivers/net/wireless/rt2x00/rt2x00.h       |   44 ++----
 drivers/net/wireless/rt2x00/rt2x00config.c |  164 +++-----------------
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   16 ++-
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    3 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c    |   12 +--
 drivers/net/wireless/rt2x00/rt61pci.c      |  231 ++++++++++++++--------------
 drivers/net/wireless/rt2x00/rt73usb.c      |  216 +++++++++++++-------------
 11 files changed, 501 insertions(+), 670 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-12-02 17:19 Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-02 17:19 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is a new batch of updates for rt2x00.

The first patch (rt2x00: Optimize IV/EIV handling) was send individually
a few days ago, but it is probably easier if you pull it along with the rest
of the patches during this merge.

Small warning which might be important:
The patch "Implement HW encryption (rt2500usb)" adds support for HW crypto
but it does _not_ activate it. The module parameter "nohwcrypt" is set to 1
by default for now. This code has been sleeping in the rt2x00 experimental branch
for quite some time now, and doesn't work completely. I hope to debug this
further when I have time, but I am hoping that with the code in wireless-testing
other people will take a look at it to see what might be going wrong.

Ivo

---
The following changes since commit ca072018d6425a55b3f0e6d8bd3e6217ee509065:
  Winkler, Tomas (1):
        iwlwifi: TX update chicken bits

are available in the git repository at:

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

Ivo van Doorn (5):
      rt2x00: Optimize IV/EIV handling
      rt2x00: Store retry limit values
      rt2x00: Remove duplicate code
      rt2x00: Implement HW encryption (rt2500usb)
      rt2x00: Release rt2x00 2.2.3

 drivers/net/wireless/rt2x00/Kconfig        |    1 +
 drivers/net/wireless/rt2x00/rt2500usb.c    |  132 ++++++++++++++++++++++++++-
 drivers/net/wireless/rt2x00/rt2500usb.h    |    3 +
 drivers/net/wireless/rt2x00/rt2x00.h       |    9 ++-
 drivers/net/wireless/rt2x00/rt2x00config.c |   39 +++++----
 drivers/net/wireless/rt2x00/rt2x00crypto.c |   56 ++++++------
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    6 ++
 drivers/net/wireless/rt2x00/rt2x00mac.c    |    2 -
 drivers/net/wireless/rt2x00/rt2x00queue.c  |   17 ++--
 drivers/net/wireless/rt2x00/rt2x00queue.h  |   12 +--
 drivers/net/wireless/rt2x00/rt61pci.c      |    8 +-
 drivers/net/wireless/rt2x00/rt73usb.c      |    8 +-
 12 files changed, 211 insertions(+), 82 deletions(-)

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Please pull 'upstream' branch of rt2x00
@ 2008-12-20  9:52 Ivo van Doorn
  2008-12-20  9:52 ` [PATCH 1/15] rt2x00: Implement Powersaving Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:52 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Hi John,

Here is the latest rt2x00 update.
Lots of new features, optimizations and cleanups.

Ivo

---
The following changes since commit 30b5741a6880688c4540c8f80f90371f42b05a63:
  Winkler, Tomas (1):
        iwl3945: use iwl_rb_status

are available in the git repository at:

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

Andrey Yurovsky (1):
      rt2x00: Add mesh support

Ivo van Doorn (14):
      rt2x00: Implement Powersaving
      rt2x00: Move link tuning into seperate file
      rt2x00: Reduce calls to bbp_read()
      rt2x00: Restrict interface between rt2x00link and drivers
      rt2x00: Add RFKILL support to rt2500usb and rt73usb
      rt2x00: Rename CONFIG_CRYPTO_COPY_IV
      rt2x00: Implement WDS support
      rt2x00: Split EEPROM_NIC_TX_RX_FIXED
      rt2x00: Move code into seperate functions
      rt2x00: Remove ENTRY_TXD_OFDM_RATE
      rt2x00: Allow drivers to pass the noise value during rxdone
      rt2x00: Introduce RXDONE_SIGNAL_MASK mask
      rt2x00: Fix segementation fault
      rt2x00: Release rt2x00 2.3.0

 drivers/net/wireless/rt2x00/Makefile       |    1 +
 drivers/net/wireless/rt2x00/rt2400pci.c    |   60 +++-
 drivers/net/wireless/rt2x00/rt2500pci.c    |   88 ++++--
 drivers/net/wireless/rt2x00/rt2500usb.c    |   58 ++++-
 drivers/net/wireless/rt2x00/rt2500usb.h    |    8 +
 drivers/net/wireless/rt2x00/rt2x00.h       |  131 +++------
 drivers/net/wireless/rt2x00/rt2x00config.c |    7 +-
 drivers/net/wireless/rt2x00/rt2x00crypto.c |   13 +-
 drivers/net/wireless/rt2x00/rt2x00debug.c  |    4 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c    |  322 ++------------------
 drivers/net/wireless/rt2x00/rt2x00lib.h    |   87 +++++-
 drivers/net/wireless/rt2x00/rt2x00link.c   |  461 ++++++++++++++++++++++++++++
 drivers/net/wireless/rt2x00/rt2x00mac.c    |   42 ++-
 drivers/net/wireless/rt2x00/rt2x00queue.c  |  193 ++++++------
 drivers/net/wireless/rt2x00/rt2x00queue.h  |   15 +-
 drivers/net/wireless/rt2x00/rt2x00reg.h    |   10 +
 drivers/net/wireless/rt2x00/rt2x00usb.c    |    6 +-
 drivers/net/wireless/rt2x00/rt61pci.c      |  144 +++++----
 drivers/net/wireless/rt2x00/rt61pci.h      |    7 +-
 drivers/net/wireless/rt2x00/rt73usb.c      |  134 ++++++---
 drivers/net/wireless/rt2x00/rt73usb.h      |   13 +
 21 files changed, 1138 insertions(+), 666 deletions(-)
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00link.c

^ permalink raw reply	[flat|nested] 74+ messages in thread

* [PATCH 1/15] rt2x00: Implement Powersaving
  2008-12-20  9:52 Please pull 'upstream' branch of rt2x00 Ivo van Doorn
@ 2008-12-20  9:52 ` Ivo van Doorn
  2008-12-20  9:53   ` [PATCH 2/15] rt2x00: Move link tuning into seperate file Ivo van Doorn
  2008-12-21 17:53   ` [PATCH 1/15] rt2x00: Implement Powersaving David Shwatrz
  0 siblings, 2 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:52 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Listen to IEEE80211_CONF_PS to determine if the device
should drop into powersaving mode. This feature depends
on the dynamic power save functionality in mac80211.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2400pci.c |   28 ++++++++++++++++
 drivers/net/wireless/rt2x00/rt2500pci.c |   28 ++++++++++++++++
 drivers/net/wireless/rt2x00/rt2500usb.c |   28 ++++++++++++++++
 drivers/net/wireless/rt2x00/rt61pci.c   |   53 ++++++++++++++++++++++++++----
 drivers/net/wireless/rt2x00/rt61pci.h   |    4 ++
 drivers/net/wireless/rt2x00/rt73usb.c   |   40 +++++++++++++++++++++++
 6 files changed, 174 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index fabcd71..031cb0a 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -524,6 +524,32 @@ static void rt2400pci_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2x00pci_register_write(rt2x00dev, CSR12, reg);
 }
 
+static void rt2400pci_config_ps(struct rt2x00_dev *rt2x00dev,
+				struct rt2x00lib_conf *libconf)
+{
+	enum dev_state state =
+	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
+		STATE_SLEEP : STATE_AWAKE;
+	u32 reg;
+
+	if (state == STATE_SLEEP) {
+		rt2x00pci_register_read(rt2x00dev, CSR20, &reg);
+		rt2x00_set_field32(&reg, CSR20_DELAY_AFTER_TBCN,
+				   (libconf->conf->beacon_int - 20) * 16);
+		rt2x00_set_field32(&reg, CSR20_TBCN_BEFORE_WAKEUP,
+				   libconf->conf->listen_interval - 1);
+
+		/* We must first disable autowake before it can be enabled */
+		rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 0);
+		rt2x00pci_register_write(rt2x00dev, CSR20, reg);
+
+		rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 1);
+		rt2x00pci_register_write(rt2x00dev, CSR20, reg);
+	}
+
+	rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
+}
+
 static void rt2400pci_config(struct rt2x00_dev *rt2x00dev,
 			     struct rt2x00lib_conf *libconf,
 			     const unsigned int flags)
@@ -537,6 +563,8 @@ static void rt2400pci_config(struct rt2x00_dev *rt2x00dev,
 		rt2400pci_config_retry_limit(rt2x00dev, libconf);
 	if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
 		rt2400pci_config_duration(rt2x00dev, libconf);
+	if (flags & IEEE80211_CONF_CHANGE_PS)
+		rt2400pci_config_ps(rt2x00dev, libconf);
 }
 
 static void rt2400pci_config_cw(struct rt2x00_dev *rt2x00dev,
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index a9add81..780c96b 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -573,6 +573,32 @@ static void rt2500pci_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2x00pci_register_write(rt2x00dev, CSR12, reg);
 }
 
+static void rt2500pci_config_ps(struct rt2x00_dev *rt2x00dev,
+				struct rt2x00lib_conf *libconf)
+{
+	enum dev_state state =
+	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
+		STATE_SLEEP : STATE_AWAKE;
+	u32 reg;
+
+	if (state == STATE_SLEEP) {
+		rt2x00pci_register_read(rt2x00dev, CSR20, &reg);
+		rt2x00_set_field32(&reg, CSR20_DELAY_AFTER_TBCN,
+				   (libconf->conf->beacon_int - 20) * 16);
+		rt2x00_set_field32(&reg, CSR20_TBCN_BEFORE_WAKEUP,
+				   libconf->conf->listen_interval - 1);
+
+		/* We must first disable autowake before it can be enabled */
+		rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 0);
+		rt2x00pci_register_write(rt2x00dev, CSR20, reg);
+
+		rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 1);
+		rt2x00pci_register_write(rt2x00dev, CSR20, reg);
+	}
+
+	rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
+}
+
 static void rt2500pci_config(struct rt2x00_dev *rt2x00dev,
 			     struct rt2x00lib_conf *libconf,
 			     const unsigned int flags)
@@ -588,6 +614,8 @@ static void rt2500pci_config(struct rt2x00_dev *rt2x00dev,
 		rt2500pci_config_retry_limit(rt2x00dev, libconf);
 	if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
 		rt2500pci_config_duration(rt2x00dev, libconf);
+	if (flags & IEEE80211_CONF_CHANGE_PS)
+		rt2500pci_config_ps(rt2x00dev, libconf);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index d8c48fd..4de1bc1 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -634,6 +634,32 @@ static void rt2500usb_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
 }
 
+static void rt2500usb_config_ps(struct rt2x00_dev *rt2x00dev,
+				struct rt2x00lib_conf *libconf)
+{
+	enum dev_state state =
+	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
+		STATE_SLEEP : STATE_AWAKE;
+	u16 reg;
+
+	if (state == STATE_SLEEP) {
+		rt2500usb_register_read(rt2x00dev, MAC_CSR18, &reg);
+		rt2x00_set_field16(&reg, MAC_CSR18_DELAY_AFTER_BEACON,
+				   libconf->conf->beacon_int - 20);
+		rt2x00_set_field16(&reg, MAC_CSR18_BEACONS_BEFORE_WAKEUP,
+				   libconf->conf->listen_interval - 1);
+
+		/* We must first disable autowake before it can be enabled */
+		rt2x00_set_field16(&reg, MAC_CSR18_AUTO_WAKE, 0);
+		rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
+
+		rt2x00_set_field16(&reg, MAC_CSR18_AUTO_WAKE, 1);
+		rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
+	}
+
+	rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
+}
+
 static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,
 			     struct rt2x00lib_conf *libconf,
 			     const unsigned int flags)
@@ -647,6 +673,8 @@ static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,
 					 libconf->conf->power_level);
 	if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
 		rt2500usb_config_duration(rt2x00dev, libconf);
+	if (flags & IEEE80211_CONF_CHANGE_PS)
+		rt2500usb_config_ps(rt2x00dev, libconf);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 3b9015a..3f91a6e 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -146,12 +146,6 @@ static void rt61pci_rf_write(struct rt2x00_dev *rt2x00dev,
 	mutex_unlock(&rt2x00dev->csr_mutex);
 }
 
-#ifdef CONFIG_RT2X00_LIB_LEDS
-/*
- * This function is only called from rt61pci_led_brightness()
- * make gcc happy by placing this function inside the
- * same ifdef statement as the caller.
- */
 static void rt61pci_mcu_request(struct rt2x00_dev *rt2x00dev,
 				const u8 command, const u8 token,
 				const u8 arg0, const u8 arg1)
@@ -180,7 +174,6 @@ static void rt61pci_mcu_request(struct rt2x00_dev *rt2x00dev,
 	mutex_unlock(&rt2x00dev->csr_mutex);
 
 }
-#endif /* CONFIG_RT2X00_LIB_LEDS */
 
 static void rt61pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
 {
@@ -967,6 +960,50 @@ static void rt61pci_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
 }
 
+static void rt61pci_config_ps(struct rt2x00_dev *rt2x00dev,
+				struct rt2x00lib_conf *libconf)
+{
+	enum dev_state state =
+	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
+		STATE_SLEEP : STATE_AWAKE;
+	u32 reg;
+
+	if (state == STATE_SLEEP) {
+		rt2x00pci_register_read(rt2x00dev, MAC_CSR11, &reg);
+		rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN,
+				   libconf->conf->beacon_int - 10);
+		rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP,
+				   libconf->conf->listen_interval - 1);
+		rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 5);
+
+		/* We must first disable autowake before it can be enabled */
+		rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
+		rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg);
+
+		rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 1);
+		rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg);
+
+		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, 0, 0);
+	} else {
+		rt2x00pci_register_read(rt2x00dev, MAC_CSR11, &reg);
+		rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN, 0);
+		rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0);
+		rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
+		rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 0);
+		rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg);
+
+		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, 0, 0);
+	}
+}
+
 static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
 			   struct rt2x00lib_conf *libconf,
 			   const unsigned int flags)
@@ -984,6 +1021,8 @@ static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
 		rt61pci_config_retry_limit(rt2x00dev, libconf);
 	if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
 		rt61pci_config_duration(rt2x00dev, libconf);
+	if (flags & IEEE80211_CONF_CHANGE_PS)
+		rt61pci_config_ps(rt2x00dev, libconf);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt61pci.h b/drivers/net/wireless/rt2x00/rt61pci.h
index 65fe333..86590c6 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.h
+++ b/drivers/net/wireless/rt2x00/rt61pci.h
@@ -88,8 +88,10 @@
 
 /*
  * SOFT_RESET_CSR
+ * FORCE_CLOCK_ON: Host force MAC clock ON
  */
 #define SOFT_RESET_CSR			0x0010
+#define SOFT_RESET_CSR_FORCE_CLOCK_ON	FIELD32(0x00000002)
 
 /*
  * MCU_INT_SOURCE_CSR: MCU interrupt source/mask register.
@@ -1054,8 +1056,10 @@ struct hw_pairwise_ta_entry {
 
 /*
  * IO_CNTL_CSR
+ * RF_PS: Set RF interface value to power save
  */
 #define IO_CNTL_CSR			0x3498
+#define IO_CNTL_CSR_RF_PS		FIELD32(0x00000004)
 
 /*
  * UART_INT_SOURCE_CSR
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 563be0b..8a365c9 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -844,6 +844,44 @@ static void rt73usb_config_duration(struct rt2x00_dev *rt2x00dev,
 	rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
 }
 
+static void rt73usb_config_ps(struct rt2x00_dev *rt2x00dev,
+				struct rt2x00lib_conf *libconf)
+{
+	enum dev_state state =
+	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
+		STATE_SLEEP : STATE_AWAKE;
+	u32 reg;
+
+	if (state == STATE_SLEEP) {
+		rt2x00usb_register_read(rt2x00dev, MAC_CSR11, &reg);
+		rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN,
+				   libconf->conf->beacon_int - 10);
+		rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP,
+				   libconf->conf->listen_interval - 1);
+		rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 5);
+
+		/* We must first disable autowake before it can be enabled */
+		rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
+		rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg);
+
+		rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 1);
+		rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg);
+
+		rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
+					    USB_MODE_SLEEP, REGISTER_TIMEOUT);
+	} else {
+		rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
+					    USB_MODE_WAKEUP, REGISTER_TIMEOUT);
+
+		rt2x00usb_register_read(rt2x00dev, MAC_CSR11, &reg);
+		rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN, 0);
+		rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0);
+		rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
+		rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 0);
+		rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg);
+	}
+}
+
 static void rt73usb_config(struct rt2x00_dev *rt2x00dev,
 			   struct rt2x00lib_conf *libconf,
 			   const unsigned int flags)
@@ -861,6 +899,8 @@ static void rt73usb_config(struct rt2x00_dev *rt2x00dev,
 		rt73usb_config_retry_limit(rt2x00dev, libconf);
 	if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
 		rt73usb_config_duration(rt2x00dev, libconf);
+	if (flags & IEEE80211_CONF_CHANGE_PS)
+		rt73usb_config_ps(rt2x00dev, libconf);
 }
 
 /*
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 2/15] rt2x00: Move link tuning into seperate file
  2008-12-20  9:52 ` [PATCH 1/15] rt2x00: Implement Powersaving Ivo van Doorn
@ 2008-12-20  9:53   ` Ivo van Doorn
  2008-12-20  9:54     ` [PATCH 3/15] rt2x00: Reduce calls to bbp_read() Ivo van Doorn
  2008-12-21 17:53   ` [PATCH 1/15] rt2x00: Implement Powersaving David Shwatrz
  1 sibling, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:53 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Move link and antenna tuning into a seperate file named rt2x00link.c,
this makes the interface to the link tuner a lot cleaner.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/Makefile       |    1 +
 drivers/net/wireless/rt2x00/rt2x00.h       |   29 +--
 drivers/net/wireless/rt2x00/rt2x00config.c |    5 +-
 drivers/net/wireless/rt2x00/rt2x00debug.c  |    4 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c    |  303 +--------------------
 drivers/net/wireless/rt2x00/rt2x00lib.h    |   81 ++++++-
 drivers/net/wireless/rt2x00/rt2x00link.c   |  402 ++++++++++++++++++++++++++++
 7 files changed, 494 insertions(+), 331 deletions(-)
 create mode 100644 drivers/net/wireless/rt2x00/rt2x00link.c

diff --git a/drivers/net/wireless/rt2x00/Makefile b/drivers/net/wireless/rt2x00/Makefile
index 917cb4f..f22d808 100644
--- a/drivers/net/wireless/rt2x00/Makefile
+++ b/drivers/net/wireless/rt2x00/Makefile
@@ -2,6 +2,7 @@ rt2x00lib-y				+= rt2x00dev.o
 rt2x00lib-y				+= rt2x00mac.o
 rt2x00lib-y				+= rt2x00config.o
 rt2x00lib-y				+= rt2x00queue.o
+rt2x00lib-y				+= rt2x00link.o
 rt2x00lib-$(CONFIG_RT2X00_LIB_DEBUGFS)	+= rt2x00debug.o
 rt2x00lib-$(CONFIG_RT2X00_LIB_CRYPTO)	+= rt2x00crypto.o
 rt2x00lib-$(CONFIG_RT2X00_LIB_RFKILL)	+= rt2x00rfkill.o
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 39ecf3b..19c0687 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -212,7 +212,7 @@ struct link_qual {
 	 *                       (WEIGHT_TX * tx_percentage) +
 	 *                       (WEIGHT_RX * rx_percentage)) / 100
 	 *
-	 * This value should then be checked to not be greated then 100.
+	 * This value should then be checked to not be greater then 100.
 	 */
 	int rx_percentage;
 	int rx_success;
@@ -318,33 +318,6 @@ static inline int rt2x00_get_link_rssi(struct link *link)
 	return DEFAULT_RSSI;
 }
 
-static inline int rt2x00_get_link_ant_rssi(struct link *link)
-{
-	if (link->ant.rssi_ant && link->qual.rx_success)
-		return link->ant.rssi_ant;
-	return DEFAULT_RSSI;
-}
-
-static inline void rt2x00_reset_link_ant_rssi(struct link *link)
-{
-	link->ant.rssi_ant = 0;
-}
-
-static inline int rt2x00_get_link_ant_rssi_history(struct link *link,
-						   enum antenna ant)
-{
-	if (link->ant.rssi_history[ant - ANTENNA_A])
-		return link->ant.rssi_history[ant - ANTENNA_A];
-	return DEFAULT_RSSI;
-}
-
-static inline int rt2x00_update_ant_rssi(struct link *link, int rssi)
-{
-	int old_rssi = link->ant.rssi_history[link->ant.active.rx - ANTENNA_A];
-	link->ant.rssi_history[link->ant.active.rx - ANTENNA_A] = rssi;
-	return old_rssi;
-}
-
 /*
  * Interface structure
  * Per interface configuration details, this structure
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c
index e66fb31..2f4cb8d 100644
--- a/drivers/net/wireless/rt2x00/rt2x00config.c
+++ b/drivers/net/wireless/rt2x00/rt2x00config.c
@@ -152,8 +152,7 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
 	 */
 	rt2x00dev->ops->lib->config_ant(rt2x00dev, ant);
 
-	rt2x00lib_reset_link_tuner(rt2x00dev);
-	rt2x00_reset_link_ant_rssi(&rt2x00dev->link);
+	rt2x00link_reset_tuner(rt2x00dev, true);
 
 	memcpy(active, ant, sizeof(*ant));
 
@@ -191,7 +190,7 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
 	 * which means we need to reset the link tuner.
 	 */
 	if (ieee80211_flags & IEEE80211_CONF_CHANGE_CHANNEL)
-		rt2x00lib_reset_link_tuner(rt2x00dev);
+		rt2x00link_reset_tuner(rt2x00dev, false);
 
 	rt2x00dev->curr_band = conf->channel->band;
 	rt2x00dev->tx_power = conf->power_level;
diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c
index 54dd100..cc19406 100644
--- a/drivers/net/wireless/rt2x00/rt2x00debug.c
+++ b/drivers/net/wireless/rt2x00/rt2x00debug.c
@@ -130,9 +130,11 @@ struct rt2x00debug_intf {
 };
 
 void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
-			       enum cipher cipher, enum rx_crypto status)
+			       struct rxdone_entry_desc *rxdesc)
 {
 	struct rt2x00debug_intf *intf = rt2x00dev->debugfs_intf;
+	enum cipher cipher = rxdesc->cipher;
+	enum rx_crypto status = rxdesc->cipher_status;
 
 	if (cipher == CIPHER_TKIP_NO_MIC)
 		cipher = CIPHER_TKIP;
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 6d92542..1c49a9c 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -30,60 +30,6 @@
 #include "rt2x00lib.h"
 
 /*
- * Link tuning handlers
- */
-void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
-{
-	if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
-		return;
-
-	/*
-	 * Reset link information.
-	 * Both the currently active vgc level as well as
-	 * the link tuner counter should be reset. Resetting
-	 * the counter is important for devices where the
-	 * device should only perform link tuning during the
-	 * first minute after being enabled.
-	 */
-	rt2x00dev->link.count = 0;
-	rt2x00dev->link.vgc_level = 0;
-
-	/*
-	 * Reset the link tuner.
-	 */
-	rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
-}
-
-static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
-{
-	/*
-	 * Clear all (possibly) pre-existing quality statistics.
-	 */
-	memset(&rt2x00dev->link.qual, 0, sizeof(rt2x00dev->link.qual));
-
-	/*
-	 * The RX and TX percentage should start at 50%
-	 * this will assure we will get at least get some
-	 * decent value when the link tuner starts.
-	 * The value will be dropped and overwritten with
-	 * the correct (measured )value anyway during the
-	 * first run of the link tuner.
-	 */
-	rt2x00dev->link.qual.rx_percentage = 50;
-	rt2x00dev->link.qual.tx_percentage = 50;
-
-	rt2x00lib_reset_link_tuner(rt2x00dev);
-
-	queue_delayed_work(rt2x00dev->hw->workqueue,
-			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
-}
-
-static void rt2x00lib_stop_link_tuner(struct rt2x00_dev *rt2x00dev)
-{
-	cancel_delayed_work_sync(&rt2x00dev->link.work);
-}
-
-/*
  * Radio control handlers.
  */
 int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev)
@@ -161,238 +107,15 @@ void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state)
 	 * When we are disabling the RX, we should also stop the link tuner.
 	 */
 	if (state == STATE_RADIO_RX_OFF)
-		rt2x00lib_stop_link_tuner(rt2x00dev);
+		rt2x00link_stop_tuner(rt2x00dev);
 
 	rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
 
 	/*
 	 * When we are enabling the RX, we should also start the link tuner.
 	 */
-	if (state == STATE_RADIO_RX_ON &&
-	    (rt2x00dev->intf_ap_count || rt2x00dev->intf_sta_count))
-		rt2x00lib_start_link_tuner(rt2x00dev);
-}
-
-static void rt2x00lib_evaluate_antenna_sample(struct rt2x00_dev *rt2x00dev)
-{
-	struct antenna_setup ant;
-	int sample_a =
-	    rt2x00_get_link_ant_rssi_history(&rt2x00dev->link, ANTENNA_A);
-	int sample_b =
-	    rt2x00_get_link_ant_rssi_history(&rt2x00dev->link, ANTENNA_B);
-
-	memcpy(&ant, &rt2x00dev->link.ant.active, sizeof(ant));
-
-	/*
-	 * We are done sampling. Now we should evaluate the results.
-	 */
-	rt2x00dev->link.ant.flags &= ~ANTENNA_MODE_SAMPLE;
-
-	/*
-	 * During the last period we have sampled the RSSI
-	 * from both antenna's. It now is time to determine
-	 * which antenna demonstrated the best performance.
-	 * When we are already on the antenna with the best
-	 * performance, then there really is nothing for us
-	 * left to do.
-	 */
-	if (sample_a == sample_b)
-		return;
-
-	if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY)
-		ant.rx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
-
-	if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)
-		ant.tx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
-
-	rt2x00lib_config_antenna(rt2x00dev, &ant);
-}
-
-static void rt2x00lib_evaluate_antenna_eval(struct rt2x00_dev *rt2x00dev)
-{
-	struct antenna_setup ant;
-	int rssi_curr = rt2x00_get_link_ant_rssi(&rt2x00dev->link);
-	int rssi_old = rt2x00_update_ant_rssi(&rt2x00dev->link, rssi_curr);
-
-	memcpy(&ant, &rt2x00dev->link.ant.active, sizeof(ant));
-
-	/*
-	 * Legacy driver indicates that we should swap antenna's
-	 * when the difference in RSSI is greater that 5. This
-	 * also should be done when the RSSI was actually better
-	 * then the previous sample.
-	 * When the difference exceeds the threshold we should
-	 * sample the rssi from the other antenna to make a valid
-	 * comparison between the 2 antennas.
-	 */
-	if (abs(rssi_curr - rssi_old) < 5)
-		return;
-
-	rt2x00dev->link.ant.flags |= ANTENNA_MODE_SAMPLE;
-
-	if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY)
-		ant.rx = (ant.rx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A;
-
-	if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)
-		ant.tx = (ant.tx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A;
-
-	rt2x00lib_config_antenna(rt2x00dev, &ant);
-}
-
-static void rt2x00lib_evaluate_antenna(struct rt2x00_dev *rt2x00dev)
-{
-	/*
-	 * Determine if software diversity is enabled for
-	 * either the TX or RX antenna (or both).
-	 * Always perform this check since within the link
-	 * tuner interval the configuration might have changed.
-	 */
-	rt2x00dev->link.ant.flags &= ~ANTENNA_RX_DIVERSITY;
-	rt2x00dev->link.ant.flags &= ~ANTENNA_TX_DIVERSITY;
-
-	if (rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY)
-		rt2x00dev->link.ant.flags |= ANTENNA_RX_DIVERSITY;
-	if (rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY)
-		rt2x00dev->link.ant.flags |= ANTENNA_TX_DIVERSITY;
-
-	if (!(rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) &&
-	    !(rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)) {
-		rt2x00dev->link.ant.flags = 0;
-		return;
-	}
-
-	/*
-	 * If we have only sampled the data over the last period
-	 * we should now harvest the data. Otherwise just evaluate
-	 * the data. The latter should only be performed once
-	 * every 2 seconds.
-	 */
-	if (rt2x00dev->link.ant.flags & ANTENNA_MODE_SAMPLE)
-		rt2x00lib_evaluate_antenna_sample(rt2x00dev);
-	else if (rt2x00dev->link.count & 1)
-		rt2x00lib_evaluate_antenna_eval(rt2x00dev);
-}
-
-static void rt2x00lib_update_link_stats(struct link *link, int rssi)
-{
-	int avg_rssi = rssi;
-
-	/*
-	 * Update global RSSI
-	 */
-	if (link->qual.avg_rssi)
-		avg_rssi = MOVING_AVERAGE(link->qual.avg_rssi, rssi, 8);
-	link->qual.avg_rssi = avg_rssi;
-
-	/*
-	 * Update antenna RSSI
-	 */
-	if (link->ant.rssi_ant)
-		rssi = MOVING_AVERAGE(link->ant.rssi_ant, rssi, 8);
-	link->ant.rssi_ant = rssi;
-}
-
-static void rt2x00lib_precalculate_link_signal(struct link_qual *qual)
-{
-	if (qual->rx_failed || qual->rx_success)
-		qual->rx_percentage =
-		    (qual->rx_success * 100) /
-		    (qual->rx_failed + qual->rx_success);
-	else
-		qual->rx_percentage = 50;
-
-	if (qual->tx_failed || qual->tx_success)
-		qual->tx_percentage =
-		    (qual->tx_success * 100) /
-		    (qual->tx_failed + qual->tx_success);
-	else
-		qual->tx_percentage = 50;
-
-	qual->rx_success = 0;
-	qual->rx_failed = 0;
-	qual->tx_success = 0;
-	qual->tx_failed = 0;
-}
-
-static int rt2x00lib_calculate_link_signal(struct rt2x00_dev *rt2x00dev,
-					   int rssi)
-{
-	int rssi_percentage = 0;
-	int signal;
-
-	/*
-	 * We need a positive value for the RSSI.
-	 */
-	if (rssi < 0)
-		rssi += rt2x00dev->rssi_offset;
-
-	/*
-	 * Calculate the different percentages,
-	 * which will be used for the signal.
-	 */
-	if (rt2x00dev->rssi_offset)
-		rssi_percentage = (rssi * 100) / rt2x00dev->rssi_offset;
-
-	/*
-	 * Add the individual percentages and use the WEIGHT
-	 * defines to calculate the current link signal.
-	 */
-	signal = ((WEIGHT_RSSI * rssi_percentage) +
-		  (WEIGHT_TX * rt2x00dev->link.qual.tx_percentage) +
-		  (WEIGHT_RX * rt2x00dev->link.qual.rx_percentage)) / 100;
-
-	return (signal > 100) ? 100 : signal;
-}
-
-static void rt2x00lib_link_tuner(struct work_struct *work)
-{
-	struct rt2x00_dev *rt2x00dev =
-	    container_of(work, struct rt2x00_dev, link.work.work);
-
-	/*
-	 * When the radio is shutting down we should
-	 * immediately cease all link tuning.
-	 */
-	if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
-		return;
-
-	/*
-	 * Update statistics.
-	 */
-	rt2x00dev->ops->lib->link_stats(rt2x00dev, &rt2x00dev->link.qual);
-	rt2x00dev->low_level_stats.dot11FCSErrorCount +=
-	    rt2x00dev->link.qual.rx_failed;
-
-	/*
-	 * Only perform the link tuning when Link tuning
-	 * has been enabled (This could have been disabled from the EEPROM).
-	 */
-	if (!test_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags))
-		rt2x00dev->ops->lib->link_tuner(rt2x00dev);
-
-	/*
-	 * Precalculate a portion of the link signal which is
-	 * in based on the tx/rx success/failure counters.
-	 */
-	rt2x00lib_precalculate_link_signal(&rt2x00dev->link.qual);
-
-	/*
-	 * Send a signal to the led to update the led signal strength.
-	 */
-	rt2x00leds_led_quality(rt2x00dev, rt2x00dev->link.qual.avg_rssi);
-
-	/*
-	 * Evaluate antenna setup, make this the last step since this could
-	 * possibly reset some statistics.
-	 */
-	rt2x00lib_evaluate_antenna(rt2x00dev);
-
-	/*
-	 * Increase tuner counter, and reschedule the next link tuner run.
-	 */
-	rt2x00dev->link.count++;
-	queue_delayed_work(rt2x00dev->hw->workqueue,
-			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+	if (state == STATE_RADIO_RX_ON)
+		rt2x00link_start_tuner(rt2x00dev);
 }
 
 static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
@@ -597,7 +320,6 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
 	struct sk_buff *skb;
 	struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
 	struct ieee80211_supported_band *sband;
-	struct ieee80211_hdr *hdr;
 	const struct rt2x00_rate *rate;
 	unsigned int header_length;
 	unsigned int align;
@@ -674,23 +396,14 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
 	}
 
 	/*
-	 * Only update link status if this is a beacon frame carrying our bssid.
+	 * Update extra components
 	 */
-	hdr = (struct ieee80211_hdr *)entry->skb->data;
-	if (ieee80211_is_beacon(hdr->frame_control) &&
-	    (rxdesc.dev_flags & RXDONE_MY_BSS))
-		rt2x00lib_update_link_stats(&rt2x00dev->link, rxdesc.rssi);
-
-	rt2x00debug_update_crypto(rt2x00dev,
-				  rxdesc.cipher,
-				  rxdesc.cipher_status);
-
-	rt2x00dev->link.qual.rx_success++;
+	rt2x00link_update_stats(rt2x00dev, entry->skb, &rxdesc);
+	rt2x00debug_update_crypto(rt2x00dev, &rxdesc);
 
 	rx_status->mactime = rxdesc.timestamp;
 	rx_status->rate_idx = idx;
-	rx_status->qual =
-	    rt2x00lib_calculate_link_signal(rt2x00dev, rxdesc.rssi);
+	rx_status->qual = rt2x00link_calculate_signal(rt2x00dev, rxdesc.rssi);
 	rx_status->signal = rxdesc.rssi;
 	rx_status->flag = rxdesc.flags;
 	rx_status->antenna = rt2x00dev->link.ant.active.rx;
@@ -1085,7 +798,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 	 */
 	INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);
 	INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled);
-	INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner);
 
 	/*
 	 * Allocate queue array.
@@ -1106,6 +818,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Register extra components.
 	 */
+	rt2x00link_register(rt2x00dev);
 	rt2x00leds_register(rt2x00dev);
 	rt2x00rfkill_allocate(rt2x00dev);
 	rt2x00debug_register(rt2x00dev);
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h
index 0302432..a6b7e00 100644
--- a/drivers/net/wireless/rt2x00/rt2x00lib.h
+++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
@@ -74,7 +74,6 @@ static inline int rt2x00_get_rate_preamble(const u16 hw_value)
 int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev);
 void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev);
 void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state);
-void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev);
 
 /*
  * Initialization handlers.
@@ -165,6 +164,81 @@ void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev);
 int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev);
 void rt2x00queue_free(struct rt2x00_dev *rt2x00dev);
 
+/**
+ * rt2x00link_update_stats - Update link statistics from RX frame
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ * @skb: Received frame
+ * @rxdesc: Received frame descriptor
+ *
+ * Update link statistics based on the information from the
+ * received frame descriptor.
+ */
+void rt2x00link_update_stats(struct rt2x00_dev *rt2x00dev,
+			     struct sk_buff *skb,
+			     struct rxdone_entry_desc *rxdesc);
+
+/**
+ * rt2x00link_calculate_signal - Calculate signal quality
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ * @rssi: RX Frame RSSI
+ *
+ * Calculate the signal quality of a frame based on the rssi
+ * measured during the receiving of the frame and the global
+ * link quality statistics measured since the start of the
+ * link tuning. The result is a value between 0 and 100 which
+ * is an indication of the signal quality.
+ */
+int rt2x00link_calculate_signal(struct rt2x00_dev *rt2x00dev, int rssi);
+
+/**
+ * rt2x00link_start_tuner - Start periodic link tuner work
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ *
+ * This start the link tuner periodic work, this work will
+ * be executed periodically until &rt2x00link_stop_tuner has
+ * been called.
+ */
+void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev);
+
+/**
+ * rt2x00link_stop_tuner - Stop periodic link tuner work
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ *
+ * After this function completed the link tuner will not
+ * be running until &rt2x00link_start_tuner is called.
+ */
+void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev);
+
+/**
+ * rt2x00link_reset_tuner - Reset periodic link tuner work
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ * @antenna: Should the antenna tuning also be reset
+ *
+ * The VGC limit configured in the hardware will be reset to 0
+ * which forces the driver to rediscover the correct value for
+ * the current association. This is needed when configuration
+ * options have changed which could drastically change the
+ * SNR level or link quality (i.e. changing the antenna setting).
+ *
+ * Resetting the link tuner will also cause the periodic work counter
+ * to be reset. Any driver which has a fixed limit on the number
+ * of rounds the link tuner is supposed to work will accept the
+ * tuner actions again if this limit was previously reached.
+ *
+ * If @antenna is set to true a the software antenna diversity
+ * tuning will also be reset.
+ */
+void rt2x00link_reset_tuner(struct rt2x00_dev *rt2x00dev, bool antenna);
+
+/**
+ * rt2x00link_register - Initialize link tuning functionality
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ *
+ * Initialize work structure and all link tuning related
+ * paramters. This will not start the link tuning process itself.
+ */
+void rt2x00link_register(struct rt2x00_dev *rt2x00dev);
+
 /*
  * Firmware handlers.
  */
@@ -190,7 +264,7 @@ void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev);
 void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
 			    enum rt2x00_dump_type type, struct sk_buff *skb);
 void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
-			       enum cipher cipher, enum rx_crypto status);
+			       struct rxdone_entry_desc *rxdesc);
 #else
 static inline void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
 {
@@ -207,8 +281,7 @@ static inline void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
 }
 
 static inline void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
-					     enum cipher cipher,
-					     enum rx_crypto status)
+					     struct rxdone_entry_desc *rxdesc)
 {
 }
 #endif /* CONFIG_RT2X00_LIB_DEBUGFS */
diff --git a/drivers/net/wireless/rt2x00/rt2x00link.c b/drivers/net/wireless/rt2x00/rt2x00link.c
new file mode 100644
index 0000000..0462d5a
--- /dev/null
+++ b/drivers/net/wireless/rt2x00/rt2x00link.c
@@ -0,0 +1,402 @@
+/*
+	Copyright (C) 2004 - 2008 rt2x00 SourceForge Project
+	<http://rt2x00.serialmonkey.com>
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the
+	Free Software Foundation, Inc.,
+	59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+	Module: rt2x00lib
+	Abstract: rt2x00 generic link tuning routines.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include "rt2x00.h"
+#include "rt2x00lib.h"
+
+static int rt2x00link_antenna_get_link_rssi(struct rt2x00_dev *rt2x00dev)
+{
+	struct link_ant *ant = &rt2x00dev->link.ant;
+
+	if (ant->rssi_ant && rt2x00dev->link.qual.rx_success)
+		return ant->rssi_ant;
+	return DEFAULT_RSSI;
+}
+
+static int rt2x00link_antenna_get_rssi_history(struct rt2x00_dev *rt2x00dev,
+					       enum antenna antenna)
+{
+	struct link_ant *ant = &rt2x00dev->link.ant;
+
+	if (ant->rssi_history[antenna - ANTENNA_A])
+		return ant->rssi_history[antenna - ANTENNA_A];
+	return DEFAULT_RSSI;
+}
+/* Small wrapper for rt2x00link_antenna_get_rssi_history() */
+#define rt2x00link_antenna_get_rssi_rx_history(__dev) \
+	rt2x00link_antenna_get_rssi_history((__dev), \
+					    (__dev)->link.ant.active.rx)
+#define rt2x00link_antenna_get_rssi_tx_history(__dev) \
+	rt2x00link_antenna_get_rssi_history((__dev), \
+					    (__dev)->link.ant.active.tx)
+
+static void rt2x00link_antenna_update_rssi_history(struct rt2x00_dev *rt2x00dev,
+						   enum antenna antenna,
+						   int rssi)
+{
+	struct link_ant *ant = &rt2x00dev->link.ant;
+	ant->rssi_history[ant->active.rx - ANTENNA_A] = rssi;
+}
+/* Small wrapper for rt2x00link_antenna_get_rssi_history() */
+#define rt2x00link_antenna_update_rssi_rx_history(__dev, __rssi) \
+	rt2x00link_antenna_update_rssi_history((__dev), \
+					       (__dev)->link.ant.active.rx, \
+					       (__rssi))
+#define rt2x00link_antenna_update_rssi_tx_history(__dev, __rssi) \
+	rt2x00link_antenna_update_rssi_history((__dev), \
+					       (__dev)->link.ant.active.tx, \
+					       (__rssi))
+
+static void rt2x00link_antenna_reset(struct rt2x00_dev *rt2x00dev)
+{
+	rt2x00dev->link.ant.rssi_ant = 0;
+}
+
+static void rt2x00lib_antenna_diversity_sample(struct rt2x00_dev *rt2x00dev)
+{
+	struct link_ant *ant = &rt2x00dev->link.ant;
+	struct antenna_setup new_ant;
+	int sample_a = rt2x00link_antenna_get_rssi_history(rt2x00dev, ANTENNA_A);
+	int sample_b = rt2x00link_antenna_get_rssi_history(rt2x00dev, ANTENNA_B);
+
+	memcpy(&new_ant, &ant->active, sizeof(new_ant));
+
+	/*
+	 * We are done sampling. Now we should evaluate the results.
+	 */
+	ant->flags &= ~ANTENNA_MODE_SAMPLE;
+
+	/*
+	 * During the last period we have sampled the RSSI
+	 * from both antenna's. It now is time to determine
+	 * which antenna demonstrated the best performance.
+	 * When we are already on the antenna with the best
+	 * performance, then there really is nothing for us
+	 * left to do.
+	 */
+	if (sample_a == sample_b)
+		return;
+
+	if (ant->flags & ANTENNA_RX_DIVERSITY)
+		new_ant.rx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
+
+	if (ant->flags & ANTENNA_TX_DIVERSITY)
+		new_ant.tx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
+
+	rt2x00lib_config_antenna(rt2x00dev, &new_ant);
+}
+
+static void rt2x00lib_antenna_diversity_eval(struct rt2x00_dev *rt2x00dev)
+{
+	struct link_ant *ant = &rt2x00dev->link.ant;
+	struct antenna_setup new_ant;
+	int rssi_curr;
+	int rssi_old;
+
+	memcpy(&new_ant, &ant->active, sizeof(new_ant));
+
+	/*
+	 * Get current RSSI value along with the historical value,
+	 * after that update the history with the current value.
+	 */
+	rssi_curr = rt2x00link_antenna_get_link_rssi(rt2x00dev);
+	rssi_old = rt2x00link_antenna_get_rssi_rx_history(rt2x00dev);
+	rt2x00link_antenna_update_rssi_rx_history(rt2x00dev, rssi_curr);
+
+	/*
+	 * Legacy driver indicates that we should swap antenna's
+	 * when the difference in RSSI is greater that 5. This
+	 * also should be done when the RSSI was actually better
+	 * then the previous sample.
+	 * When the difference exceeds the threshold we should
+	 * sample the rssi from the other antenna to make a valid
+	 * comparison between the 2 antennas.
+	 */
+	if (abs(rssi_curr - rssi_old) < 5)
+		return;
+
+	ant->flags |= ANTENNA_MODE_SAMPLE;
+
+	if (ant->flags & ANTENNA_RX_DIVERSITY)
+		new_ant.rx = (new_ant.rx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A;
+
+	if (ant->flags & ANTENNA_TX_DIVERSITY)
+		new_ant.tx = (new_ant.tx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A;
+
+	rt2x00lib_config_antenna(rt2x00dev, &new_ant);
+}
+
+static void rt2x00lib_antenna_diversity(struct rt2x00_dev *rt2x00dev)
+{
+	struct link_ant *ant = &rt2x00dev->link.ant;
+
+	/*
+	 * Determine if software diversity is enabled for
+	 * either the TX or RX antenna (or both).
+	 * Always perform this check since within the link
+	 * tuner interval the configuration might have changed.
+	 */
+	ant->flags &= ~ANTENNA_RX_DIVERSITY;
+	ant->flags &= ~ANTENNA_TX_DIVERSITY;
+
+	if (rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY)
+		ant->flags |= ANTENNA_RX_DIVERSITY;
+	if (rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY)
+		ant->flags |= ANTENNA_TX_DIVERSITY;
+
+	if (!(ant->flags & ANTENNA_RX_DIVERSITY) &&
+	    !(ant->flags & ANTENNA_TX_DIVERSITY)) {
+		ant->flags = 0;
+		return;
+	}
+
+	/*
+	 * If we have only sampled the data over the last period
+	 * we should now harvest the data. Otherwise just evaluate
+	 * the data. The latter should only be performed once
+	 * every 2 seconds.
+	 */
+	if (ant->flags & ANTENNA_MODE_SAMPLE)
+		rt2x00lib_antenna_diversity_sample(rt2x00dev);
+	else if (rt2x00dev->link.count & 1)
+		rt2x00lib_antenna_diversity_eval(rt2x00dev);
+}
+
+void rt2x00link_update_stats(struct rt2x00_dev *rt2x00dev,
+			     struct sk_buff *skb,
+			     struct rxdone_entry_desc *rxdesc)
+{
+	struct link_qual *qual = &rt2x00dev->link.qual;
+	struct link_ant *ant = &rt2x00dev->link.ant;
+	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+	int avg_rssi = rxdesc->rssi;
+	int ant_rssi = rxdesc->rssi;
+
+	/*
+	 * Frame was received successfully since non-succesfull
+	 * frames would have been dropped by the hardware.
+	 */
+	qual->rx_success++;
+
+	/*
+	 * We are only interested in quality statistics from
+	 * beacons which came from the BSS which we are
+	 * associated with.
+	 */
+	if (!ieee80211_is_beacon(hdr->frame_control) ||
+	    !(rxdesc->dev_flags & RXDONE_MY_BSS))
+		return;
+
+	/*
+	 * Update global RSSI
+	 */
+	if (qual->avg_rssi)
+		avg_rssi = MOVING_AVERAGE(qual->avg_rssi, rxdesc->rssi, 8);
+	qual->avg_rssi = avg_rssi;
+
+	/*
+	 * Update antenna RSSI
+	 */
+	if (ant->rssi_ant)
+		ant_rssi = MOVING_AVERAGE(ant->rssi_ant, rxdesc->rssi, 8);
+	ant->rssi_ant = ant_rssi;
+}
+
+static void rt2x00link_precalculate_signal(struct rt2x00_dev *rt2x00dev)
+{
+	struct link_qual *qual = &rt2x00dev->link.qual;
+
+	if (qual->rx_failed || qual->rx_success)
+		qual->rx_percentage =
+		    (qual->rx_success * 100) /
+		    (qual->rx_failed + qual->rx_success);
+	else
+		qual->rx_percentage = 50;
+
+	if (qual->tx_failed || qual->tx_success)
+		qual->tx_percentage =
+		    (qual->tx_success * 100) /
+		    (qual->tx_failed + qual->tx_success);
+	else
+		qual->tx_percentage = 50;
+
+	qual->rx_success = 0;
+	qual->rx_failed = 0;
+	qual->tx_success = 0;
+	qual->tx_failed = 0;
+}
+
+int rt2x00link_calculate_signal(struct rt2x00_dev *rt2x00dev, int rssi)
+{
+	struct link_qual *qual = &rt2x00dev->link.qual;
+	int rssi_percentage = 0;
+	int signal;
+
+	/*
+	 * We need a positive value for the RSSI.
+	 */
+	if (rssi < 0)
+		rssi += rt2x00dev->rssi_offset;
+
+	/*
+	 * Calculate the different percentages,
+	 * which will be used for the signal.
+	 */
+	rssi_percentage = (rssi * 100) / rt2x00dev->rssi_offset;
+
+	/*
+	 * Add the individual percentages and use the WEIGHT
+	 * defines to calculate the current link signal.
+	 */
+	signal = ((WEIGHT_RSSI * rssi_percentage) +
+		  (WEIGHT_TX * qual->tx_percentage) +
+		  (WEIGHT_RX * qual->rx_percentage)) / 100;
+
+	return max_t(int, signal, 100);
+}
+
+void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev)
+{
+	struct link_qual *qual = &rt2x00dev->link.qual;
+
+	/*
+	 * Link tuning should only be performed when
+	 * an active sta or master interface exists.
+	 * Single monitor mode interfaces should never have
+	 * work with link tuners.
+	 */
+	if (!rt2x00dev->intf_ap_count && !rt2x00dev->intf_sta_count)
+		return;
+
+	/*
+	 * Clear all (possibly) pre-existing quality statistics.
+	 */
+	memset(qual, 0, sizeof(*qual));
+
+	/*
+	 * The RX and TX percentage should start at 50%
+	 * this will assure we will get at least get some
+	 * decent value when the link tuner starts.
+	 * The value will be dropped and overwritten with
+	 * the correct (measured) value anyway during the
+	 * first run of the link tuner.
+	 */
+	qual->rx_percentage = 50;
+	qual->tx_percentage = 50;
+
+	rt2x00link_reset_tuner(rt2x00dev, false);
+
+	queue_delayed_work(rt2x00dev->hw->workqueue,
+			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+}
+
+void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev)
+{
+	cancel_delayed_work_sync(&rt2x00dev->link.work);
+}
+
+void rt2x00link_reset_tuner(struct rt2x00_dev *rt2x00dev, bool antenna)
+{
+	if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+		return;
+
+	/*
+	 * Reset link information.
+	 * Both the currently active vgc level as well as
+	 * the link tuner counter should be reset. Resetting
+	 * the counter is important for devices where the
+	 * device should only perform link tuning during the
+	 * first minute after being enabled.
+	 */
+	rt2x00dev->link.count = 0;
+	rt2x00dev->link.vgc_level = 0;
+
+	/*
+	 * Reset the link tuner.
+	 */
+	rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
+
+	if (antenna)
+		rt2x00link_antenna_reset(rt2x00dev);
+}
+
+static void rt2x00link_tuner(struct work_struct *work)
+{
+	struct rt2x00_dev *rt2x00dev =
+	    container_of(work, struct rt2x00_dev, link.work.work);
+	struct link_qual *qual = &rt2x00dev->link.qual;
+
+	/*
+	 * When the radio is shutting down we should
+	 * immediately cease all link tuning.
+	 */
+	if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+		return;
+
+	/*
+	 * Update statistics.
+	 */
+	rt2x00dev->ops->lib->link_stats(rt2x00dev, qual);
+	rt2x00dev->low_level_stats.dot11FCSErrorCount += qual->rx_failed;
+
+	/*
+	 * Only perform the link tuning when Link tuning
+	 * has been enabled (This could have been disabled from the EEPROM).
+	 */
+	if (!test_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags))
+		rt2x00dev->ops->lib->link_tuner(rt2x00dev);
+
+	/*
+	 * Precalculate a portion of the link signal which is
+	 * in based on the tx/rx success/failure counters.
+	 */
+	rt2x00link_precalculate_signal(rt2x00dev);
+
+	/*
+	 * Send a signal to the led to update the led signal strength.
+	 */
+	rt2x00leds_led_quality(rt2x00dev, qual->avg_rssi);
+
+	/*
+	 * Evaluate antenna setup, make this the last step since this could
+	 * possibly reset some statistics.
+	 */
+	rt2x00lib_antenna_diversity(rt2x00dev);
+
+	/*
+	 * Increase tuner counter, and reschedule the next link tuner run.
+	 */
+	rt2x00dev->link.count++;
+	queue_delayed_work(rt2x00dev->hw->workqueue,
+			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+}
+
+void rt2x00link_register(struct rt2x00_dev *rt2x00dev)
+{
+	INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00link_tuner);
+}
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 3/15] rt2x00: Reduce calls to bbp_read()
  2008-12-20  9:53   ` [PATCH 2/15] rt2x00: Move link tuning into seperate file Ivo van Doorn
@ 2008-12-20  9:54     ` Ivo van Doorn
  2008-12-20  9:54       ` [PATCH 4/15] rt2x00: Restrict interface between rt2x00link and drivers Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:54 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

The link_tuner() function will always call bbp_read()
at the start of the function. Because this is an
indirect register access has some costs attached
to it (especially for USB hardware).

We already store the value read from the register
into the vgc_level value inside the link structure.
Instead of reading from the register we can read that
field directly and base the tuner on that value.

This reduces the time the registers are locked with
the csr_mutex and speeds up the link_tuner processing.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2400pci.c |   27 ++++++++--------
 drivers/net/wireless/rt2x00/rt2500pci.c |   50 +++++++++++++++---------------
 drivers/net/wireless/rt2x00/rt2x00.h    |    9 ++++-
 drivers/net/wireless/rt2x00/rt61pci.c   |   49 +++++++++++++----------------
 drivers/net/wireless/rt2x00/rt73usb.c   |   52 ++++++++++++++----------------
 5 files changed, 92 insertions(+), 95 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 031cb0a..a186e4b 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -600,35 +600,36 @@ static void rt2400pci_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = bbp;
 }
 
+static inline void rt2400pci_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+{
+	rt2400pci_bbp_write(rt2x00dev, 13, vgc_level);
+	rt2x00dev->link.vgc_level = vgc_level;
+	rt2x00dev->link.vgc_level_reg = vgc_level;
+}
+
 static void rt2400pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	rt2400pci_bbp_write(rt2x00dev, 13, 0x08);
-	rt2x00dev->link.vgc_level = 0x08;
+	rt2400pci_set_vgc(rt2x00dev, 0x08);
 }
 
 static void rt2400pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	u8 reg;
+	struct link *link = &rt2x00dev->link;
 
 	/*
 	 * The link tuner should not run longer then 60 seconds,
 	 * and should run once every 2 seconds.
 	 */
-	if (rt2x00dev->link.count > 60 || !(rt2x00dev->link.count & 1))
+	if (link->count > 60 || !(link->count & 1))
 		return;
 
 	/*
 	 * Base r13 link tuning on the false cca count.
 	 */
-	rt2400pci_bbp_read(rt2x00dev, 13, &reg);
-
-	if (rt2x00dev->link.qual.false_cca > 512 && reg < 0x20) {
-		rt2400pci_bbp_write(rt2x00dev, 13, ++reg);
-		rt2x00dev->link.vgc_level = reg;
-	} else if (rt2x00dev->link.qual.false_cca < 100 && reg > 0x08) {
-		rt2400pci_bbp_write(rt2x00dev, 13, --reg);
-		rt2x00dev->link.vgc_level = reg;
-	}
+	if ((link->qual.false_cca > 512) && (link->vgc_level < 0x20))
+		rt2400pci_set_vgc(rt2x00dev, ++link->vgc_level);
+	else if ((link->qual.false_cca < 100) && (link->vgc_level > 0x08))
+		rt2400pci_set_vgc(rt2x00dev, --link->vgc_level);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 780c96b..dd1f2c0 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -639,16 +639,23 @@ static void rt2500pci_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = rt2x00_get_field32(reg, CNT3_FALSE_CCA);
 }
 
+static inline void rt2500pci_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+{
+	if (rt2x00dev->link.vgc_level_reg != vgc_level) {
+		rt2500pci_bbp_write(rt2x00dev, 17, vgc_level);
+		rt2x00dev->link.vgc_level_reg = vgc_level;
+	}
+}
+
 static void rt2500pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	rt2500pci_bbp_write(rt2x00dev, 17, 0x48);
-	rt2x00dev->link.vgc_level = 0x48;
+	rt2500pci_set_vgc(rt2x00dev, 0x48);
 }
 
 static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	int rssi = rt2x00_get_link_rssi(&rt2x00dev->link);
-	u8 r17;
+	struct link *link = &rt2x00dev->link;
+	int rssi = rt2x00_get_link_rssi(link);
 
 	/*
 	 * To prevent collisions with MAC ASIC on chipsets
@@ -656,12 +663,9 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * seconds while being associated.
 	 */
 	if (rt2x00_rev(&rt2x00dev->chip) < RT2560_VERSION_D &&
-	    rt2x00dev->intf_associated &&
-	    rt2x00dev->link.count > 20)
+	    rt2x00dev->intf_associated && link->count > 20)
 		return;
 
-	rt2500pci_bbp_read(rt2x00dev, 17, &r17);
-
 	/*
 	 * Chipset versions C and lower should directly continue
 	 * to the dynamic CCA tuning. Chipset version D and higher
@@ -677,11 +681,9 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * then corrupt the R17 tuning. To remidy this the tuning should
 	 * be stopped (While making sure the R17 value will not exceed limits)
 	 */
-	if (rssi < -80 && rt2x00dev->link.count > 20) {
-		if (r17 >= 0x41) {
-			r17 = rt2x00dev->link.vgc_level;
-			rt2500pci_bbp_write(rt2x00dev, 17, r17);
-		}
+	if (rssi < -80 && link->count > 20) {
+		if (link->vgc_level_reg >= 0x41)
+			rt2500pci_set_vgc(rt2x00dev, link->vgc_level);
 		return;
 	}
 
@@ -689,8 +691,7 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special big-R17 for short distance
 	 */
 	if (rssi >= -58) {
-		if (r17 != 0x50)
-			rt2500pci_bbp_write(rt2x00dev, 17, 0x50);
+		rt2500pci_set_vgc(rt2x00dev, 0x50);
 		return;
 	}
 
@@ -698,8 +699,7 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special mid-R17 for middle distance
 	 */
 	if (rssi >= -74) {
-		if (r17 != 0x41)
-			rt2500pci_bbp_write(rt2x00dev, 17, 0x41);
+		rt2500pci_set_vgc(rt2x00dev, 0x41);
 		return;
 	}
 
@@ -707,8 +707,8 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Leave short or middle distance condition, restore r17
 	 * to the dynamic tuning range.
 	 */
-	if (r17 >= 0x41) {
-		rt2500pci_bbp_write(rt2x00dev, 17, rt2x00dev->link.vgc_level);
+	if (link->vgc_level_reg >= 0x41) {
+		rt2500pci_set_vgc(rt2x00dev, link->vgc_level);
 		return;
 	}
 
@@ -718,12 +718,12 @@ dynamic_cca_tune:
 	 * R17 is inside the dynamic tuning range,
 	 * start tuning the link based on the false cca counter.
 	 */
-	if (rt2x00dev->link.qual.false_cca > 512 && r17 < 0x40) {
-		rt2500pci_bbp_write(rt2x00dev, 17, ++r17);
-		rt2x00dev->link.vgc_level = r17;
-	} else if (rt2x00dev->link.qual.false_cca < 100 && r17 > 0x32) {
-		rt2500pci_bbp_write(rt2x00dev, 17, --r17);
-		rt2x00dev->link.vgc_level = r17;
+	if (link->qual.false_cca > 512 && link->vgc_level_reg < 0x40) {
+		rt2500pci_set_vgc(rt2x00dev, ++link->vgc_level_reg);
+		link->vgc_level = link->vgc_level_reg;
+	} else if (link->qual.false_cca < 100 && link->vgc_level_reg > 0x32) {
+		rt2500pci_set_vgc(rt2x00dev, --link->vgc_level_reg);
+		link->vgc_level = link->vgc_level_reg;
 	}
 }
 
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 19c0687..8935f2c 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -286,9 +286,14 @@ struct link {
 	struct link_ant ant;
 
 	/*
-	 * Active VGC level
+	 * Active VGC level (for false cca tuning)
 	 */
-	int vgc_level;
+	u8 vgc_level;
+
+	/*
+	 * VGC level as configured in register
+	 */
+	u8 vgc_level_reg;
 
 	/*
 	 * Work structure for scheduling periodic link tuning.
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 3f91a6e..abd7b43 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1046,21 +1046,27 @@ static void rt61pci_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR);
 }
 
+static inline void rt61pci_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+{
+	if (rt2x00dev->link.vgc_level != vgc_level) {
+		rt61pci_bbp_write(rt2x00dev, 17, vgc_level);
+		rt2x00dev->link.vgc_level = vgc_level;
+		rt2x00dev->link.vgc_level_reg = vgc_level;
+	}
+}
+
 static void rt61pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	rt61pci_bbp_write(rt2x00dev, 17, 0x20);
-	rt2x00dev->link.vgc_level = 0x20;
+	rt61pci_set_vgc(rt2x00dev, 0x20);
 }
 
 static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	int rssi = rt2x00_get_link_rssi(&rt2x00dev->link);
-	u8 r17;
+	struct link *link = &rt2x00dev->link;
+	int rssi = rt2x00_get_link_rssi(link);
 	u8 up_bound;
 	u8 low_bound;
 
-	rt61pci_bbp_read(rt2x00dev, 17, &r17);
-
 	/*
 	 * Determine r17 bounds.
 	 */
@@ -1091,8 +1097,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special big-R17 for very short distance
 	 */
 	if (rssi >= -35) {
-		if (r17 != 0x60)
-			rt61pci_bbp_write(rt2x00dev, 17, 0x60);
+		rt61pci_set_vgc(rt2x00dev, 0x60);
 		return;
 	}
 
@@ -1100,8 +1105,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special big-R17 for short distance
 	 */
 	if (rssi >= -58) {
-		if (r17 != up_bound)
-			rt61pci_bbp_write(rt2x00dev, 17, up_bound);
+		rt61pci_set_vgc(rt2x00dev, up_bound);
 		return;
 	}
 
@@ -1109,9 +1113,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special big-R17 for middle-short distance
 	 */
 	if (rssi >= -66) {
-		low_bound += 0x10;
-		if (r17 != low_bound)
-			rt61pci_bbp_write(rt2x00dev, 17, low_bound);
+		rt61pci_set_vgc(rt2x00dev, low_bound + 0x10);
 		return;
 	}
 
@@ -1119,9 +1121,7 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special mid-R17 for middle distance
 	 */
 	if (rssi >= -74) {
-		low_bound += 0x08;
-		if (r17 != low_bound)
-			rt61pci_bbp_write(rt2x00dev, 17, low_bound);
+		rt61pci_set_vgc(rt2x00dev, low_bound + 0x08);
 		return;
 	}
 
@@ -1133,8 +1133,8 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	if (low_bound > up_bound)
 		up_bound = low_bound;
 
-	if (r17 > up_bound) {
-		rt61pci_bbp_write(rt2x00dev, 17, up_bound);
+	if (link->vgc_level > up_bound) {
+		rt61pci_set_vgc(rt2x00dev, up_bound);
 		return;
 	}
 
@@ -1144,15 +1144,10 @@ dynamic_cca_tune:
 	 * r17 does not yet exceed upper limit, continue and base
 	 * the r17 tuning on the false CCA count.
 	 */
-	if (rt2x00dev->link.qual.false_cca > 512 && r17 < up_bound) {
-		if (++r17 > up_bound)
-			r17 = up_bound;
-		rt61pci_bbp_write(rt2x00dev, 17, r17);
-	} else if (rt2x00dev->link.qual.false_cca < 100 && r17 > low_bound) {
-		if (--r17 < low_bound)
-			r17 = low_bound;
-		rt61pci_bbp_write(rt2x00dev, 17, r17);
-	}
+	if ((link->qual.false_cca > 512) && (link->vgc_level < up_bound))
+		rt61pci_set_vgc(rt2x00dev, ++link->vgc_level);
+	else if ((link->qual.false_cca < 100) && (link->vgc_level > low_bound))
+		rt61pci_set_vgc(rt2x00dev, --link->vgc_level);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 8a365c9..49fd42a 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -924,21 +924,27 @@ static void rt73usb_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR);
 }
 
+static inline void rt73usb_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+{
+	if (rt2x00dev->link.vgc_level != vgc_level) {
+		rt73usb_bbp_write(rt2x00dev, 17, vgc_level);
+		rt2x00dev->link.vgc_level = vgc_level;
+		rt2x00dev->link.vgc_level_reg = vgc_level;
+	}
+}
+
 static void rt73usb_reset_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	rt73usb_bbp_write(rt2x00dev, 17, 0x20);
-	rt2x00dev->link.vgc_level = 0x20;
+	rt73usb_set_vgc(rt2x00dev, 0x20);
 }
 
 static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	int rssi = rt2x00_get_link_rssi(&rt2x00dev->link);
-	u8 r17;
+	struct link *link = &rt2x00dev->link;
+	int rssi = rt2x00_get_link_rssi(link);
 	u8 up_bound;
 	u8 low_bound;
 
-	rt73usb_bbp_read(rt2x00dev, 17, &r17);
-
 	/*
 	 * Determine r17 bounds.
 	 */
@@ -979,8 +985,7 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special big-R17 for very short distance
 	 */
 	if (rssi > -35) {
-		if (r17 != 0x60)
-			rt73usb_bbp_write(rt2x00dev, 17, 0x60);
+		rt73usb_set_vgc(rt2x00dev, 0x60);
 		return;
 	}
 
@@ -988,8 +993,7 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special big-R17 for short distance
 	 */
 	if (rssi >= -58) {
-		if (r17 != up_bound)
-			rt73usb_bbp_write(rt2x00dev, 17, up_bound);
+		rt73usb_set_vgc(rt2x00dev, up_bound);
 		return;
 	}
 
@@ -997,9 +1001,7 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special big-R17 for middle-short distance
 	 */
 	if (rssi >= -66) {
-		low_bound += 0x10;
-		if (r17 != low_bound)
-			rt73usb_bbp_write(rt2x00dev, 17, low_bound);
+		rt73usb_set_vgc(rt2x00dev, low_bound + 0x10);
 		return;
 	}
 
@@ -1007,8 +1009,7 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special mid-R17 for middle distance
 	 */
 	if (rssi >= -74) {
-		if (r17 != (low_bound + 0x10))
-			rt73usb_bbp_write(rt2x00dev, 17, low_bound + 0x08);
+		rt73usb_set_vgc(rt2x00dev, low_bound + 0x08);
 		return;
 	}
 
@@ -1020,8 +1021,8 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 	if (low_bound > up_bound)
 		up_bound = low_bound;
 
-	if (r17 > up_bound) {
-		rt73usb_bbp_write(rt2x00dev, 17, up_bound);
+	if (link->vgc_level > up_bound) {
+		rt73usb_set_vgc(rt2x00dev, up_bound);
 		return;
 	}
 
@@ -1031,17 +1032,12 @@ dynamic_cca_tune:
 	 * r17 does not yet exceed upper limit, continue and base
 	 * the r17 tuning on the false CCA count.
 	 */
-	if (rt2x00dev->link.qual.false_cca > 512 && r17 < up_bound) {
-		r17 += 4;
-		if (r17 > up_bound)
-			r17 = up_bound;
-		rt73usb_bbp_write(rt2x00dev, 17, r17);
-	} else if (rt2x00dev->link.qual.false_cca < 100 && r17 > low_bound) {
-		r17 -= 4;
-		if (r17 < low_bound)
-			r17 = low_bound;
-		rt73usb_bbp_write(rt2x00dev, 17, r17);
-	}
+	if ((link->qual.false_cca > 512) && (link->vgc_level < up_bound))
+		rt73usb_set_vgc(rt2x00dev,
+				min_t(u8, link->vgc_level + 4, up_bound));
+	else if ((link->qual.false_cca < 100) && (link->vgc_level > low_bound))
+		rt73usb_set_vgc(rt2x00dev,
+				max_t(u8, link->vgc_level - 4, low_bound));
 }
 
 /*
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 4/15] rt2x00: Restrict interface between rt2x00link and drivers
  2008-12-20  9:54     ` [PATCH 3/15] rt2x00: Reduce calls to bbp_read() Ivo van Doorn
@ 2008-12-20  9:54       ` Ivo van Doorn
  2008-12-20  9:55         ` [PATCH 5/15] rt2x00: Add mesh support Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:54 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Restrict drivers to only access link_qual structure during
link tuning. The contents of these fields are for the drivers
and all fields are allowed to be changed to values the driver
considers correct.

This means that some fields need to be moved outside of this
structure to restrict access only to rt2x00link itself.
This allows some code to be moved outside of the rt2x00.h header
and into rt2x00link.c.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2400pci.c  |   27 +++---
 drivers/net/wireless/rt2x00/rt2500pci.c  |   50 +++++-----
 drivers/net/wireless/rt2x00/rt2500usb.c  |    5 +-
 drivers/net/wireless/rt2x00/rt2x00.h     |   99 +++++++-------------
 drivers/net/wireless/rt2x00/rt2x00link.c |  145 +++++++++++++++++++++---------
 drivers/net/wireless/rt2x00/rt61pci.c    |   49 +++++-----
 drivers/net/wireless/rt2x00/rt73usb.c    |   57 ++++++------
 7 files changed, 233 insertions(+), 199 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index a186e4b..9c02231 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -600,36 +600,37 @@ static void rt2400pci_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = bbp;
 }
 
-static inline void rt2400pci_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+static inline void rt2400pci_set_vgc(struct rt2x00_dev *rt2x00dev,
+				     struct link_qual *qual, u8 vgc_level)
 {
 	rt2400pci_bbp_write(rt2x00dev, 13, vgc_level);
-	rt2x00dev->link.vgc_level = vgc_level;
-	rt2x00dev->link.vgc_level_reg = vgc_level;
+	qual->vgc_level = vgc_level;
+	qual->vgc_level_reg = vgc_level;
 }
 
-static void rt2400pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt2400pci_reset_tuner(struct rt2x00_dev *rt2x00dev,
+				  struct link_qual *qual)
 {
-	rt2400pci_set_vgc(rt2x00dev, 0x08);
+	rt2400pci_set_vgc(rt2x00dev, qual, 0x08);
 }
 
-static void rt2400pci_link_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt2400pci_link_tuner(struct rt2x00_dev *rt2x00dev,
+				 struct link_qual *qual, const u32 count)
 {
-	struct link *link = &rt2x00dev->link;
-
 	/*
 	 * The link tuner should not run longer then 60 seconds,
 	 * and should run once every 2 seconds.
 	 */
-	if (link->count > 60 || !(link->count & 1))
+	if (count > 60 || !(count & 1))
 		return;
 
 	/*
 	 * Base r13 link tuning on the false cca count.
 	 */
-	if ((link->qual.false_cca > 512) && (link->vgc_level < 0x20))
-		rt2400pci_set_vgc(rt2x00dev, ++link->vgc_level);
-	else if ((link->qual.false_cca < 100) && (link->vgc_level > 0x08))
-		rt2400pci_set_vgc(rt2x00dev, --link->vgc_level);
+	if ((qual->false_cca > 512) && (qual->vgc_level < 0x20))
+		rt2400pci_set_vgc(rt2x00dev, qual, ++qual->vgc_level);
+	else if ((qual->false_cca < 100) && (qual->vgc_level > 0x08))
+		rt2400pci_set_vgc(rt2x00dev, qual, --qual->vgc_level);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index dd1f2c0..90333ee 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -639,31 +639,31 @@ static void rt2500pci_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = rt2x00_get_field32(reg, CNT3_FALSE_CCA);
 }
 
-static inline void rt2500pci_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+static inline void rt2500pci_set_vgc(struct rt2x00_dev *rt2x00dev,
+				     struct link_qual *qual, u8 vgc_level)
 {
-	if (rt2x00dev->link.vgc_level_reg != vgc_level) {
+	if (qual->vgc_level_reg != vgc_level) {
 		rt2500pci_bbp_write(rt2x00dev, 17, vgc_level);
-		rt2x00dev->link.vgc_level_reg = vgc_level;
+		qual->vgc_level_reg = vgc_level;
 	}
 }
 
-static void rt2500pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt2500pci_reset_tuner(struct rt2x00_dev *rt2x00dev,
+				  struct link_qual *qual)
 {
-	rt2500pci_set_vgc(rt2x00dev, 0x48);
+	rt2500pci_set_vgc(rt2x00dev, qual, 0x48);
 }
 
-static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev,
+				 struct link_qual *qual, const u32 count)
 {
-	struct link *link = &rt2x00dev->link;
-	int rssi = rt2x00_get_link_rssi(link);
-
 	/*
 	 * To prevent collisions with MAC ASIC on chipsets
 	 * up to version C the link tuning should halt after 20
 	 * seconds while being associated.
 	 */
 	if (rt2x00_rev(&rt2x00dev->chip) < RT2560_VERSION_D &&
-	    rt2x00dev->intf_associated && link->count > 20)
+	    rt2x00dev->intf_associated && count > 20)
 		return;
 
 	/*
@@ -681,25 +681,25 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * then corrupt the R17 tuning. To remidy this the tuning should
 	 * be stopped (While making sure the R17 value will not exceed limits)
 	 */
-	if (rssi < -80 && link->count > 20) {
-		if (link->vgc_level_reg >= 0x41)
-			rt2500pci_set_vgc(rt2x00dev, link->vgc_level);
+	if (qual->rssi < -80 && count > 20) {
+		if (qual->vgc_level_reg >= 0x41)
+			rt2500pci_set_vgc(rt2x00dev, qual, qual->vgc_level);
 		return;
 	}
 
 	/*
 	 * Special big-R17 for short distance
 	 */
-	if (rssi >= -58) {
-		rt2500pci_set_vgc(rt2x00dev, 0x50);
+	if (qual->rssi >= -58) {
+		rt2500pci_set_vgc(rt2x00dev, qual, 0x50);
 		return;
 	}
 
 	/*
 	 * Special mid-R17 for middle distance
 	 */
-	if (rssi >= -74) {
-		rt2500pci_set_vgc(rt2x00dev, 0x41);
+	if (qual->rssi >= -74) {
+		rt2500pci_set_vgc(rt2x00dev, qual, 0x41);
 		return;
 	}
 
@@ -707,8 +707,8 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Leave short or middle distance condition, restore r17
 	 * to the dynamic tuning range.
 	 */
-	if (link->vgc_level_reg >= 0x41) {
-		rt2500pci_set_vgc(rt2x00dev, link->vgc_level);
+	if (qual->vgc_level_reg >= 0x41) {
+		rt2500pci_set_vgc(rt2x00dev, qual, qual->vgc_level);
 		return;
 	}
 
@@ -718,12 +718,12 @@ dynamic_cca_tune:
 	 * R17 is inside the dynamic tuning range,
 	 * start tuning the link based on the false cca counter.
 	 */
-	if (link->qual.false_cca > 512 && link->vgc_level_reg < 0x40) {
-		rt2500pci_set_vgc(rt2x00dev, ++link->vgc_level_reg);
-		link->vgc_level = link->vgc_level_reg;
-	} else if (link->qual.false_cca < 100 && link->vgc_level_reg > 0x32) {
-		rt2500pci_set_vgc(rt2x00dev, --link->vgc_level_reg);
-		link->vgc_level = link->vgc_level_reg;
+	if (qual->false_cca > 512 && qual->vgc_level_reg < 0x40) {
+		rt2500pci_set_vgc(rt2x00dev, qual, ++qual->vgc_level_reg);
+		qual->vgc_level = qual->vgc_level_reg;
+	} else if (qual->false_cca < 100 && qual->vgc_level_reg > 0x32) {
+		rt2500pci_set_vgc(rt2x00dev, qual, --qual->vgc_level_reg);
+		qual->vgc_level = qual->vgc_level_reg;
 	}
 }
 
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 4de1bc1..79f0771 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -698,7 +698,8 @@ static void rt2500usb_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = rt2x00_get_field16(reg, STA_CSR3_FALSE_CCA_ERROR);
 }
 
-static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev,
+				  struct link_qual *qual)
 {
 	u16 eeprom;
 	u16 value;
@@ -719,7 +720,7 @@ static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev)
 	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_VGCUPPER);
 	rt2500usb_bbp_write(rt2x00dev, 17, value);
 
-	rt2x00dev->link.vgc_level = value;
+	qual->vgc_level = value;
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 8935f2c..dea5022 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -177,52 +177,41 @@ struct antenna_setup {
  */
 struct link_qual {
 	/*
-	 * Statistics required for Link tuning.
-	 * For the average RSSI value we use the "Walking average" approach.
-	 * When adding RSSI to the average value the following calculation
-	 * is needed:
-	 *
-	 *        avg_rssi = ((avg_rssi * 7) + rssi) / 8;
+	 * Statistics required for Link tuning by driver
+	 * The rssi value is provided by rt2x00lib during the
+	 * link_tuner() callback function.
+	 * The false_cca field is filled during the link_stats()
+	 * callback function and could be used during the
+	 * link_tuner() callback function.
+	 */
+	int rssi;
+	int false_cca;
+
+	/*
+	 * VGC levels
+	 * Hardware driver will tune the VGC level during each call
+	 * to the link_tuner() callback function. This vgc_level is
+	 * is determined based on the link quality statistics like
+	 * average RSSI and the false CCA count.
 	 *
-	 * The advantage of this approach is that we only need 1 variable
-	 * to store the average in (No need for a count and a total).
-	 * But more importantly, normal average values will over time
-	 * move less and less towards newly added values this results
-	 * that with link tuning, the device can have a very good RSSI
-	 * for a few minutes but when the device is moved away from the AP
-	 * the average will not decrease fast enough to compensate.
-	 * The walking average compensates this and will move towards
-	 * the new values correctly allowing a effective link tuning.
+	 * In some cases the drivers need to differentiate between
+	 * the currently "desired" VGC level and the level configured
+	 * in the hardware. The latter is important to reduce the
+	 * number of BBP register reads to reduce register access
+	 * overhead. For this reason we store both values here.
 	 */
-	int avg_rssi;
-	int false_cca;
+	u8 vgc_level;
+	u8 vgc_level_reg;
 
 	/*
 	 * Statistics required for Signal quality calculation.
-	 * For calculating the Signal quality we have to determine
-	 * the total number of success and failed RX and TX frames.
-	 * After that we also use the average RSSI value to help
-	 * determining the signal quality.
-	 * For the calculation we will use the following algorithm:
-	 *
-	 *         rssi_percentage = (avg_rssi * 100) / rssi_offset
-	 *         rx_percentage = (rx_success * 100) / rx_total
-	 *         tx_percentage = (tx_success * 100) / tx_total
-	 *         avg_signal = ((WEIGHT_RSSI * avg_rssi) +
-	 *                       (WEIGHT_TX * tx_percentage) +
-	 *                       (WEIGHT_RX * rx_percentage)) / 100
-	 *
-	 * This value should then be checked to not be greater then 100.
+	 * These fields might be changed during the link_stats()
+	 * callback function.
 	 */
-	int rx_percentage;
 	int rx_success;
 	int rx_failed;
-	int tx_percentage;
 	int tx_success;
 	int tx_failed;
-#define WEIGHT_RSSI	20
-#define WEIGHT_RX	40
-#define WEIGHT_TX	40
 };
 
 /*
@@ -286,14 +275,16 @@ struct link {
 	struct link_ant ant;
 
 	/*
-	 * Active VGC level (for false cca tuning)
+	 * Currently active average RSSI value
 	 */
-	u8 vgc_level;
+	int avg_rssi;
 
 	/*
-	 * VGC level as configured in register
+	 * Currently precalculated percentages of successful
+	 * TX and RX frames.
 	 */
-	u8 vgc_level_reg;
+	int rx_percentage;
+	int tx_percentage;
 
 	/*
 	 * Work structure for scheduling periodic link tuning.
@@ -302,28 +293,6 @@ struct link {
 };
 
 /*
- * Small helper macro to work with moving/walking averages.
- */
-#define MOVING_AVERAGE(__avg, __val, __samples) \
-	( (((__avg) * ((__samples) - 1)) + (__val)) / (__samples) )
-
-/*
- * When we lack RSSI information return something less then -80 to
- * tell the driver to tune the device to maximum sensitivity.
- */
-#define DEFAULT_RSSI	( -128 )
-
-/*
- * Link quality access functions.
- */
-static inline int rt2x00_get_link_rssi(struct link *link)
-{
-	if (link->qual.avg_rssi && link->qual.rx_success)
-		return link->qual.avg_rssi;
-	return DEFAULT_RSSI;
-}
-
-/*
  * Interface structure
  * Per interface configuration details, this structure
  * is allocated as the private data for ieee80211_vif.
@@ -522,8 +491,10 @@ struct rt2x00lib_ops {
 	int (*rfkill_poll) (struct rt2x00_dev *rt2x00dev);
 	void (*link_stats) (struct rt2x00_dev *rt2x00dev,
 			    struct link_qual *qual);
-	void (*reset_tuner) (struct rt2x00_dev *rt2x00dev);
-	void (*link_tuner) (struct rt2x00_dev *rt2x00dev);
+	void (*reset_tuner) (struct rt2x00_dev *rt2x00dev,
+			     struct link_qual *qual);
+	void (*link_tuner) (struct rt2x00_dev *rt2x00dev,
+			    struct link_qual *qual, const u32 count);
 
 	/*
 	 * TX control handlers
diff --git a/drivers/net/wireless/rt2x00/rt2x00link.c b/drivers/net/wireless/rt2x00/rt2x00link.c
index 0462d5a..ee08f11 100644
--- a/drivers/net/wireless/rt2x00/rt2x00link.c
+++ b/drivers/net/wireless/rt2x00/rt2x00link.c
@@ -29,6 +29,71 @@
 #include "rt2x00.h"
 #include "rt2x00lib.h"
 
+/*
+ * When we lack RSSI information return something less then -80 to
+ * tell the driver to tune the device to maximum sensitivity.
+ */
+#define DEFAULT_RSSI		-128
+
+/*
+ * When no TX/RX percentage could be calculated due to lack of
+ * frames on the air, we fallback to a percentage of 50%.
+ * This will assure we will get at least get some decent value
+ * when the link tuner starts.
+ * The value will be dropped and overwritten with the correct (measured)
+ * value anyway during the first run of the link tuner.
+ */
+#define DEFAULT_PERCENTAGE	50
+
+/*
+ * Small helper macro to work with moving/walking averages.
+ * When adding a value to the average value the following calculation
+ * is needed:
+ *
+ *        avg_rssi = ((avg_rssi * 7) + rssi) / 8;
+ *
+ * The advantage of this approach is that we only need 1 variable
+ * to store the average in (No need for a count and a total).
+ * But more importantly, normal average values will over time
+ * move less and less towards newly added values this results
+ * that with link tuning, the device can have a very good RSSI
+ * for a few minutes but when the device is moved away from the AP
+ * the average will not decrease fast enough to compensate.
+ * The walking average compensates this and will move towards
+ * the new values correctly allowing a effective link tuning.
+ */
+#define MOVING_AVERAGE(__avg, __val, __samples) \
+	( (((__avg) * ((__samples) - 1)) + (__val)) / (__samples) )
+
+/*
+ * Small helper macro for percentage calculation
+ * This is a very simple macro with the only catch that it will
+ * produce a default value in case no total value was provided.
+ */
+#define PERCENTAGE(__value, __total) \
+	( (__total) ? (((__value) * 100) / (__total)) : (DEFAULT_PERCENTAGE) )
+
+/*
+ * For calculating the Signal quality we have determined
+ * the total number of success and failed RX and TX frames.
+ * With the addition of the average RSSI value we can determine
+ * the link quality using the following algorithm:
+ *
+ *         rssi_percentage = (avg_rssi * 100) / rssi_offset
+ *         rx_percentage = (rx_success * 100) / rx_total
+ *         tx_percentage = (tx_success * 100) / tx_total
+ *         avg_signal = ((WEIGHT_RSSI * avg_rssi) +
+ *                       (WEIGHT_TX * tx_percentage) +
+ *                       (WEIGHT_RX * rx_percentage)) / 100
+ *
+ * This value should then be checked to not be greater then 100.
+ * This means the values of WEIGHT_RSSI, WEIGHT_RX, WEIGHT_TX must
+ * sum up to 100 as well.
+ */
+#define WEIGHT_RSSI	20
+#define WEIGHT_RX	40
+#define WEIGHT_TX	40
+
 static int rt2x00link_antenna_get_link_rssi(struct rt2x00_dev *rt2x00dev)
 {
 	struct link_ant *ant = &rt2x00dev->link.ant;
@@ -191,6 +256,7 @@ void rt2x00link_update_stats(struct rt2x00_dev *rt2x00dev,
 			     struct sk_buff *skb,
 			     struct rxdone_entry_desc *rxdesc)
 {
+	struct link *link = &rt2x00dev->link;
 	struct link_qual *qual = &rt2x00dev->link.qual;
 	struct link_ant *ant = &rt2x00dev->link.ant;
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
@@ -215,9 +281,9 @@ void rt2x00link_update_stats(struct rt2x00_dev *rt2x00dev,
 	/*
 	 * Update global RSSI
 	 */
-	if (qual->avg_rssi)
-		avg_rssi = MOVING_AVERAGE(qual->avg_rssi, rxdesc->rssi, 8);
-	qual->avg_rssi = avg_rssi;
+	if (link->avg_rssi)
+		avg_rssi = MOVING_AVERAGE(link->avg_rssi, rxdesc->rssi, 8);
+	link->avg_rssi = avg_rssi;
 
 	/*
 	 * Update antenna RSSI
@@ -229,21 +295,13 @@ void rt2x00link_update_stats(struct rt2x00_dev *rt2x00dev,
 
 static void rt2x00link_precalculate_signal(struct rt2x00_dev *rt2x00dev)
 {
+	struct link *link = &rt2x00dev->link;
 	struct link_qual *qual = &rt2x00dev->link.qual;
 
-	if (qual->rx_failed || qual->rx_success)
-		qual->rx_percentage =
-		    (qual->rx_success * 100) /
-		    (qual->rx_failed + qual->rx_success);
-	else
-		qual->rx_percentage = 50;
-
-	if (qual->tx_failed || qual->tx_success)
-		qual->tx_percentage =
-		    (qual->tx_success * 100) /
-		    (qual->tx_failed + qual->tx_success);
-	else
-		qual->tx_percentage = 50;
+	link->rx_percentage =
+	    PERCENTAGE(qual->rx_success, qual->rx_failed + qual->rx_success);
+	link->tx_percentage =
+	    PERCENTAGE(qual->tx_success, qual->tx_failed + qual->tx_success);
 
 	qual->rx_success = 0;
 	qual->rx_failed = 0;
@@ -253,7 +311,7 @@ static void rt2x00link_precalculate_signal(struct rt2x00_dev *rt2x00dev)
 
 int rt2x00link_calculate_signal(struct rt2x00_dev *rt2x00dev, int rssi)
 {
-	struct link_qual *qual = &rt2x00dev->link.qual;
+	struct link *link = &rt2x00dev->link;
 	int rssi_percentage = 0;
 	int signal;
 
@@ -267,22 +325,22 @@ int rt2x00link_calculate_signal(struct rt2x00_dev *rt2x00dev, int rssi)
 	 * Calculate the different percentages,
 	 * which will be used for the signal.
 	 */
-	rssi_percentage = (rssi * 100) / rt2x00dev->rssi_offset;
+	rssi_percentage = PERCENTAGE(rssi, rt2x00dev->rssi_offset);
 
 	/*
 	 * Add the individual percentages and use the WEIGHT
 	 * defines to calculate the current link signal.
 	 */
 	signal = ((WEIGHT_RSSI * rssi_percentage) +
-		  (WEIGHT_TX * qual->tx_percentage) +
-		  (WEIGHT_RX * qual->rx_percentage)) / 100;
+		  (WEIGHT_TX * link->tx_percentage) +
+		  (WEIGHT_RX * link->rx_percentage)) / 100;
 
 	return max_t(int, signal, 100);
 }
 
 void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev)
 {
-	struct link_qual *qual = &rt2x00dev->link.qual;
+	struct link *link = &rt2x00dev->link;
 
 	/*
 	 * Link tuning should only be performed when
@@ -293,26 +351,13 @@ void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev)
 	if (!rt2x00dev->intf_ap_count && !rt2x00dev->intf_sta_count)
 		return;
 
-	/*
-	 * Clear all (possibly) pre-existing quality statistics.
-	 */
-	memset(qual, 0, sizeof(*qual));
-
-	/*
-	 * The RX and TX percentage should start at 50%
-	 * this will assure we will get at least get some
-	 * decent value when the link tuner starts.
-	 * The value will be dropped and overwritten with
-	 * the correct (measured) value anyway during the
-	 * first run of the link tuner.
-	 */
-	qual->rx_percentage = 50;
-	qual->tx_percentage = 50;
+	link->rx_percentage = DEFAULT_PERCENTAGE;
+	link->tx_percentage = DEFAULT_PERCENTAGE;
 
 	rt2x00link_reset_tuner(rt2x00dev, false);
 
 	queue_delayed_work(rt2x00dev->hw->workqueue,
-			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+			   &link->work, LINK_TUNE_INTERVAL);
 }
 
 void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev)
@@ -322,6 +367,8 @@ void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev)
 
 void rt2x00link_reset_tuner(struct rt2x00_dev *rt2x00dev, bool antenna)
 {
+	struct link_qual *qual = &rt2x00dev->link.qual;
+
 	if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
 		return;
 
@@ -334,12 +381,12 @@ void rt2x00link_reset_tuner(struct rt2x00_dev *rt2x00dev, bool antenna)
 	 * first minute after being enabled.
 	 */
 	rt2x00dev->link.count = 0;
-	rt2x00dev->link.vgc_level = 0;
+	memset(qual, 0, sizeof(*qual));
 
 	/*
 	 * Reset the link tuner.
 	 */
-	rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
+	rt2x00dev->ops->lib->reset_tuner(rt2x00dev, qual);
 
 	if (antenna)
 		rt2x00link_antenna_reset(rt2x00dev);
@@ -349,6 +396,7 @@ static void rt2x00link_tuner(struct work_struct *work)
 {
 	struct rt2x00_dev *rt2x00dev =
 	    container_of(work, struct rt2x00_dev, link.work.work);
+	struct link *link = &rt2x00dev->link;
 	struct link_qual *qual = &rt2x00dev->link.qual;
 
 	/*
@@ -365,11 +413,22 @@ static void rt2x00link_tuner(struct work_struct *work)
 	rt2x00dev->low_level_stats.dot11FCSErrorCount += qual->rx_failed;
 
 	/*
+	 * Update quality RSSI for link tuning,
+	 * when we have received some frames and we managed to
+	 * collect the RSSI data we could use this. Otherwise we
+	 * must fallback to the default RSSI value.
+	 */
+	if (!link->avg_rssi || !qual->rx_success)
+		qual->rssi = DEFAULT_RSSI;
+	else
+		qual->rssi = link->avg_rssi;
+
+	/*
 	 * Only perform the link tuning when Link tuning
 	 * has been enabled (This could have been disabled from the EEPROM).
 	 */
 	if (!test_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags))
-		rt2x00dev->ops->lib->link_tuner(rt2x00dev);
+		rt2x00dev->ops->lib->link_tuner(rt2x00dev, qual, link->count);
 
 	/*
 	 * Precalculate a portion of the link signal which is
@@ -380,7 +439,7 @@ static void rt2x00link_tuner(struct work_struct *work)
 	/*
 	 * Send a signal to the led to update the led signal strength.
 	 */
-	rt2x00leds_led_quality(rt2x00dev, qual->avg_rssi);
+	rt2x00leds_led_quality(rt2x00dev, link->avg_rssi);
 
 	/*
 	 * Evaluate antenna setup, make this the last step since this could
@@ -391,9 +450,9 @@ static void rt2x00link_tuner(struct work_struct *work)
 	/*
 	 * Increase tuner counter, and reschedule the next link tuner run.
 	 */
-	rt2x00dev->link.count++;
+	link->count++;
 	queue_delayed_work(rt2x00dev->hw->workqueue,
-			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
+			   &link->work, LINK_TUNE_INTERVAL);
 }
 
 void rt2x00link_register(struct rt2x00_dev *rt2x00dev)
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index abd7b43..2b72010 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1046,24 +1046,25 @@ static void rt61pci_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR);
 }
 
-static inline void rt61pci_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+static inline void rt61pci_set_vgc(struct rt2x00_dev *rt2x00dev,
+				   struct link_qual *qual, u8 vgc_level)
 {
-	if (rt2x00dev->link.vgc_level != vgc_level) {
+	if (qual->vgc_level != vgc_level) {
 		rt61pci_bbp_write(rt2x00dev, 17, vgc_level);
-		rt2x00dev->link.vgc_level = vgc_level;
-		rt2x00dev->link.vgc_level_reg = vgc_level;
+		qual->vgc_level = vgc_level;
+		qual->vgc_level_reg = vgc_level;
 	}
 }
 
-static void rt61pci_reset_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt61pci_reset_tuner(struct rt2x00_dev *rt2x00dev,
+				struct link_qual *qual)
 {
-	rt61pci_set_vgc(rt2x00dev, 0x20);
+	rt61pci_set_vgc(rt2x00dev, qual, 0x20);
 }
 
-static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev,
+			       struct link_qual *qual, const u32 count)
 {
-	struct link *link = &rt2x00dev->link;
-	int rssi = rt2x00_get_link_rssi(link);
 	u8 up_bound;
 	u8 low_bound;
 
@@ -1096,32 +1097,32 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Special big-R17 for very short distance
 	 */
-	if (rssi >= -35) {
-		rt61pci_set_vgc(rt2x00dev, 0x60);
+	if (qual->rssi >= -35) {
+		rt61pci_set_vgc(rt2x00dev, qual, 0x60);
 		return;
 	}
 
 	/*
 	 * Special big-R17 for short distance
 	 */
-	if (rssi >= -58) {
-		rt61pci_set_vgc(rt2x00dev, up_bound);
+	if (qual->rssi >= -58) {
+		rt61pci_set_vgc(rt2x00dev, qual, up_bound);
 		return;
 	}
 
 	/*
 	 * Special big-R17 for middle-short distance
 	 */
-	if (rssi >= -66) {
-		rt61pci_set_vgc(rt2x00dev, low_bound + 0x10);
+	if (qual->rssi >= -66) {
+		rt61pci_set_vgc(rt2x00dev, qual, low_bound + 0x10);
 		return;
 	}
 
 	/*
 	 * Special mid-R17 for middle distance
 	 */
-	if (rssi >= -74) {
-		rt61pci_set_vgc(rt2x00dev, low_bound + 0x08);
+	if (qual->rssi >= -74) {
+		rt61pci_set_vgc(rt2x00dev, qual, low_bound + 0x08);
 		return;
 	}
 
@@ -1129,12 +1130,12 @@ static void rt61pci_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special case: Change up_bound based on the rssi.
 	 * Lower up_bound when rssi is weaker then -74 dBm.
 	 */
-	up_bound -= 2 * (-74 - rssi);
+	up_bound -= 2 * (-74 - qual->rssi);
 	if (low_bound > up_bound)
 		up_bound = low_bound;
 
-	if (link->vgc_level > up_bound) {
-		rt61pci_set_vgc(rt2x00dev, up_bound);
+	if (qual->vgc_level > up_bound) {
+		rt61pci_set_vgc(rt2x00dev, qual, up_bound);
 		return;
 	}
 
@@ -1144,10 +1145,10 @@ dynamic_cca_tune:
 	 * r17 does not yet exceed upper limit, continue and base
 	 * the r17 tuning on the false CCA count.
 	 */
-	if ((link->qual.false_cca > 512) && (link->vgc_level < up_bound))
-		rt61pci_set_vgc(rt2x00dev, ++link->vgc_level);
-	else if ((link->qual.false_cca < 100) && (link->vgc_level > low_bound))
-		rt61pci_set_vgc(rt2x00dev, --link->vgc_level);
+	if ((qual->false_cca > 512) && (qual->vgc_level < up_bound))
+		rt61pci_set_vgc(rt2x00dev, qual, ++qual->vgc_level);
+	else if ((qual->false_cca < 100) && (qual->vgc_level > low_bound))
+		rt61pci_set_vgc(rt2x00dev, qual, --qual->vgc_level);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 49fd42a..5992c8f 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -924,24 +924,25 @@ static void rt73usb_link_stats(struct rt2x00_dev *rt2x00dev,
 	qual->false_cca = rt2x00_get_field32(reg, STA_CSR1_FALSE_CCA_ERROR);
 }
 
-static inline void rt73usb_set_vgc(struct rt2x00_dev *rt2x00dev, u8 vgc_level)
+static inline void rt73usb_set_vgc(struct rt2x00_dev *rt2x00dev,
+				   struct link_qual *qual, u8 vgc_level)
 {
-	if (rt2x00dev->link.vgc_level != vgc_level) {
+	if (qual->vgc_level != vgc_level) {
 		rt73usb_bbp_write(rt2x00dev, 17, vgc_level);
-		rt2x00dev->link.vgc_level = vgc_level;
-		rt2x00dev->link.vgc_level_reg = vgc_level;
+		qual->vgc_level = vgc_level;
+		qual->vgc_level_reg = vgc_level;
 	}
 }
 
-static void rt73usb_reset_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt73usb_reset_tuner(struct rt2x00_dev *rt2x00dev,
+				struct link_qual *qual)
 {
-	rt73usb_set_vgc(rt2x00dev, 0x20);
+	rt73usb_set_vgc(rt2x00dev, qual, 0x20);
 }
 
-static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
+static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev,
+			       struct link_qual *qual, const u32 count)
 {
-	struct link *link = &rt2x00dev->link;
-	int rssi = rt2x00_get_link_rssi(link);
 	u8 up_bound;
 	u8 low_bound;
 
@@ -957,10 +958,10 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 			up_bound += 0x10;
 		}
 	} else {
-		if (rssi > -82) {
+		if (qual->rssi > -82) {
 			low_bound = 0x1c;
 			up_bound = 0x40;
-		} else if (rssi > -84) {
+		} else if (qual->rssi > -84) {
 			low_bound = 0x1c;
 			up_bound = 0x20;
 		} else {
@@ -984,32 +985,32 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 	/*
 	 * Special big-R17 for very short distance
 	 */
-	if (rssi > -35) {
-		rt73usb_set_vgc(rt2x00dev, 0x60);
+	if (qual->rssi > -35) {
+		rt73usb_set_vgc(rt2x00dev, qual, 0x60);
 		return;
 	}
 
 	/*
 	 * Special big-R17 for short distance
 	 */
-	if (rssi >= -58) {
-		rt73usb_set_vgc(rt2x00dev, up_bound);
+	if (qual->rssi >= -58) {
+		rt73usb_set_vgc(rt2x00dev, qual, up_bound);
 		return;
 	}
 
 	/*
 	 * Special big-R17 for middle-short distance
 	 */
-	if (rssi >= -66) {
-		rt73usb_set_vgc(rt2x00dev, low_bound + 0x10);
+	if (qual->rssi >= -66) {
+		rt73usb_set_vgc(rt2x00dev, qual, low_bound + 0x10);
 		return;
 	}
 
 	/*
 	 * Special mid-R17 for middle distance
 	 */
-	if (rssi >= -74) {
-		rt73usb_set_vgc(rt2x00dev, low_bound + 0x08);
+	if (qual->rssi >= -74) {
+		rt73usb_set_vgc(rt2x00dev, qual, low_bound + 0x08);
 		return;
 	}
 
@@ -1017,12 +1018,12 @@ static void rt73usb_link_tuner(struct rt2x00_dev *rt2x00dev)
 	 * Special case: Change up_bound based on the rssi.
 	 * Lower up_bound when rssi is weaker then -74 dBm.
 	 */
-	up_bound -= 2 * (-74 - rssi);
+	up_bound -= 2 * (-74 - qual->rssi);
 	if (low_bound > up_bound)
 		up_bound = low_bound;
 
-	if (link->vgc_level > up_bound) {
-		rt73usb_set_vgc(rt2x00dev, up_bound);
+	if (qual->vgc_level > up_bound) {
+		rt73usb_set_vgc(rt2x00dev, qual, up_bound);
 		return;
 	}
 
@@ -1032,12 +1033,12 @@ dynamic_cca_tune:
 	 * r17 does not yet exceed upper limit, continue and base
 	 * the r17 tuning on the false CCA count.
 	 */
-	if ((link->qual.false_cca > 512) && (link->vgc_level < up_bound))
-		rt73usb_set_vgc(rt2x00dev,
-				min_t(u8, link->vgc_level + 4, up_bound));
-	else if ((link->qual.false_cca < 100) && (link->vgc_level > low_bound))
-		rt73usb_set_vgc(rt2x00dev,
-				max_t(u8, link->vgc_level - 4, low_bound));
+	if ((qual->false_cca > 512) && (qual->vgc_level < up_bound))
+		rt73usb_set_vgc(rt2x00dev, qual,
+				min_t(u8, qual->vgc_level + 4, up_bound));
+	else if ((qual->false_cca < 100) && (qual->vgc_level > low_bound))
+		rt73usb_set_vgc(rt2x00dev, qual,
+				max_t(u8, qual->vgc_level - 4, low_bound));
 }
 
 /*
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 5/15] rt2x00: Add mesh support
  2008-12-20  9:54       ` [PATCH 4/15] rt2x00: Restrict interface between rt2x00link and drivers Ivo van Doorn
@ 2008-12-20  9:55         ` Ivo van Doorn
  2008-12-20  9:55           ` [PATCH 6/15] rt2x00: Add RFKILL support to rt2500usb and rt73usb Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:55 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

From: Andrey Yurovsky <andrey@cozybit.com>

This adds initial support for Mesh Point mode.  For this we tell mac80211 that
we support NL80211_IFTYPE_MESH_POINT.  We also need to send beacons.  mac80211
will configure our RX filter accordingly.

Signed-off-by: Andrey Yurovsky <andrey@cozybit.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2x00config.c |    1 +
 drivers/net/wireless/rt2x00/rt2x00dev.c    |   11 +++++++----
 drivers/net/wireless/rt2x00/rt2x00mac.c    |    1 +
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c
index 2f4cb8d..a35265c 100644
--- a/drivers/net/wireless/rt2x00/rt2x00config.c
+++ b/drivers/net/wireless/rt2x00/rt2x00config.c
@@ -42,6 +42,7 @@ void rt2x00lib_config_intf(struct rt2x00_dev *rt2x00dev,
 	switch (type) {
 	case NL80211_IFTYPE_ADHOC:
 	case NL80211_IFTYPE_AP:
+	case NL80211_IFTYPE_MESH_POINT:
 		conf.sync = TSF_SYNC_BEACON;
 		break;
 	case NL80211_IFTYPE_STATION:
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 1c49a9c..b484197 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -190,7 +190,8 @@ static void rt2x00lib_beacondone_iter(void *data, u8 *mac,
 	struct rt2x00_intf *intf = vif_to_intf(vif);
 
 	if (vif->type != NL80211_IFTYPE_AP &&
-	    vif->type != NL80211_IFTYPE_ADHOC)
+	    vif->type != NL80211_IFTYPE_ADHOC &&
+	    vif->type != NL80211_IFTYPE_MESH_POINT)
 		return;
 
 	/*
@@ -782,7 +783,8 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 	if (rt2x00dev->ops->bcn->entry_num > 0)
 		rt2x00dev->hw->wiphy->interface_modes |=
 		    BIT(NL80211_IFTYPE_ADHOC) |
-		    BIT(NL80211_IFTYPE_AP);
+		    BIT(NL80211_IFTYPE_AP) |
+		    BIT(NL80211_IFTYPE_MESH_POINT);
 
 	/*
 	 * Let the driver probe the device to detect the capabilities.
@@ -937,10 +939,11 @@ static void rt2x00lib_resume_intf(void *data, u8 *mac,
 
 
 	/*
-	 * Master or Ad-hoc mode require a new beacon update.
+	 * AP, Ad-hoc, and Mesh Point mode require a new beacon update.
 	 */
 	if (vif->type == NL80211_IFTYPE_AP ||
-	    vif->type == NL80211_IFTYPE_ADHOC)
+	    vif->type == NL80211_IFTYPE_ADHOC ||
+	    vif->type == NL80211_IFTYPE_MESH_POINT)
 		intf->delayed_flags |= DELAYED_UPDATE_BEACON;
 
 	spin_unlock(&intf->lock);
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
index 38edee5..137386e 100644
--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
@@ -226,6 +226,7 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
 		break;
 	case NL80211_IFTYPE_STATION:
 	case NL80211_IFTYPE_ADHOC:
+	case NL80211_IFTYPE_MESH_POINT:
 		/*
 		 * We don't support mixed combinations of
 		 * sta and ap interfaces.
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 6/15] rt2x00: Add RFKILL support to rt2500usb and rt73usb
  2008-12-20  9:55         ` [PATCH 5/15] rt2x00: Add mesh support Ivo van Doorn
@ 2008-12-20  9:55           ` Ivo van Doorn
  2008-12-20  9:56             ` [PATCH 7/15] rt2x00: Rename CONFIG_CRYPTO_COPY_IV Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:55 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Some very rare Ralink USB hardware exists which features
the RFKILL switch on the USB stick.
This patch adds the EEPROM check function to see if RFKILL
is supported and the polling function to rt2500usb and
rt73usb in order to support RFKILL for that hardware.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2500usb.c |   21 +++++++++++++++++++++
 drivers/net/wireless/rt2x00/rt2500usb.h |    8 ++++++++
 drivers/net/wireless/rt2x00/rt73usb.c   |   21 +++++++++++++++++++++
 drivers/net/wireless/rt2x00/rt73usb.h   |   13 +++++++++++++
 4 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 79f0771..ce76a87 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -280,6 +280,18 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = {
 };
 #endif /* CONFIG_RT2X00_LIB_DEBUGFS */
 
+#ifdef CONFIG_RT2X00_LIB_RFKILL
+static int rt2500usb_rfkill_poll(struct rt2x00_dev *rt2x00dev)
+{
+	u16 reg;
+
+	rt2500usb_register_read(rt2x00dev, MAC_CSR19, &reg);
+	return rt2x00_get_field32(reg, MAC_CSR19_BIT7);
+}
+#else
+#define rt2500usb_rfkill_poll	NULL
+#endif /* CONFIG_RT2X00_LIB_RFKILL */
+
 #ifdef CONFIG_RT2X00_LIB_LEDS
 static void rt2500usb_brightness_set(struct led_classdev *led_cdev,
 				     enum led_brightness brightness)
@@ -1606,6 +1618,14 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
 #endif /* CONFIG_RT2X00_LIB_LEDS */
 
 	/*
+	 * Detect if this device has an hardware controlled radio.
+	 */
+#ifdef CONFIG_RT2X00_LIB_RFKILL
+	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
+		__set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
+#endif /* CONFIG_RT2X00_LIB_RFKILL */
+
+	/*
 	 * Check if the BBP tuning should be disabled.
 	 */
 	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &eeprom);
@@ -1911,6 +1931,7 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
 	.uninitialize		= rt2x00usb_uninitialize,
 	.clear_entry		= rt2x00usb_clear_entry,
 	.set_device_state	= rt2500usb_set_device_state,
+	.rfkill_poll		= rt2500usb_rfkill_poll,
 	.link_stats		= rt2500usb_link_stats,
 	.reset_tuner		= rt2500usb_reset_tuner,
 	.link_tuner		= rt2500usb_link_tuner,
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.h b/drivers/net/wireless/rt2x00/rt2500usb.h
index 4347dfd..e1f714e 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.h
+++ b/drivers/net/wireless/rt2x00/rt2500usb.h
@@ -189,6 +189,14 @@
  * MAC_CSR19: GPIO control register.
  */
 #define MAC_CSR19			0x0426
+#define MAC_CSR19_BIT0			FIELD32(0x0001)
+#define MAC_CSR19_BIT1			FIELD32(0x0002)
+#define MAC_CSR19_BIT2			FIELD32(0x0004)
+#define MAC_CSR19_BIT3			FIELD32(0x0008)
+#define MAC_CSR19_BIT4			FIELD32(0x0010)
+#define MAC_CSR19_BIT5			FIELD32(0x0020)
+#define MAC_CSR19_BIT6			FIELD32(0x0040)
+#define MAC_CSR19_BIT7			FIELD32(0x0080)
 
 /*
  * MAC_CSR20: LED control register.
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 5992c8f..2268d5c 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -186,6 +186,18 @@ static const struct rt2x00debug rt73usb_rt2x00debug = {
 };
 #endif /* CONFIG_RT2X00_LIB_DEBUGFS */
 
+#ifdef CONFIG_RT2X00_LIB_RFKILL
+static int rt73usb_rfkill_poll(struct rt2x00_dev *rt2x00dev)
+{
+	u32 reg;
+
+	rt2x00usb_register_read(rt2x00dev, MAC_CSR13, &reg);
+	return rt2x00_get_field32(reg, MAC_CSR13_BIT7);
+}
+#else
+#define rt73usb_rfkill_poll	NULL
+#endif /* CONFIG_RT2X00_LIB_RFKILL */
+
 #ifdef CONFIG_RT2X00_LIB_LEDS
 static void rt73usb_brightness_set(struct led_classdev *led_cdev,
 				   enum led_brightness brightness)
@@ -1855,6 +1867,14 @@ static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
 		__set_bit(CONFIG_FRAME_TYPE, &rt2x00dev->flags);
 
 	/*
+	 * Detect if this device has an hardware controlled radio.
+	 */
+#ifdef CONFIG_RT2X00_LIB_RFKILL
+	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
+		__set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags);
+#endif /* CONFIG_RT2X00_LIB_RFKILL */
+
+	/*
 	 * Read frequency offset.
 	 */
 	rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
@@ -2259,6 +2279,7 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
 	.uninitialize		= rt2x00usb_uninitialize,
 	.clear_entry		= rt2x00usb_clear_entry,
 	.set_device_state	= rt73usb_set_device_state,
+	.rfkill_poll		= rt73usb_rfkill_poll,
 	.link_stats		= rt73usb_link_stats,
 	.reset_tuner		= rt73usb_reset_tuner,
 	.link_tuner		= rt73usb_link_tuner,
diff --git a/drivers/net/wireless/rt2x00/rt73usb.h b/drivers/net/wireless/rt2x00/rt73usb.h
index 46e1405..204bbd5 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.h
+++ b/drivers/net/wireless/rt2x00/rt73usb.h
@@ -267,6 +267,19 @@ struct hw_pairwise_ta_entry {
  * MAC_CSR13: GPIO.
  */
 #define MAC_CSR13			0x3034
+#define MAC_CSR13_BIT0			FIELD32(0x00000001)
+#define MAC_CSR13_BIT1			FIELD32(0x00000002)
+#define MAC_CSR13_BIT2			FIELD32(0x00000004)
+#define MAC_CSR13_BIT3			FIELD32(0x00000008)
+#define MAC_CSR13_BIT4			FIELD32(0x00000010)
+#define MAC_CSR13_BIT5			FIELD32(0x00000020)
+#define MAC_CSR13_BIT6			FIELD32(0x00000040)
+#define MAC_CSR13_BIT7			FIELD32(0x00000080)
+#define MAC_CSR13_BIT8			FIELD32(0x00000100)
+#define MAC_CSR13_BIT9			FIELD32(0x00000200)
+#define MAC_CSR13_BIT10			FIELD32(0x00000400)
+#define MAC_CSR13_BIT11			FIELD32(0x00000800)
+#define MAC_CSR13_BIT12			FIELD32(0x00001000)
 
 /*
  * MAC_CSR14: LED control register.
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 7/15] rt2x00: Rename CONFIG_CRYPTO_COPY_IV
  2008-12-20  9:55           ` [PATCH 6/15] rt2x00: Add RFKILL support to rt2500usb and rt73usb Ivo van Doorn
@ 2008-12-20  9:56             ` Ivo van Doorn
  2008-12-20  9:57               ` [PATCH 8/15] rt2x00: Implement WDS support Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:56 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

>From 4c3622010fe750be76403ebe4ad53e6d06ac40da Mon Sep 17 00:00:00 2001
From: Ivo van Doorn <IvDoorn@gmail.com>
Date: Sat, 20 Dec 2008 10:22:25 +0100
Subject: [PATCH] rt2x00: Rename CONFIG_CRYPTO_COPY_IV

CONFIG_CRYPTO_COPY_IV is a bad name since it is part
of the driver requirements instead of a configuration option.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2500usb.c   |    2 +-
 drivers/net/wireless/rt2x00/rt2x00.h      |    2 +-
 drivers/net/wireless/rt2x00/rt2x00queue.c |    2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index ce76a87..8a53f9b 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1897,7 +1897,7 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 	__set_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags);
 	if (!modparam_nohwcrypt) {
 		__set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags);
-		__set_bit(CONFIG_CRYPTO_COPY_IV, &rt2x00dev->flags);
+		__set_bit(DRIVER_REQUIRE_COPY_IV, &rt2x00dev->flags);
 	}
 	__set_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags);
 
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index dea5022..1612a9c 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -586,6 +586,7 @@ enum rt2x00_flags {
 	DRIVER_REQUIRE_ATIM_QUEUE,
 	DRIVER_REQUIRE_SCHEDULED,
 	DRIVER_REQUIRE_DMA,
+	DRIVER_REQUIRE_COPY_IV,
 
 	/*
 	 * Driver features
@@ -602,7 +603,6 @@ enum rt2x00_flags {
 	CONFIG_EXTERNAL_LNA_BG,
 	CONFIG_DOUBLE_ANTENNA,
 	CONFIG_DISABLE_LINK_TUNING,
-	CONFIG_CRYPTO_COPY_IV,
 };
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index eaec6bd..0777120 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -402,7 +402,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
 	 */
 	if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) &&
 	    !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags)) {
-		if (test_bit(CONFIG_CRYPTO_COPY_IV, &queue->rt2x00dev->flags))
+		if (test_bit(DRIVER_REQUIRE_COPY_IV, &queue->rt2x00dev->flags))
 			rt2x00crypto_tx_copy_iv(skb, iv_len);
 		else
 			rt2x00crypto_tx_remove_iv(skb, iv_len);
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 8/15] rt2x00: Implement WDS support
  2008-12-20  9:56             ` [PATCH 7/15] rt2x00: Rename CONFIG_CRYPTO_COPY_IV Ivo van Doorn
@ 2008-12-20  9:57               ` Ivo van Doorn
  2008-12-20  9:57                 ` [PATCH 9/15] rt2x00: Split EEPROM_NIC_TX_RX_FIXED Ivo van Doorn
  2008-12-21 10:37                 ` [PATCH 8/15] rt2x00: Implement WDS support Johannes Berg
  0 siblings, 2 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:57 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

WDS support should be very easy to handle, mac80211 handles
everything for us, so all that is needed is to set the
support flags and handle it in the add_interface() callback.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2x00config.c |    1 +
 drivers/net/wireless/rt2x00/rt2x00dev.c    |    9 ++++++---
 drivers/net/wireless/rt2x00/rt2x00mac.c    |    1 +
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c
index a35265c..ab139f2 100644
--- a/drivers/net/wireless/rt2x00/rt2x00config.c
+++ b/drivers/net/wireless/rt2x00/rt2x00config.c
@@ -43,6 +43,7 @@ void rt2x00lib_config_intf(struct rt2x00_dev *rt2x00dev,
 	case NL80211_IFTYPE_ADHOC:
 	case NL80211_IFTYPE_AP:
 	case NL80211_IFTYPE_MESH_POINT:
+	case NL80211_IFTYPE_WDS:
 		conf.sync = TSF_SYNC_BEACON;
 		break;
 	case NL80211_IFTYPE_STATION:
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index b484197..3cb417f 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -191,7 +191,8 @@ static void rt2x00lib_beacondone_iter(void *data, u8 *mac,
 
 	if (vif->type != NL80211_IFTYPE_AP &&
 	    vif->type != NL80211_IFTYPE_ADHOC &&
-	    vif->type != NL80211_IFTYPE_MESH_POINT)
+	    vif->type != NL80211_IFTYPE_MESH_POINT &&
+	    vif->type != NL80211_IFTYPE_WDS)
 		return;
 
 	/*
@@ -784,7 +785,8 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 		rt2x00dev->hw->wiphy->interface_modes |=
 		    BIT(NL80211_IFTYPE_ADHOC) |
 		    BIT(NL80211_IFTYPE_AP) |
-		    BIT(NL80211_IFTYPE_MESH_POINT);
+		    BIT(NL80211_IFTYPE_MESH_POINT) |
+		    BIT(NL80211_IFTYPE_WDS);
 
 	/*
 	 * Let the driver probe the device to detect the capabilities.
@@ -943,7 +945,8 @@ static void rt2x00lib_resume_intf(void *data, u8 *mac,
 	 */
 	if (vif->type == NL80211_IFTYPE_AP ||
 	    vif->type == NL80211_IFTYPE_ADHOC ||
-	    vif->type == NL80211_IFTYPE_MESH_POINT)
+	    vif->type == NL80211_IFTYPE_MESH_POINT ||
+	    vif->type == NL80211_IFTYPE_WDS)
 		intf->delayed_flags |= DELAYED_UPDATE_BEACON;
 
 	spin_unlock(&intf->lock);
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
index 137386e..e6fba83 100644
--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
@@ -227,6 +227,7 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
 	case NL80211_IFTYPE_STATION:
 	case NL80211_IFTYPE_ADHOC:
 	case NL80211_IFTYPE_MESH_POINT:
+	case NL80211_IFTYPE_WDS:
 		/*
 		 * We don't support mixed combinations of
 		 * sta and ap interfaces.
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 9/15] rt2x00: Split EEPROM_NIC_TX_RX_FIXED
  2008-12-20  9:57               ` [PATCH 8/15] rt2x00: Implement WDS support Ivo van Doorn
@ 2008-12-20  9:57                 ` Ivo van Doorn
  2008-12-20  9:58                   ` [PATCH 10/15] rt2x00: Move code into seperate functions Ivo van Doorn
  2008-12-21 10:37                 ` [PATCH 8/15] rt2x00: Implement WDS support Johannes Berg
  1 sibling, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:57 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

The 2 bits in EEPROM_NIC_TX_RX_FIXED each influence
a different antenna. We might as well split the
definition and directly read the correct bit.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt61pci.c |   25 ++++++-------------------
 drivers/net/wireless/rt2x00/rt61pci.h |    3 ++-
 2 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 2b72010..875acb3 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2232,7 +2232,8 @@ static int rt61pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 	if (word == 0xffff) {
 		rt2x00_set_field16(&word, EEPROM_NIC_ENABLE_DIVERSITY, 0);
 		rt2x00_set_field16(&word, EEPROM_NIC_TX_DIVERSITY, 0);
-		rt2x00_set_field16(&word, EEPROM_NIC_TX_RX_FIXED, 0);
+		rt2x00_set_field16(&word, EEPROM_NIC_RX_FIXED, 0);
+		rt2x00_set_field16(&word, EEPROM_NIC_TX_FIXED, 0);
 		rt2x00_set_field16(&word, EEPROM_NIC_EXTERNAL_LNA_BG, 0);
 		rt2x00_set_field16(&word, EEPROM_NIC_CARDBUS_ACCEL, 0);
 		rt2x00_set_field16(&word, EEPROM_NIC_EXTERNAL_LNA_A, 0);
@@ -2376,24 +2377,10 @@ static int rt61pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 */
 	if (rt2x00_rf(&rt2x00dev->chip, RF2529) &&
 	    !test_bit(CONFIG_DOUBLE_ANTENNA, &rt2x00dev->flags)) {
-		switch (rt2x00_get_field16(eeprom, EEPROM_NIC_TX_RX_FIXED)) {
-		case 0:
-			rt2x00dev->default_ant.tx = ANTENNA_B;
-			rt2x00dev->default_ant.rx = ANTENNA_A;
-			break;
-		case 1:
-			rt2x00dev->default_ant.tx = ANTENNA_B;
-			rt2x00dev->default_ant.rx = ANTENNA_B;
-			break;
-		case 2:
-			rt2x00dev->default_ant.tx = ANTENNA_A;
-			rt2x00dev->default_ant.rx = ANTENNA_A;
-			break;
-		case 3:
-			rt2x00dev->default_ant.tx = ANTENNA_A;
-			rt2x00dev->default_ant.rx = ANTENNA_B;
-			break;
-		}
+		rt2x00dev->default_ant.rx =
+		    ANTENNA_A + rt2x00_get_field16(eeprom, EEPROM_NIC_RX_FIXED);
+		rt2x00dev->default_ant.tx =
+		    ANTENNA_B - rt2x00_get_field16(eeprom, EEPROM_NIC_TX_FIXED);
 
 		if (rt2x00_get_field16(eeprom, EEPROM_NIC_TX_DIVERSITY))
 			rt2x00dev->default_ant.tx = ANTENNA_SW_DIVERSITY;
diff --git a/drivers/net/wireless/rt2x00/rt61pci.h b/drivers/net/wireless/rt2x00/rt61pci.h
index 86590c6..cd86def 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.h
+++ b/drivers/net/wireless/rt2x00/rt61pci.h
@@ -1190,7 +1190,8 @@ struct hw_pairwise_ta_entry {
 #define EEPROM_NIC			0x0011
 #define EEPROM_NIC_ENABLE_DIVERSITY	FIELD16(0x0001)
 #define EEPROM_NIC_TX_DIVERSITY		FIELD16(0x0002)
-#define EEPROM_NIC_TX_RX_FIXED		FIELD16(0x000c)
+#define EEPROM_NIC_RX_FIXED		FIELD16(0x0004)
+#define EEPROM_NIC_TX_FIXED		FIELD16(0x0008)
 #define EEPROM_NIC_EXTERNAL_LNA_BG	FIELD16(0x0010)
 #define EEPROM_NIC_CARDBUS_ACCEL	FIELD16(0x0020)
 #define EEPROM_NIC_EXTERNAL_LNA_A	FIELD16(0x0040)
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 10/15] rt2x00: Move code into seperate functions
  2008-12-20  9:57                 ` [PATCH 9/15] rt2x00: Split EEPROM_NIC_TX_RX_FIXED Ivo van Doorn
@ 2008-12-20  9:58                   ` Ivo van Doorn
  2008-12-20  9:59                     ` [PATCH 11/15] rt2x00: Remove ENTRY_TXD_OFDM_RATE Ivo van Doorn
  2008-12-23 12:19                     ` [PATCH 10/15] rt2x00: Move code into seperate functions David Shwatrz
  0 siblings, 2 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:58 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Some functions have grown rapidly in size over the last time,
some of those functions (like the rt2x00queue_create_tx_descriptor)
will further increase in size soon, so it is best to start cutting
it into logical pieces.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2x00crypto.c |   13 ++-
 drivers/net/wireless/rt2x00/rt2x00lib.h    |    6 +-
 drivers/net/wireless/rt2x00/rt2x00mac.c    |   40 +++---
 drivers/net/wireless/rt2x00/rt2x00queue.c  |  191 ++++++++++++++-------------
 4 files changed, 137 insertions(+), 113 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c
index 37ad0d2..f30bda2 100644
--- a/drivers/net/wireless/rt2x00/rt2x00crypto.c
+++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c
@@ -49,9 +49,14 @@ enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key)
 void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
 				       struct txentry_desc *txdesc)
 {
+	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
 	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
 	struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
 
+	if (!test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags) ||
+	    !hw_key || entry->skb->do_not_encrypt)
+		return;
+
 	__set_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags);
 
 	txdesc->cipher = rt2x00crypto_key_to_cipher(hw_key);
@@ -69,11 +74,17 @@ void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
 		__set_bit(ENTRY_TXD_ENCRYPT_MMIC, &txdesc->flags);
 }
 
-unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info)
+unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
+				      struct sk_buff *skb)
 {
+	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
 	struct ieee80211_key_conf *key = tx_info->control.hw_key;
 	unsigned int overhead = 0;
 
+	if (!test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags) ||
+	    !key || skb->do_not_encrypt)
+		return overhead;
+
 	/*
 	 * Extend frame length to include IV/EIV/ICV/MMIC,
 	 * note that these lengths should only be added when
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h
index a6b7e00..1e80a83 100644
--- a/drivers/net/wireless/rt2x00/rt2x00lib.h
+++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
@@ -293,7 +293,8 @@ static inline void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
 enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key);
 void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
 				       struct txentry_desc *txdesc);
-unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info);
+unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
+				      struct sk_buff *skb);
 void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, unsigned int iv_len);
 void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, unsigned int iv_len);
 void rt2x00crypto_tx_insert_iv(struct sk_buff *skb);
@@ -311,7 +312,8 @@ static inline void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
 {
 }
 
-static inline unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info)
+static inline unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
+						    struct sk_buff *skb)
 {
 	return 0;
 }
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
index e6fba83..bf7755a 100644
--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
@@ -79,8 +79,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
 	 * RTS/CTS frame should use the length of the frame plus any
 	 * encryption overhead that will be added by the hardware.
 	 */
-	if (!frag_skb->do_not_encrypt)
-		data_length += rt2x00crypto_tx_overhead(tx_info);
+	data_length += rt2x00crypto_tx_overhead(rt2x00dev, skb);
 
 	if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
 		ieee80211_ctstoself_get(rt2x00dev->hw, tx_info->control.vif,
@@ -484,6 +483,24 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
 EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter);
 
 #ifdef CONFIG_RT2X00_LIB_CRYPTO
+static void memcpy_tkip(struct rt2x00lib_crypto *crypto, u8 *key, u8 key_len)
+{
+	if (key_len > NL80211_TKIP_DATA_OFFSET_ENCR_KEY)
+		memcpy(&crypto->key,
+		       &key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY],
+		       sizeof(crypto->key));
+
+	if (key_len > NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY)
+		memcpy(&crypto->tx_mic,
+		       &key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY],
+		       sizeof(crypto->tx_mic));
+
+	if (key_len > NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY)
+		memcpy(&crypto->rx_mic,
+		       &key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY],
+		       sizeof(crypto->rx_mic));
+}
+
 int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 		      const u8 *local_address, const u8 *address,
 		      struct ieee80211_key_conf *key)
@@ -521,22 +538,9 @@ int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 	crypto.cmd = cmd;
 	crypto.address = address;
 
-	if (crypto.cipher == CIPHER_TKIP) {
-		if (key->keylen > NL80211_TKIP_DATA_OFFSET_ENCR_KEY)
-			memcpy(&crypto.key,
-			       &key->key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY],
-			       sizeof(crypto.key));
-
-		if (key->keylen > NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY)
-			memcpy(&crypto.tx_mic,
-			       &key->key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY],
-			       sizeof(crypto.tx_mic));
-
-		if (key->keylen > NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY)
-			memcpy(&crypto.rx_mic,
-			       &key->key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY],
-			       sizeof(crypto.rx_mic));
-	} else
+	if (crypto.cipher == CIPHER_TKIP)
+		memcpy_tkip(&crypto, &key->key[0], key->keylen);
+	else
 		memcpy(&crypto.key, &key->key[0], key->keylen);
 
 	/*
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 0777120..efb2875 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -148,6 +148,95 @@ void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
 	dev_kfree_skb_any(skb);
 }
 
+static void rt2x00queue_create_tx_descriptor_seq(struct queue_entry *entry,
+						 struct txentry_desc *txdesc)
+{
+	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
+	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)entry->skb->data;
+	struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif);
+	unsigned long irqflags;
+
+	if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) ||
+	    unlikely(!tx_info->control.vif))
+		return;
+
+	/*
+	 * Hardware should insert sequence counter.
+	 * FIXME: We insert a software sequence counter first for
+	 * hardware that doesn't support hardware sequence counting.
+	 *
+	 * This is wrong because beacons are not getting sequence
+	 * numbers assigned properly.
+	 *
+	 * A secondary problem exists for drivers that cannot toggle
+	 * sequence counting per-frame, since those will override the
+	 * sequence counter given by mac80211.
+	 */
+	spin_lock_irqsave(&intf->seqlock, irqflags);
+
+	if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags))
+		intf->seqno += 0x10;
+	hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
+	hdr->seq_ctrl |= cpu_to_le16(intf->seqno);
+
+	spin_unlock_irqrestore(&intf->seqlock, irqflags);
+
+	__set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags);
+}
+
+static void rt2x00queue_create_tx_descriptor_plcp(struct queue_entry *entry,
+						  struct txentry_desc *txdesc,
+						  struct ieee80211_rate *rate)
+{
+	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
+	const struct rt2x00_rate *hwrate = rt2x00_get_rate(rate->hw_value);
+	unsigned int data_length;
+	unsigned int duration;
+	unsigned int residual;
+
+	/* Data length + CRC + Crypto overhead (IV/EIV/ICV/MIC) */
+	data_length = entry->skb->len + 4;
+	data_length += rt2x00crypto_tx_overhead(rt2x00dev, entry->skb);
+
+	/*
+	 * PLCP setup
+	 * Length calculation depends on OFDM/CCK rate.
+	 */
+	txdesc->signal = hwrate->plcp;
+	txdesc->service = 0x04;
+
+	if (hwrate->flags & DEV_RATE_OFDM) {
+		txdesc->length_high = (data_length >> 6) & 0x3f;
+		txdesc->length_low = data_length & 0x3f;
+	} else {
+		/*
+		 * Convert length to microseconds.
+		 */
+		residual = GET_DURATION_RES(data_length, hwrate->bitrate);
+		duration = GET_DURATION(data_length, hwrate->bitrate);
+
+		if (residual != 0) {
+			duration++;
+
+			/*
+			 * Check if we need to set the Length Extension
+			 */
+			if (hwrate->bitrate == 110 && residual <= 30)
+				txdesc->service |= 0x80;
+		}
+
+		txdesc->length_high = (duration >> 8) & 0xff;
+		txdesc->length_low = duration & 0xff;
+
+		/*
+		 * When preamble is enabled we should set the
+		 * preamble bit for the signal.
+		 */
+		if (rt2x00_get_rate_preamble(rate->hw_value))
+			txdesc->signal |= 0x08;
+	}
+}
+
 static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
 					     struct txentry_desc *txdesc)
 {
@@ -157,10 +246,6 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
 	struct ieee80211_rate *rate =
 	    ieee80211_get_tx_rate(rt2x00dev->hw, tx_info);
 	const struct rt2x00_rate *hwrate;
-	unsigned int data_length;
-	unsigned int duration;
-	unsigned int residual;
-	unsigned long irqflags;
 
 	memset(txdesc, 0, sizeof(*txdesc));
 
@@ -172,27 +257,12 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
 	txdesc->cw_max = entry->queue->cw_max;
 	txdesc->aifs = entry->queue->aifs;
 
-	/* Data length + CRC */
-	data_length = entry->skb->len + 4;
-
 	/*
 	 * Check whether this frame is to be acked.
 	 */
 	if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK))
 		__set_bit(ENTRY_TXD_ACK, &txdesc->flags);
 
-	if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags) &&
-	    !entry->skb->do_not_encrypt) {
-		/* Apply crypto specific descriptor information */
-		rt2x00crypto_create_tx_descriptor(entry, txdesc);
-
-		/*
-		 * Extend frame length to include all encryption overhead
-		 * that will be added by the hardware.
-		 */
-		data_length += rt2x00crypto_tx_overhead(tx_info);
-	}
-
 	/*
 	 * Check if this is a RTS/CTS frame
 	 */
@@ -236,86 +306,23 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
 	 * Set ifs to IFS_SIFS when the this is not the first fragment,
 	 * or this fragment came after RTS/CTS.
 	 */
-	if (test_bit(ENTRY_TXD_RTS_FRAME, &txdesc->flags)) {
-		txdesc->ifs = IFS_SIFS;
-	} else if (tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) {
+	if ((tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) &&
+	    !test_bit(ENTRY_TXD_RTS_FRAME, &txdesc->flags)) {
 		__set_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags);
 		txdesc->ifs = IFS_BACKOFF;
-	} else {
+	} else
 		txdesc->ifs = IFS_SIFS;
-	}
-
-	/*
-	 * Hardware should insert sequence counter.
-	 * FIXME: We insert a software sequence counter first for
-	 * hardware that doesn't support hardware sequence counting.
-	 *
-	 * This is wrong because beacons are not getting sequence
-	 * numbers assigned properly.
-	 *
-	 * A secondary problem exists for drivers that cannot toggle
-	 * sequence counting per-frame, since those will override the
-	 * sequence counter given by mac80211.
-	 */
-	if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
-		if (likely(tx_info->control.vif)) {
-			struct rt2x00_intf *intf;
-
-			intf = vif_to_intf(tx_info->control.vif);
 
-			spin_lock_irqsave(&intf->seqlock, irqflags);
-
-			if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags))
-				intf->seqno += 0x10;
-			hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
-			hdr->seq_ctrl |= cpu_to_le16(intf->seqno);
-
-			spin_unlock_irqrestore(&intf->seqlock, irqflags);
-
-			__set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags);
-		}
-	}
-
-	/*
-	 * PLCP setup
-	 * Length calculation depends on OFDM/CCK rate.
-	 */
 	hwrate = rt2x00_get_rate(rate->hw_value);
-	txdesc->signal = hwrate->plcp;
-	txdesc->service = 0x04;
-
-	if (hwrate->flags & DEV_RATE_OFDM) {
+	if (hwrate->flags & DEV_RATE_OFDM)
 		__set_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags);
 
-		txdesc->length_high = (data_length >> 6) & 0x3f;
-		txdesc->length_low = data_length & 0x3f;
-	} else {
-		/*
-		 * Convert length to microseconds.
-		 */
-		residual = GET_DURATION_RES(data_length, hwrate->bitrate);
-		duration = GET_DURATION(data_length, hwrate->bitrate);
-
-		if (residual != 0) {
-			duration++;
-
-			/*
-			 * Check if we need to set the Length Extension
-			 */
-			if (hwrate->bitrate == 110 && residual <= 30)
-				txdesc->service |= 0x80;
-		}
-
-		txdesc->length_high = (duration >> 8) & 0xff;
-		txdesc->length_low = duration & 0xff;
-
-		/*
-		 * When preamble is enabled we should set the
-		 * preamble bit for the signal.
-		 */
-		if (rt2x00_get_rate_preamble(rate->hw_value))
-			txdesc->signal |= 0x08;
-	}
+	/*
+	 * Apply TX descriptor handling by components
+	 */
+	rt2x00crypto_create_tx_descriptor(entry, txdesc);
+	rt2x00queue_create_tx_descriptor_seq(entry, txdesc);
+	rt2x00queue_create_tx_descriptor_plcp(entry, txdesc, rate);
 }
 
 static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry,
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 11/15] rt2x00: Remove ENTRY_TXD_OFDM_RATE
  2008-12-20  9:58                   ` [PATCH 10/15] rt2x00: Move code into seperate functions Ivo van Doorn
@ 2008-12-20  9:59                     ` Ivo van Doorn
  2008-12-20  9:59                       ` [PATCH 12/15] Allow drivers to pass the noise value during rxdone Ivo van Doorn
  2008-12-23 12:19                     ` [PATCH 10/15] rt2x00: Move code into seperate functions David Shwatrz
  1 sibling, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:59 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

The flag ENTRY_TXD_OFDM_RATE isn't flexible enough
to indicate which rate modulation should be used for
a frame. This will become a problem when 11n support
is added.

Remove the flag and replace it with an enum value which
can better indicate the exact rate modulation.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2500pci.c   |    2 +-
 drivers/net/wireless/rt2x00/rt2500usb.c   |    2 +-
 drivers/net/wireless/rt2x00/rt2x00queue.c |    6 +++++-
 drivers/net/wireless/rt2x00/rt2x00queue.h |    5 +++--
 drivers/net/wireless/rt2x00/rt2x00reg.h   |   10 ++++++++++
 drivers/net/wireless/rt2x00/rt61pci.c     |    2 +-
 drivers/net/wireless/rt2x00/rt73usb.c     |    2 +-
 7 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 90333ee..76f016d 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1233,7 +1233,7 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
-			   test_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags));
+			   (txdesc->rate_mode == RATE_MODE_OFDM));
 	rt2x00_set_field32(&word, TXD_W0_CIPHER_OWNER, 1);
 	rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 8a53f9b..81400ea 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1217,7 +1217,7 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
-			   test_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags));
+			   (txdesc->rate_mode == RATE_MODE_OFDM));
 	rt2x00_set_field32(&word, TXD_W0_NEW_SEQ,
 			   test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags));
 	rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index efb2875..fc28e23 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -313,9 +313,13 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
 	} else
 		txdesc->ifs = IFS_SIFS;
 
+	/*
+	 * Determine rate modulation.
+	 */
 	hwrate = rt2x00_get_rate(rate->hw_value);
+	txdesc->rate_mode = RATE_MODE_CCK;
 	if (hwrate->flags & DEV_RATE_OFDM)
-		__set_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags);
+		txdesc->rate_mode = RATE_MODE_OFDM;
 
 	/*
 	 * Apply TX descriptor handling by components
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h
index 2829371..5a9d2c3 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -222,7 +222,6 @@ struct txdone_entry_desc {
  *
  * @ENTRY_TXD_RTS_FRAME: This frame is a RTS frame.
  * @ENTRY_TXD_CTS_FRAME: This frame is a CTS-to-self frame.
- * @ENTRY_TXD_OFDM_RATE: This frame is send out with an OFDM rate.
  * @ENTRY_TXD_GENERATE_SEQ: This frame requires sequence counter.
  * @ENTRY_TXD_FIRST_FRAGMENT: This is the first frame.
  * @ENTRY_TXD_MORE_FRAG: This frame is followed by another fragment.
@@ -238,7 +237,6 @@ struct txdone_entry_desc {
 enum txentry_desc_flags {
 	ENTRY_TXD_RTS_FRAME,
 	ENTRY_TXD_CTS_FRAME,
-	ENTRY_TXD_OFDM_RATE,
 	ENTRY_TXD_GENERATE_SEQ,
 	ENTRY_TXD_FIRST_FRAGMENT,
 	ENTRY_TXD_MORE_FRAG,
@@ -263,6 +261,7 @@ enum txentry_desc_flags {
  * @length_low: PLCP length low word.
  * @signal: PLCP signal.
  * @service: PLCP service.
+ * @rate_mode: Rate mode (See @enum rate_modulation).
  * @retry_limit: Max number of retries.
  * @aifs: AIFS value.
  * @ifs: IFS value.
@@ -282,6 +281,8 @@ struct txentry_desc {
 	u16 signal;
 	u16 service;
 
+	u16 rate_mode;
+
 	short retry_limit;
 	short aifs;
 	short ifs;
diff --git a/drivers/net/wireless/rt2x00/rt2x00reg.h b/drivers/net/wireless/rt2x00/rt2x00reg.h
index c2fba7c..93f8427 100644
--- a/drivers/net/wireless/rt2x00/rt2x00reg.h
+++ b/drivers/net/wireless/rt2x00/rt2x00reg.h
@@ -125,6 +125,16 @@ enum cipher {
 };
 
 /*
+ * Rate modulations
+ */
+enum rate_modulation {
+	RATE_MODE_CCK = 0,
+	RATE_MODE_OFDM = 1,
+	RATE_MODE_HT_MIX = 2,
+	RATE_MODE_HT_GREENFIELD = 3,
+};
+
+/*
  * Register handlers.
  * We store the position of a register field inside a field structure,
  * This will simplify the process of setting and reading a certain field
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 875acb3..f1150a7 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1847,7 +1847,7 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
-			   test_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags));
+			   (txdesc->rate_mode == RATE_MODE_OFDM));
 	rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
 			   test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags));
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 2268d5c..891554e 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1498,7 +1498,7 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
 			   test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
 	rt2x00_set_field32(&word, TXD_W0_OFDM,
-			   test_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags));
+			   (txdesc->rate_mode == RATE_MODE_OFDM));
 	rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
 	rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
 			   test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags));
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 12/15] Allow drivers to pass the noise value during rxdone
  2008-12-20  9:59                     ` [PATCH 11/15] rt2x00: Remove ENTRY_TXD_OFDM_RATE Ivo van Doorn
@ 2008-12-20  9:59                       ` Ivo van Doorn
  2008-12-20  9:59                         ` [PATCH 13/15] rt2x00: Introduce RXDONE_SIGNAL_MASK mask Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:59 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel


Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2x00dev.c   |    1 +
 drivers/net/wireless/rt2x00/rt2x00queue.h |    2 ++
 2 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 3cb417f..841879d 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -407,6 +407,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
 	rx_status->rate_idx = idx;
 	rx_status->qual = rt2x00link_calculate_signal(rt2x00dev, rxdesc.rssi);
 	rx_status->signal = rxdesc.rssi;
+	rx_status->noise = rxdesc.noise;
 	rx_status->flag = rxdesc.flags;
 	rx_status->antenna = rt2x00dev->link.ant.active.rx;
 
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h
index 5a9d2c3..1bd1a95 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -165,6 +165,7 @@ enum rxdone_entry_desc_flags {
  * @timestamp: RX Timestamp
  * @signal: Signal of the received frame.
  * @rssi: RSSI of the received frame.
+ * @noise: Measured noise during frame reception.
  * @size: Data size of the received frame.
  * @flags: MAC80211 receive flags (See &enum mac80211_rx_flags).
  * @dev_flags: Ralink receive flags (See &enum rxdone_entry_desc_flags).
@@ -177,6 +178,7 @@ struct rxdone_entry_desc {
 	u64 timestamp;
 	int signal;
 	int rssi;
+	int noise;
 	int size;
 	int flags;
 	int dev_flags;
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 13/15] rt2x00: Introduce RXDONE_SIGNAL_MASK mask
  2008-12-20  9:59                       ` [PATCH 12/15] Allow drivers to pass the noise value during rxdone Ivo van Doorn
@ 2008-12-20  9:59                         ` Ivo van Doorn
  2008-12-20 10:00                           ` [PATCH 14/15] rt2x00: Fix segementation fault Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20  9:59 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

Improve error message reporting when a frame was received
with unknown rate. Instead of using the boolean check if
the frame is supposed to be a PLCP value or not, we should
add a new mask (RXDONE_SIGNAL_MASK) which returns the type
identification for a signal value (i.e. PLCP). At the moment
we only have 2 different types, but more will arrive when
support for 11n is added.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2x00dev.c   |    4 ++--
 drivers/net/wireless/rt2x00/rt2x00queue.h |    8 ++++++++
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 841879d..ab8aa97 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -392,8 +392,8 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
 
 	if (idx < 0) {
 		WARNING(rt2x00dev, "Frame received with unrecognized signal,"
-			"signal=0x%.2x, plcp=%d.\n", rxdesc.signal,
-			!!(rxdesc.dev_flags & RXDONE_SIGNAL_PLCP));
+			"signal=0x%.2x, type=%d.\n", rxdesc.signal,
+			(rxdesc.dev_flags & RXDONE_SIGNAL_MASK));
 		idx = 0;
 	}
 
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h
index 1bd1a95..98209d2 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -158,6 +158,14 @@ enum rxdone_entry_desc_flags {
 };
 
 /**
+ * RXDONE_SIGNAL_MASK - Define to mask off all &rxdone_entry_desc_flags flags
+ * except for the RXDONE_SIGNAL_* flags. This is useful to convert the dev_flags
+ * from &rxdone_entry_desc to a signal value type.
+ */
+#define RXDONE_SIGNAL_MASK \
+       ( RXDONE_SIGNAL_PLCP | RXDONE_SIGNAL_BITRATE )
+
+/**
  * struct rxdone_entry_desc: RX Entry descriptor
  *
  * Summary of information that has been read from the RX frame descriptor.
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 14/15] rt2x00: Fix segementation fault
  2008-12-20  9:59                         ` [PATCH 13/15] rt2x00: Introduce RXDONE_SIGNAL_MASK mask Ivo van Doorn
@ 2008-12-20 10:00                           ` Ivo van Doorn
  2008-12-20 10:00                             ` [PATCH 15/15] rt2x00: Release rt2x00 2.3.0 Ivo van Doorn
  0 siblings, 1 reply; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20 10:00 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel

The queue_end() macro points to 1 position after the
queue, which means that if we want to know if queue
is at the end of the queue we should first increment
the position and then check if it is a valid entry.

This fixes a segmentation fault which only occurs when
the device has enough endpoints to provide a dedicated
endpoint for all TX queues (which likely won't happen
for rt2500usb and rt73usb, but will happen for rt2800usb).

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2x00usb.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
index 83df312..0b29d76 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
@@ -434,11 +434,11 @@ static int rt2x00usb_find_endpoints(struct rt2x00_dev *rt2x00dev)
 
 		if (usb_endpoint_is_bulk_in(ep_desc)) {
 			rt2x00usb_assign_endpoint(rt2x00dev->rx, ep_desc);
-		} else if (usb_endpoint_is_bulk_out(ep_desc)) {
+		} else if (usb_endpoint_is_bulk_out(ep_desc) &&
+			   (queue != queue_end(rt2x00dev))) {
 			rt2x00usb_assign_endpoint(queue, ep_desc);
+			queue = queue_next(queue);
 
-			if (queue != queue_end(rt2x00dev))
-				queue = queue_next(queue);
 			tx_ep_desc = ep_desc;
 		}
 	}
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [PATCH 15/15] rt2x00: Release rt2x00 2.3.0
  2008-12-20 10:00                           ` [PATCH 14/15] rt2x00: Fix segementation fault Ivo van Doorn
@ 2008-12-20 10:00                             ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-20 10:00 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, rt2400-devel


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 1612a9c..1ef3434 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -44,7 +44,7 @@
 /*
  * Module information.
  */
-#define DRV_VERSION	"2.2.3"
+#define DRV_VERSION	"2.3.0"
 #define DRV_PROJECT	"http://rt2x00.serialmonkey.com"
 
 /*
-- 
1.5.6.1


^ permalink raw reply related	[flat|nested] 74+ messages in thread

* Re: [PATCH 8/15] rt2x00: Implement WDS support
  2008-12-20  9:57               ` [PATCH 8/15] rt2x00: Implement WDS support Ivo van Doorn
  2008-12-20  9:57                 ` [PATCH 9/15] rt2x00: Split EEPROM_NIC_TX_RX_FIXED Ivo van Doorn
@ 2008-12-21 10:37                 ` Johannes Berg
  2008-12-21 12:07                   ` Ivo van Doorn
  1 sibling, 1 reply; 74+ messages in thread
From: Johannes Berg @ 2008-12-21 10:37 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: John Linville, linux-wireless, rt2400-devel

[-- Attachment #1: Type: text/plain, Size: 298 bytes --]

On Sat, 2008-12-20 at 10:57 +0100, Ivo van Doorn wrote:
> WDS support should be very easy to handle, mac80211 handles
> everything for us, so all that is needed is to set the
> support flags and handle it in the add_interface() callback.

Cool, you're the first, have you tested?

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [PATCH 8/15] rt2x00: Implement WDS support
  2008-12-21 10:37                 ` [PATCH 8/15] rt2x00: Implement WDS support Johannes Berg
@ 2008-12-21 12:07                   ` Ivo van Doorn
  0 siblings, 0 replies; 74+ messages in thread
From: Ivo van Doorn @ 2008-12-21 12:07 UTC (permalink / raw)
  To: Johannes Berg; +Cc: John Linville, linux-wireless, rt2400-devel

On Sunday 21 December 2008, Johannes Berg wrote:
> On Sat, 2008-12-20 at 10:57 +0100, Ivo van Doorn wrote:
> > WDS support should be very easy to handle, mac80211 handles
> > everything for us, so all that is needed is to set the
> > support flags and handle it in the add_interface() callback.
> 
> Cool, you're the first, have you tested?

Unfortunately neither Meshed mode as WDS have been tested,
I understood Meshed mode had worked some time ago on rt73usb,
but now beaconing is broken (master mode isn't working either anymore).

btw, rt2x00 wasn't the first, I looked at the b43 code to see if they had do
anything special in WDS mode. ;)

Ivo

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [PATCH 1/15] rt2x00: Implement Powersaving
  2008-12-20  9:52 ` [PATCH 1/15] rt2x00: Implement Powersaving Ivo van Doorn
  2008-12-20  9:53   ` [PATCH 2/15] rt2x00: Move link tuning into seperate file Ivo van Doorn
@ 2008-12-21 17:53   ` David Shwatrz
  2008-12-22  7:34     ` Holger Schurig
  1 sibling, 1 reply; 74+ messages in thread
From: David Shwatrz @ 2008-12-21 17:53 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: John Linville, linux-wireless, rt2400-devel

Hi,
Great new ! It seems to me that this is the first **usb** wireless
device with power save support (and please correct me if I am wrong).

Regards,
DavidS

On Sat, Dec 20, 2008 at 11:52 AM, Ivo van Doorn <ivdoorn@gmail.com> wrote:
> Listen to IEEE80211_CONF_PS to determine if the device
> should drop into powersaving mode. This feature depends
> on the dynamic power save functionality in mac80211.
>
> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
> ---
>  drivers/net/wireless/rt2x00/rt2400pci.c |   28 ++++++++++++++++
>  drivers/net/wireless/rt2x00/rt2500pci.c |   28 ++++++++++++++++
>  drivers/net/wireless/rt2x00/rt2500usb.c |   28 ++++++++++++++++
>  drivers/net/wireless/rt2x00/rt61pci.c   |   53 ++++++++++++++++++++++++++----
>  drivers/net/wireless/rt2x00/rt61pci.h   |    4 ++
>  drivers/net/wireless/rt2x00/rt73usb.c   |   40 +++++++++++++++++++++++
>  6 files changed, 174 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
> index fabcd71..031cb0a 100644
> --- a/drivers/net/wireless/rt2x00/rt2400pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2400pci.c
> @@ -524,6 +524,32 @@ static void rt2400pci_config_duration(struct rt2x00_dev *rt2x00dev,
>        rt2x00pci_register_write(rt2x00dev, CSR12, reg);
>  }
>
> +static void rt2400pci_config_ps(struct rt2x00_dev *rt2x00dev,
> +                               struct rt2x00lib_conf *libconf)
> +{
> +       enum dev_state state =
> +           (libconf->conf->flags & IEEE80211_CONF_PS) ?
> +               STATE_SLEEP : STATE_AWAKE;
> +       u32 reg;
> +
> +       if (state == STATE_SLEEP) {
> +               rt2x00pci_register_read(rt2x00dev, CSR20, &reg);
> +               rt2x00_set_field32(&reg, CSR20_DELAY_AFTER_TBCN,
> +                                  (libconf->conf->beacon_int - 20) * 16);
> +               rt2x00_set_field32(&reg, CSR20_TBCN_BEFORE_WAKEUP,
> +                                  libconf->conf->listen_interval - 1);
> +
> +               /* We must first disable autowake before it can be enabled */
> +               rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 0);
> +               rt2x00pci_register_write(rt2x00dev, CSR20, reg);
> +
> +               rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 1);
> +               rt2x00pci_register_write(rt2x00dev, CSR20, reg);
> +       }
> +
> +       rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
> +}
> +
>  static void rt2400pci_config(struct rt2x00_dev *rt2x00dev,
>                             struct rt2x00lib_conf *libconf,
>                             const unsigned int flags)
> @@ -537,6 +563,8 @@ static void rt2400pci_config(struct rt2x00_dev *rt2x00dev,
>                rt2400pci_config_retry_limit(rt2x00dev, libconf);
>        if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
>                rt2400pci_config_duration(rt2x00dev, libconf);
> +       if (flags & IEEE80211_CONF_CHANGE_PS)
> +               rt2400pci_config_ps(rt2x00dev, libconf);
>  }
>
>  static void rt2400pci_config_cw(struct rt2x00_dev *rt2x00dev,
> diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
> index a9add81..780c96b 100644
> --- a/drivers/net/wireless/rt2x00/rt2500pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2500pci.c
> @@ -573,6 +573,32 @@ static void rt2500pci_config_duration(struct rt2x00_dev *rt2x00dev,
>        rt2x00pci_register_write(rt2x00dev, CSR12, reg);
>  }
>
> +static void rt2500pci_config_ps(struct rt2x00_dev *rt2x00dev,
> +                               struct rt2x00lib_conf *libconf)
> +{
> +       enum dev_state state =
> +           (libconf->conf->flags & IEEE80211_CONF_PS) ?
> +               STATE_SLEEP : STATE_AWAKE;
> +       u32 reg;
> +
> +       if (state == STATE_SLEEP) {
> +               rt2x00pci_register_read(rt2x00dev, CSR20, &reg);
> +               rt2x00_set_field32(&reg, CSR20_DELAY_AFTER_TBCN,
> +                                  (libconf->conf->beacon_int - 20) * 16);
> +               rt2x00_set_field32(&reg, CSR20_TBCN_BEFORE_WAKEUP,
> +                                  libconf->conf->listen_interval - 1);
> +
> +               /* We must first disable autowake before it can be enabled */
> +               rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 0);
> +               rt2x00pci_register_write(rt2x00dev, CSR20, reg);
> +
> +               rt2x00_set_field32(&reg, CSR20_AUTOWAKE, 1);
> +               rt2x00pci_register_write(rt2x00dev, CSR20, reg);
> +       }
> +
> +       rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
> +}
> +
>  static void rt2500pci_config(struct rt2x00_dev *rt2x00dev,
>                             struct rt2x00lib_conf *libconf,
>                             const unsigned int flags)
> @@ -588,6 +614,8 @@ static void rt2500pci_config(struct rt2x00_dev *rt2x00dev,
>                rt2500pci_config_retry_limit(rt2x00dev, libconf);
>        if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
>                rt2500pci_config_duration(rt2x00dev, libconf);
> +       if (flags & IEEE80211_CONF_CHANGE_PS)
> +               rt2500pci_config_ps(rt2x00dev, libconf);
>  }
>
>  /*
> diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
> index d8c48fd..4de1bc1 100644
> --- a/drivers/net/wireless/rt2x00/rt2500usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2500usb.c
> @@ -634,6 +634,32 @@ static void rt2500usb_config_duration(struct rt2x00_dev *rt2x00dev,
>        rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
>  }
>
> +static void rt2500usb_config_ps(struct rt2x00_dev *rt2x00dev,
> +                               struct rt2x00lib_conf *libconf)
> +{
> +       enum dev_state state =
> +           (libconf->conf->flags & IEEE80211_CONF_PS) ?
> +               STATE_SLEEP : STATE_AWAKE;
> +       u16 reg;
> +
> +       if (state == STATE_SLEEP) {
> +               rt2500usb_register_read(rt2x00dev, MAC_CSR18, &reg);
> +               rt2x00_set_field16(&reg, MAC_CSR18_DELAY_AFTER_BEACON,
> +                                  libconf->conf->beacon_int - 20);
> +               rt2x00_set_field16(&reg, MAC_CSR18_BEACONS_BEFORE_WAKEUP,
> +                                  libconf->conf->listen_interval - 1);
> +
> +               /* We must first disable autowake before it can be enabled */
> +               rt2x00_set_field16(&reg, MAC_CSR18_AUTO_WAKE, 0);
> +               rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
> +
> +               rt2x00_set_field16(&reg, MAC_CSR18_AUTO_WAKE, 1);
> +               rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
> +       }
> +
> +       rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
> +}
> +
>  static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,
>                             struct rt2x00lib_conf *libconf,
>                             const unsigned int flags)
> @@ -647,6 +673,8 @@ static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,
>                                         libconf->conf->power_level);
>        if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
>                rt2500usb_config_duration(rt2x00dev, libconf);
> +       if (flags & IEEE80211_CONF_CHANGE_PS)
> +               rt2500usb_config_ps(rt2x00dev, libconf);
>  }
>
>  /*
> diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
> index 3b9015a..3f91a6e 100644
> --- a/drivers/net/wireless/rt2x00/rt61pci.c
> +++ b/drivers/net/wireless/rt2x00/rt61pci.c
> @@ -146,12 +146,6 @@ static void rt61pci_rf_write(struct rt2x00_dev *rt2x00dev,
>        mutex_unlock(&rt2x00dev->csr_mutex);
>  }
>
> -#ifdef CONFIG_RT2X00_LIB_LEDS
> -/*
> - * This function is only called from rt61pci_led_brightness()
> - * make gcc happy by placing this function inside the
> - * same ifdef statement as the caller.
> - */
>  static void rt61pci_mcu_request(struct rt2x00_dev *rt2x00dev,
>                                const u8 command, const u8 token,
>                                const u8 arg0, const u8 arg1)
> @@ -180,7 +174,6 @@ static void rt61pci_mcu_request(struct rt2x00_dev *rt2x00dev,
>        mutex_unlock(&rt2x00dev->csr_mutex);
>
>  }
> -#endif /* CONFIG_RT2X00_LIB_LEDS */
>
>  static void rt61pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
>  {
> @@ -967,6 +960,50 @@ static void rt61pci_config_duration(struct rt2x00_dev *rt2x00dev,
>        rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
>  }
>
> +static void rt61pci_config_ps(struct rt2x00_dev *rt2x00dev,
> +                               struct rt2x00lib_conf *libconf)
> +{
> +       enum dev_state state =
> +           (libconf->conf->flags & IEEE80211_CONF_PS) ?
> +               STATE_SLEEP : STATE_AWAKE;
> +       u32 reg;
> +
> +       if (state == STATE_SLEEP) {
> +               rt2x00pci_register_read(rt2x00dev, MAC_CSR11, &reg);
> +               rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN,
> +                                  libconf->conf->beacon_int - 10);
> +               rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP,
> +                                  libconf->conf->listen_interval - 1);
> +               rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 5);
> +
> +               /* We must first disable autowake before it can be enabled */
> +               rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
> +               rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg);
> +
> +               rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 1);
> +               rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg);
> +
> +               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, 0, 0);
> +       } else {
> +               rt2x00pci_register_read(rt2x00dev, MAC_CSR11, &reg);
> +               rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN, 0);
> +               rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0);
> +               rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
> +               rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 0);
> +               rt2x00pci_register_write(rt2x00dev, MAC_CSR11, reg);
> +
> +               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, 0, 0);
> +       }
> +}
> +
>  static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
>                           struct rt2x00lib_conf *libconf,
>                           const unsigned int flags)
> @@ -984,6 +1021,8 @@ static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
>                rt61pci_config_retry_limit(rt2x00dev, libconf);
>        if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
>                rt61pci_config_duration(rt2x00dev, libconf);
> +       if (flags & IEEE80211_CONF_CHANGE_PS)
> +               rt61pci_config_ps(rt2x00dev, libconf);
>  }
>
>  /*
> diff --git a/drivers/net/wireless/rt2x00/rt61pci.h b/drivers/net/wireless/rt2x00/rt61pci.h
> index 65fe333..86590c6 100644
> --- a/drivers/net/wireless/rt2x00/rt61pci.h
> +++ b/drivers/net/wireless/rt2x00/rt61pci.h
> @@ -88,8 +88,10 @@
>
>  /*
>  * SOFT_RESET_CSR
> + * FORCE_CLOCK_ON: Host force MAC clock ON
>  */
>  #define SOFT_RESET_CSR                 0x0010
> +#define SOFT_RESET_CSR_FORCE_CLOCK_ON  FIELD32(0x00000002)
>
>  /*
>  * MCU_INT_SOURCE_CSR: MCU interrupt source/mask register.
> @@ -1054,8 +1056,10 @@ struct hw_pairwise_ta_entry {
>
>  /*
>  * IO_CNTL_CSR
> + * RF_PS: Set RF interface value to power save
>  */
>  #define IO_CNTL_CSR                    0x3498
> +#define IO_CNTL_CSR_RF_PS              FIELD32(0x00000004)
>
>  /*
>  * UART_INT_SOURCE_CSR
> diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
> index 563be0b..8a365c9 100644
> --- a/drivers/net/wireless/rt2x00/rt73usb.c
> +++ b/drivers/net/wireless/rt2x00/rt73usb.c
> @@ -844,6 +844,44 @@ static void rt73usb_config_duration(struct rt2x00_dev *rt2x00dev,
>        rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
>  }
>
> +static void rt73usb_config_ps(struct rt2x00_dev *rt2x00dev,
> +                               struct rt2x00lib_conf *libconf)
> +{
> +       enum dev_state state =
> +           (libconf->conf->flags & IEEE80211_CONF_PS) ?
> +               STATE_SLEEP : STATE_AWAKE;
> +       u32 reg;
> +
> +       if (state == STATE_SLEEP) {
> +               rt2x00usb_register_read(rt2x00dev, MAC_CSR11, &reg);
> +               rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN,
> +                                  libconf->conf->beacon_int - 10);
> +               rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP,
> +                                  libconf->conf->listen_interval - 1);
> +               rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 5);
> +
> +               /* We must first disable autowake before it can be enabled */
> +               rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
> +               rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg);
> +
> +               rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 1);
> +               rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg);
> +
> +               rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
> +                                           USB_MODE_SLEEP, REGISTER_TIMEOUT);
> +       } else {
> +               rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
> +                                           USB_MODE_WAKEUP, REGISTER_TIMEOUT);
> +
> +               rt2x00usb_register_read(rt2x00dev, MAC_CSR11, &reg);
> +               rt2x00_set_field32(&reg, MAC_CSR11_DELAY_AFTER_TBCN, 0);
> +               rt2x00_set_field32(&reg, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0);
> +               rt2x00_set_field32(&reg, MAC_CSR11_AUTOWAKE, 0);
> +               rt2x00_set_field32(&reg, MAC_CSR11_WAKEUP_LATENCY, 0);
> +               rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg);
> +       }
> +}
> +
>  static void rt73usb_config(struct rt2x00_dev *rt2x00dev,
>                           struct rt2x00lib_conf *libconf,
>                           const unsigned int flags)
> @@ -861,6 +899,8 @@ static void rt73usb_config(struct rt2x00_dev *rt2x00dev,
>                rt73usb_config_retry_limit(rt2x00dev, libconf);
>        if (flags & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
>                rt73usb_config_duration(rt2x00dev, libconf);
> +       if (flags & IEEE80211_CONF_CHANGE_PS)
> +               rt73usb_config_ps(rt2x00dev, libconf);
>  }
>
>  /*
> --
> 1.5.6.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [PATCH 1/15] rt2x00: Implement Powersaving
  2008-12-21 17:53   ` [PATCH 1/15] rt2x00: Implement Powersaving David Shwatrz
@ 2008-12-22  7:34     ` Holger Schurig
  0 siblings, 0 replies; 74+ messages in thread
From: Holger Schurig @ 2008-12-22  7:34 UTC (permalink / raw)
  To: linux-wireless; +Cc: David Shwatrz, Ivo van Doorn, John Linville, rt2400-devel

> Hi,
> Great new ! It seems to me that this is the first **usb**
> wireless device with power save support (and please correct me
> if I am wrong).

The libertas device as used in the OLPC ?
It's a non-mac80211 device, but uses powersave nethertheless.

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [PATCH 10/15] rt2x00: Move code into seperate functions
  2008-12-20  9:58                   ` [PATCH 10/15] rt2x00: Move code into seperate functions Ivo van Doorn
  2008-12-20  9:59                     ` [PATCH 11/15] rt2x00: Remove ENTRY_TXD_OFDM_RATE Ivo van Doorn
@ 2008-12-23 12:19                     ` David Shwatrz
  1 sibling, 0 replies; 74+ messages in thread
From: David Shwatrz @ 2008-12-23 12:19 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: John Linville, linux-wireless, rt2400-devel

Hello,

I have a techinical problem with this patch.
It is strangley being cut before it is ended:
I tried it with thunderbird and mutt clients.
It is cutt after :
-			 */
-			if (hwrate->bitrate == 110 && residual <= 30)
-				txdesc->service |= 0x80;
-		}
-
-		txdesc->length_high = (duration >> 8) & 0xff;
-		txdesc->length_low = duration & 0xff;

Therfore, I get a "corrupt patch" when trying to apply it
Any ideas ?
Davids

On Sat, Dec 20, 2008 at 11:58 AM, Ivo van Doorn <ivdoorn@gmail.com> wrote:
> Some functions have grown rapidly in size over the last time,
> some of those functions (like the rt2x00queue_create_tx_descriptor)
> will further increase in size soon, so it is best to start cutting
> it into logical pieces.
>
> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
> ---
>  drivers/net/wireless/rt2x00/rt2x00crypto.c |   13 ++-
>  drivers/net/wireless/rt2x00/rt2x00lib.h    |    6 +-
>  drivers/net/wireless/rt2x00/rt2x00mac.c    |   40 +++---
>  drivers/net/wireless/rt2x00/rt2x00queue.c  |  191 ++++++++++++++-------------
>  4 files changed, 137 insertions(+), 113 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c
> index 37ad0d2..f30bda2 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00crypto.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c
> @@ -49,9 +49,14 @@ enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key)
>  void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
>                                       struct txentry_desc *txdesc)
>  {
> +       struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
>        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
>        struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
>
> +       if (!test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags) ||
> +           !hw_key || entry->skb->do_not_encrypt)
> +               return;
> +
>        __set_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags);
>
>        txdesc->cipher = rt2x00crypto_key_to_cipher(hw_key);
> @@ -69,11 +74,17 @@ void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
>                __set_bit(ENTRY_TXD_ENCRYPT_MMIC, &txdesc->flags);
>  }
>
> -unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info)
> +unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
> +                                     struct sk_buff *skb)
>  {
> +       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
>        struct ieee80211_key_conf *key = tx_info->control.hw_key;
>        unsigned int overhead = 0;
>
> +       if (!test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags) ||
> +           !key || skb->do_not_encrypt)
> +               return overhead;
> +
>        /*
>         * Extend frame length to include IV/EIV/ICV/MMIC,
>         * note that these lengths should only be added when
> diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h
> index a6b7e00..1e80a83 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
> @@ -293,7 +293,8 @@ static inline void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
>  enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key);
>  void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
>                                       struct txentry_desc *txdesc);
> -unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info);
> +unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
> +                                     struct sk_buff *skb);
>  void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, unsigned int iv_len);
>  void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, unsigned int iv_len);
>  void rt2x00crypto_tx_insert_iv(struct sk_buff *skb);
> @@ -311,7 +312,8 @@ static inline void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
>  {
>  }
>
> -static inline unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info)
> +static inline unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev,
> +                                                   struct sk_buff *skb)
>  {
>        return 0;
>  }
> diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
> index e6fba83..bf7755a 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00mac.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
> @@ -79,8 +79,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
>         * RTS/CTS frame should use the length of the frame plus any
>         * encryption overhead that will be added by the hardware.
>         */
> -       if (!frag_skb->do_not_encrypt)
> -               data_length += rt2x00crypto_tx_overhead(tx_info);
> +       data_length += rt2x00crypto_tx_overhead(rt2x00dev, skb);
>
>        if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
>                ieee80211_ctstoself_get(rt2x00dev->hw, tx_info->control.vif,
> @@ -484,6 +483,24 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
>  EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter);
>
>  #ifdef CONFIG_RT2X00_LIB_CRYPTO
> +static void memcpy_tkip(struct rt2x00lib_crypto *crypto, u8 *key, u8 key_len)
> +{
> +       if (key_len > NL80211_TKIP_DATA_OFFSET_ENCR_KEY)
> +               memcpy(&crypto->key,
> +                      &key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY],
> +                      sizeof(crypto->key));
> +
> +       if (key_len > NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY)
> +               memcpy(&crypto->tx_mic,
> +                      &key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY],
> +                      sizeof(crypto->tx_mic));
> +
> +       if (key_len > NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY)
> +               memcpy(&crypto->rx_mic,
> +                      &key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY],
> +                      sizeof(crypto->rx_mic));
> +}
> +
>  int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
>                      const u8 *local_address, const u8 *address,
>                      struct ieee80211_key_conf *key)
> @@ -521,22 +538,9 @@ int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
>        crypto.cmd = cmd;
>        crypto.address = address;
>
> -       if (crypto.cipher == CIPHER_TKIP) {
> -               if (key->keylen > NL80211_TKIP_DATA_OFFSET_ENCR_KEY)
> -                       memcpy(&crypto.key,
> -                              &key->key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY],
> -                              sizeof(crypto.key));
> -
> -               if (key->keylen > NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY)
> -                       memcpy(&crypto.tx_mic,
> -                              &key->key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY],
> -                              sizeof(crypto.tx_mic));
> -
> -               if (key->keylen > NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY)
> -                       memcpy(&crypto.rx_mic,
> -                              &key->key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY],
> -                              sizeof(crypto.rx_mic));
> -       } else
> +       if (crypto.cipher == CIPHER_TKIP)
> +               memcpy_tkip(&crypto, &key->key[0], key->keylen);
> +       else
>                memcpy(&crypto.key, &key->key[0], key->keylen);
>
>        /*
> diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
> index 0777120..efb2875 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
> @@ -148,6 +148,95 @@ void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
>        dev_kfree_skb_any(skb);
>  }
>
> +static void rt2x00queue_create_tx_descriptor_seq(struct queue_entry *entry,
> +                                                struct txentry_desc *txdesc)
> +{
> +       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
> +       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)entry->skb->data;
> +       struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif);
> +       unsigned long irqflags;
> +
> +       if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) ||
> +           unlikely(!tx_info->control.vif))
> +               return;
> +
> +       /*
> +        * Hardware should insert sequence counter.
> +        * FIXME: We insert a software sequence counter first for
> +        * hardware that doesn't support hardware sequence counting.
> +        *
> +        * This is wrong because beacons are not getting sequence
> +        * numbers assigned properly.
> +        *
> +        * A secondary problem exists for drivers that cannot toggle
> +        * sequence counting per-frame, since those will override the
> +        * sequence counter given by mac80211.
> +        */
> +       spin_lock_irqsave(&intf->seqlock, irqflags);
> +
> +       if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags))
> +               intf->seqno += 0x10;
> +       hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
> +       hdr->seq_ctrl |= cpu_to_le16(intf->seqno);
> +
> +       spin_unlock_irqrestore(&intf->seqlock, irqflags);
> +
> +       __set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags);
> +}
> +
> +static void rt2x00queue_create_tx_descriptor_plcp(struct queue_entry *entry,
> +                                                 struct txentry_desc *txdesc,
> +                                                 struct ieee80211_rate *rate)
> +{
> +       struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
> +       const struct rt2x00_rate *hwrate = rt2x00_get_rate(rate->hw_value);
> +       unsigned int data_length;
> +       unsigned int duration;
> +       unsigned int residual;
> +
> +       /* Data length + CRC + Crypto overhead (IV/EIV/ICV/MIC) */
> +       data_length = entry->skb->len + 4;
> +       data_length += rt2x00crypto_tx_overhead(rt2x00dev, entry->skb);
> +
> +       /*
> +        * PLCP setup
> +        * Length calculation depends on OFDM/CCK rate.
> +        */
> +       txdesc->signal = hwrate->plcp;
> +       txdesc->service = 0x04;
> +
> +       if (hwrate->flags & DEV_RATE_OFDM) {
> +               txdesc->length_high = (data_length >> 6) & 0x3f;
> +               txdesc->length_low = data_length & 0x3f;
> +       } else {
> +               /*
> +                * Convert length to microseconds.
> +                */
> +               residual = GET_DURATION_RES(data_length, hwrate->bitrate);
> +               duration = GET_DURATION(data_length, hwrate->bitrate);
> +
> +               if (residual != 0) {
> +                       duration++;
> +
> +                       /*
> +                        * Check if we need to set the Length Extension
> +                        */
> +                       if (hwrate->bitrate == 110 && residual <= 30)
> +                               txdesc->service |= 0x80;
> +               }
> +
> +               txdesc->length_high = (duration >> 8) & 0xff;
> +               txdesc->length_low = duration & 0xff;
> +
> +               /*
> +                * When preamble is enabled we should set the
> +                * preamble bit for the signal.
> +                */
> +               if (rt2x00_get_rate_preamble(rate->hw_value))
> +                       txdesc->signal |= 0x08;
> +       }
> +}
> +
>  static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
>                                             struct txentry_desc *txdesc)
>  {
> @@ -157,10 +246,6 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
>        struct ieee80211_rate *rate =
>            ieee80211_get_tx_rate(rt2x00dev->hw, tx_info);
>        const struct rt2x00_rate *hwrate;
> -       unsigned int data_length;
> -       unsigned int duration;
> -       unsigned int residual;
> -       unsigned long irqflags;
>
>        memset(txdesc, 0, sizeof(*txdesc));
>
> @@ -172,27 +257,12 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
>        txdesc->cw_max = entry->queue->cw_max;
>        txdesc->aifs = entry->queue->aifs;
>
> -       /* Data length + CRC */
> -       data_length = entry->skb->len + 4;
> -
>        /*
>         * Check whether this frame is to be acked.
>         */
>        if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK))
>                __set_bit(ENTRY_TXD_ACK, &txdesc->flags);
>
> -       if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags) &&
> -           !entry->skb->do_not_encrypt) {
> -               /* Apply crypto specific descriptor information */
> -               rt2x00crypto_create_tx_descriptor(entry, txdesc);
> -
> -               /*
> -                * Extend frame length to include all encryption overhead
> -                * that will be added by the hardware.
> -                */
> -               data_length += rt2x00crypto_tx_overhead(tx_info);
> -       }
> -
>        /*
>         * Check if this is a RTS/CTS frame
>         */
> @@ -236,86 +306,23 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
>         * Set ifs to IFS_SIFS when the this is not the first fragment,
>         * or this fragment came after RTS/CTS.
>         */
> -       if (test_bit(ENTRY_TXD_RTS_FRAME, &txdesc->flags)) {
> -               txdesc->ifs = IFS_SIFS;
> -       } else if (tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) {
> +       if ((tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) &&
> +           !test_bit(ENTRY_TXD_RTS_FRAME, &txdesc->flags)) {
>                __set_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags);
>                txdesc->ifs = IFS_BACKOFF;
> -       } else {
> +       } else
>                txdesc->ifs = IFS_SIFS;
> -       }
> -
> -       /*
> -        * Hardware should insert sequence counter.
> -        * FIXME: We insert a software sequence counter first for
> -        * hardware that doesn't support hardware sequence counting.
> -        *
> -        * This is wrong because beacons are not getting sequence
> -        * numbers assigned properly.
> -        *
> -        * A secondary problem exists for drivers that cannot toggle
> -        * sequence counting per-frame, since those will override the
> -        * sequence counter given by mac80211.
> -        */
> -       if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
> -               if (likely(tx_info->control.vif)) {
> -                       struct rt2x00_intf *intf;
> -
> -                       intf = vif_to_intf(tx_info->control.vif);
>
> -                       spin_lock_irqsave(&intf->seqlock, irqflags);
> -
> -                       if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags))
> -                               intf->seqno += 0x10;
> -                       hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
> -                       hdr->seq_ctrl |= cpu_to_le16(intf->seqno);
> -
> -                       spin_unlock_irqrestore(&intf->seqlock, irqflags);
> -
> -                       __set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags);
> -               }
> -       }
> -
> -       /*
> -        * PLCP setup
> -        * Length calculation depends on OFDM/CCK rate.
> -        */
>        hwrate = rt2x00_get_rate(rate->hw_value);
> -       txdesc->signal = hwrate->plcp;
> -       txdesc->service = 0x04;
> -
> -       if (hwrate->flags & DEV_RATE_OFDM) {
> +       if (hwrate->flags & DEV_RATE_OFDM)
>                __set_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags);
>
> -               txdesc->length_high = (data_length >> 6) & 0x3f;
> -               txdesc->length_low = data_length & 0x3f;
> -       } else {
> -               /*
> -                * Convert length to microseconds.
> -                */
> -               residual = GET_DURATION_RES(data_length, hwrate->bitrate);
> -               duration = GET_DURATION(data_length, hwrate->bitrate);
> -
> -               if (residual != 0) {
> -                       duration++;
> -
> -                       /*
> -                        * Check if we need to set the Length Extension
> -                        */
> -                       if (hwrate->bitrate == 110 && residual <= 30)
> -                               txdesc->service |= 0x80;
> -               }
> -
> -               txdesc->length_high = (duration >> 8) & 0xff;
> -               txdesc->length_low = duration & 0xff;
> -
> -               /*
> -                * When preamble is enabled we should set the
> -                * preamble bit for the signal.
> -                */
> -               if (rt2x00_get_rate_preamble(rate->hw_value))
> -                       txdesc->signal |= 0x08;
> -       }
> +       /*
> +        * Apply TX descriptor handling by components
> +        */
> +       rt2x00crypto_create_tx_descriptor(entry, txdesc);
> +       rt2x00queue_create_tx_descriptor_seq(entry, txdesc);
> +       rt2x00queue_create_tx_descriptor_plcp(entry, txdesc, rate);
>  }
>
>  static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry,
> --
> 1.5.6.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

^ permalink raw reply	[flat|nested] 74+ messages in thread

end of thread, other threads:[~2008-12-23 12:19 UTC | newest]

Thread overview: 74+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-20  9:52 Please pull 'upstream' branch of rt2x00 Ivo van Doorn
2008-12-20  9:52 ` [PATCH 1/15] rt2x00: Implement Powersaving Ivo van Doorn
2008-12-20  9:53   ` [PATCH 2/15] rt2x00: Move link tuning into seperate file Ivo van Doorn
2008-12-20  9:54     ` [PATCH 3/15] rt2x00: Reduce calls to bbp_read() Ivo van Doorn
2008-12-20  9:54       ` [PATCH 4/15] rt2x00: Restrict interface between rt2x00link and drivers Ivo van Doorn
2008-12-20  9:55         ` [PATCH 5/15] rt2x00: Add mesh support Ivo van Doorn
2008-12-20  9:55           ` [PATCH 6/15] rt2x00: Add RFKILL support to rt2500usb and rt73usb Ivo van Doorn
2008-12-20  9:56             ` [PATCH 7/15] rt2x00: Rename CONFIG_CRYPTO_COPY_IV Ivo van Doorn
2008-12-20  9:57               ` [PATCH 8/15] rt2x00: Implement WDS support Ivo van Doorn
2008-12-20  9:57                 ` [PATCH 9/15] rt2x00: Split EEPROM_NIC_TX_RX_FIXED Ivo van Doorn
2008-12-20  9:58                   ` [PATCH 10/15] rt2x00: Move code into seperate functions Ivo van Doorn
2008-12-20  9:59                     ` [PATCH 11/15] rt2x00: Remove ENTRY_TXD_OFDM_RATE Ivo van Doorn
2008-12-20  9:59                       ` [PATCH 12/15] Allow drivers to pass the noise value during rxdone Ivo van Doorn
2008-12-20  9:59                         ` [PATCH 13/15] rt2x00: Introduce RXDONE_SIGNAL_MASK mask Ivo van Doorn
2008-12-20 10:00                           ` [PATCH 14/15] rt2x00: Fix segementation fault Ivo van Doorn
2008-12-20 10:00                             ` [PATCH 15/15] rt2x00: Release rt2x00 2.3.0 Ivo van Doorn
2008-12-23 12:19                     ` [PATCH 10/15] rt2x00: Move code into seperate functions David Shwatrz
2008-12-21 10:37                 ` [PATCH 8/15] rt2x00: Implement WDS support Johannes Berg
2008-12-21 12:07                   ` Ivo van Doorn
2008-12-21 17:53   ` [PATCH 1/15] rt2x00: Implement Powersaving David Shwatrz
2008-12-22  7:34     ` Holger Schurig
  -- strict thread matches above, loose matches on Subject: below --
2008-12-02 17:19 Please pull 'upstream' branch of rt2x00 Ivo van Doorn
2008-10-29 16:16 Ivo van Doorn
2008-08-29 19:03 Ivo van Doorn
2008-08-04 14:36 Ivo van Doorn
2008-07-19 14:15 Ivo van Doorn
2008-07-18 18:43 Ivo van Doorn
2008-07-19 13:55 ` Ivo van Doorn
2008-06-16 17:58 Ivo van Doorn
2008-06-08 21:41 Ivo van Doorn
2008-05-10 11:37 Ivo van Doorn
2008-05-10 12:48 ` drago01
2008-05-10 13:06   ` Ivo van Doorn
2008-05-10 13:15     ` drago01
2008-05-05 15:23 Ivo van Doorn
2008-05-02 21:04 Scott White
2008-05-02 21:25 ` Ivo van Doorn
2008-05-03  6:19   ` Mattias Nissler
2008-05-03  9:58     ` Ivo van Doorn
2008-05-03 10:18       ` Mattias Nissler
2008-05-03 15:02         ` Ivo van Doorn
2008-05-03 15:27           ` Johannes Berg
2008-05-03 15:38             ` Mattias Nissler
2008-05-03 16:56               ` Ivo van Doorn
2008-05-03 19:29   ` Scott White
2008-05-05 17:31 ` John W. Linville
2008-04-21 17:06 Ivo van Doorn
2008-05-01  8:29 ` Ivo van Doorn
2008-03-09 21:37 Ivo van Doorn
2008-02-25 22:20 Ivo van Doorn
2008-02-17 16:30 Ivo van Doorn
2008-02-10 21:46 Ivo van Doorn
2008-02-03 14:41 Ivo van Doorn
2008-01-06 22:37 Ivo van Doorn
2007-11-27 20:46 Ivo van Doorn
2007-11-27 20:54 ` Ivo van Doorn
2007-11-29 22:26   ` John W. Linville
2007-11-30  9:51     ` Ivo van Doorn
2007-10-27 11:34 Ivo van Doorn
2007-10-13 14:27 Ivo van Doorn
2007-10-06 12:19 Ivo van Doorn
2007-09-25 18:52 Ivo van Doorn
2007-09-16 12:17 Ivo van Doorn
2007-08-19 18:18 Ivo van Doorn
2007-08-02 15:45 Ivo van Doorn
2007-07-31 18:36 Ivo van Doorn
2007-08-01 17:05 ` Ivo van Doorn
2007-07-25 20:49 Ivo van Doorn
2007-07-20  8:11 Ivo van Doorn
2007-07-20  8:13 ` Ivo van Doorn
2007-06-19 18:18 Ivo van Doorn
2007-06-03 12:25 Ivo van Doorn
2007-05-07 14:44 Ivo van Doorn
2007-04-28 20:45 Ivo van Doorn

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).