diff --git a/target_if/scan/src/target_if_scan.c b/target_if/scan/src/target_if_scan.c index 434ea5053868..4bb6d0bf597b 100644 --- a/target_if/scan/src/target_if_scan.c +++ b/target_if/scan/src/target_if_scan.c @@ -239,7 +239,17 @@ static QDF_STATUS target_if_pno_start(struct wlan_objmgr_psoc *psoc, struct pno_scan_req_params *req) { - return wmi_unified_pno_start_cmd(GET_WMI_HDL_FROM_PSOC(psoc), req); + QDF_STATUS status; + + status = wmi_unified_pno_start_cmd(GET_WMI_HDL_FROM_PSOC(psoc), req); + if (status == QDF_STATUS_SUCCESS) { + if (req->mawc_params.enable) + status = wmi_unified_nlo_mawc_cmd( + GET_WMI_HDL_FROM_PSOC(psoc), + &req->mawc_params); + } + + return status; } static QDF_STATUS diff --git a/umac/scan/core/src/wlan_scan_main.h b/umac/scan/core/src/wlan_scan_main.h index 88e8396b6f27..353dbebc584c 100644 --- a/umac/scan/core/src/wlan_scan_main.h +++ b/umac/scan/core/src/wlan_scan_main.h @@ -188,6 +188,7 @@ struct scan_vdev_obj { * to be triggered. * @pno_wake_lock: pno wake lock * @pno_cb: callback to call on PNO completion + * @mawc_params: Configuration parameters for NLO MAWC. */ struct pno_def_config { bool channel_prediction; @@ -197,6 +198,7 @@ struct pno_def_config { uint32_t channel_prediction_full_scan; qdf_wake_lock_t pno_wake_lock; struct cb_handler pno_cb; + struct nlo_mawc_params mawc_params; }; diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index 0afd9c23d54f..41fb834494bd 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -883,6 +883,11 @@ enum scan_cb_type { #define SCAN_STATIONARY_THRESHOLD 10 #define SCAN_CHANNEL_PREDICTION_FULL_SCAN_MS 60000 #define SCAN_ADAPTIVE_PNOSCAN_DWELL_MODE 0 +#define SCAN_MAWC_NLO_ENABLED 1 +#define SCAN_MAWC_NLO_EXP_BACKOFF_RATIO 3 +#define SCAN_MAWC_NLO_INIT_SCAN_INTERVAL 10000 +#define SCAN_MAWC_NLO_MAX_SCAN_INTERVAL 60000 + /** * enum ssid_bc_type - SSID broadcast type @@ -927,6 +932,23 @@ struct cpno_band_rssi_pref { int8_t rssi; }; +/** + * struct nlo_mawc_params - Motion Aided Wireless Connectivity based + * Network List Offload configuration + * @vdev_id: VDEV ID on which the configuration needs to be applied + * @enable: flag to enable or disable + * @exp_backoff_ratio: ratio of exponential backoff + * @init_scan_interval: initial scan interval(msec) + * @max_scan_interval: max scan interval(msec) + */ +struct nlo_mawc_params { + uint8_t vdev_id; + bool enable; + uint32_t exp_backoff_ratio; + uint32_t init_scan_interval; + uint32_t max_scan_interval; +}; + /** * struct pno_scan_req_params - PNO Scan request structure * @networks_cnt: Number of networks @@ -957,6 +979,7 @@ struct cpno_band_rssi_pref { * { 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 + * @mawc_params: Configuration parameters for NLO MAWC. */ struct pno_scan_req_params { uint32_t networks_cnt; @@ -979,23 +1002,7 @@ struct pno_scan_req_params { bool relative_rssi_set; int8_t relative_rssi; struct cpno_band_rssi_pref band_rssi_pref; -}; - -/** - * struct nlo_mawc_params - Motion Aided Wireless Connectivity based - * Network List Offload configuration - * @vdev_id: VDEV ID on which the configuration needs to be applied - * @enable: flag to enable or disable - * @exp_backoff_ratio: ratio of exponential backoff - * @init_scan_interval: initial scan interval(msec) - * @max_scan_interval: max scan interval(msec) - */ -struct nlo_mawc_params { - uint8_t vdev_id; - bool enable; - uint32_t exp_backoff_ratio; - uint32_t init_scan_interval; - uint32_t max_scan_interval; + struct nlo_mawc_params mawc_params; }; /** @@ -1007,6 +1014,7 @@ struct nlo_mawc_params { * @pnoscan_adaptive_dwell_mode: def adaptive dwelltime mode for pno scan * @channel_prediction_full_scan: def periodic timer upon which full scan needs * to be triggered. + * @mawc_params: Configuration parameters for NLO MAWC. */ struct pno_user_cfg { bool channel_prediction; @@ -1014,6 +1022,7 @@ struct pno_user_cfg { uint8_t stationary_thresh; enum scan_dwelltime_adaptive_mode adaptive_dwell_mode; uint32_t channel_prediction_full_scan; + struct nlo_mawc_params mawc_params; }; /** diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c index 34901cbaf15a..8e866680d521 100644 --- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c @@ -227,13 +227,20 @@ bool ucfg_scan_get_pno_match(struct wlan_objmgr_vdev *vdev) static QDF_STATUS wlan_pno_global_init(struct pno_def_config *pno_def) { + struct nlo_mawc_params *mawc_cfg; + qdf_wake_lock_create(&pno_def->pno_wake_lock, "wlan_pno_wl"); + mawc_cfg = &pno_def->mawc_params; pno_def->channel_prediction = SCAN_PNO_CHANNEL_PREDICTION; pno_def->top_k_num_of_channels = SCAN_TOP_K_NUM_OF_CHANNELS; pno_def->stationary_thresh = SCAN_STATIONARY_THRESHOLD; pno_def->channel_prediction_full_scan = SCAN_CHANNEL_PREDICTION_FULL_SCAN_MS; pno_def->adaptive_dwell_mode = SCAN_ADAPTIVE_PNOSCAN_DWELL_MODE; + mawc_cfg->enable = SCAN_MAWC_NLO_ENABLED; + mawc_cfg->exp_backoff_ratio = SCAN_MAWC_NLO_EXP_BACKOFF_RATIO; + mawc_cfg->init_scan_interval = SCAN_MAWC_NLO_INIT_SCAN_INTERVAL; + mawc_cfg->max_scan_interval = SCAN_MAWC_NLO_MAX_SCAN_INTERVAL; return QDF_STATUS_SUCCESS; } @@ -273,6 +280,9 @@ ucfg_scan_get_pno_def_params(struct wlan_objmgr_vdev *vdev, req->stationary_thresh = pno_def->stationary_thresh; req->channel_prediction_full_scan = pno_def->channel_prediction_full_scan; + req->mawc_params.vdev_id = wlan_vdev_get_id(vdev); + qdf_mem_copy(&req->mawc_params, &pno_def->mawc_params, + sizeof(req->mawc_params)); return QDF_STATUS_SUCCESS; } @@ -286,6 +296,8 @@ static QDF_STATUS ucfg_scan_update_pno_config(struct pno_def_config *pno, pno->adaptive_dwell_mode = pno_cfg->adaptive_dwell_mode; pno->channel_prediction_full_scan = pno_cfg->channel_prediction_full_scan; + qdf_mem_copy(&pno->mawc_params, &pno_cfg->mawc_params, + sizeof(pno->mawc_params)); return QDF_STATUS_SUCCESS; }