Orinoco merge updates, part the fourth
Subsystems (3)
cover Orinoco merge updates, part the fourth
Hi Jeff, please apply:
Here's yet another batch of orinoco updates. Smaller and less significant than the last, this is basically a handful of remaining small updates before tackling the big changes (wext v15, monitor and scanning). Patches are:
orinoco-wstats-updates
Updates and bugfixes to wireless stats handling
orinoco-ignore-disconnect
Add the ignore_disconnect module parameter
orinoco-kill-dump-recs
Remove ugly debugging code, to be replaced later with simpler and more useful stuff
orinoco-no-infra-channel
Don't attempt to set channel in managed mode, the firmware doesn't like that.
orinoco-consolidate-allocate
Remove some duplicated code for firmware buffer allocation, removing a bug in a hw workaround in the process.
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/people/dgibson
PATCH 1/5 Orinoco merge updates, part the fourth: wireless stats updates
Minor updates/bugfixes to the handling of wireless statistics.
drivers/net/wireless/orinoco.c +22 -19
@@ -686,7 +686,7 @@struct orinoco_private *priv =netdev_priv (dev);hermes_t *hw = &priv->hw;struct iw_statistics *wstats = &priv->wstats; -int err =0 ; +int err;unsigned long flags;if (!netif_device_present (dev)) {
@@ -695,9 +695,21 @@return NULL ;/* FIXME: Can we do better than this? */ } +/* If busy, return the old stats. Returning NULL may cause +* the interface to disappear from /proc/net/wireless */ if (orinoco_lock (priv, &flags) !=0 ) -return NULL ;/* FIXME: Erg, we've been signalled, how -* do we propagate this back up? */ +return wstats; + +/* We can't really wait for the tallies inquiry command to +* complete, so we just use the previous results and trigger +* a new tallies inquiry command for next time - Jean II */ +/* FIXME: Really we should wait for the inquiry to come back - +* as it is the stats we give don't make a whole lot of sense. +* Unfortunately, it's not clear how to do that within the +* wireless extensions framework: I think we're in user +* context, but a lock seems to be held by the time we get in +* here so we're not safe to sleep here. */ +hermes_inquire (hw,HERMES_INQ_TALLIES );if (priv->iw_mode ==IW_MODE_ADHOC ) {memset (&wstats->qual,0 ,sizeof (wstats->qual));
@@ -716,25 +728,16 @@ err =HERMES_READ_RECORD (hw,USER_BAP ,HERMES_RID_COMMSQUALITY , &cq); - - wstats->qual.qual = (int )le16_to_cpu (cq.qual); - wstats->qual.level = (int )le16_to_cpu (cq.signal) -0x95 ; - wstats->qual.noise = (int )le16_to_cpu (cq.noise) -0x95 ; - wstats->qual.updated =7 ; + +if (!err) { + wstats->qual.qual = (int )le16_to_cpu (cq.qual); + wstats->qual.level = (int )le16_to_cpu (cq.signal) -0x95 ; + wstats->qual.noise = (int )le16_to_cpu (cq.noise) -0x95 ; + wstats->qual.updated =7 ; + } } -/* We can't really wait for the tallies inquiry command to -* complete, so we just use the previous results and trigger -* a new tallies inquiry command for next time - Jean II */ -/* FIXME: We're in user context (I think?), so we should just -wait for the tallies to come through */ - err =hermes_inquire (hw,HERMES_INQ_TALLIES ); -orinoco_unlock (priv, &flags); - -if (err) -return NULL ; -return wstats; }
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/people/dgibson
PATCH 2/5 Orinoco merge updates, part the fourth: ignore_disconnect flag
Adds an ignore_disconnect module parameter. When enabled, the driver will continue attempting to send packets even when the firmware has told us we've lost our link to the AP. On some firmwares this substantially increases the usable range of the card (presumably because we have an interrmittent connection, but the firmware is able to queue the packets for us until we're connected again). On some other cards, it causes the firmware to fall in a screaming heap :( (hence, default off).
drivers/net/wireless/orinoco.c +4 -1
@@ -492,6 +492,9 @@static int suppress_linkstatus;/* = 0 */ module_param (suppress_linkstatus, bool,0644 );MODULE_PARM_DESC (suppress_linkstatus,"Don't log link status changes" ); +static int ignore_disconnect;/* = 0 */ +module_param (ignore_disconnect, int,0644 ); +MODULE_PARM_DESC (ignore_disconnect,"Don't report lost link to the network layer" );/********************************************************************/ /* Compile time configuration and compatibility stuff */
@@ -1320,7 +1323,7 @@if (connected)netif_carrier_on (dev); -else +else if (!ignore_disconnect)netif_carrier_off (dev);if (newstatus != priv->last_linkstatus)
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/people/dgibson
PATCH 3/5 Orinoco merge updates, part the fourth: kill dump_recs
Remove the dump_recs debugging iwpriv command. It will be replaced later with the simpler and more flexible get_rid command.
drivers/net/wireless/orinoco.c +0 -191
@@ -607,7 +607,6 @@static int orinoco_ioctl (struct net_device *dev,struct ifreq *rq,int cmd);static int __orinoco_program_rids (struct net_device *dev);static void __orinoco_set_multicast_list (struct net_device *dev); -static int orinoco_debug_dump_recs (struct net_device *dev);/********************************************************************/ /* Internal helper functions */
@@ -3861,7 +3860,6 @@ {SIOCIWFIRSTPRIV +0x7 ,0 ,IW_PRIV_TYPE_INT |IW_PRIV_SIZE_FIXED |1 , "get_ibssport" }, - { SIOCIWLASTPRIV, 0, 0, "dump_recs" }, }; wrq->u.data.length =sizeof (privtab) /sizeof (privtab[0 ]);
@@ -3949,14 +3947,6 @@ err =orinoco_ioctl_getibssport (dev, wrq);break ; -case SIOCIWLASTPRIV : - err =orinoco_debug_dump_recs (dev); -if (err) -printk (KERN_ERR "%s: Unable to dump records (%d)\n" , - dev->name, err); -break ; - -default : err = -EOPNOTSUPP ; }
@@ -3970,187 +3960,6 @@return err; } -struct { -u16 rid; -char *name; -int displaytype; -#define DISPLAY_WORDS 0 -#define DISPLAY_BYTES 1 -#define DISPLAY_STRING 2 -#define DISPLAY_XSTRING 3 -} record_table[] = { -#define DEBUG_REC(name,type) { HERMES_RID_##name, #name, DISPLAY_##type } -DEBUG_REC (CNFPORTTYPE ,WORDS ), -DEBUG_REC (CNFOWNMACADDR ,BYTES ), -DEBUG_REC (CNFDESIREDSSID ,STRING ), -DEBUG_REC (CNFOWNCHANNEL ,WORDS ), -DEBUG_REC (CNFOWNSSID ,STRING ), -DEBUG_REC (CNFOWNATIMWINDOW ,WORDS ), -DEBUG_REC (CNFSYSTEMSCALE ,WORDS ), -DEBUG_REC (CNFMAXDATALEN ,WORDS ), -DEBUG_REC (CNFPMENABLED ,WORDS ), -DEBUG_REC (CNFPMEPS ,WORDS ), -DEBUG_REC (CNFMULTICASTRECEIVE ,WORDS ), -DEBUG_REC (CNFMAXSLEEPDURATION ,WORDS ), -DEBUG_REC (CNFPMHOLDOVERDURATION ,WORDS ), -DEBUG_REC (CNFOWNNAME ,STRING ), -DEBUG_REC (CNFOWNDTIMPERIOD ,WORDS ), -DEBUG_REC (CNFMULTICASTPMBUFFERING ,WORDS ), -DEBUG_REC (CNFWEPENABLED_AGERE ,WORDS ), -DEBUG_REC (CNFMANDATORYBSSID_SYMBOL ,WORDS ), -DEBUG_REC (CNFWEPDEFAULTKEYID ,WORDS ), -DEBUG_REC (CNFDEFAULTKEY0 ,BYTES ), -DEBUG_REC (CNFDEFAULTKEY1 ,BYTES ), -DEBUG_REC (CNFMWOROBUST_AGERE ,WORDS ), -DEBUG_REC (CNFDEFAULTKEY2 ,BYTES ), -DEBUG_REC (CNFDEFAULTKEY3 ,BYTES ), -DEBUG_REC (CNFWEPFLAGS_INTERSIL ,WORDS ), -DEBUG_REC (CNFWEPKEYMAPPINGTABLE ,WORDS ), -DEBUG_REC (CNFAUTHENTICATION ,WORDS ), -DEBUG_REC (CNFMAXASSOCSTA ,WORDS ), -DEBUG_REC (CNFKEYLENGTH_SYMBOL ,WORDS ), -DEBUG_REC (CNFTXCONTROL ,WORDS ), -DEBUG_REC (CNFROAMINGMODE ,WORDS ), -DEBUG_REC (CNFHOSTAUTHENTICATION ,WORDS ), -DEBUG_REC (CNFRCVCRCERROR ,WORDS ), -DEBUG_REC (CNFMMLIFE ,WORDS ), -DEBUG_REC (CNFALTRETRYCOUNT ,WORDS ), -DEBUG_REC (CNFBEACONINT ,WORDS ), -DEBUG_REC (CNFAPPCFINFO ,WORDS ), -DEBUG_REC (CNFSTAPCFINFO ,WORDS ), -DEBUG_REC (CNFPRIORITYQUSAGE ,WORDS ), -DEBUG_REC (CNFTIMCTRL ,WORDS ), -DEBUG_REC (CNFTHIRTY2TALLY ,WORDS ), -DEBUG_REC (CNFENHSECURITY ,WORDS ), -DEBUG_REC (CNFGROUPADDRESSES ,BYTES ), -DEBUG_REC (CNFCREATEIBSS ,WORDS ), -DEBUG_REC (CNFFRAGMENTATIONTHRESHOLD ,WORDS ), -DEBUG_REC (CNFRTSTHRESHOLD ,WORDS ), -DEBUG_REC (CNFTXRATECONTROL ,WORDS ), -DEBUG_REC (CNFPROMISCUOUSMODE ,WORDS ), -DEBUG_REC (CNFBASICRATES_SYMBOL ,WORDS ), -DEBUG_REC (CNFPREAMBLE_SYMBOL ,WORDS ), -DEBUG_REC (CNFSHORTPREAMBLE ,WORDS ), -DEBUG_REC (CNFWEPKEYS_AGERE ,BYTES ), -DEBUG_REC (CNFEXCLUDELONGPREAMBLE ,WORDS ), -DEBUG_REC (CNFTXKEY_AGERE ,WORDS ), -DEBUG_REC (CNFAUTHENTICATIONRSPTO ,WORDS ), -DEBUG_REC (CNFBASICRATES ,WORDS ), -DEBUG_REC (CNFSUPPORTEDRATES ,WORDS ), -DEBUG_REC (CNFTICKTIME ,WORDS ), -DEBUG_REC (CNFSCANREQUEST ,WORDS ), -DEBUG_REC (CNFJOINREQUEST ,WORDS ), -DEBUG_REC (CNFAUTHENTICATESTATION ,WORDS ), -DEBUG_REC (CNFCHANNELINFOREQUEST ,WORDS ), -DEBUG_REC (MAXLOADTIME ,WORDS ), -DEBUG_REC (DOWNLOADBUFFER ,WORDS ), -DEBUG_REC (PRIID ,WORDS ), -DEBUG_REC (PRISUPRANGE ,WORDS ), -DEBUG_REC (CFIACTRANGES ,WORDS ), -DEBUG_REC (NICSERNUM ,XSTRING ), -DEBUG_REC (NICID ,WORDS ), -DEBUG_REC (MFISUPRANGE ,WORDS ), -DEBUG_REC (CFISUPRANGE ,WORDS ), -DEBUG_REC (CHANNELLIST ,WORDS ), -DEBUG_REC (REGULATORYDOMAINS ,WORDS ), -DEBUG_REC (TEMPTYPE ,WORDS ), -/* DEBUG_REC(CIS,BYTES), */ -DEBUG_REC (STAID ,WORDS ), -DEBUG_REC (CURRENTSSID ,STRING ), -DEBUG_REC (CURRENTBSSID ,BYTES ), -DEBUG_REC (COMMSQUALITY ,WORDS ), -DEBUG_REC (CURRENTTXRATE ,WORDS ), -DEBUG_REC (CURRENTBEACONINTERVAL ,WORDS ), -DEBUG_REC (CURRENTSCALETHRESHOLDS ,WORDS ), -DEBUG_REC (PROTOCOLRSPTIME ,WORDS ), -DEBUG_REC (SHORTRETRYLIMIT ,WORDS ), -DEBUG_REC (LONGRETRYLIMIT ,WORDS ), -DEBUG_REC (MAXTRANSMITLIFETIME ,WORDS ), -DEBUG_REC (MAXRECEIVELIFETIME ,WORDS ), -DEBUG_REC (CFPOLLABLE ,WORDS ), -DEBUG_REC (AUTHENTICATIONALGORITHMS ,WORDS ), -DEBUG_REC (PRIVACYOPTIONIMPLEMENTED ,WORDS ), -DEBUG_REC (OWNMACADDR ,BYTES ), -DEBUG_REC (SCANRESULTSTABLE ,WORDS ), -DEBUG_REC (PHYTYPE ,WORDS ), -DEBUG_REC (CURRENTCHANNEL ,WORDS ), -DEBUG_REC (CURRENTPOWERSTATE ,WORDS ), -DEBUG_REC (CCAMODE ,WORDS ), -DEBUG_REC (SUPPORTEDDATARATES ,WORDS ), -DEBUG_REC (BUILDSEQ ,BYTES ), -DEBUG_REC (FWID ,XSTRING ) -#undef DEBUG_REC -}; - -#define DEBUG_LTV_SIZE 128 - -static int orinoco_debug_dump_recs (struct net_device *dev) -{ -struct orinoco_private *priv =netdev_priv (dev); -hermes_t *hw = &priv->hw; -u8 *val8; -u16 *val16; -int i,j; -u16 length; -int err; - -/* I'm not sure: we might have a lock here, so we'd better go -atomic, just in case. */ - val8 =kmalloc (DEBUG_LTV_SIZE +2 ,GFP_ATOMIC ); -if (! val8) -return -ENOMEM ; - val16 = (u16 *)val8; - -for (i =0 ; i <ARRAY_SIZE (record_table); i++) { -u16 rid = record_table[i].rid; -int len; - -memset (val8,0 ,DEBUG_LTV_SIZE +2 ); - - err =hermes_read_ltv (hw,USER_BAP , rid,DEBUG_LTV_SIZE , - &length, val8); -if (err) { -DEBUG (0 ,"Error %d reading RID 0x%04x\n" , err, rid); -continue ; - } - val16 = (u16 *)val8; -if (length ==0 ) -continue ; - -printk (KERN_DEBUG "%-15s (0x%04x): length=%d (%d bytes)\tvalue=" , - record_table[i].name, - rid, length, (length-1 )*2 ); - len =min (((int )length-1 )*2 ,DEBUG_LTV_SIZE ); - -switch (record_table[i].displaytype) { -case DISPLAY_WORDS : -for (j =0 ; j < len /2 ; j++) -printk ("%04X-" ,le16_to_cpu (val16[j])); -break ; - -case DISPLAY_BYTES : -default : -for (j =0 ; j < len; j++) -printk ("%02X:" , val8[j]); -break ; - -case DISPLAY_STRING : - len =min (len,le16_to_cpu (val16[0 ])+2 ); - val8[len] ='\0' ; -printk ("\"%s\"" , (char *)&val16[1 ]); -break ; - -case DISPLAY_XSTRING : -printk ("'%s'" , (char *)val8); - } - -printk ("\n" ); - } - -kfree (val8); - -return 0 ; -}/********************************************************************/ /* Debugging */
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/people/dgibson
PATCH 4/5 Orinoco merge updates, part the fourth: don't set channel in managed mode
Don't attempt to manually set the channel in infrastructure mode, the firmware doesn't like that much. Also don't attempt to override the firmware's default channel number for IBSS mode (I believe default channel can vary by regulatory domain).
drivers/net/wireless/orinoco.c +10 -12
@@ -1615,17 +1615,15 @@return err; }/* Set the channel/frequency */ -if (priv->channel ==0 ) { -printk (KERN_DEBUG "%s: Channel is 0 in __orinoco_program_rids()\n" , dev->name); -if (priv->createibss) - priv->channel =10 ; - } - err =hermes_write_wordrec (hw,USER_BAP ,HERMES_RID_CNFOWNCHANNEL , - priv->channel); -if (err) { -printk (KERN_ERR "%s: Error %d setting channel\n" , - dev->name, err); -return err; +if (priv->channel !=0 && priv->iw_mode !=IW_MODE_INFRA ) { + err =hermes_write_wordrec (hw,USER_BAP , +HERMES_RID_CNFOWNCHANNEL , + priv->channel); +if (err) { +printk (KERN_ERR "%s: Error %d setting channel %d\n" , + dev->name, err, priv->channel); +return err; + } }if (priv->has_ibss) {
@@ -2405,7 +2403,7 @@/* By default use IEEE/IBSS ad-hoc mode if we have it */ priv->prefer_port3 = priv->has_port3 && (! priv->has_ibss);set_port_type (priv); - priv->channel =10 ;/* default channel, more-or-less arbitrary */ + priv->channel =0 ;/* use firmware default */ priv->promiscuous =0 ; priv->wep_on =0 ;
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/people/dgibson
PATCH 5/5 Orinoco merge updates, part the fourth: consolidate allocation code
Consolidate allocation of firmware buffers. In the process, remove duplication of a workaround for an old symbol firmware bug, and fix a bug where we could retry the workaround, even if it already failed to help.
drivers/net/wireless/orinoco.c +2 -21
@@ -1418,7 +1418,7 @@return err; err =hermes_allocate (hw, priv->nicbuf_size, &priv->txfid); -if (err == -EIO ) { +if (err == -EIO && priv->nicbuf_size >TX_NICBUF_SIZE_BUG ) {/* Try workaround for old Symbol firmware bug */ printk(KERN_WARNING "%s: firmware ALLOC bug detected " "(old Symbol firmware?). Trying to work around... ",
@@ -2270,7 +2270,7 @@ priv->nicbuf_size =IEEE802_11_FRAME_LEN +ETH_HLEN ;/* Initialize the firmware */ - err =hermes_init (hw); + err =orinoco_reinit_firmware (dev);if (err !=0 ) {printk (KERN_ERR "%s: failed to initialize firmware (err = %d)\n" , dev->name, err);
@@ -2409,25 +2409,6 @@ priv->wep_on =0 ; priv->tx_key =0 ; - err =hermes_allocate (hw, priv->nicbuf_size, &priv->txfid); -if (err == -EIO ) { -/* Try workaround for old Symbol firmware bug */ -printk (KERN_WARNING "%s: firmware ALLOC bug detected " -"(old Symbol firmware?). Trying to work around... " , - dev->name); - - priv->nicbuf_size =TX_NICBUF_SIZE_BUG ; - err =hermes_allocate (hw, priv->nicbuf_size, &priv->txfid); -if (err) -printk ("failed!\n" ); -else -printk ("ok.\n" ); - } -if (err) { -printk ("%s: Error %d allocating Tx buffer\n" , dev->name, err); - goto out; - } -/* Make the hardware available, as long as it hasn't been * removed elsewhere (e.g. by PCMCIA hot unplug) */ spin_lock_irq (&priv->lock);
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/people/dgibson
Re: [1/5] Orinoco merge updates, part the fourth: wireless stats updates
In reply to David Gibsonapplied 1-5
Hello,
DG> Here's yet another batch of orinoco updates.
Will this patches be included in CVS-Head code? Now I checked and the last modification of orinoco.c was about 4 days ago, when switch to enable monitor mode on all firmwares was included...
DG> Smaller and less significant than the last,
What was the last?
DG> this is basically a handful of remaining small updates before DG> tackling the big changes (wext v15, monitor and scanning).
So, the next thing that will be do, will be WPA and monitor mode improvement (maybe in all firmwares)?
Signature · 4 lines
Bye, abuas_z mailto:[email protected] The Bat! v3.0.2.10, Windows XP 5.1, Build 2600, Service Pack 1