[PATCH] Orinoco: wireless stats updates
authorDavid Gibson <hermes@gibson.dropbear.id.au>
Fri, 13 May 2005 00:01:22 +0000 (20:01 -0400)
committerJeff Garzik <jgarzik@pobox.com>
Fri, 13 May 2005 00:01:22 +0000 (20:01 -0400)
  Minor updates/bugfixes to the handling of wireless statistics.

drivers/net/wireless/orinoco.c

index a3a32430ae9d719e105d945b3eb7071523a44e37..3eab7e0b8507f44b40de6dacbcb41e62f73de7c7 100644 (file)
@@ -686,7 +686,7 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
        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 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
                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 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
 
                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;
 }