qcacld-3.0: Update linkspeed state to F/W for roaming dp 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: I2c2a22c1f24a730783ee09455f4d70b099d9bff1 CRs-Fixed: 3255036
This commit is contained in:

committed by
Madan Koyyalamudi

parent
c4459eb18e
commit
71eb93c537
@@ -587,6 +587,7 @@ union wlan_tp_data {
|
||||
* @os_if_dp_nud_stats_info: osif callback to print nud stats info
|
||||
* @dp_get_pause_map: Callback API to get pause map count
|
||||
* @dp_nud_failure_work: Callback API to handle NUD failuire work
|
||||
* @link_monitoring_cb: Callback API to handle link speed change
|
||||
*/
|
||||
struct wlan_dp_psoc_callbacks {
|
||||
hdd_cb_handle callback_ctx;
|
||||
@@ -666,6 +667,9 @@ struct wlan_dp_psoc_callbacks {
|
||||
void (*os_if_dp_nud_stats_info)(struct wlan_objmgr_vdev *vdev);
|
||||
uint32_t (*dp_get_pause_map)(hdd_cb_handle context, uint8_t vdev_id);
|
||||
void (*dp_nud_failure_work)(hdd_cb_handle context, uint8_t vdev_id);
|
||||
void (*link_monitoring_cb)(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
bool is_link_speed_good);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -1222,4 +1222,13 @@ void ucfg_dp_event_eapol_log(qdf_nbuf_t nbuf, enum qdf_proto_dir dir);
|
||||
QDF_STATUS
|
||||
ucfg_dp_softap_inspect_dhcp_packet(struct wlan_objmgr_vdev *vdev,
|
||||
qdf_nbuf_t nbuf, enum qdf_proto_dir dir);
|
||||
|
||||
void
|
||||
dp_ucfg_enable_link_monitoring(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev,
|
||||
uint32_t threshold);
|
||||
|
||||
void
|
||||
dp_ucfg_disable_link_monitoring(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev);
|
||||
#endif /* _WLAN_DP_UCFG_API_H_ */
|
||||
|
@@ -1915,6 +1915,7 @@ void ucfg_dp_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
|
||||
cb_obj->os_if_dp_nud_stats_info;
|
||||
dp_ctx->dp_ops.osif_dp_process_mic_error =
|
||||
cb_obj->osif_dp_process_mic_error;
|
||||
dp_ctx->dp_ops.link_monitoring_cb = cb_obj->link_monitoring_cb;
|
||||
}
|
||||
|
||||
void ucfg_dp_register_event_handler(struct wlan_objmgr_psoc *psoc,
|
||||
@@ -2153,3 +2154,34 @@ ucfg_dp_softap_inspect_dhcp_packet(struct wlan_objmgr_vdev *vdev,
|
||||
|
||||
return dp_softap_inspect_dhcp_packet(dp_intf, nbuf, dir);
|
||||
}
|
||||
|
||||
void
|
||||
dp_ucfg_enable_link_monitoring(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev,
|
||||
uint32_t threshold)
|
||||
{
|
||||
struct wlan_dp_intf *dp_intf;
|
||||
|
||||
dp_intf = dp_get_vdev_priv_obj(vdev);
|
||||
if (unlikely(!dp_intf)) {
|
||||
dp_err("DP interface not found");
|
||||
return;
|
||||
}
|
||||
dp_intf->link_monitoring.rx_linkspeed_threshold = threshold;
|
||||
dp_intf->link_monitoring.enabled = true;
|
||||
}
|
||||
|
||||
void
|
||||
dp_ucfg_disable_link_monitoring(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
struct wlan_dp_intf *dp_intf;
|
||||
|
||||
dp_intf = dp_get_vdev_priv_obj(vdev);
|
||||
if (unlikely(!dp_intf)) {
|
||||
dp_err("DP interface not found");
|
||||
return;
|
||||
}
|
||||
dp_intf->link_monitoring.enabled = false;
|
||||
dp_intf->link_monitoring.rx_linkspeed_threshold = 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user