diff -u -p linux/drivers/net/wireless/airo.18.c linux/drivers/net/wireless/airo.c
--- linux/drivers/net/wireless/airo.18.c	Fri Mar 18 17:45:57 2005
+++ linux/drivers/net/wireless/airo.c	Mon Mar 21 18:00:25 2005
@@ -1713,6 +1713,7 @@ static int readBSSListRid(struct airo_in
 	list->fh.dwell = le16_to_cpu(list->fh.dwell);
 	list->dsChannel = le16_to_cpu(list->dsChannel);
 	list->atimWindow = le16_to_cpu(list->atimWindow);
+	list->rssi = le16_to_cpu(list->rssi);
 	return rc;
 }
 
@@ -3245,7 +3246,8 @@ badrx:
 					wstats.level = 0x100 - apriv->rssi[hdr.rssi[1]].rssidBm;
 				else
 					wstats.level = (hdr.rssi[1] + 321) / 2;
-				wstats.updated = 3;	
+				wstats.noise = apriv->wstats.qual.noise;
+				wstats.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_DBM;
 				/* Update spy records */
 				wireless_spy_update(dev, sa, &wstats);
 			}
@@ -3588,7 +3590,8 @@ void mpi_receive_802_11 (struct airo_inf
 			wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm;
 		else
 			wstats.level = (hdr.rssi[1] + 321) / 2;
-		wstats.updated = 3;
+		wstats.noise = ai->wstats.qual.noise;
+		wstats.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_DBM;
 		/* Update spy records */
 		wireless_spy_update(ai->dev, sa, &wstats);
 	}
@@ -6446,9 +6449,19 @@ static int airo_get_range(struct net_dev
 	/* Hum... Should put the right values there */
 	range->max_qual.qual = airo_get_max_quality(&cap_rid);
 	range->max_qual.level = 0x100 - 120;	/* -120 dBm */
-	range->max_qual.noise = 0;
+	range->max_qual.noise = 0x100 - 120;	/* -120 dBm */
 	range->sensitivity = 65535;
 
+	/* Experimental measurements - boundary 11/5.5 Mb/s */
+	/* Note : with or without the (local->rssi), results
+	 * are somewhat different. - Jean II */
+	range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
+	if (local->rssi)
+		range->avg_qual.level = 0x100 - 70;	/* -70 dBm */
+	else
+		range->avg_qual.level = 0x100 - 80;	/* -80 dBm */
+	range->avg_qual.noise = 0x100 - 85;		/* -85 dBm */
+
 	for(i = 0 ; i < 8 ; i++) {
 		range->bitrate[i] = cap_rid.supportedRates[i] * 500000;
 		if(range->bitrate[i] == 0)
@@ -6508,15 +6521,6 @@ static int airo_get_range(struct net_dev
 	range->max_retry = 65535;
 	range->min_r_time = 1024;
 	range->max_r_time = 65535 * 1024;
-	/* Experimental measurements - boundary 11/5.5 Mb/s */
-	/* Note : with or without the (local->rssi), results
-	 * are somewhat different. - Jean II */
-	range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
-	if (local->rssi)
-		range->avg_qual.level = 186;	/* -70 dBm */
-	else
-		range->avg_qual.level = 176;	/* -80 dBm */
-	range->avg_qual.noise = 0;
 
 	/* Event capability (kernel + driver) */
 	range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
@@ -6680,8 +6684,9 @@ static int airo_get_aplist(struct net_de
 			qual[i].level = 0x100 - local->rssi[BSSList.rssi].rssidBm;
 		else
 			qual[i].level = (BSSList.rssi + 321) / 2;
-		qual[i].qual = qual[i].noise = 0;
-		qual[i].updated = 2;
+		qual[i].noise = local->wstats.qual.noise;
+		qual[i].updated = IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_UPDATED
+				| IW_QUAL_DBM;
 		if (BSSList.index == 0xffff)
 			break;
 	}
@@ -6808,8 +6813,10 @@ static inline char *airo_translate_scan(
 		iwe.u.qual.level = 0x100 - ai->rssi[list->rssi].rssidBm;
 	else
 		iwe.u.qual.level = (list->rssi + 321) / 2;
-	iwe.u.qual.noise = 0;
 	iwe.u.qual.qual = 0;
+	iwe.u.qual.noise = ai->wstats.qual.noise;
+	iwe.u.qual.updated = IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_UPDATED
+			| IW_QUAL_DBM;
 	current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
 
 	/* Add encryption capability */
@@ -7153,7 +7160,7 @@ static void airo_read_wireless_stats(str
 	/* The status */
 	local->wstats.status = status_rid.mode;
 
-	/* Signal quality and co. But where is the noise level ??? */
+	/* Signal quality and co. */
 	local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid);
 	if (local->rssi)
 		local->wstats.qual.level = 0x100 - local->rssi[status_rid.sigQuality].rssidBm;
@@ -7161,10 +7168,10 @@ static void airo_read_wireless_stats(str
 		local->wstats.qual.level = (status_rid.normalizedSignalStrength + 321) / 2;
 	if (status_rid.len >= 124) {
 		local->wstats.qual.noise = 256 - status_rid.noisedBm;
-		local->wstats.qual.updated = 7;
+		local->wstats.qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
 	} else {
 		local->wstats.qual.noise = 0;
-		local->wstats.qual.updated = 3;
+		local->wstats.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID | IW_QUAL_DBM;
 	}
 
 	/* Packets discarded in the wireless adapter due to wireless
