📄 orinoco.c
字号:
/* orinoco.c 0.13e - (formerly known as dldwd_cs.c and orinoco_cs.c) * * A driver for Hermes or Prism 2 chipset based PCMCIA wireless * adaptors, with Lucent/Agere, Intersil or Symbol firmware. * * Copyright (C) 2000 David Gibson, Linuxcare Australia <hermes@gibson.dropbear.id.au> * With some help from : * Copyright (C) 2001 Jean Tourrilhes, HP Labs <jt@hpl.hp.com> * Copyright (C) 2001 Benjamin Herrenschmidt <benh@kernel.crashing.org> * * Based on dummy_cs.c 1.27 2000/06/12 21:27:25 * * Portions based on wvlan_cs.c 1.0.6, Copyright Andreas Neuhaus <andy@fasta.fh-dortmund.de> * http://www.fasta.fh-dortmund.de/users/andy/wvlan/ * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License * at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and * limitations under the License. * * The initial developer of the original code is David A. Hinds * <dahinds@users.sourceforge.net>. Portions created by David * A. Hinds are Copyright (C) 1999 David A. Hinds. All Rights * Reserved. * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License version 2 (the "GPL"), in * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use your * version of this file under the MPL, indicate your decision by * deleting the provisions above and replace them with the notice and * other provisions required by the GPL. If you do not delete the * provisions above, a recipient may use your version of this file * under either the MPL or the GPL. *//* * v0.01 -> v0.02 - 21/3/2001 - Jean II * o Allow to use regular ethX device name instead of dldwdX * o Warning on IBSS with ESSID=any for firmware 6.06 * o Put proper range.throughput values (optimistic) * o IWSPY support (IOCTL and stat gather in Rx path) * o Allow setting frequency in Ad-Hoc mode * o Disable WEP setting if !has_wep to work on old firmware * o Fix txpower range * o Start adding support for Samsung/Compaq firmware * * v0.02 -> v0.03 - 23/3/2001 - Jean II * o Start adding Symbol support - need to check all that * o Fix Prism2/Symbol WEP to accept 128 bits keys * o Add Symbol WEP (add authentication type) * o Add Prism2/Symbol rate * o Add PM timeout (holdover duration) * o Enable "iwconfig eth0 key off" and friends (toggle flags) * o Enable "iwconfig eth0 power unicast/all" (toggle flags) * o Try with an intel card. It report firmware 1.01, behave like * an antiquated firmware, however on windows it says 2.00. Yuck ! * o Workaround firmware bug in allocate buffer (Intel 1.01) * o Finish external renaming to orinoco... * o Testing with various Wavelan firmwares * * v0.03 -> v0.04 - 30/3/2001 - Jean II * o Update to Wireless 11 -> add retry limit/lifetime support * o Tested with a D-Link DWL 650 card, fill in firmware support * o Warning on Vcc mismatch (D-Link 3.3v card in Lucent 5v only slot) * o Fixed the Prims2 WEP bugs that I introduced in v0.03 :-( * It work on D-Link *only* after a tcpdump. Weird... * And still doesn't work on Intel card. Grrrr... * o Update the mode after a setport3 * o Add preamble setting for Symbol cards (not yet enabled) * o Don't complain as much about Symbol cards... * * v0.04 -> v0.04b - 22/4/2001 - David Gibson * o Removed the 'eth' parameter - always use ethXX as the * interface name instead of dldwdXX. The other was racy * anyway. * o Clean up RID definitions in hermes.h, other cleanups * * v0.04b -> v0.04c - 24/4/2001 - Jean II * o Tim Hurley <timster@seiki.bliztech.com> reported a D-Link card * with vendor 02 and firmware 0.08. Added in the capabilities... * o Tested Lucent firmware 7.28, everything works... * * v0.04c -> v0.05 - 3/5/2001 - Benjamin Herrenschmidt * o Spin-off Pcmcia code. This file is renamed orinoco.c, * and orinoco_cs.c now contains only the Pcmcia specific stuff * o Add Airport driver support on top of orinoco.c (see airport.c) * * v0.05 -> v0.05a - 4/5/2001 - Jean II * o Revert to old Pcmcia code to fix breakage of Ben's changes... * * v0.05a -> v0.05b - 4/5/2001 - Jean II * o add module parameter 'ignore_cis_vcc' for D-Link @ 5V * o D-Link firmware doesn't support multicast. We just print a few * error messages, but otherwise everything works... * o For David : set/getport3 works fine, just upgrade iwpriv... * * v0.05b -> v0.05c - 5/5/2001 - Benjamin Herrenschmidt * o Adapt airport.c to latest changes in orinoco.c * o Remove deferred power enabling code * * v0.05c -> v0.05d - 5/5/2001 - Jean II * o Workaround to SNAP decapsulate frame from LinkSys AP * original patch from : Dong Liu <dliu@research.bell-labs.com> * (note : the memcmp bug was mine - fixed) * o Remove set_retry stuff, no firmware support it (bloat--). * * v0.05d -> v0.06 - 25/5/2001 - Jean II * Original patch from "Hong Lin" <alin@redhat.com>, * "Ian Kinner" <ikinner@redhat.com> * and "David Smith" <dsmith@redhat.com> * o Init of priv->tx_rate_ctrl in firmware specific section. * o Prism2/Symbol rate, upto should be 0xF and not 0x15. Doh ! * o Spectrum card always need cor_reset (for every reset) * o Fix cor_reset to not lose bit 7 in the register * o flush_stale_links to remove zombie Pcmcia instances * o Ack previous hermes event before reset * Me (with my little hands) * o Allow orinoco.c to call cor_reset via priv->card_reset_handler * o Add priv->need_card_reset to toggle this feature * o Fix various buglets when setting WEP in Symbol firmware * Now, encryption is fully functional on Symbol cards. Youpi ! * * v0.06 -> v0.06b - 25/5/2001 - Jean II * o IBSS on Symbol use port_mode = 4. Please don't ask... * * v0.06b -> v0.06c - 29/5/2001 - Jean II * o Show first spy address in /proc/net/wireless for IBSS mode as well * * v0.06c -> v0.06d - 6/7/2001 - David Gibson * o Change a bunch of KERN_INFO messages to KERN_DEBUG, as per Linus' * wishes to reduce the number of unecessary messages. * o Removed bogus message on CRC error. * o Merged fixeds for v0.08 Prism 2 firmware from William Waghorn * <willwaghorn@yahoo.co.uk> * o Slight cleanup/re-arrangement of firmware detection code. * * v0.06d -> v0.06e - 1/8/2001 - David Gibson * o Removed some redundant global initializers (orinoco_cs.c). * o Added some module metadataa * * v0.06e -> v0.06f - 14/8/2001 - David Gibson * o Wording fix to license * o Added a 'use_alternate_encaps' module parameter for APs which need an * oui of 00:00:00. We really need a better way of handling this, but * the module flag is better than nothing for now. * * v0.06f -> v0.07 - 20/8/2001 - David Gibson * o Removed BAP error retries from hermes_bap_seek(). For Tx we now * let the upper layers handle the retry, we retry explicitly in the * Rx path, but don't make as much noise about it. * o Firmware detection cleanups. * * v0.07 -> v0.07a - 1/10/3001 - Jean II * o Add code to read Symbol firmware revision, inspired by latest code * in Spectrum24 by Lee John Keyser-Allen - Thanks Lee ! * o Thanks to Jared Valentine <hidden@xmission.com> for "providing" me * a 3Com card with a recent firmware, fill out Symbol firmware * capabilities of latest rev (2.20), as well as older Symbol cards. * o Disable Power Management in newer Symbol firmware, the API * has changed (documentation needed). * * v0.07a -> v0.08 - 3/10/2001 - David Gibson * o Fixed a possible buffer overrun found by the Stanford checker (in * dldwd_ioctl_setiwencode()). Can only be called by root anyway, so not * a big problem. * o Turned has_big_wep on for Intersil cards. That's not true for all of * them but we should at least let the capable ones try. * o Wait for BUSY to clear at the beginning of hermes_bap_seek(). I * realised that my assumption that the driver's serialization * would prevent the BAP being busy on entry was possibly false, because * things other than seeks may make the BAP busy. * o Use "alternate" (oui 00:00:00) encapsulation by default. * Setting use_old_encaps will mimic the old behaviour, but I think we * will be able to eliminate this. * o Don't try to make __initdata const (the version string). This can't * work because of the way the __initdata sectioning works. * o Added MODULE_LICENSE tags. * o Support for PLX (transparent PCMCIA->PCI brdge) cards. * o Changed to using the new type-facist min/max. * * v0.08 -> v0.08a - 9/10/2001 - David Gibson * o Inserted some missing acknowledgements/info into the Changelog. * o Fixed some bugs in the normalisation of signel level reporting. * o Fixed bad bug in WEP key handling on Intersil and Symbol firmware, * which led to an instant crash on big-endian machines. * * v0.08a -> v0.08b - 20/11/2001 - David Gibson * o Lots of cleanup and bugfixes in orinoco_plx.c * o Cleanup to handling of Tx rate setting. * o Removed support for old encapsulation method. * o Removed old "dldwd" names. * o Split RID constants into a new file hermes_rid.h * o Renamed RID constants to match linux-wlan-ng and prism2.o * o Bugfixes in hermes.c * o Poke the PLX's INTCSR register, so it actually starts * generating interrupts. These cards might actually work now. * o Update to wireless extensions v12 (Jean II) * o Support for tallies and inquire command (Jean II) * o Airport updates for newer PPC kernels (BenH) * * v0.08b -> v0.09 - 21/12/2001 - David Gibson * o Some new PCI IDs for PLX cards. * o Removed broken attempt to do ALLMULTI reception. Just use * promiscuous mode instead * o Preliminary work for list-AP (Jean II) * o Airport updates from (BenH) * o Eliminated racy hw_ready stuff * o Fixed generation of fake events in irq handler. This should * finally kill the EIO problems (Jean II & dgibson) * o Fixed breakage of bitrate set/get on Agere firmware (Jean II) * * v0.09 -> v0.09a - 2/1/2002 - David Gibson * o Fixed stupid mistake in multicast list handling, triggering * a BUG() * * v0.09a -> v0.09b - 16/1/2002 - David Gibson * o Fixed even stupider mistake in new interrupt handling, which * seriously broke things on big-endian machines. * o Removed a bunch of redundant includes and exports. * o Removed a redundant MOD_{INC,DEC}_USE_COUNT pair in airport.c * o Don't attempt to do hardware level multicast reception on * Intersil firmware, just go promisc instead. * o Typo fixed in hermes_issue_cmd() * o Eliminated WIRELESS_SPY #ifdefs * o Status code reported on Tx exceptions * o Moved netif_wake_queue() from ALLOC interrupts to TX and TXEXC * interrupts, which should fix the timeouts we're seeing. * * v0.09b -> v0.10 - 25 Feb 2002 - David Gibson * o Removed nested structures used for header parsing, so the * driver should now work without hackery on ARM * o Fix for WEP handling on Intersil (Hawk Newton) * o Eliminated the /proc/hermes/ethXX/regs debugging file. It * was never very useful. * o Make Rx errors less noisy. * * v0.10 -> v0.11 - 5 Apr 2002 - David Gibson * o Laid the groundwork in hermes.[ch] for devices which map * into PCI memory space rather than IO space. * o Fixed bug in multicast handling (cleared multicast list when * leaving promiscuous mode). * o Relegated Tx error messages to debug. * o Cleaned up / corrected handling of allocation lengths. * o Set OWNSSID in IBSS mode for WinXP interoperability (jimc). * o Change to using alloc_etherdev() for structure allocations. * o Check for and drop undersized packets. * o Fixed a race in stopping/waking the queue. This should fix * the timeout problems (Pavel Roskin) * o Reverted to netif_wake_queue() on the ALLOC event. * o Fixes for recent Symbol firmwares which lack AP density * (Pavel Roskin). * * v0.11 -> v0.11a - 29 Apr 2002 - David Gibson * o Handle different register spacing, necessary for Prism 2.5 * PCI adaptors (Steve Hill). * o Cleaned up initialization of card structures in orinoco_cs * and airport. Removed card->priv field. * o Make response structure optional for hermes_docmd_wait() * Pavel Roskin) * o Added PCI id for Nortel emobility to orinoco_plx.c. * o Cleanup to handling of Symbol's allocation bug. (Pavel Roskin) * o Cleanups to firmware capability detection. * o Arrange for orinoco_pci.c to override firmware detection. * We should be able to support the PCI Intersil cards now. * o Cleanup handling of reset_cor and hard_reset (Pavel Roskin). * o Remove erroneous use of USER_BAP in the TxExc handler (Jouni * Malinen). * o Makefile changes for better integration into David Hinds * pcmcia-cs package. * * v0.11a -> v0.11b - 1 May 2002 - David Gibson * o Better error reporting in orinoco_plx_init_one() * o Fixed multiple bad kfree() bugs introduced by the * alloc_orinocodev() changes. * * v0.11b -> v0.12 - 19 Jun 2002 - David Gibson * o Support changing the MAC address. * o Correct display of Intersil firmware revision numbers. * o Entirely revised locking scheme. Should be both simpler and * better. * o Merged some common code in orinoco_plx, orinoco_pci and * airport by creating orinoco_default_{open,stop,reset}() * which are used as the dev->open, dev->stop, priv->reset * callbacks if none are specified when alloc_orinocodev() is * called. * o Removed orinoco_plx_interrupt() and orinoco_pci_interrupt(). * They didn't do anything. * * v0.12 -> v0.12a - 4 Jul 2002 - David Gibson * o Some rearrangement of code. * o Numerous fixups to locking and rest handling, particularly * for PCMCIA. * o This allows open and stop net_device methods to be in * orinoco.c now, rather than in the init modules. * o In orinoco_cs.c link->priv now points to the struct * net_device not to the struct orinoco_private. * o Added a check for undersized SNAP frames, which could cause * crashes. * * v0.12a -> v0.12b - 11 Jul 2002 - David Gibson * o Fix hw->num_init testing code, so num_init is actually * incremented. * o Fix very stupid bug in orinoco_cs which broke compile with * CONFIG_SMP. * o Squashed a warning. * * v0.12b -> v0.12c - 26 Jul 2002 - David Gibson * o Change to C9X style designated initializers. * o Add support for 3Com AirConnect PCI. * o No longer ignore the hard_reset argument to * alloc_orinocodev(). Oops. * * v0.12c -> v0.13beta1 - 13 Sep 2002 - David Gibson * o Revert the broken 0.12* locking scheme and go to a new yet * simpler scheme. * o Do firmware resets only in orinoco_init() and when waking * the card from hard sleep. * * v0.13beta1 -> v0.13 - 27 Sep 2002 - David Gibson * o Re-introduced full resets (via schedule_task()) on Tx * timeout. * * v0.13 -> v0.13a - 30 Sep 2002 - David Gibson * o Minor cleanups to info frame handling. Add basic support * for linkstatus info frames. * o Include required kernel headers in orinoco.h, to avoid * compile problems. * * v0.13a -> v0.13b - 10 Feb 2003 - David Gibson * o Implemented hard reset for Airport cards * o Experimental suspend/resume implementation for orinoco_pci * o Abolished /proc debugging support, replaced with a debugging * iwpriv. Now it's ugly and simple instead of ugly and complex. * o Bugfix in hermes.c if the firmware returned a record length * of 0, we could go clobbering memory. * o Bugfix in orinoco_stop() - it used to fail if hw_unavailable * was set, which was usually true on PCMCIA hot removes. * o Track LINKSTATUS messages, silently drop Tx packets before * we are connected (avoids cofusing the firmware), and only * give LINKSTATUS printk()s if the status has changed. * * v0.13b -> v0.13c - 11 Mar 2003 - David Gibson * o Cleanup: use dev instead of priv in various places. * o Bug fix: Don't ReleaseConfiguration on RESET_PHYSICAL event * if we're in the middle of a (driver initiated) hard reset. * o Bug fix: ETH_ZLEN is supposed to include the header * (Dionysus Blazakis & Manish Karir) * o Convert to using workqueues instead of taskqueues (and * backwards compatibility macros for pre 2.5.41 kernels). * o Drop redundant (I think...) MOD_{INC,DEC}_USE_COUNT in * airport.c * o New orinoco_tmd.c init module from Joerg Dorchain for * TMD7160 based PCI to PCMCIA bridges (similar to * orinoco_plx.c). * * v0.13c -> v0.13d - 22 Apr 2003 - David Gibson * o Make hw_unavailable a counter, rather than just a flag, this * is necessary to avoid some races (such as a card being * removed in the middle of orinoco_reset(). * o Restore Release/RequestConfiguration in the PCMCIA event handler * when dealing with a driver initiated hard reset. This is * necessary to prevent hangs due to a spurious interrupt while * the reset is in progress. * o Clear the 802.11 header when transmitting, even though we * don't use it. This fixes a long standing bug on some * firmwares, which seem to get confused if that isn't done. * o Be less eager to de-encapsulate SNAP frames, only do so if * the OUI is 00:00:00 or 00:00:f8, leave others alone. The old * behaviour broke CDP (Cisco Discovery Protocol). * o Use dev instead of priv for free_irq() as well as * request_irq() (oops). * o Attempt to reset rather than giving up if we get too many * IRQs. * o Changed semantics of __orinoco_down() so it can be called * safely with hw_unavailable set. It also now clears the * linkstatus (since we're going to have to reassociate). * * v0.13d -> v0.13e - 12 May 2003 - David Gibson * o Support for post-2.5.68 return values from irq handler. * o Fixed bug where underlength packets would be double counted * in the rx_dropped statistics. * o Provided a module parameter to suppress linkstatus messages. * * TODO * o New wireless extensions API (patch from Moustafa * Youssef, updated by Jim Carter and Pavel Roskin). * o Handle de-encapsulation within network layer, provide 802.11 * headers (patch from Thomas 'Dent' Mirlacher) * o RF monitor mode support * o Fix possible races in SPY handling. * o Disconnect wireless extensions from fundamental configuration. * o (maybe) Software WEP support (patch from Stano Meduna). * o (maybe) Use multiple Tx buffers - driver handling queue * rather than firmware. *//* Locking and synchronization: * * The basic principle is that everything is serialized through a * single spinlock, priv->lock. The lock is used in user, bh and irq * context, so when taken outside hardirq context it should always be * taken with interrupts disabled. The lock protects both the * hardware and the struct orinoco_private. * * Another flag, priv->hw_unavailable indicates that the hardware is * unavailable for an extended period of time (e.g. suspended, or in * the middle of a hard reset). This flag is protected by the * spinlock. All code which touches the hardware should check the * flag after taking the lock, and if it is set, give up on whatever
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -