|
@@ -1298,11 +1298,6 @@ static void wma_update_peer_stats(tp_wma_handle wma,
|
|
|
node->rate_flags, node->nss,
|
|
|
classa_stats->max_pwr);
|
|
|
}
|
|
|
-
|
|
|
- if (node->fw_stats_set & FW_STATS_SET) {
|
|
|
- WMA_LOGD("<--STATS RSP VDEV_ID:%d", vdev_id);
|
|
|
- wma_post_stats(wma, node);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1331,6 +1326,107 @@ void wma_post_link_status(tAniGetLinkStatus *pGetLinkStatus,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * wma_update_per_chain_rssi_stats() - to store per chain rssi stats
|
|
|
+ * @wma: wma handle
|
|
|
+ * @rssi_stats: rssi stats
|
|
|
+ * @rssi_per_chain_stats: buffer where rssi stats to be stored
|
|
|
+ *
|
|
|
+ * This function stores per chain rssi stats received from fw for all vdevs for
|
|
|
+ * which the stats were requested into a csr stats structure.
|
|
|
+ *
|
|
|
+ * Return: void
|
|
|
+ */
|
|
|
+static void wma_update_per_chain_rssi_stats(tp_wma_handle wma,
|
|
|
+ wmi_rssi_stats *rssi_stats,
|
|
|
+ struct csr_per_chain_rssi_stats_info *rssi_per_chain_stats)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ int8_t bcn_snr, dat_snr;
|
|
|
+
|
|
|
+ for (i = 0; i < NUM_CHAINS_MAX; i++) {
|
|
|
+ bcn_snr = rssi_stats->rssi_avg_beacon[i];
|
|
|
+ dat_snr = rssi_stats->rssi_avg_data[i];
|
|
|
+ WMA_LOGD("chain %d beacon snr %d data snr %d",
|
|
|
+ i, bcn_snr, dat_snr);
|
|
|
+ if (dat_snr != WMA_TGT_INVALID_SNR)
|
|
|
+ rssi_per_chain_stats->rssi[i] = dat_snr;
|
|
|
+ else if (bcn_snr != WMA_TGT_INVALID_SNR)
|
|
|
+ rssi_per_chain_stats->rssi[i] = bcn_snr;
|
|
|
+ else
|
|
|
+ /*
|
|
|
+ * Firmware sends invalid snr till it sees
|
|
|
+ * Beacon/Data after connection since after
|
|
|
+ * vdev up fw resets the snr to invalid.
|
|
|
+ * In this duartion Host will return an invalid rssi
|
|
|
+ * value.
|
|
|
+ */
|
|
|
+ rssi_per_chain_stats->rssi[i] = WMA_TGT_RSSI_INVALID;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Get the absolute rssi value from the current rssi value the
|
|
|
+ * sinr value is hardcoded into 0 in the qcacld-new/CORE stack
|
|
|
+ */
|
|
|
+ rssi_per_chain_stats->rssi[i] += WMA_TGT_NOISE_FLOOR_DBM;
|
|
|
+ WMI_MAC_ADDR_TO_CHAR_ARRAY(&(rssi_stats->peer_macaddr),
|
|
|
+ rssi_per_chain_stats->peer_mac_addr);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * wma_update_rssi_stats() - to update rssi stats for all vdevs
|
|
|
+ * for which the stats were requested.
|
|
|
+ * @wma: wma handle
|
|
|
+ * @rssi_stats: rssi stats
|
|
|
+ *
|
|
|
+ * This function updates the rssi stats for all vdevs for which
|
|
|
+ * the stats were requested.
|
|
|
+ *
|
|
|
+ * Return: void
|
|
|
+ */
|
|
|
+static void wma_update_rssi_stats(tp_wma_handle wma,
|
|
|
+ wmi_rssi_stats *rssi_stats)
|
|
|
+{
|
|
|
+ tAniGetPEStatsRsp *stats_rsp_params;
|
|
|
+ struct csr_per_chain_rssi_stats_info *rssi_per_chain_stats = NULL;
|
|
|
+ struct wma_txrx_node *node;
|
|
|
+ uint8_t *stats_buf;
|
|
|
+ uint32_t temp_mask;
|
|
|
+ uint8_t vdev_id;
|
|
|
+
|
|
|
+ vdev_id = rssi_stats->vdev_id;
|
|
|
+ node = &wma->interfaces[vdev_id];
|
|
|
+ if (node->stats_rsp) {
|
|
|
+ node->fw_stats_set |= FW_RSSI_PER_CHAIN_STATS_SET;
|
|
|
+ WMA_LOGD("<-- FW RSSI PER CHAIN STATS received for vdevId:%d",
|
|
|
+ vdev_id);
|
|
|
+ stats_rsp_params = (tAniGetPEStatsRsp *) node->stats_rsp;
|
|
|
+ stats_buf = (uint8_t *) (stats_rsp_params + 1);
|
|
|
+ temp_mask = stats_rsp_params->statsMask;
|
|
|
+
|
|
|
+ if (temp_mask & (1 << eCsrSummaryStats))
|
|
|
+ stats_buf += sizeof(tCsrSummaryStatsInfo);
|
|
|
+ if (temp_mask & (1 << eCsrGlobalClassAStats))
|
|
|
+ stats_buf += sizeof(tCsrGlobalClassAStatsInfo);
|
|
|
+ if (temp_mask & (1 << eCsrGlobalClassBStats))
|
|
|
+ stats_buf += sizeof(tCsrGlobalClassBStatsInfo);
|
|
|
+ if (temp_mask & (1 << eCsrGlobalClassCStats))
|
|
|
+ stats_buf += sizeof(tCsrGlobalClassCStatsInfo);
|
|
|
+ if (temp_mask & (1 << eCsrGlobalClassDStats))
|
|
|
+ stats_buf += sizeof(tCsrGlobalClassDStatsInfo);
|
|
|
+ if (temp_mask & (1 << eCsrPerStaStats))
|
|
|
+ stats_buf += sizeof(tCsrPerStaStatsInfo);
|
|
|
+
|
|
|
+ if (temp_mask & (1 << csr_per_chain_rssi_stats)) {
|
|
|
+ rssi_per_chain_stats =
|
|
|
+ (struct csr_per_chain_rssi_stats_info *)stats_buf;
|
|
|
+ wma_update_per_chain_rssi_stats(wma, rssi_stats,
|
|
|
+ rssi_per_chain_stats);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* wma_link_status_event_handler() - link status event handler
|
|
|
* @handle: wma handle
|
|
@@ -1412,9 +1508,11 @@ int wma_stats_event_handler(void *handle, uint8_t *cmd_param_info,
|
|
|
wmi_pdev_stats *pdev_stats;
|
|
|
wmi_vdev_stats *vdev_stats;
|
|
|
wmi_peer_stats *peer_stats;
|
|
|
+ wmi_rssi_stats *rssi_stats;
|
|
|
+ wmi_per_chain_rssi_stats *rssi_event;
|
|
|
+ struct wma_txrx_node *node;
|
|
|
uint8_t i, *temp;
|
|
|
|
|
|
-
|
|
|
param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *) cmd_param_info;
|
|
|
if (!param_buf) {
|
|
|
WMA_LOGA("%s: Invalid stats event", __func__);
|
|
@@ -1450,6 +1548,34 @@ int wma_stats_event_handler(void *handle, uint8_t *cmd_param_info,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ rssi_event = (wmi_per_chain_rssi_stats *) param_buf->chain_stats;
|
|
|
+ if (rssi_event) {
|
|
|
+ if ((rssi_event->tlv_header & 0xFFFF0000) >> 16 ==
|
|
|
+ WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats) {
|
|
|
+ WMA_LOGD("%s: num_rssi_stats %u", __func__,
|
|
|
+ rssi_event->num_per_chain_rssi_stats);
|
|
|
+ if (rssi_event->num_per_chain_rssi_stats > 0) {
|
|
|
+ temp = (uint8_t *) rssi_event;
|
|
|
+ temp += sizeof(*rssi_event);
|
|
|
+ for (i = 0;
|
|
|
+ i < rssi_event->num_per_chain_rssi_stats;
|
|
|
+ i++) {
|
|
|
+ rssi_stats = (wmi_rssi_stats *)temp;
|
|
|
+ wma_update_rssi_stats(wma, rssi_stats);
|
|
|
+ temp += sizeof(wmi_rssi_stats);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < wma->max_bssid; i++) {
|
|
|
+ node = &wma->interfaces[i];
|
|
|
+ if (node->fw_stats_set & FW_PEER_STATS_SET) {
|
|
|
+ WMA_LOGD("<--STATS RSP VDEV_ID:%d", i);
|
|
|
+ wma_post_stats(wma, node);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
WMA_LOGI("%s: Exit", __func__);
|
|
|
return 0;
|
|
|
}
|
|
@@ -1880,6 +2006,10 @@ static tAniGetPEStatsRsp *wma_get_stats_rsp_buf
|
|
|
case eCsrPerStaStats:
|
|
|
len += sizeof(tCsrPerStaStatsInfo);
|
|
|
break;
|
|
|
+ case csr_per_chain_rssi_stats:
|
|
|
+ len +=
|
|
|
+ sizeof(struct csr_per_chain_rssi_stats_info);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|