⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 orinoco.c

📁 优龙2410linux2.6.8内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 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 + -