diff --git a/os_if/linux/scan/inc/wlan_cfg80211_scan.h b/os_if/linux/scan/inc/wlan_cfg80211_scan.h index 3b47f7738c..b455b87cf3 100644 --- a/os_if/linux/scan/inc/wlan_cfg80211_scan.h +++ b/os_if/linux/scan/inc/wlan_cfg80211_scan.h @@ -117,12 +117,14 @@ struct scan_req { * @pdev: pdev pointer * @dev: Pointer network device * @request: Pointer to cfg80211 scheduled scan start request + * @scan_backoff_multiplier: multiply scan period by this after max cycles * * Return: 0 for success, non zero for failure */ int wlan_cfg80211_sched_scan_start(struct wlan_objmgr_pdev *pdev, struct net_device *dev, - struct cfg80211_sched_scan_request *request); + struct cfg80211_sched_scan_request *request, + uint8_t scan_backoff_multiplier); /** * wlan_cfg80211_sched_scan_stop() - cfg80211 scheduled scan(pno) stop diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index 2ec383b23a..9381ef7b51 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -140,7 +140,7 @@ static void wlan_cfg80211_pno_callback(struct wlan_objmgr_vdev *vdev, pdev_ospriv = wlan_pdev_get_ospriv(pdev); wlan_pdev_obj_unlock(pdev); if (!pdev_ospriv) { - cfg80211_err("pdev_osprivis NULL"); + cfg80211_err("pdev_ospriv is NULL"); return; } cfg80211_sched_scan_results(pdev_ospriv->wiphy); @@ -181,7 +181,8 @@ static QDF_STATUS wlan_cfg80211_is_pno_allowed(struct wlan_objmgr_vdev *vdev) int wlan_cfg80211_sched_scan_start(struct wlan_objmgr_pdev *pdev, struct net_device *dev, - struct cfg80211_sched_scan_request *request) + struct cfg80211_sched_scan_request *request, + uint8_t scan_backoff_multiplier) { struct pno_scan_req_params *req; int i, j, ret = 0; @@ -342,6 +343,7 @@ int wlan_cfg80211_sched_scan_start(struct wlan_objmgr_pdev *pdev, */ wlan_config_sched_scan_plan(req, request); req->delay_start_time = hdd_config_sched_scan_start_delay(request); + req->scan_backoff_multiplier = scan_backoff_multiplier; cfg80211_notice("Base scan interval: %d sec, scan cycles: %d, slow scan interval %d", req->fast_scan_period, req->fast_scan_max_cycles, req->slow_scan_period); diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index d413547b7d..a3fada2c6f 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -880,6 +880,7 @@ struct pno_nw_type { * @slow_scan_period: Slow scan period * @delay_start_time: delay in seconds to use before starting the first scan * @fast_scan_max_cycles: Fast scan max cycles + * @scan_backoff_multiplier: multiply fast scan period by this after max cycles * @pno_channel_prediction: PNO channel prediction feature status * @uint32_t active_dwell_time: active dwell time * @uint32_t passive_dwell_time: passive dwell time @@ -890,6 +891,11 @@ struct pno_nw_type { * @channel_prediction_full_scan: periodic timer upon which a full scan needs * to be triggered. * @networks_list: Preferred network list + * + * E.g. + * { fast_scan_period=120, fast_scan_max_cycles=2, + * slow_scan_period=1800, scan_backoff_multiplier=2 } + * Result: 120s x2, 240s x2, 480s x2, 960s x2, 1800s xN */ struct pno_scan_req_params { uint32_t networks_cnt; @@ -898,6 +904,7 @@ struct pno_scan_req_params { uint32_t slow_scan_period; uint32_t delay_start_time; uint32_t fast_scan_max_cycles; + uint8_t scan_backoff_multiplier; uint32_t active_dwell_time; uint32_t passive_dwell_time; uint32_t pno_channel_prediction; diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 98c9844719..988c8f7fe6 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -7020,6 +7020,7 @@ static QDF_STATUS send_pno_start_cmd_tlv(wmi_unified_t wmi_handle, cmd->slow_scan_period = pno->slow_scan_period; cmd->delay_start_time = WMI_SEC_TO_MSEC(pno->delay_start_time); cmd->fast_scan_max_cycles = pno->fast_scan_max_cycles; + cmd->scan_backoff_multiplier = pno->scan_backoff_multiplier; WMI_LOGD("fast_scan_period: %d msec slow_scan_period: %d msec", cmd->fast_scan_period, cmd->slow_scan_period); WMI_LOGD("fast_scan_max_cycles: %d", cmd->fast_scan_max_cycles);