qcacld-3.0: Update linkspeed state to F/W for roaming protocol part
To avoid unmeaningful roaming, when low RSSI trigger, only roam when rx linkspeed is also bad. Steps: 1. F/W indicates feature supported by: wmi_service_linkspeed_roam_trigger_support 2. App sets vdev rx link speed threshold by vendor cmd. 3. Bus_bw_work gets rx link speed from data path periodically. 4. If found rx link speed change from good to poor, or poor to good, send to F/W. 5. F/W low rssi roaming is triggered only when both RSSI and link speed are poor. Change-Id: I56829e42b26e407dd8e989a870aee2b3ea406232 CRs-Fixed: 3261996
Цей коміт міститься в:

зафіксовано
Madan Koyyalamudi

джерело
ebfe40c98a
коміт
5a9556bf4b
@@ -29,6 +29,7 @@
|
||||
#include "wlan_mlme_main.h"
|
||||
#include "wlan_mlme_api.h"
|
||||
#include "wlan_reg_ucfg_api.h"
|
||||
#include "wlan_cm_tgt_if_tx_api.h"
|
||||
|
||||
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
/**
|
||||
@@ -840,6 +841,48 @@ QDF_STATUS wlan_cm_set_roam_band_bitmask(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
uint32_t roam_band_bitmask);
|
||||
|
||||
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
|
||||
/**
|
||||
* struct link_speed_cfg - link speed state config
|
||||
* @psoc: pointer to psoc
|
||||
* @vdev_id: vdev id
|
||||
* @is_link_speed_good: true means link speed good, false means bad
|
||||
*/
|
||||
struct roam_link_speed_cfg {
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
uint8_t vdev_id;
|
||||
uint8_t is_link_speed_good;
|
||||
};
|
||||
|
||||
/**
|
||||
* wlan_cm_send_roam_linkspeed_state() - Send link speed state to target
|
||||
* @msg: Pointer to schedule message
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS wlan_cm_send_roam_linkspeed_state(struct scheduler_msg *msg);
|
||||
|
||||
/**
|
||||
* wlan_cm_roam_link_speed_update() - Update link speed state for roaming
|
||||
* @psoc: psoc pointer
|
||||
* @vdev_id: vdev id
|
||||
* @is_link_speed_good: true means link speed good, false means bad
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void wlan_cm_roam_link_speed_update(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
bool is_link_speed_good);
|
||||
|
||||
/**
|
||||
* wlan_mlme_is_linkspeed_roam_trigger_supported() - Get roam linkspeed check
|
||||
* @psoc: pointer to psoc object
|
||||
*
|
||||
* Return: bool, true: Linkspeed check for low rssi roaming supported
|
||||
*/
|
||||
bool wlan_cm_is_linkspeed_roam_trigger_supported(struct wlan_objmgr_psoc *psoc);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_cm_set_roam_band_update() - send rso update on set band
|
||||
* @psoc: psoc pointer
|
||||
|
@@ -2293,6 +2293,7 @@ struct roam_pmkid_req_event {
|
||||
* @send_roam_abort: send roam abort
|
||||
* @send_roam_disable_config: send roam disable config
|
||||
* @send_roam_rt_stats_config: Send roam events vendor command param value to FW
|
||||
* @send_roam_linkspeed_state: Send roam link speed good/poor state to FW
|
||||
* @send_roam_vendor_handoff_config: send vendor handoff config command to FW
|
||||
*/
|
||||
struct wlan_cm_roam_tx_ops {
|
||||
@@ -2324,6 +2325,10 @@ struct wlan_cm_roam_tx_ops {
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
QDF_STATUS (*send_roam_rt_stats_config)(struct wlan_objmgr_vdev *vdev,
|
||||
uint8_t vdev_id, uint8_t value);
|
||||
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
|
||||
QDF_STATUS (*send_roam_linkspeed_state)(struct wlan_objmgr_vdev *vdev,
|
||||
uint8_t vdev_id, bool value);
|
||||
#endif
|
||||
#endif
|
||||
#ifdef WLAN_VENDOR_HANDOFF_CONTROL
|
||||
QDF_STATUS (*send_roam_vendor_handoff_config)(
|
||||
|
@@ -126,6 +126,38 @@ ucfg_cm_update_session_assoc_ie(struct wlan_objmgr_psoc *psoc,
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
|
||||
/**
|
||||
* ucfg_cm_roam_link_speed_update() - Update link speed state for roaming
|
||||
* @psoc: psoc pointer
|
||||
* @vdev_id: vdev id
|
||||
* @is_link_speed_good: true means link speed good, false means bad
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static inline
|
||||
void ucfg_cm_roam_link_speed_update(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
bool is_link_speed_good)
|
||||
{
|
||||
wlan_cm_roam_link_speed_update(psoc,
|
||||
vdev_id,
|
||||
is_link_speed_good);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucfg_mlme_is_linkspeed_roam_trigger_supported() - Get roam linkspeed check
|
||||
* @psoc: pointer to psoc object
|
||||
*
|
||||
* Return: bool, true: Linkspeed check for low rssi roaming supported
|
||||
*/
|
||||
static inline bool
|
||||
ucfg_cm_is_linkspeed_roam_trigger_supported(struct wlan_objmgr_psoc *psoc)
|
||||
{
|
||||
return wlan_cm_is_linkspeed_roam_trigger_supported(psoc);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline QDF_STATUS
|
||||
ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
|
@@ -48,6 +48,19 @@ wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
|
||||
*/
|
||||
QDF_STATUS wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
|
||||
struct roam_disable_cfg *req);
|
||||
|
||||
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
|
||||
/**
|
||||
* wlan_cm_tgt_send_roam_linkspeed_state() - Send roam link speed state
|
||||
* command to FW
|
||||
* @psoc: psoc pointer
|
||||
* @req: roam stats config parameter
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS wlan_cm_tgt_send_roam_linkspeed_state(struct wlan_objmgr_psoc *psoc,
|
||||
struct roam_disable_cfg *req);
|
||||
#endif
|
||||
#else
|
||||
static inline QDF_STATUS
|
||||
wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc,
|
||||
@@ -62,6 +75,7 @@ wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
|
||||
{
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
|
||||
|
||||
#ifdef WLAN_VENDOR_HANDOFF_CONTROL
|
||||
|
@@ -35,6 +35,7 @@
|
||||
#include <../../core/src/wlan_cm_roam_i.h>
|
||||
#include "wlan_reg_ucfg_api.h"
|
||||
#include "wlan_connectivity_logging.h"
|
||||
#include "target_if.h"
|
||||
|
||||
/* Support for "Fast roaming" (i.e., ESE, LFR, or 802.11r.) */
|
||||
#define BG_SCAN_OCCUPIED_CHANNEL_LIST_LEN 15
|
||||
@@ -316,6 +317,70 @@ bool wlan_cm_same_band_sta_allowed(struct wlan_objmgr_psoc *psoc)
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
|
||||
QDF_STATUS wlan_cm_send_roam_linkspeed_state(struct scheduler_msg *msg)
|
||||
{
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
struct roam_link_speed_cfg *link_speed_cfg;
|
||||
struct roam_disable_cfg roam_link_speed_cfg;
|
||||
|
||||
if (!msg || !msg->bodyptr)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
link_speed_cfg = msg->bodyptr;
|
||||
roam_link_speed_cfg.vdev_id = link_speed_cfg->vdev_id;
|
||||
roam_link_speed_cfg.cfg = link_speed_cfg->is_link_speed_good;
|
||||
status = wlan_cm_tgt_send_roam_linkspeed_state(link_speed_cfg->psoc,
|
||||
&roam_link_speed_cfg);
|
||||
qdf_mem_free(link_speed_cfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void wlan_cm_roam_link_speed_update(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
bool is_link_speed_good)
|
||||
{
|
||||
QDF_STATUS qdf_status;
|
||||
struct scheduler_msg msg = {0};
|
||||
struct roam_link_speed_cfg *link_speed_cfg;
|
||||
|
||||
link_speed_cfg = qdf_mem_malloc(sizeof(*link_speed_cfg));
|
||||
if (!link_speed_cfg)
|
||||
return;
|
||||
|
||||
link_speed_cfg->psoc = psoc;
|
||||
link_speed_cfg->vdev_id = vdev_id;
|
||||
link_speed_cfg->is_link_speed_good = is_link_speed_good;
|
||||
|
||||
msg.bodyptr = link_speed_cfg;
|
||||
msg.callback = wlan_cm_send_roam_linkspeed_state;
|
||||
|
||||
qdf_status = scheduler_post_message(QDF_MODULE_ID_MLME,
|
||||
QDF_MODULE_ID_OS_IF,
|
||||
QDF_MODULE_ID_OS_IF, &msg);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(qdf_status)) {
|
||||
mlme_err("post msg failed");
|
||||
qdf_mem_free(link_speed_cfg);
|
||||
}
|
||||
}
|
||||
|
||||
bool wlan_cm_is_linkspeed_roam_trigger_supported(struct wlan_objmgr_psoc *psoc)
|
||||
{
|
||||
struct wmi_unified *wmi_handle;
|
||||
|
||||
wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
|
||||
if (!wmi_handle) {
|
||||
mlme_debug("Invalid WMI handle");
|
||||
return false;
|
||||
}
|
||||
|
||||
return wmi_service_enabled(wmi_handle,
|
||||
wmi_service_linkspeed_roam_trigger_support);
|
||||
}
|
||||
#endif
|
||||
|
||||
QDF_STATUS
|
||||
wlan_cm_fw_roam_abort_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
|
||||
{
|
||||
|
@@ -206,6 +206,39 @@ QDF_STATUS wlan_cm_tgt_send_roam_rt_stats_config(struct wlan_objmgr_psoc *psoc,
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
|
||||
QDF_STATUS wlan_cm_tgt_send_roam_linkspeed_state(struct wlan_objmgr_psoc *psoc,
|
||||
struct roam_disable_cfg *req)
|
||||
{
|
||||
QDF_STATUS status;
|
||||
struct wlan_cm_roam_tx_ops *roam_tx_ops;
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, req->vdev_id,
|
||||
WLAN_MLME_NB_ID);
|
||||
if (!vdev)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
roam_tx_ops = wlan_cm_roam_get_tx_ops_from_vdev(vdev);
|
||||
if (!roam_tx_ops || !roam_tx_ops->send_roam_linkspeed_state) {
|
||||
mlme_err("vdev %d send_roam_linkspeed_state is NULL",
|
||||
req->vdev_id);
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
status = roam_tx_ops->send_roam_linkspeed_state(vdev,
|
||||
req->vdev_id, req->cfg);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
mlme_debug("vdev %d fail to send roam linkspeed state",
|
||||
req->vdev_id);
|
||||
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
|
||||
|
||||
return status;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_VENDOR_HANDOFF_CONTROL
|
||||
|
Посилання в новій задачі
Заблокувати користувача