Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e67d9d9d authored by David Gibson's avatar David Gibson Committed by Jeff Garzik
Browse files

[PATCH] Orinoco: wireless stats updates

  
  Minor updates/bugfixes to the handling of wireless statistics.
parent 88d7bd8c
Loading
Loading
Loading
Loading
+22 −19
Original line number Diff line number Diff line
@@ -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));
@@ -717,24 +729,15 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
		err = HERMES_READ_RECORD(hw, USER_BAP,
					 HERMES_RID_COMMSQUALITY, &cq);

		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;
}