John W. Linville 3e45ced
commit 8b74964c73ca9eed7078388d871cc7fae973cb63
John W. Linville 3e45ced
Author: John W. Linville <linville@tuxdriver.com>
John W. Linville 3e45ced
Date:   Mon Jul 19 16:35:20 2010 -0400
John W. Linville 3e45ced
John W. Linville 3e45ced
    rtl8180: improve signal reporting for rtl8185 hardware
John W. Linville 3e45ced
    
John W. Linville 3e45ced
    The existing code seemed to be somewhat based on the datasheet, but
John W. Linville 3e45ced
    varied substantially from the vendor-provided driver.  This mirrors the
John W. Linville 3e45ced
    handling of the rtl8185 case from that driver, but still neglects the
John W. Linville 3e45ced
    specifics for the rtl8180 hardware.  Those details are a bit muddled...
John W. Linville 3e45ced
    
John W. Linville 3e45ced
    Signed-off-by: John W. Linville <linville@tuxdriver.com>
John W. Linville 3e45ced
John W. Linville 3e45ced
diff --git a/drivers/net/wireless/rtl818x/rtl8180_dev.c b/drivers/net/wireless/rtl818x/rtl8180_dev.c
John W. Linville 3e45ced
index 4270502..31808f9 100644
John W. Linville 3e45ced
--- a/drivers/net/wireless/rtl818x/rtl8180_dev.c
John W. Linville 3e45ced
+++ b/drivers/net/wireless/rtl818x/rtl8180_dev.c
John W. Linville 3e45ced
@@ -103,6 +103,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
John W. Linville 3e45ced
 {
John W. Linville 3e45ced
 	struct rtl8180_priv *priv = dev->priv;
John W. Linville 3e45ced
 	unsigned int count = 32;
John W. Linville 3e45ced
+	u8 signal;
John W. Linville 3e45ced
 
John W. Linville 3e45ced
 	while (count--) {
John W. Linville 3e45ced
 		struct rtl8180_rx_desc *entry = &priv->rx_ring[priv->rx_idx];
John W. Linville 3e45ced
@@ -130,10 +131,14 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
John W. Linville 3e45ced
 			skb_put(skb, flags & 0xFFF);
John W. Linville 3e45ced
 
John W. Linville 3e45ced
 			rx_status.antenna = (flags2 >> 15) & 1;
John W. Linville 3e45ced
-			/* TODO: improve signal/rssi reporting */
John W. Linville 3e45ced
-			rx_status.signal = (flags2 >> 8) & 0x7F;
John W. Linville 3e45ced
-			/* XXX: is this correct? */
John W. Linville 3e45ced
 			rx_status.rate_idx = (flags >> 20) & 0xF;
John W. Linville 3e45ced
+			/* TODO: improve signal/rssi reporting for !rtl8185 */
John W. Linville 3e45ced
+			signal = (flags2 >> 17) & 0x7F;
John W. Linville 3e45ced
+			if (rx_status.rate_idx > 3)
John W. Linville 3e45ced
+				signal = 90 - clamp_t(u8, signal, 25, 90);
John W. Linville 3e45ced
+			else
John W. Linville 3e45ced
+				signal = 95 - clamp_t(u8, signal, 30, 95);
John W. Linville 3e45ced
+			rx_status.signal = signal;
John W. Linville 3e45ced
 			rx_status.freq = dev->conf.channel->center_freq;
John W. Linville 3e45ced
 			rx_status.band = dev->conf.channel->band;
John W. Linville 3e45ced
 			rx_status.mactime = le64_to_cpu(entry->tsft);