qcacld-3.0: Support tx_bitrate for SON node info

tx_bitrate is used as indication of macThroughputCapacity in transmitter
link metric for backhaul STA link.

tx_bitrate is added in wlan_node_info structure and os_if interface is
exposed so that SON module could get the tx_bitrate parameter.

Change-Id: Ib9949906b3247519bf8c1ce786d6b93d38d4d8ea
CRs-Fixed: 3154548
This commit is contained in:
Jia Ding
2022-04-22 11:52:36 +08:00
committed by Madan Koyyalamudi
parent 0e0c2a645c
commit 0e8a200692
5 changed files with 109 additions and 63 deletions

View File

@@ -2276,9 +2276,36 @@ wlan_hdd_son_get_ieee_phymode(enum wlan_phymode wlan_phymode)
return wlanphymode2ieeephymode[wlan_phymode]; return wlanphymode2ieeephymode[wlan_phymode];
} }
static QDF_STATUS hdd_son_get_node_info(struct wlan_objmgr_vdev *vdev, static QDF_STATUS hdd_son_get_node_info_sta(struct wlan_objmgr_vdev *vdev,
uint8_t *mac_addr, uint8_t *mac_addr,
wlan_node_info *node_info) wlan_node_info *node_info)
{
struct hdd_adapter *adapter = wlan_hdd_get_adapter_from_objmgr(vdev);
struct hdd_station_ctx *sta_ctx;
struct hdd_context *hdd_ctx;
hdd_ctx = adapter->hdd_ctx;
if (wlan_hdd_validate_context(hdd_ctx))
return QDF_STATUS_E_FAILURE;
if (!hdd_cm_is_vdev_associated(adapter)) {
hdd_debug_rl("STA adapter not connected");
/* Still return success and framework will see default stats */
return QDF_STATUS_SUCCESS;
}
hdd_get_max_tx_bitrate(hdd_ctx, adapter);
sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
node_info->tx_bitrate = cfg80211_calculate_bitrate(
&sta_ctx->cache_conn_info.max_tx_bitrate);
hdd_debug("tx_bitrate %u", node_info->tx_bitrate);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS hdd_son_get_node_info_sap(struct wlan_objmgr_vdev *vdev,
uint8_t *mac_addr,
wlan_node_info *node_info)
{ {
struct hdd_adapter *adapter = wlan_hdd_get_adapter_from_objmgr(vdev); struct hdd_adapter *adapter = wlan_hdd_get_adapter_from_objmgr(vdev);
struct hdd_station_info *sta_info; struct hdd_station_info *sta_info;
@@ -2321,6 +2348,20 @@ static QDF_STATUS hdd_son_get_node_info(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
static QDF_STATUS hdd_son_get_node_info(struct wlan_objmgr_vdev *vdev,
uint8_t *mac_addr,
wlan_node_info *node_info)
{
struct hdd_adapter *adapter = wlan_hdd_get_adapter_from_objmgr(vdev);
if (adapter->device_mode == QDF_STA_MODE)
return hdd_son_get_node_info_sta(vdev, mac_addr, node_info);
else if (adapter->device_mode == QDF_SAP_MODE)
return hdd_son_get_node_info_sap(vdev, mac_addr, node_info);
else
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS hdd_son_get_peer_capability(struct wlan_objmgr_vdev *vdev, static QDF_STATUS hdd_son_get_peer_capability(struct wlan_objmgr_vdev *vdev,
struct wlan_objmgr_peer *peer, struct wlan_objmgr_peer *peer,
wlan_peer_cap *peer_cap) wlan_peer_cap *peer_cap)

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -442,65 +442,6 @@ fail:
return -EINVAL; return -EINVAL;
} }
/**
* hdd_get_max_tx_bitrate() - Get the max tx bitrate of the AP
* @hdd_ctx: hdd context
* @adapter: hostapd interface
*
* THis function gets the MAX supported rate by AP and cache
* it into connection info structure
*
* Return: None
*/
static void hdd_get_max_tx_bitrate(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter)
{
struct station_info sinfo;
enum tx_rate_info tx_rate_flags;
uint8_t tx_mcs_index, tx_nss = 1;
uint16_t my_tx_rate;
struct hdd_station_ctx *hdd_sta_ctx;
struct wlan_objmgr_vdev *vdev;
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
qdf_mem_zero(&sinfo, sizeof(struct station_info));
sinfo.signal = adapter->rssi;
tx_rate_flags = adapter->hdd_stats.class_a_stat.tx_rx_rate_flags;
tx_mcs_index = adapter->hdd_stats.class_a_stat.tx_mcs_index;
my_tx_rate = adapter->hdd_stats.class_a_stat.tx_rate;
if (!(tx_rate_flags & TX_RATE_LEGACY)) {
vdev = hdd_objmgr_get_vdev_by_user(adapter,
WLAN_OSIF_STATS_ID);
if (vdev) {
/*
* Take static NSS for reporting max rates.
* NSS from FW is not reliable as it changes
* as per the environment quality.
*/
tx_nss = wlan_vdev_mlme_get_nss(vdev);
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_STATS_ID);
} else {
tx_nss = adapter->hdd_stats.class_a_stat.tx_nss;
}
hdd_check_and_update_nss(hdd_ctx, &tx_nss, NULL);
if (tx_mcs_index == INVALID_MCS_IDX)
tx_mcs_index = 0;
}
if (hdd_report_max_rate(adapter, 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",
sinfo.txrate.flags, sinfo.txrate.mcs,
sinfo.txrate.nss, sinfo.txrate.bw);
}
}
/** /**
* hdd_add_sta_info() - add station info attribute * hdd_add_sta_info() - add station info attribute
* @skb: pointer to sk buff * @skb: pointer to sk buff

View File

@@ -5376,6 +5376,55 @@ static void wlan_hdd_fill_os_rate_info(enum tx_rate_info rate_flags,
os_rate->flags |= RATE_INFO_FLAGS_SHORT_GI; os_rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
} }
void hdd_get_max_tx_bitrate(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter)
{
struct station_info sinfo;
enum tx_rate_info tx_rate_flags;
uint8_t tx_mcs_index, tx_nss = 1;
uint16_t my_tx_rate;
struct hdd_station_ctx *hdd_sta_ctx;
struct wlan_objmgr_vdev *vdev;
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
qdf_mem_zero(&sinfo, sizeof(struct station_info));
sinfo.signal = adapter->rssi;
tx_rate_flags = adapter->hdd_stats.class_a_stat.tx_rx_rate_flags;
tx_mcs_index = adapter->hdd_stats.class_a_stat.tx_mcs_index;
my_tx_rate = adapter->hdd_stats.class_a_stat.tx_rate;
if (!(tx_rate_flags & TX_RATE_LEGACY)) {
vdev = hdd_objmgr_get_vdev_by_user(adapter,
WLAN_OSIF_STATS_ID);
if (vdev) {
/*
* Take static NSS for reporting max rates.
* NSS from FW is not reliable as it changes
* as per the environment quality.
*/
tx_nss = wlan_vdev_mlme_get_nss(vdev);
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_STATS_ID);
} else {
tx_nss = adapter->hdd_stats.class_a_stat.tx_nss;
}
hdd_check_and_update_nss(hdd_ctx, &tx_nss, NULL);
if (tx_mcs_index == INVALID_MCS_IDX)
tx_mcs_index = 0;
}
if (hdd_report_max_rate(adapter, 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",
sinfo.txrate.flags, sinfo.txrate.mcs,
sinfo.txrate.nss, sinfo.txrate.bw);
}
}
bool hdd_report_max_rate(struct hdd_adapter *adapter, bool hdd_report_max_rate(struct hdd_adapter *adapter,
mac_handle_t mac_handle, mac_handle_t mac_handle,
struct rate_info *rate, struct rate_info *rate,

View File

@@ -570,6 +570,19 @@ int wlan_hdd_get_temperature(struct hdd_adapter *adapter, int *temperature);
*/ */
void wlan_hdd_display_txrx_stats(struct hdd_context *hdd_ctx); void wlan_hdd_display_txrx_stats(struct hdd_context *hdd_ctx);
/**
* hdd_get_max_tx_bitrate() - Get the max tx bitrate of the AP
* @hdd_ctx: hdd context
* @adapter: hostapd interface
*
* THis function gets the MAX supported rate by AP and cache
* it into connection info structure
*
* Return: None
*/
void hdd_get_max_tx_bitrate(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter);
/** /**
* hdd_report_max_rate() - Fill the max rate stats in the station info structure * hdd_report_max_rate() - Fill the max rate stats in the station info structure
* to be sent to the userspace. * to be sent to the userspace.

View File

@@ -1783,6 +1783,8 @@ QDF_STATUS os_if_son_get_node_datarate_info(struct wlan_objmgr_vdev *vdev,
return status; return status;
} }
qdf_export_symbol(os_if_son_get_node_datarate_info);
uint32_t os_if_son_get_peer_max_mcs_idx(struct wlan_objmgr_vdev *vdev, uint32_t os_if_son_get_peer_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
struct wlan_objmgr_peer *peer) struct wlan_objmgr_peer *peer)
{ {