TODO:
e100.c: pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr, sizeof(struct rfd), PCI_DMA_FROMDEVICE);
do we need to do something like above for rxhostdescs/rxbufs?

TODO: from Efthym <efthym@gmx.net>:
13:12:42 wlan0: rx: 31 DUPs in 551 packets received in 10 sec
13:12:48 wlan0: tx error 0x20, buf 20! (excessive Tx retries
13:12:48 wlan0: tx error 0x20, buf 21! (excessive Tx retries
13:12:48 wlan0: several excessive Tx retry errors occurred, a
13:12:48 wlan0: tx error 0x20, buf 22! (excessive Tx retries
13:12:48 wlan0: tx error 0x20, buf 23! (excessive Tx retries
13:12:48 wlan0: tx error 0x20, buf 24! (excessive Tx retries
13:12:48 wlan0: recalibrating radio
13:12:48 wlan0: successfully recalibrated radio
13:12:52 wlan0: tx error 0x20, buf 25! (excessive Tx retries
13:12:52 wlan0: several excessive Tx retry errors occurred, a
13:12:52 wlan0: tx error 0x20, buf 26! (excessive Tx retries
13:12:52 wlan0: tx error 0x20, buf 27! (excessive Tx retries
13:12:52 wlan0: tx error 0x20, buf 28! (excessive Tx retries
13:12:52 wlan0: tx error 0x20, buf 29! (excessive Tx retries
13:12:52 wlan0: several excessive Tx retry errors occurred, a
13:12:52 wlan0: tx error 0x20, buf 30! (excessive Tx retries
13:12:52 wlan0: tx error 0x20, buf 31! (excessive Tx retries
13:12:52 wlan0: tx error 0x20, buf 00! (excessive Tx retries
13:12:52 wlan0: less than 5 minutes since last radio recalibr
13:12:58 wlan0: tx error 0x20, buf 01! (excessive Tx retries
13:12:58 wlan0: several excessive Tx retry errors occurred, a
13:12:58 wlan0: tx error 0x20, buf 02! (excessive Tx retries
13:12:58 wlan0: tx error 0x20, buf 03! (excessive Tx retries
13:12:58 wlan0: tx error 0x20, buf 04! (excessive Tx retries
13:12:58 wlan0: tx error 0x20, buf 05! (excessive Tx retries
13:12:58 wlan0: several excessive Tx retry errors occurred, a
13:12:58 disabling above notification message
13:12:58 wlan0: tx error 0x20, buf 06! (excessive Tx retries
13:12:58 wlan0: tx error 0x20, buf 07!
13:12:58 wlan0: tx error 0x20, buf 08!
13:12:58 wlan0: less than 5 minutes since last radio recalibr
13:13:06 wlan0: tx error 0x20, buf 09!
13:13:06 wlan0: tx error 0x20, buf 10!
13:13:06 wlan0: tx error 0x20, buf 11!
13:13:06 wlan0: tx error 0x20, buf 12!
13:13:06 wlan0: tx error 0x20, buf 13!
13:13:06 wlan0: tx error 0x20, buf 14!
13:13:06 wlan0: tx error 0x20, buf 15!
13:13:06 wlan0: tx error 0x20, buf 16!
13:13:06 wlan0: less than 5 minutes since last radio recalibr
13:13:18 wlan0: tx error 0x20, buf 17!
13:13:18 wlan0: tx error 0x20, buf 18!
13:13:18 wlan0: tx error 0x20, buf 19!
13:13:18 wlan0: tx error 0x20, buf 20!
13:13:18 wlan0: tx error 0x20, buf 21!
13:13:18 wlan0: tx error 0x20, buf 22!
13:13:18 wlan0: tx error 0x20, buf 23!
13:13:18 wlan0: tx error 0x20, buf 24!
13:13:18 wlan0: less than 5 minutes since last radio recalibr
13:13:25 wlan0: tx error 0x20, buf 25!
13:13:25 wlan0: tx error 0x20, buf 26!
13:13:25 wlan0: tx error 0x20, buf 27!
13:13:25 wlan0: tx error 0x20, buf 28!
13:13:25 wlan0: tx error 0x20, buf 29!
13:13:25 wlan0: tx error 0x20, buf 30!
13:13:25 wlan0: tx error 0x20, buf 31!
13:13:25 wlan0: tx error 0x20, buf 00!
13:13:25 wlan0: less than 5 minutes since last radio recalibr
13:13:25 disabling above message
13:13:32 wlan0: tx error 0x20, buf 01!
13:13:32 wlan0: tx error 0x20, buf 02!
13:13:32 wlan0: tx error 0x20, buf 03!
13:13:32 wlan0: tx error 0x20, buf 04!
13:13:32 wlan0: tx error 0x20, buf 05!
13:13:32 wlan0: tx error 0x20, buf 06!
13:13:32 wlan0: tx error 0x20, buf 07!
13:13:32 wlan0: tx error 0x20, buf 08!
13:13:41 wlan0: tx error 0x20, buf 09!
13:13:41 wlan0: tx error 0x20, buf 10!
13:13:41 wlan0: tx error 0x20, buf 11!
13:13:41 wlan0: tx error 0x20, buf 12!
13:13:41 wlan0: tx error 0x20, buf 13!
13:13:41 wlan0: tx error 0x20, buf 14!
13:13:41 wlan0: tx error 0x20, buf 15!
13:13:41 wlan0: tx error 0x20, buf 16!
13:13:51 wlan0: tx error 0x20, buf 17!
13:13:51 wlan0: tx error 0x20, buf 18!
13:13:51 wlan0: tx error 0x20, buf 19!
13:13:51 wlan0: tx error 0x20, buf 20!
13:13:51 wlan0: tx error 0x20, buf 21!
13:13:51 wlan0: tx error 0x20, buf 22!
13:13:51 wlan0: tx error 0x20, buf 23!
13:13:51 wlan0: tx error 0x20, buf 24!
13:14:02 wlan0: tx error 0x20, buf 25!
13:14:02 wlan0: tx error 0x20, buf 26!
13:14:02 wlan0: tx error 0x20, buf 27!
13:14:02 wlan0: tx error 0x20, buf 28!
13:14:02 wlan0: tx error 0x20, buf 29!
13:14:02 wlan0: tx error 0x20, buf 30!
13:14:02 wlan0: tx error 0x20, buf 31!
13:14:02 wlan0: tx error 0x20, buf 00!
13:14:13 wlan0: tx error 0x20, buf 01!
13:14:13 wlan0: tx error 0x20, buf 02!
13:14:13 wlan0: tx error 0x20, buf 03!
13:14:13 wlan0: tx error 0x20, buf 04!
13:14:13 wlan0: tx error 0x20, buf 05!
13:14:13 wlan0: tx error 0x20, buf 06!
13:14:13 wlan0: tx error 0x20, buf 07!
13:14:13 wlan0: tx error 0x20, buf 08!

[20060518]
* Fix warnings about packed structs and printf format mismatches.
  Fix "implicit declaration of function dma_free_coherent" warning.

[20060212] 0.3.35
* Carlos Martin <carlos@cmartin.tk>
  - Fix breakage of "Get rid of circular list of adev's"
  - Remove .owner = THIS_MODULE

[20060209] 0.3.34
* Get rid of circular list of adev's

[20060206]
* Register driver device ids to usb device table

[20060205] 0.3.33
* Andreas Mohr <andi@rhlx01.fht-esslingen.de>
  - implement much more flexible firmware statistics parsing
    (for /proc/driver/acx_wlanX_diag)
    This has the nice effect that we now get output for both the older
    TNETW1100 USB and TNETW1450.
    Since firmware statistics information has non-stable layout depending on
    firmware version, please report if you suspect any parsing mismatch!
    This improved version now uses 2kB more driver space, unfortunately.
  - use "% 8" modulo instead of more complicated "% 5" calculation

[20060202] 0.3.32
* Andreas Mohr <andim2@users.sourceforge.net>
  - add initial support for new TNETW1450 USB chip (available on the market since
    June or so): successful firmware booting, driver initialization working up to
    a working iwconfig. Any network traffic whatsoever NOT working yet.
    VERY EXPERIMENTAL! (especially since TNETW1450 sometimes uses enhanced,
    longer structs for some IEs)
  - add a ton of different TNETW1450 USB device VID/PID combinations; it's
    highly likely that there will be many more TNETW1450 devices in the future...
  - add many more firmware command IEs
  - firmware upload cleanup (rename variables to better names, unify the various
    firmware upload implementations, ...)
  - add FIXME comment to remind about semaphore -> mutex conversion
  The TNETW1450 firmware image is currently called tiacx111usbcRR, with RR being
  the currently used radio ID 0x1D ("1D"): tiacx111usbc1D.

[20060126] 0.3.31
* fix bug uncovered by code added in support for firmware 2.3.1.31

[20060124] 0.3.30
* fix breakage introduced by vda
* Bas Vermeulen <bvermeul@blackstar.xs4all.nl>:
  support for firmware 2.3.1.31

[20060117] 0.3.29
* Andreas Mohr <andim2@users.sourceforge.net>:
  - fix OOPS in acx_l_rxmonitor() (wrong ndev->type setting leading to memcpy
    of negative size) by reworking monitor mode type setup and adding
    missing sanity checks
  - rename acx1XX_ie_powermgmt_t to more correct acx1XX_ie_powersave_t
  - fix format string compile warnings
  - add <linux/compiler.h> include apparently required for __iomem define
    around Linux 2.6.8
  - rework eCPU init by replacing static msleep with faster, more intelligent
    (hopefully) busy-wait
* acx_s_set_defaults slightly edited
* ioctls are changed to have correct prototypes

[20060116] 0.3.28
* Massive global replaces: priv->adev, netdev_priv->ndev2adev etc.
  Minimal code changes

[20060113]
* Andreas Mohr <andim2@users.sourceforge.net>:
  - add recommended cpu_relax() to busy-wait loops
  - reorder struct wlandevice_t for better(??) cache use
  - kill superfluous result variable in conv.c
  - misc. small cleanup
* SEPARATE_DRIVER_INSTANCES is a 2.4ism, removed

[20060112] 0.3.27
* Andreas Mohr <andim2@users.sourceforge.net>:
  - add support for configopt parsing for ACX100 EEPROM version v5
  - only start another radio recalibration interval every 5 seconds
    on ACX111 instead of every second

[20060111]
* drop compatibility cruft for kernels < 2.6.10

[20060109] 0.3.26
* From Andreas Mohr <andi@rhlx01.fht-esslingen.de>
  - revert kzalloc change (too early, only Linux 2.6.14+ has support)
  - add safe limit checks for probe_delay EEPROM values, log more
    configopt values
  - some early parts for packet fragmentation support
    (I already know how to do it, I think, I just need some time
    to implement it, and I *really* need this feature here with such
    a BROKEN 3-wall connection here...)
  - 802.11 power save mode improvements (not usable by mere mortals yet)
  - switch fw cmd length structs depending on whether acx100 or acx111
  - fix log message rate limiting (as a benefit code is now faster, too)
  - unify acx100/acx111 scanning, saving a couple hundred bytes
  - set Ctl2_8 to 0 which it most likely should be (please report if
    this breaks anything - but it shouldn't since it's being initialized
    to 0 on driver init anyway...)

[20060108] 0.3.25
* fix scanning breakage
* fix cmd timeout breakage
* attempt to fix suspend/resume

[20060104] 0.3.24
* From Andreas Mohr <andim2@users.sourceforge.net>
  - activated acx100 configoption readout, unified acx100/acx111 parsing
  - init NULL data template, required for 802.11 power save mode
  - return actual, valid txpower levels in range ioctl (from configoption!)
  fix bugs:
  - fatal bug in 802.11 powersave structs
  - some missing endianness conversions
  - check for sane regulatory domain related settings on both SETting and GETting
  - random optimizations making this much enhanced code *smaller* than the
    previous version!
  - optimized struct layout
  - merge acx100_s_init_packet_templates and acx111_s_init_packet_templates
  - use kzalloc instead of kmalloc where useful (yes, this driver is Linux 2.6.x
    only, with x rather large)
  - avoid some sprintf() and strlen()
  - add support for new get_wireless_stats handling (...silence deprecation
    warning!)
  - add some unlikely()
  - lower msleep() value in issue_cmd() in order to speed up card initialization
    time (almost less than 1 second now, on P3/700!). should this lower msleep()
    value be made init-only??
  - disable get sensitivity ioctl for USB (unfortunately not working yet)
  - make sure to call synchronize_irq(), (semi-)required for SMP
  - group together some closely related functions
  - misc cleanups/code maintenance
  So, configoptions are now working for acx100, too, and unified, and
  802.11 power save mode actually worked for acx100 when I tested it (large
  delays during ping which indicate that it must be active, but I guess these
  delays should be much reduced with a properly tuned implementation), but it's
  not finished and thus not enabled by default.

[20051228]
* Global s/acxlog/log/

[20051220] 0.3.23
* timeout handling fixed for high load case
  (patch by Andreas Mohr)

[20051219] 0.3.22
* acx100 active scanning must be working now, thanks to Carlos Martin
  <carlos@cmartin.tk>.

[20051202]
* acx_s_update_card_settings cosmetic change
  (but wasn't run tested)

[20051201] 0.3.21
* Thanks Carlos Martin
* Completely serialize USB rx. Tiny speed loss,
  but even more safe wrt reordering.
* A few msleeps removed

[20051128] 0.3.20
* we will use only 2 rx usb buffers now. No apparent speed loss,
  eliminates usb packet reordering risk.
* two USB fixes for real bugs and one fix for possible leak
  of an urb on error path. Thanks Carlos Martin <carlosmn@gmail.com>.

[20051116] 0.3.19
* a few small fixes accumulated over time, nothing spectacular

[20051031] 0.3.18
* hopefully a final touch on USB tx autorate

[20051022] 0.3.17
* PCI command submission made simpler

[20051021] 0.3.16
* Small changes mostly designed to break USB ;)
* Auto rate handling for USB is still not confirmed to work.
  I need USB logs from the users.

[20051020] 0.3.15
* Auto rate handling for USB is implemented. Untested.

[20051019]
* first step in proper auto rate handling for USB

[20051018] 0.3.14
* update for 2.6.14-rc4-mm1
* Kconfig bug (error if ACX=y, ACX_USB=y, USB=m) fixed
* PARANOID_LOCKING off by default

[20051016] 0.3.13
* Revert 20051013 fix, we have one which actually works.
  Thanks Jacek Jablonski <yacek87@gmail.com> for testing!

[20051013]
* trying to fix "yet another similar bug"
* usb fix by Carlos Martin

[20051012] 0.3.12
* acx_l_clean_tx_desc bug fixed - was stopping tx completely
  at high load. (It seems there exists yet another similar bug!)
* "unknown IE" dump was 2 bytes too short - fixed
* DUP logging made less noisy
* another usb fix by Carlos Martin <carlosmn@gmail.com>

[20051003]
* several usb fixes by Carlos Martin <carlosmn@gmail.com> - thanks!
* unknown IE logging made less noisy
* few unknown IEs added to the growing collection
* version bump to 0.3.11

[20050916]
* fix bogus MTU handling, add ability to change MTU
* fix WLAN_DATA_MAXLEN: 2312 -> 2304
* version bump to 0.3.10

[20050915]
* by popular request default mode is 'managed'
* empty handler for EID 7 (country info) is added
* fix 'timer not started - iface is not up'
* tx[host]desc micro optimizations
* version bump to 0.3.9

[20050914]
* tx[host]desc ring workings brought a bit back to two-hostdesc
  scheme. This is an attempt to fix weird WG311v2 bug.
  I still fail to understand how same chip with same fw can
  work for me but do not work for a WG311v2 owner. Mystery.
* README updated
* version bump to 0.3.8

[20050913]
* variable and fields with awful names renamed
* a few fields dropped (they had constant values)
* small optimization to acx_l_clean_tx_desc()
* version bump to 0.3.7

[20050912]
* stop using 16 byte "private area" in txdesc - fw bug makes it unreliable
* better logging of DUPs
* version bump to 0.3.6

[20050911]
* use alloc_netdev/free_netdev/netdev_priv
* acx_inline.h incorporated into pci.c
* helper.c + helper2.c = common.c
* marking static functions
* enable IE_DOT11_CURRENT_ANTENNA for acx111
* version bump to 0.3.5

[20050910]
* minor fixes, 2.6.13-mm2 integration

[20050905]
* TIWLAN_DC is dead, ui32ACX[TR]xQueueStart is dead
* massive mucking with PCI and USB resulting in:
  acx_pci.o + acx_usb.o = acx.o  ;)
  Why? Here's why:
    text    data     bss     dec     hex filename
  116199     452      40  116691   1c7d3 acx.o
  103435     244      20  103699   19513 acx_pci.o
   81732     196      32   81960   14028 acx_usb.o
* helper.c is PCI/USB independent now. It was the last one.
* both modular and non-modular builds, PCI, USB, PCI+USB,
  seem to compile successfully!
* version bump to 0.3.4

[20050904]
* acx_stop_queue() locking reviewed and mostly fixed
* 2.4isms in USB code are officially dead
* added debug stuff for discovering interrogate/configure IEs
* version bump to 0.3.3

[20050903]
* locking bug on error path fixed
* issue_cmd() logging made more sane
* issue_cmd() callers may abstain from printing issue_cmd() errors:
  issue_cmd() itself gives enough info
* version bump to 0.3.2

[20050902]
* kill bogus configure() call in acx100_s_create_dma_regions()

[20050901]
* acx100_s_create_dma_regions: hopefully fixed for USB
  (problem found with help of Carlos Martin <carlosmn@gmail.com> - thanks!)
* a load of cleanups:
* acx_s_create_tx_desc_queue -> acx_create_tx_desc_queue
  (it doesn't sleep)
* struct acxp80211_nullframe -> acx_template_nullframe
* xXBUFFERCOUNT_ACXnn -> xXBUFCNT_ACXnn
* xXBUFFERCOUNT_USB -> USB_xXBUFCNT: these are _unrelated_ to xXBUFCNT_ACXnn,
  should have visibly different names
* TODOs added (we have a few really Pascalish/Windowish names,
  and some misleading ones)
* version bump to 0.3.1

[20050830]
* finally kill warning about acx_s_activate_power_save_mode()
* struct acx100_ie_memconfigoption: convert pRxHostDesc to acx_ptr type
* massive move of device-independent code from helper.c to helper2.c

[20050829]
* dummy handler for NONERP EID (47) added

[20050823]
* driver submitted for kernel inclusion
* #defines renamed: CONFIG_ACX_{PCI,USB} -> ACX_{PCI,USB}
  (needed for correct compilation of two modules from the same source)
* version bump to 0.3.0
* sizes:
   text    data     bss     dec     hex filename
  78242     264       8   78514   132b2 drivers/net/wireless/acx/acx_pci.o
  60622     208      20   60850    edb2 drivers/net/wireless/acx/acx_usb.o

[20050822]
* idma.c is incorporated into helper.c
* lots of cosmetic work: comments, struct member shuffling,
  etc. TIWLAN_DC and other PCI data structs are #ifdef'ed
  to be PCI-only. A few todos added. Extra #include's removed.
* added sem locking debug printout code (for amd64 debug)
* beacon tx rate and beacon ratevector is updated according to
  "iwconfig rate" command immediately (required mode change before).

[20050821]
* Switch to wrapper functions for dealing with "tx buffers"
  (memory areas where we create packets for tx. For USB, it's just
  a part of wlandevice_t, for PCI it's a DMAable buffer pointed to
  by txhostdesc).
* Completely hide nature of PCI txdescs under opaque pointer type tx_t*
* acx_l_ether_to_txdesc -> acx_l_ether_to_txbuf, not using knowledge
  of PCI txdesc anymore.
* Massive surgery on usb.c, cutting all paths into PCI code.
* PCI code moved to pci.c - USB don't need these pieces anymore
* acx111 and acx100 txhostdesc creation unified into single function

[20050816]
* PCI code switched to single-txdesc scheme
* version bump to 0.2.5

[20050815]
* dev_kfree_skb -> dev_kfree_skb_any

[20050814]
* Auto rate was reset to lowest rate by scanning code
  (AP beacons did it every tenth of a second!). Fixed.
* USB rx no longer uses PCI-style rx descriptor ring.
  tx ring elimination needs 'single-descriptor' setup
  to be developed for acx100 (patch exists for acx111).
* Very strange sem locking problems are reported on amd64.
  Code which misbehaves looks fine. I do not know what's going on.
  Workaround: turn off preemption.

[20050812]
* acx100 was failing to find out radio module #,
  and wanted to load radio module 00. Must be fixed now.
* USB: more simplifications

[20050810]
* USB: simplified command submission code, removed some
  wlandevice_t fields (now unused)

[20050808]
* USB changes: nuked global statics, simplified issue_cmd,
  shortened wlandevice_t. Added some TODOs :)

[20050807]
* restart scan if AP is not found
* remove use_eth_name parameter. It was deprecated
* disable legacy firmware loader for 2.6. Driver printed a warning
  about need to switch to hotplug.
* WARNING: new names for firmware images!
  Driver will try to load the following images:
  PCI driver:
    'tiacxNNNcMM' (NNN=100/111, MM=radio module ID (in uppercase hex)):
    combined firmware for specified chipset and radio.
    failing that, it will try to load images named
    'tiacxNNN' (NNN=100/111): main firmware for specified chipset
    and 'tiacxNNNrMM': corresponding radio module.
    For example, my firmware is in file named 'tiacx111c16'.
    Alternatively, I may remove it and use pair of files
    'tiacx111' and 'tiacx111r16' instead.
  USB driver: loads image named 'tiacx100usb'
  Hint: you can keep both old and new image names (via symlinks
  or just by copying files) if you need to run older driver.
* fix "Debug: sleeping function called from invalid context..." for USB
* ACX_{PCI,USB} -> CONFIG_ACX_{PCI,USB} in preparation to 2.6 merge
* version bump to 0.2.4

[20050804]
* 'Fixed' deadlock on flush_scheduled_work (need a better fix eventually)
* We didn't completely disable IRQs on ifdown -> "Disabling IRQ#NN"
  on second modprobe. Fixed.

[20050802]
* removed some // comments in order to please Andreas
* moved a field to PCI-only part of wlandevice_t
* Random Version Bump (tm) to 0.2.3
* no code changes

[20050730]
* Basically just incorporating acx-20050722.acx100fixed.patch
  This is a bit of a backward step, because instead of figuring out
  why active scanning doesn't work for acx100, we just disable it.
  acx100 owners encouraged to try to make it work

[20050729]
* Added some IE IDs

[20050726]
* added probe request config to acx100_s_init_packet_templates,
  maybe acx100 is working now

[20050721]
* del_timer_sync() sem lockup on SMP maybe fixed

[20050720]
* lots of amd64 warnings fixed, thanks to Matan Peled <chaosite@gmail.com>

[20050710]
* {tx,rx}hostdesc->desc_phy removed (was not used)
* netdev->type of ARPHRD_IEEE80211_PRISM was sticking forever
  after monitor mode. Fixed
* monitor mode tx is working again
* rate reporting added in monitor mode packet header

[20050709]
* moved PCI specific ioctls to pci.c
* ioctl.c is PCI/USB independent now

[20050708]
* Fixed one apparent bug (wlandevice_t had different
  layout for PCI and USB - conv.c would die horribly)
* Massive code shuffling with only trivial code changes.
  Mostly sorting out PCI/USB stuff into relevant files.
* ihw.c eliminated
* helper2.c is PCI/USB independent now
