wil6210: support FW RSSI reporting
authorDedy Lansky <qca_dlansky@qca.qualcomm.com>
Tue, 8 Aug 2017 11:16:43 +0000 (14:16 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 8 Aug 2017 18:43:51 +0000 (21:43 +0300)
New FW supports reporting RSSI signal in dBm.
Report RSSI to kernel in case FW has this capability.

Signed-off-by: Dedy Lansky <qca_dlansky@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/cfg80211.c
drivers/net/wireless/ath/wil6210/debugfs.c
drivers/net/wireless/ath/wil6210/pcie_bus.c
drivers/net/wireless/ath/wil6210/wmi.c
drivers/net/wireless/ath/wil6210/wmi.h

index 77af7492420df62e6121d8c16b499a0a57685c07..5cd91145c079b3059fff80305b5104514bc96bc5 100644 (file)
@@ -273,12 +273,12 @@ int wil_cid_fill_sinfo(struct wil6210_priv *wil, int cid,
 
        wil_dbg_wmi(wil, "Link status for CID %d: {\n"
                    "  MCS %d TSF 0x%016llx\n"
-                   "  BF status 0x%08x SNR 0x%08x SQI %d%%\n"
+                   "  BF status 0x%08x RSSI %d SQI %d%%\n"
                    "  Tx Tpt %d goodput %d Rx goodput %d\n"
                    "  Sectors(rx:tx) my %d:%d peer %d:%d\n""}\n",
                    cid, le16_to_cpu(reply.evt.bf_mcs),
                    le64_to_cpu(reply.evt.tsf), reply.evt.status,
-                   le32_to_cpu(reply.evt.snr_val),
+                   reply.evt.rssi,
                    reply.evt.sqi,
                    le32_to_cpu(reply.evt.tx_tpt),
                    le32_to_cpu(reply.evt.tx_goodput),
@@ -311,7 +311,11 @@ int wil_cid_fill_sinfo(struct wil6210_priv *wil, int cid,
 
        if (test_bit(wil_status_fwconnected, wil->status)) {
                sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
-               sinfo->signal = reply.evt.sqi;
+               if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING,
+                            wil->fw_capabilities))
+                       sinfo->signal = reply.evt.rssi;
+               else
+                       sinfo->signal = reply.evt.sqi;
        }
 
        return rc;
@@ -1794,7 +1798,7 @@ static void wil_wiphy_init(struct wiphy *wiphy)
 
        wiphy->bands[NL80211_BAND_60GHZ] = &wil_band_60ghz;
 
-       /* TODO: figure this out */
+       /* may change after reading FW capabilities */
        wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC;
 
        wiphy->cipher_suites = wil_cipher_suites;
index a2b5d595aa1911cb0b9217f6a87336f8c30aab1c..21b661158b1a588fbf3166b4e422622f882a846b 100644 (file)
@@ -1016,6 +1016,7 @@ static int wil_bf_debugfs_show(struct seq_file *s, void *data)
                           "  TSF = 0x%016llx\n"
                           "  TxMCS = %2d TxTpt = %4d\n"
                           "  SQI = %4d\n"
+                          "  RSSI = %4d\n"
                           "  Status = 0x%08x %s\n"
                           "  Sectors(rx:tx) my %2d:%2d peer %2d:%2d\n"
                           "  Goodput(rx:tx) %4d:%4d\n"
@@ -1025,6 +1026,7 @@ static int wil_bf_debugfs_show(struct seq_file *s, void *data)
                           le16_to_cpu(reply.evt.bf_mcs),
                           le32_to_cpu(reply.evt.tx_tpt),
                           reply.evt.sqi,
+                          reply.evt.rssi,
                           status, wil_bfstatus_str(status),
                           le16_to_cpu(reply.evt.my_rx_sector),
                           le16_to_cpu(reply.evt.my_tx_sector),
index d571feb2370e035178c52ec391f14c5668171915..6a3ab4bf916dd85a38a8f47243478b4ea12c3ea1 100644 (file)
@@ -84,6 +84,9 @@ void wil_set_capabilities(struct wil6210_priv *wil)
 
        /* extract FW capabilities from file without loading the FW */
        wil_request_firmware(wil, wil->wil_fw_name, false);
+
+       if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING, wil->fw_capabilities))
+               wil_to_wiphy(wil)->signal_type = CFG80211_SIGNAL_TYPE_MBM;
 }
 
 void wil_disable_irq(struct wil6210_priv *wil)
index 65ef67321fc0a54978d168c0902f978fa2ce4912..a9487f2b8d60848af49b52d6e503627d320206e7 100644 (file)
@@ -381,12 +381,15 @@ static void wmi_evt_rx_mgmt(struct wil6210_priv *wil, int id, void *d, int len)
        ch_no = data->info.channel + 1;
        freq = ieee80211_channel_to_frequency(ch_no, NL80211_BAND_60GHZ);
        channel = ieee80211_get_channel(wiphy, freq);
-       signal = data->info.sqi;
+       if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING, wil->fw_capabilities))
+               signal = 100 * data->info.rssi;
+       else
+               signal = data->info.sqi;
        d_status = le16_to_cpu(data->info.status);
        fc = rx_mgmt_frame->frame_control;
 
-       wil_dbg_wmi(wil, "MGMT Rx: channel %d MCS %d SNR %d SQI %d%%\n",
-                   data->info.channel, data->info.mcs, data->info.snr,
+       wil_dbg_wmi(wil, "MGMT Rx: channel %d MCS %d RSSI %d SQI %d%%\n",
+                   data->info.channel, data->info.mcs, data->info.rssi,
                    data->info.sqi);
        wil_dbg_wmi(wil, "status 0x%04x len %d fc 0x%04x\n", d_status, d_len,
                    le16_to_cpu(fc));
index 256f63c57da0b7b16a4e03ea9d9c9b30c73bb2a8..4e31c2fd1fc66b334eed44883930fab9be1896e8 100644 (file)
@@ -60,6 +60,7 @@ enum wmi_fw_capability {
        WMI_FW_CAPABILITY_WMI_ONLY              = 5,
        WMI_FW_CAPABILITY_THERMAL_THROTTLING    = 7,
        WMI_FW_CAPABILITY_D3_SUSPEND            = 8,
+       WMI_FW_CAPABILITY_RSSI_REPORTING        = 12,
        WMI_FW_CAPABILITY_MAX,
 };
 
@@ -1306,7 +1307,8 @@ struct wmi_notify_req_done_event {
        /* beamforming status, 0: fail; 1: OK; 2: retrying */
        __le32 status;
        __le64 tsf;
-       __le32 snr_val;
+       s8 rssi;
+       u8 reserved0[3];
        __le32 tx_tpt;
        __le32 tx_goodput;
        __le32 rx_goodput;
@@ -1602,7 +1604,7 @@ struct wmi_get_ssid_event {
 /* wmi_rx_mgmt_info */
 struct wmi_rx_mgmt_info {
        u8 mcs;
-       s8 snr;
+       s8 rssi;
        u8 range;
        u8 sqi;
        __le16 stype;