diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 63deb55d89..17567e69fe 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -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) */ diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index dfe623e777..808f99d637 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -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, ¶m); /* Sends RSO update */ diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 9a540dded2..0998e4e918 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -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); }