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:
committed by
Madan Koyyalamudi
parent
75fcd4dc84
commit
ebfe40c98a
@@ -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) */
|
||||
|
@@ -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 */
|
||||
|
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user