The result is my iwconfig link quality values now track my Windows XP
link quality values. A useful reference is
http://www.wildpackets.com/elements/whitepapers/Converting_Signal_Strength.pdf
patch
___________________
--- ipw2200.c_orig 2005-02-02 19:31:47.742210264 -0500
+++ ipw2200.c 2005-02-02 19:47:19.107621200 -0500
@@ -3101,7 +3101,7 @@ static u32 ipw_get_current_rate(struct i
return 0;
}
-#define PERFECT_RSSI (-50)
+#define PERFECT_RSSI (-20)
#define WORST_RSSI (-85)
#define IPW_STATS_INTERVAL (2 * HZ)
static void ipw_gather_stats(struct ipw_priv *priv)
@@ -3114,6 +3114,7 @@ static void ipw_gather_stats(struct ipw_
s16 rssi;
u32 beacon_quality, signal_quality, tx_quality, rx_quality,
rate_quality;
+ u32 max_rate;
if (!(priv->status & STATUS_ASSOCIATED)) {
priv->quality = 0;
@@ -3171,7 +3172,8 @@ static void ipw_gather_stats(struct ipw_
beacon_quality, missed_beacons_percent);
priv->last_rate = ipw_get_current_rate(priv);
- rate_quality = priv->last_rate * 40 / priv->last_rate + 60;
+ max_rate = ipw_get_max_rate(priv);
+ rate_quality = priv->last_rate * 40 / max_rate + 60;
IPW_DEBUG_STATS("Rate quality : %3d%% (%dMbs)\n",
rate_quality, priv->last_rate / 1000000);
@@ -3199,8 +3201,11 @@ static void ipw_gather_stats(struct ipw_
else if (rssi < WORST_RSSI)
signal_quality = 0;
else
- signal_quality = (rssi - WORST_RSSI) * 100 /
- (PERFECT_RSSI - WORST_RSSI);
+ signal_quality = ( 100 *
+ (PERFECT_RSSI - WORST_RSSI) * (PERFECT_RSSI -
WORST_RSSI)
+ - (PERFECT_RSSI - rssi) * (15 * (PERFECT_RSSI -
WORST_RSSI)
+ + 62 * (PERFECT_RSSI - rssi)) ) /
+ ( (PERFECT_RSSI - WORST_RSSI) * (PERFECT_RSSI -
WORST_RSSI) );
IPW_DEBUG_STATS("Signal level : %3d%% (%d dBm)\n",
signal_quality, rssi);