qcacld-3.0: Update linkspeed state to F/W for roaming hdd 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: I38c60c55cca80ad9c71fcffda6712ac5984daef0
CRs-Fixed: 3264981
This commit is contained in:
Jianmin Zhu
2022-08-10 19:12:05 +08:00
committed by Madan Koyyalamudi
parent 75fcd4dc84
commit ebfe40c98a
3 changed files with 80 additions and 0 deletions

View File

@@ -4680,4 +4680,25 @@ hdd_is_dynamic_set_mac_addr_allowed(struct hdd_adapter *adapter)
}
#endif /* WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE */
#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && \
defined(FEATURE_RX_LINKSPEED_ROAM_TRIGGER)
/**
* wlan_hdd_link_speed_update() - Update link speed to F/W
* @psoc: pointer to soc
* @vdev_id: Vdev ID
* @is_link_speed_good: true means good link speed, false means bad link speed
*
* Return: None
*/
void wlan_hdd_link_speed_update(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
bool is_link_speed_good);
#else
static inline void wlan_hdd_link_speed_update(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
bool is_link_speed_good)
{}
#endif
#endif /* end #if !defined(WLAN_HDD_MAIN_H) */

View File

@@ -5006,6 +5006,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = {
[QCA_ATTR_ROAM_CONTROL_USER_REASON] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_BAND_MASK] = {.type = NLA_U32},
[QCA_ATTR_ROAM_CONTROL_RX_LINKSPEED_THRESHOLD] = {.type = NLA_U16},
};
/**
@@ -5398,6 +5399,44 @@ hdd_send_roam_scan_period_to_sme(struct hdd_context *hdd_ctx,
return status;
}
#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && \
defined(FEATURE_RX_LINKSPEED_ROAM_TRIGGER)
/**
* hdd_set_roam_rx_linkspeed_threshold() - Set rx link speed threshold
* @psoc: Pointer to psoc
* @vdev_id: vdev id
*
* Return: none
*/
static QDF_STATUS
hdd_set_roam_rx_linkspeed_threshold(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev,
uint32_t linkspeed_threshold)
{
if (!ucfg_cm_is_linkspeed_roam_trigger_supported(psoc))
return QDF_STATUS_E_NOSUPPORT;
if (linkspeed_threshold) {
dp_ucfg_enable_link_monitoring(psoc, vdev,
linkspeed_threshold);
} else {
dp_ucfg_disable_link_monitoring(psoc, vdev);
wlan_hdd_link_speed_update(psoc, wlan_vdev_get_id(vdev),
false);
}
return QDF_STATUS_SUCCESS;
}
#else
static inline QDF_STATUS
hdd_set_roam_rx_linkspeed_threshold(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev,
uint32_t linkspeed_threshold)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif
/**
* hdd_set_roam_with_control_config() - Set roam control configuration
* @hdd_ctx: HDD context
@@ -5420,6 +5459,7 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
struct wlan_cm_roam_vendor_btm_params param = {0};
bool is_wtc_param_updated = false;
uint32_t band_mask;
uint16_t threshold;
struct hdd_adapter *adapter;
uint8_t roam_control_enable = false;
@@ -5639,6 +5679,14 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx,
}
}
attr = tb2[QCA_ATTR_ROAM_CONTROL_RX_LINKSPEED_THRESHOLD];
if (attr) {
threshold = nla_get_u16(attr);
status = hdd_set_roam_rx_linkspeed_threshold(hdd_ctx->psoc,
adapter->vdev,
threshold);
}
if (is_wtc_param_updated) {
wlan_cm_roam_set_vendor_btm_params(hdd_ctx->psoc, &param);
/* Sends RSO update */

View File

@@ -10509,6 +10509,16 @@ static inline void wlan_hdd_send_mscs_action_frame(hdd_cb_handle context,
}
#endif
#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && \
defined(FEATURE_RX_LINKSPEED_ROAM_TRIGGER)
void wlan_hdd_link_speed_update(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
bool is_link_speed_good)
{
ucfg_cm_roam_link_speed_update(psoc, vdev_id, is_link_speed_good);
}
#endif
/**
* hdd_dp_register_callbacks() - Register DP callbacks with HDD
* @hdd_ctx: HDD context
@@ -10551,6 +10561,7 @@ static void hdd_dp_register_callbacks(struct hdd_context *hdd_ctx)
cb_obj.dp_get_tsf_time = hdd_get_tsf_time_cb;
cb_obj.dp_tsf_timestamp_rx = hdd_tsf_timestamp_rx;
cb_obj.dp_gro_rx_legacy_get_napi = hdd_legacy_gro_get_napi;
cb_obj.link_monitoring_cb = wlan_hdd_link_speed_update;
os_if_dp_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj);
}