2014-05-31 16:31:11

by Andrea Merello

[permalink] [raw]
Subject: [RFT] rtl818x_pci: add RSSI information for rtl8187SE

This patch makes the driver to report signal stength information
to mac80211 for rtl8187se boards.

My card has probably an HW problem, because it suffers of bad
RX sensitivity (even on other OSes), so I could only test that
the information is somewhat proportional to the signal RXed.

Signed-off-by: Andrea Merello <[email protected]>
---
drivers/net/wireless/rtl818x/rtl8180/dev.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/rtl818x/rtl8180/dev.c b/drivers/net/wireless/rtl818x/rtl8180/dev.c
index 1e25929..b41267c 100644
--- a/drivers/net/wireless/rtl818x/rtl8180/dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8180/dev.c
@@ -188,6 +188,9 @@ static const int rtl8187se_queues_map[RTL8187SE_NR_TX_QUEUES] = {5, 4, 3, 2, 7};

static const int rtl8180_queues_map[RTL8180_NR_TX_QUEUES] = {4, 7};

+/* LNA gain table for rtl8187se */
+static const u8 rtl8187se_lna_gain[4] = {02, 17, 29, 39};
+
void rtl8180_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data)
{
struct rtl8180_priv *priv = dev->priv;
@@ -215,7 +218,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
while (count--) {
void *entry = priv->rx_ring + priv->rx_idx * priv->rx_ring_sz;
struct sk_buff *skb = priv->rx_buf[priv->rx_idx];
- u32 flags, flags2;
+ u32 flags, flags2, flags3;
u64 tsft;

if (priv->chip_family == RTL818X_CHIP_FAMILY_RTL8187SE) {
@@ -229,6 +232,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
*/
rmb();
flags2 = le32_to_cpu(desc->flags2);
+ flags3 = le32_to_cpu(desc->flags3);
tsft = le64_to_cpu(desc->tsft);
} else {
struct rtl8180_rx_desc *desc = entry;
@@ -237,6 +241,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
/* same as above */
rmb();
flags2 = le32_to_cpu(desc->flags2);
+ flags3 = 0; /* not used. get rid of GCC warn */
tsft = le64_to_cpu(desc->tsft);
}

@@ -275,6 +280,11 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
agc = (flags2 >> 17) & 0x7F;

switch (priv->chip_family) {
+ case RTL818X_CHIP_FAMILY_RTL8187SE:
+ /* bias + BB gain + LNA gain */
+ agc = -4 + (agc & 0x1F) * 2 +
+ rtl8187se_lna_gain[(agc & 0x60) >> 5];
+ /* fall through */
case RTL818X_CHIP_FAMILY_RTL8185:
if (rx_status.rate_idx > 3)
signal = -clamp_t(u8, agc, 25, 90) - 9;
@@ -285,10 +295,6 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
sq = flags2 & 0xff;
signal = priv->rf->calc_rssi(agc, sq);
break;
- case RTL818X_CHIP_FAMILY_RTL8187SE:
- /* TODO: rtl8187se rssi */
- signal = 10;
- break;
}
rx_status.signal = signal;
rx_status.freq = dev->conf.chandef.chan->center_freq;
@@ -1819,7 +1825,7 @@ static int rtl8180_probe(struct pci_dev *pdev,
pci_try_set_mwi(pdev);
}

- if (priv->chip_family == RTL818X_CHIP_FAMILY_RTL8185)
+ if (priv->chip_family != RTL818X_CHIP_FAMILY_RTL8180)
dev->flags |= IEEE80211_HW_SIGNAL_DBM;
else
dev->flags |= IEEE80211_HW_SIGNAL_UNSPEC;
--
1.9.1