qcacld-3.0: Add rx rate info in connect_info debugfs

Currently in connect_info debugfs file, only tx rate info is presented.

Add rx_bit_rate to present rx rate info.

Change-Id: I24ceb287880a60896b49b69d40646b549fd9a3d1
CRs-Fixed: 2440285
This commit is contained in:
Rajeev Kumar Sirasanagandla 2019-04-30 23:36:24 +05:30 • committed by nshrivas
commit e709bca3e5
5 changed files with 111 additions and 92 deletions

View file

@ -156,6 +156,7 @@ struct hdd_conn_flag {
* @rate_flags: rate flags for current connection
* @freq: channel frequency
* @txrate: txrate structure holds nss & datarate info
* @rxrate: rx rate info
* @noise: holds noise information
* @ht_caps: holds ht capabilities info
* @vht_caps: holds vht capabilities info
@ -192,6 +193,7 @@ struct hdd_connection_info {
uint32_t rate_flags;
uint32_t freq;
struct rate_info txrate;
struct rate_info rxrate;
int8_t noise;
struct ieee80211_ht_cap ht_caps;
struct ieee80211_vht_cap vht_caps;

View file

@ -318,7 +318,7 @@ wlan_hdd_connect_info_debugfs(struct hdd_adapter *adapter, uint8_t *buf,
ssize_t length = 0;
struct hdd_station_ctx *hdd_sta_ctx;
struct hdd_connection_info *conn_info;
uint32_t bit_rate;
uint32_t tx_bit_rate, rx_bit_rate;
int ret_val;
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
@ -350,7 +350,8 @@ wlan_hdd_connect_info_debugfs(struct hdd_adapter *adapter, uint8_t *buf,
}
conn_info = &hdd_sta_ctx->conn_info;
bit_rate = cfg80211_calculate_bitrate(&conn_info->txrate);
tx_bit_rate = cfg80211_calculate_bitrate(&conn_info->txrate);
rx_bit_rate = cfg80211_calculate_bitrate(&conn_info->rxrate);
if (length >= buf_avail_len) {
hdd_err("No sufficient buf_avail_len");
@ -364,7 +365,8 @@ wlan_hdd_connect_info_debugfs(struct hdd_adapter *adapter, uint8_t *buf,
"freq = %u\n"
"ch_width = %s\n"
"signal = %ddBm\n"
"bit_rate = %u\n"
"tx_bit_rate = %u\n"
"rx_bit_rate = %u\n"
"last_auth_type = %s\n"
"dot11mode = %s\n",
conn_info->last_ssid.SSID.ssId,
@ -374,7 +376,8 @@ wlan_hdd_connect_info_debugfs(struct hdd_adapter *adapter, uint8_t *buf,
conn_info->freq,
hdd_ch_width_str(conn_info->ch_width),
conn_info->signal,
bit_rate,
tx_bit_rate,
rx_bit_rate,
hdd_auth_type_str(conn_info->last_auth_type),
hdd_dot11_mode_str(conn_info->dot11mode));

View file

@ -406,8 +406,8 @@ static void hdd_get_max_tx_bitrate(struct hdd_context *hdd_ctx,
tx_nss--;
}
}
if (hdd_report_max_rate(hdd_ctx->mac_handle, &sinfo,
tx_rate_flags, tx_mcs_index,
if (hdd_report_max_rate(hdd_ctx->mac_handle, &sinfo.txrate,
sinfo.signal, tx_rate_flags, tx_mcs_index,
my_tx_rate, tx_nss)) {
hdd_sta_ctx->cache_conn_info.max_tx_bitrate = sinfo.txrate;
hdd_debug("Reporting max tx rate flags %d mcs %d nss %d bw %d",

View file

@ -3935,11 +3935,12 @@ static int wlan_hdd_get_station_remote(struct wiphy *wiphy,
return status;
}
int hdd_report_max_rate(mac_handle_t mac_handle,
struct station_info *sinfo,
uint8_t tx_rate_flags,
uint8_t tx_mcs_index,
uint16_t my_tx_rate, uint8_t tx_nss)
bool hdd_report_max_rate(mac_handle_t mac_handle,
struct rate_info *rate,
int8_t signal,
uint8_t rate_flags,
uint8_t mcs_index,
uint16_t fw_rate, uint8_t nss)
{
uint8_t i, j, rssidx;
uint16_t max_rate = 0;
@ -3968,7 +3969,7 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
if (!hdd_ctx) {
hdd_err("HDD context is NULL");
return QDF_STATUS_E_FAILURE;
return false;
}
ucfg_mlme_stats_get_cfg_values(hdd_ctx->psoc,
@ -3984,13 +3985,13 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
} else if (ucfg_mlme_stats_is_link_speed_report_max_scaled(
hdd_ctx->psoc)) {
/* report the max possible speed with RSSI scaling */
if (sinfo->signal >= link_speed_rssi_high) {
if (signal >= link_speed_rssi_high) {
/* report the max possible speed */
rssidx = 0;
} else if (sinfo->signal >= link_speed_rssi_mid) {
} else if (signal >= link_speed_rssi_mid) {
/* report middle speed */
rssidx = 1;
} else if (sinfo->signal >= link_speed_rssi_low) {
} else if (signal >= link_speed_rssi_low) {
/* report middle speed */
rssidx = 2;
} else {
@ -4011,7 +4012,7 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
operational_rates, &or_leng)) {
hdd_err("cfg get returned failure");
/*To keep GUI happy */
return 0;
return false;
}
for (i = 0; i < or_leng; i++) {
@ -4036,7 +4037,7 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
&er_leng)) {
hdd_err("cfg get returned failure");
/*To keep GUI happy */
return 0;
return false;
}
for (i = 0; i < er_leng; i++) {
@ -4055,30 +4056,30 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
* Only if we are connected in non legacy mode and not reporting
* actual speed
*/
if ((3 != rssidx) && !(tx_rate_flags & TX_RATE_LEGACY)) {
if ((3 != rssidx) && !(rate_flags & TX_RATE_LEGACY)) {
if (0 != ucfg_mlme_get_current_mcs_set(hdd_ctx->psoc,
mcs_rates,
&mcs_leng)) {
hdd_err("cfg get returned failure");
/*To keep GUI happy */
return 0;
return false;
}
rate_flag = 0;
supported_vht_mcs_rate = (struct index_vht_data_rate_type *)
((tx_nss == 1) ?
((nss == 1) ?
&supported_vht_mcs_rate_nss1 :
&supported_vht_mcs_rate_nss2);
if (tx_rate_flags & TX_RATE_VHT80)
if (rate_flags & TX_RATE_VHT80)
mode = 2;
else if ((tx_rate_flags & TX_RATE_VHT40) ||
(tx_rate_flags & TX_RATE_HT40))
else if ((rate_flags & TX_RATE_VHT40) ||
(rate_flags & TX_RATE_HT40))
mode = 1;
else
mode = 0;
/* VHT80 rate has separate rate table */
if (tx_rate_flags & (TX_RATE_VHT20 | TX_RATE_VHT40 |
if (rate_flags & (TX_RATE_VHT20 | TX_RATE_VHT40 |
TX_RATE_VHT80)) {
stat = ucfg_mlme_cfg_get_vht_tx_mcs_map(hdd_ctx->psoc,
&vht_mcs_map);
@ -4086,7 +4087,7 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
hdd_err("failed to get tx_mcs_map");
vht_max_mcs = (enum data_rate_11ac_max_mcs)
(vht_mcs_map & DATA_RATE_11AC_MCS_MASK);
if (tx_rate_flags & TX_RATE_SGI)
if (rate_flags & TX_RATE_SGI)
rate_flag |= 1;
if (DATA_RATE_11AC_MAX_MCS_7 == vht_max_mcs) {
@ -4099,31 +4100,30 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
if (rssidx != 0) {
for (i = 0; i <= max_mcs_idx; i++) {
if (sinfo->signal <=
rssi_mcs_tbl[mode][i]) {
if (signal <= rssi_mcs_tbl[mode][i]) {
max_mcs_idx = i;
break;
}
}
}
if (tx_rate_flags & TX_RATE_VHT80) {
if (rate_flags & TX_RATE_VHT80) {
current_rate =
supported_vht_mcs_rate[tx_mcs_index].
supported_vht_mcs_rate[mcs_index].
supported_VHT80_rate[rate_flag];
max_rate =
supported_vht_mcs_rate[max_mcs_idx].
supported_VHT80_rate[rate_flag];
} else if (tx_rate_flags & TX_RATE_VHT40) {
} else if (rate_flags & TX_RATE_VHT40) {
current_rate =
supported_vht_mcs_rate[tx_mcs_index].
supported_vht_mcs_rate[mcs_index].
supported_VHT40_rate[rate_flag];
max_rate =
supported_vht_mcs_rate[max_mcs_idx].
supported_VHT40_rate[rate_flag];
} else if (tx_rate_flags & TX_RATE_VHT20) {
} else if (rate_flags & TX_RATE_VHT20) {
current_rate =
supported_vht_mcs_rate[tx_mcs_index].
supported_vht_mcs_rate[mcs_index].
supported_VHT20_rate[rate_flag];
max_rate =
supported_vht_mcs_rate[max_mcs_idx].
@ -4135,22 +4135,20 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
max_rate = current_rate;
} else {
if (tx_rate_flags & TX_RATE_HT40)
if (rate_flags & TX_RATE_HT40)
rate_flag |= 1;
if (tx_rate_flags & TX_RATE_SGI)
if (rate_flags & TX_RATE_SGI)
rate_flag |= 2;
supported_mcs_rate =
(struct index_data_rate_type *)
((tx_nss ==
1) ? &supported_mcs_rate_nss1 :
((nss == 1) ? &supported_mcs_rate_nss1 :
&supported_mcs_rate_nss2);
max_ht_idx = MAX_HT_MCS_IDX;
if (rssidx != 0) {
for (i = 0; i < MAX_HT_MCS_IDX; i++) {
if (sinfo->signal <=
rssi_mcs_tbl[mode][i]) {
if (signal <= rssi_mcs_tbl[mode][i]) {
max_ht_idx = i + 1;
break;
}
@ -4179,67 +4177,64 @@ int hdd_report_max_rate(mac_handle_t mac_handle,
}
max_speed_mcs = 1;
}
if (tx_nss == 2)
if (nss == 2)
max_mcs_idx += MAX_HT_MCS_IDX;
}
}
else if (!(tx_rate_flags & TX_RATE_LEGACY)) {
max_rate = my_tx_rate;
else if (!(rate_flags & TX_RATE_LEGACY)) {
max_rate = fw_rate;
max_speed_mcs = 1;
max_mcs_idx = tx_mcs_index;
max_mcs_idx = mcs_index;
}
/* report a value at least as big as current rate */
if ((max_rate < my_tx_rate) || (0 == max_rate)) {
max_rate = my_tx_rate;
if (tx_rate_flags & TX_RATE_LEGACY) {
if ((max_rate < fw_rate) || (0 == max_rate)) {
max_rate = fw_rate;
if (rate_flags & TX_RATE_LEGACY) {
max_speed_mcs = 0;
} else {
max_speed_mcs = 1;
max_mcs_idx = tx_mcs_index;
max_mcs_idx = mcs_index;
}
}
if (tx_rate_flags & TX_RATE_LEGACY) {
sinfo->txrate.legacy = max_rate;
if (rate_flags & TX_RATE_LEGACY) {
rate->legacy = max_rate;
hdd_info("Reporting legacy rate %d",
sinfo->txrate.legacy);
hdd_info("Reporting legacy rate %d", rate->legacy);
} else {
sinfo->txrate.mcs = max_mcs_idx;
sinfo->txrate.nss = tx_nss;
if (tx_rate_flags & TX_RATE_VHT80)
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_80);
else if (tx_rate_flags & TX_RATE_VHT40)
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_40);
else if (tx_rate_flags & TX_RATE_VHT20)
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_20);
rate->mcs = max_mcs_idx;
rate->nss = nss;
if (rate_flags & TX_RATE_VHT80)
hdd_set_rate_bw(rate, HDD_RATE_BW_80);
else if (rate_flags & TX_RATE_VHT40)
hdd_set_rate_bw(rate, HDD_RATE_BW_40);
else if (rate_flags & TX_RATE_VHT20)
hdd_set_rate_bw(rate, HDD_RATE_BW_20);
if (tx_rate_flags &
if (rate_flags &
(TX_RATE_HT20 | TX_RATE_HT40)) {
sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
if (tx_rate_flags & TX_RATE_HT40)
hdd_set_rate_bw(&sinfo->txrate,
rate->flags |= RATE_INFO_FLAGS_MCS;
if (rate_flags & TX_RATE_HT40)
hdd_set_rate_bw(rate,
HDD_RATE_BW_40);
else if (tx_rate_flags & TX_RATE_HT20)
hdd_set_rate_bw(&sinfo->txrate,
else if (rate_flags & TX_RATE_HT20)
hdd_set_rate_bw(rate,
HDD_RATE_BW_20);
} else {
sinfo->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
rate->flags |= RATE_INFO_FLAGS_VHT_MCS;
}
if (tx_rate_flags & TX_RATE_SGI) {
if (!
(sinfo->txrate.
flags & RATE_INFO_FLAGS_VHT_MCS))
sinfo->txrate.flags |=
RATE_INFO_FLAGS_MCS;
sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
if (rate_flags & TX_RATE_SGI) {
if (!(rate->flags & RATE_INFO_FLAGS_VHT_MCS))
rate->flags |= RATE_INFO_FLAGS_MCS;
rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
}
linkspeed_dbg("Reporting MCS rate %d flags %x\n",
sinfo->txrate.mcs, sinfo->txrate.flags);
rate->mcs, rate->flags);
}
return 1;
return true;
}
/**
@ -4519,12 +4514,26 @@ static int wlan_hdd_get_sta_stats(struct wiphy *wiphy,
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_20);
if (!ucfg_mlme_stats_is_link_speed_report_actual(hdd_ctx->psoc)) {
if (!hdd_report_max_rate(mac_handle, sinfo,
tx_rate_flags, tx_mcs_index,
my_tx_rate, tx_nss)) {
bool tx_rate_calc;
bool rx_rate_calc;
tx_rate_calc = hdd_report_max_rate(mac_handle, &sinfo->txrate,
sinfo->signal,
tx_rate_flags,
tx_mcs_index,
my_tx_rate,
tx_nss);
rx_rate_calc = hdd_report_max_rate(mac_handle, &sinfo->rxrate,
sinfo->signal,
rx_rate_flags,
rx_mcs_index,
my_rx_rate,
rx_nss);
if (!tx_rate_calc || !rx_rate_calc)
/* Keep GUI happy */
return 0;
}
} else {
/* Fill TX stats */
@ -4548,6 +4557,9 @@ static int wlan_hdd_get_sta_stats(struct wiphy *wiphy,
qdf_mem_copy(&sta_ctx->cache_conn_info.txrate,
&sinfo->txrate, sizeof(sinfo->txrate));
qdf_mem_copy(&sta_ctx->conn_info.rxrate,
&sinfo->rxrate, sizeof(sinfo->rxrate));
sinfo->filled |= HDD_INFO_TX_BITRATE |
HDD_INFO_RX_BITRATE |
HDD_INFO_TX_BYTES |

View file

@ -470,18 +470,20 @@ void wlan_hdd_display_txrx_stats(struct hdd_context *hdd_ctx);
* to be sent to the userspace.
*
* @mac_handle: The mac handle
* @sinfo: The station_info struct to be filled
* @tx_rate_flags: The TX rate flags computed from tx rate
* @tx_mcs_index; The TX mcs index computed from tx rate
* @my_tx_rate: The tx_rate from fw stats
* @tx_nss: The TX NSS from fw stats
* @rate: The station_info tx/rx rate to be filled
* @signal: signal from station_info
* @rate_flags: TX/RX rate flags computed from tx/rx rate
* @mcs_index; The TX/RX mcs index computed from tx/rx rate
* @fw_rate: The tx/rx rate from fw stats
* @nss: The TX/RX NSS from fw stats
*
* Return: 0 for success
* Return: True if fill is successful
*/
int hdd_report_max_rate(mac_handle_t mac_handle,
struct station_info *sinfo,
uint8_t tx_rate_flags,
uint8_t tx_mcs_index,
uint16_t my_tx_rate, uint8_t tx_nss);
bool hdd_report_max_rate(mac_handle_t mac_handle,
struct rate_info *rate,
int8_t signal,
uint8_t rate_flags,
uint8_t mcs_index,
uint16_t fw_rate, uint8_t nss);
#endif /* end #if !defined(WLAN_HDD_STATS_H) */