diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 0fe797b8cf7e..f51d9b998cec 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -47,6 +47,7 @@ struct hdd_context; #define CFG_ENABLE_RX_THREAD (1 << 0) #define CFG_ENABLE_RPS (1 << 1) #define CFG_ENABLE_NAPI (1 << 2) +#define CFG_ENABLE_DYNAMIC_RPS (1 << 3) #ifdef DHCP_SERVER_OFFLOAD #define IPADDR_NUM_ENTRIES (4) @@ -9959,7 +9960,8 @@ enum dot11p_mode { * rx_mode - Control to decide rx mode * * @Min: 0 - * @Max: (CFG_ENABLE_RX_THREAD | CFG_ENABLE_RPS | CFG_ENABLE_NAPI) + * @Max: (CFG_ENABLE_RX_THREAD | CFG_ENABLE_RPS | CFG_ENABLE_NAPI | \ + * CFG_ENABLE_DYNAMIC_RPS) * @Default: MDM_PLATFORM - 0 * HELIUMPLUS - CFG_ENABLE_NAPI * Other cases - (CFG_ENABLE_RX_THREAD | CFG_ENABLE_NAPI) @@ -9975,7 +9977,7 @@ enum dot11p_mode { #define CFG_RX_MODE_NAME "rx_mode" #define CFG_RX_MODE_MIN (0) #define CFG_RX_MODE_MAX (CFG_ENABLE_RX_THREAD | CFG_ENABLE_RPS | \ - CFG_ENABLE_NAPI) + CFG_ENABLE_NAPI | CFG_ENABLE_DYNAMIC_RPS) #ifdef MDM_PLATFORM #define CFG_RX_MODE_DEFAULT (0) #elif defined(HELIUMPLUS) diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index a54f95a7fe86..023b4c8d83e6 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1842,6 +1842,7 @@ struct hdd_context { /* Interface change lock */ struct mutex iface_change_lock; bool rps; + bool dynamic_rps; bool enable_rxthread; bool napi_enable; bool stop_modules_in_progress; diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 4ddb6c4ffed1..2a21a747a74f 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -7500,6 +7500,11 @@ static void hdd_override_all_ps(struct hdd_context *hdd_ctx) */ static void hdd_set_rx_mode_value(struct hdd_context *hdd_ctx) { + /* RPS has higher priority than dynamic RPS when both bits are set */ + if (hdd_ctx->config->rx_mode & CFG_ENABLE_RPS && + hdd_ctx->config->rx_mode & CFG_ENABLE_DYNAMIC_RPS) + hdd_ctx->config->rx_mode &= ~CFG_ENABLE_DYNAMIC_RPS; + if (hdd_ctx->config->rx_mode & CFG_ENABLE_RX_THREAD && hdd_ctx->config->rx_mode & CFG_ENABLE_RPS) { hdd_warn("rx_mode wrong configuration. Make it default"); @@ -7514,6 +7519,9 @@ static void hdd_set_rx_mode_value(struct hdd_context *hdd_ctx) if (hdd_ctx->config->rx_mode & CFG_ENABLE_NAPI) hdd_ctx->napi_enable = true; + + if (hdd_ctx->config->rx_mode & CFG_ENABLE_DYNAMIC_RPS) + hdd_ctx->dynamic_rps = true; } /** diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 04db5c383b37..dc5a9298bf22 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -7043,6 +7043,20 @@ void hdd_display_periodic_stats(struct hdd_context *hdd_ctx, } } +/** + * hdd_clear_rps_cpu_mask - clear RPS CPU mask for interfaces + * @hdd_ctx: pointer to struct hdd_context + * + * Return: none + */ +static void hdd_clear_rps_cpu_mask(struct hdd_context *hdd_ctx) +{ + struct hdd_adapter *adapter; + + hdd_for_each_adapter(hdd_ctx, adapter) + hdd_send_rps_disable_ind(adapter); +} + /** * hdd_pld_request_bus_bandwidth() - Function to control bus bandwidth * @hdd_ctx - handle to hdd context @@ -7086,13 +7100,17 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, hdd_ctx->cur_vote_level = next_vote_level; vote_level_change = true; pld_request_bus_bandwidth(hdd_ctx->parent_dev, next_vote_level); - if (next_vote_level == PLD_BUS_WIDTH_LOW) { + if ((next_vote_level == PLD_BUS_WIDTH_LOW) || + (next_vote_level == PLD_BUS_WIDTH_NONE)) { if (hdd_ctx->hbw_requested) { pld_remove_pm_qos(hdd_ctx->parent_dev); hdd_ctx->hbw_requested = false; } if (cds_sched_handle_throughput_req(false)) hdd_warn("low bandwidth set rx affinity fail"); + + if (hdd_ctx->dynamic_rps) + hdd_clear_rps_cpu_mask(hdd_ctx); } else { if (!hdd_ctx->hbw_requested) { pld_request_pm_qos(hdd_ctx->parent_dev, 1); @@ -7101,6 +7119,9 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, if (cds_sched_handle_throughput_req(true)) hdd_warn("high bandwidth set rx affinity fail"); + + if (hdd_ctx->dynamic_rps) + hdd_set_rps_cpu_mask(hdd_ctx); } hdd_napi_apply_throughput_policy(hdd_ctx, tx_packets, rx_packets); } diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index 2f796591a814..94afa9c2b10d 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -2464,7 +2464,6 @@ err: */ void hdd_send_rps_disable_ind(struct hdd_adapter *adapter) { - uint8_t cpu_map_list_len = 0; struct hdd_context *hdd_ctxt = NULL; struct wlan_rps_data rps_data; struct cds_config_info *cds_cfg; @@ -2487,10 +2486,6 @@ void hdd_send_rps_disable_ind(struct hdd_adapter *adapter) hdd_info("Set cpu_map_list 0"); qdf_mem_zero(&rps_data.cpu_map_list, sizeof(rps_data.cpu_map_list)); - cpu_map_list_len = 0; - rps_data.num_queues = - (cpu_map_list_len < rps_data.num_queues) ? - cpu_map_list_len : rps_data.num_queues; strlcpy(rps_data.ifname, adapter->dev->name, sizeof(rps_data.ifname)); wlan_hdd_send_svc_nlink_msg(hdd_ctxt->radio_index,