{
        struct rtl8180_priv *priv = dev->priv;
        unsigned int count = 32;
-       u8 signal;
+       u8 signal, agc, sq;
 
        while (count--) {
                struct rtl8180_rx_desc *entry = &priv->rx_ring[priv->rx_idx];
 
                        rx_status.antenna = (flags2 >> 15) & 1;
                        rx_status.rate_idx = (flags >> 20) & 0xF;
-                       /* TODO: improve signal/rssi reporting for !rtl8185 */
-                       signal = (flags2 >> 17) & 0x7F;
-                       if (rx_status.rate_idx > 3)
-                               signal = 90 - clamp_t(u8, signal, 25, 90);
-                       else
-                               signal = 95 - clamp_t(u8, signal, 30, 95);
+                       agc = (flags2 >> 17) & 0x7F;
+                       if (priv->r8185) {
+                               if (rx_status.rate_idx > 3)
+                                       signal = 90 - clamp_t(u8, agc, 25, 90);
+                               else
+                                       signal = 95 - clamp_t(u8, agc, 30, 95);
+                       } else {
+                               sq = flags2 & 0xff;
+                               signal = priv->rf->calc_rssi(agc, sq);
+                       }
                        rx_status.signal = signal;
                        rx_status.freq = dev->conf.channel->center_freq;
                        rx_status.band = dev->conf.channel->band;
 
        rtl8180_write_phy(dev, 0x10, ant);
 }
 
+static u8 grf5101_rf_calc_rssi(u8 agc, u8 sq)
+{
+       if (agc > 60)
+               return 65;
+
+       /* TODO(?): just return agc (or agc + 5) to avoid mult / div */
+       return 65 * agc / 60;
+}
+
 static void grf5101_rf_set_channel(struct ieee80211_hw *dev,
                                   struct ieee80211_conf *conf)
 {
        .name           = "GCT",
        .init           = grf5101_rf_init,
        .stop           = grf5101_rf_stop,
-       .set_chan       = grf5101_rf_set_channel
+       .set_chan       = grf5101_rf_set_channel,
+       .calc_rssi      = grf5101_rf_calc_rssi,
 };
 
        rtl8180_write_phy(dev, 0x10, ant);
 }
 
+static u8 max2820_rf_calc_rssi(u8 agc, u8 sq)
+{
+       bool odd;
+
+       odd = !!(agc & 1);
+
+       agc >>= 1;
+       if (odd)
+               agc += 76;
+       else
+               agc += 66;
+
+       /* TODO: change addends above to avoid mult / div below */
+       return 65 * agc / 100;
+}
+
 static void max2820_rf_set_channel(struct ieee80211_hw *dev,
                                   struct ieee80211_conf *conf)
 {
        .name           = "Maxim",
        .init           = max2820_rf_init,
        .stop           = max2820_rf_stop,
-       .set_chan       = max2820_rf_set_channel
+       .set_chan       = max2820_rf_set_channel,
+       .calc_rssi      = max2820_rf_calc_rssi,
 };
 
 
 }
 
+static u8 sa2400_rf_rssi_map[] = {
+       0x64, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5e,
+       0x5d, 0x5c, 0x5b, 0x5a, 0x57, 0x54, 0x52, 0x50,
+       0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x41, 0x3f,
+       0x3c, 0x3a, 0x37, 0x36, 0x36, 0x1c, 0x1c, 0x1b,
+       0x1b, 0x1a, 0x1a, 0x19, 0x19, 0x18, 0x18, 0x17,
+       0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13,
+       0x13, 0x12, 0x12, 0x11, 0x11, 0x10, 0x10, 0x0f,
+       0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b,
+       0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07,
+       0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x02,
+};
+
+static u8 sa2400_rf_calc_rssi(u8 agc, u8 sq)
+{
+       if (sq == 0x80)
+               return 1;
+
+       if (sq > 78)
+               return 32;
+
+       /* TODO: recalc sa2400_rf_rssi_map to avoid mult / div */
+       return 65 * sa2400_rf_rssi_map[sq] / 100;
+}
+
 static void sa2400_rf_set_channel(struct ieee80211_hw *dev,
                                  struct ieee80211_conf *conf)
 {
        .name           = "Philips",
        .init           = sa2400_rf_init,
        .stop           = sa2400_rf_stop,
-       .set_chan       = sa2400_rf_set_channel
+       .set_chan       = sa2400_rf_set_channel,
+       .calc_rssi      = sa2400_rf_calc_rssi,
 };