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

Commit b1b508e1 authored by James Ketrenos's avatar James Ketrenos Committed by Jeff Garzik
Browse files

[PATCH] ieee80211 quality scaling algorithm extension handler



Incorporated Bill Moss' quality scaling algorithm into default wireless
extension handler.

Signed-off-by: default avatarJames Ketrenos <jketreno@linux.intel.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent fd27817c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -719,6 +719,9 @@ struct ieee80211_device {
	int freq_band;  /* 2.4Ghz, 5.2Ghz, Mixed */
	int abg_ture;   /* ABG flag              */

	int perfect_rssi;
	int worst_rssi;

	/* Callback functions */
	void (*set_security)(struct net_device *dev,
			     struct ieee80211_security *sec);
+30 −10
Original line number Diff line number Diff line
@@ -140,18 +140,38 @@ static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee,
		start = iwe_stream_add_point(start, stop, &iwe, custom);

	/* Add quality statistics */
	/* TODO: Fix these values... */
	iwe.cmd = IWEVQUAL;
	iwe.u.qual.qual = network->stats.signal;
	iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED |
	    IW_QUAL_NOISE_UPDATED;

	if (!(network->stats.mask & IEEE80211_STATMASK_RSSI)) {
		iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID |
		    IW_QUAL_LEVEL_INVALID;
		iwe.u.qual.qual = 0;
		iwe.u.qual.level = 0;
	} else {
		iwe.u.qual.level = network->stats.rssi;
	iwe.u.qual.noise = network->stats.noise;
	iwe.u.qual.updated = network->stats.mask & IEEE80211_STATMASK_WEMASK;
	if (!(network->stats.mask & IEEE80211_STATMASK_RSSI))
		iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID;
	if (!(network->stats.mask & IEEE80211_STATMASK_NOISE))
		iwe.u.qual.qual =
		    (100 *
		     (ieee->perfect_rssi - ieee->worst_rssi) *
		     (ieee->perfect_rssi - ieee->worst_rssi) -
		     (ieee->perfect_rssi - network->stats.rssi) *
		     (15 * (ieee->perfect_rssi - ieee->worst_rssi) +
		      62 * (ieee->perfect_rssi - network->stats.rssi))) /
		    ((ieee->perfect_rssi - ieee->worst_rssi) *
		     (ieee->perfect_rssi - ieee->worst_rssi));
		if (iwe.u.qual.qual > 100)
			iwe.u.qual.qual = 100;
		else if (iwe.u.qual.qual < 1)
			iwe.u.qual.qual = 0;
	}

	if (!(network->stats.mask & IEEE80211_STATMASK_NOISE)) {
		iwe.u.qual.updated |= IW_QUAL_NOISE_INVALID;
	if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL))
		iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID;
		iwe.u.qual.noise = 0;
	} else {
		iwe.u.qual.noise = network->stats.noise;
	}

	start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN);