diff --git a/core/hdd/inc/hdd_dp_cfg.h b/core/hdd/inc/hdd_dp_cfg.h index 01ccd893e295..46697ce734b5 100644 --- a/core/hdd/inc/hdd_dp_cfg.h +++ b/core/hdd/inc/hdd_dp_cfg.h @@ -350,6 +350,29 @@ #endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */ #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH +/* + * + * gBusBandwidthVeryHighThreshold - bus bandwidth very high threshold + * + * @Min: 0 + * @Max: 4294967295UL + * @Default: 7000 + * + * This ini specifies the bus bandwidth very high threshold + * + * Usage: Internal + * + * + */ +#define CFG_DP_BUS_BANDWIDTH_VERY_HIGH_THRESHOLD \ + CFG_INI_UINT( \ + "gBusBandwidthVeryHighThreshold", \ + 0, \ + 4294967295UL, \ + 7000, \ + CFG_VALUE_OR_DEFAULT, \ + "Bus bandwidth very high threshold") + /* * * gBusBandwidthHighThreshold - bus bandwidth high threshold @@ -358,7 +381,7 @@ * @Max: 4294967295UL * @Default: 2000 * - * This ini specifies thebus bandwidth high threshold + * This ini specifies the bus bandwidth high threshold * * Usage: Internal * @@ -381,7 +404,7 @@ * @Max: 4294967295UL * @Default: 500 * - * This ini specifies thebus bandwidth medium threshold + * This ini specifies the bus bandwidth medium threshold * * Usage: Internal * @@ -404,7 +427,7 @@ * @Max: 4294967295UL * @Default: 150 * - * This ini specifies thebus bandwidth low threshold + * This ini specifies the bus bandwidth low threshold * * Usage: Internal * @@ -1178,6 +1201,7 @@ #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH #define CFG_HDD_DP_BUS_BANDWIDTH \ + CFG(CFG_DP_BUS_BANDWIDTH_VERY_HIGH_THRESHOLD) \ CFG(CFG_DP_BUS_BANDWIDTH_HIGH_THRESHOLD) \ CFG(CFG_DP_BUS_BANDWIDTH_MEDIUM_THRESHOLD) \ CFG(CFG_DP_BUS_BANDWIDTH_LOW_THRESHOLD) \ diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 53928c7009b9..9a41af00a716 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -159,8 +159,13 @@ struct hdd_config { uint32_t rx_hp_oos_update_limit; uint64_t rx_softirq_max_yield_duration_ns; #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH + /* bandwidth threshold for very high bandwidth */ + uint32_t bus_bw_very_high_threshold; + /* bandwidth threshold for high bandwidth */ uint32_t bus_bw_high_threshold; + /* bandwidth threshold for medium bandwidth */ uint32_t bus_bw_medium_threshold; + /* bandwidth threshold for low bandwidth */ uint32_t bus_bw_low_threshold; uint32_t bus_bw_compute_interval; uint32_t enable_tcp_delack; diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 5f1362b2745f..742ce6b69e1c 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -7871,6 +7871,12 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, const uint64_t tx_packets, const uint64_t rx_packets) { + uint16_t index = 0; + bool vote_level_change = false; + bool rx_level_change = false; + bool tx_level_change = false; + bool rxthread_high_tput_req = false; + bool dptrace_high_tput_req; u64 total_pkts = tx_packets + rx_packets; uint64_t temp_tx = 0, avg_rx = 0; uint64_t no_rx_offload_pkts = 0, avg_no_rx_offload_pkts = 0; @@ -7879,14 +7885,10 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, static enum wlan_tp_level next_rx_level = WLAN_SVC_TP_NONE; enum wlan_tp_level next_tx_level = WLAN_SVC_TP_NONE; uint32_t delack_timer_cnt = hdd_ctx->config->tcp_delack_timer_count; - uint16_t index = 0; - bool vote_level_change = false; - bool rx_level_change = false; - bool tx_level_change = false; - bool rxthread_high_tput_req = false; - bool dptrace_high_tput_req; - if (total_pkts > hdd_ctx->config->bus_bw_high_threshold) + if (total_pkts > hdd_ctx->config->bus_bw_very_high_threshold) + next_vote_level = PLD_BUS_WIDTH_VERY_HIGH; + else if (total_pkts > hdd_ctx->config->bus_bw_high_threshold) next_vote_level = PLD_BUS_WIDTH_HIGH; else if (total_pkts > hdd_ctx->config->bus_bw_medium_threshold) next_vote_level = PLD_BUS_WIDTH_MEDIUM; @@ -7899,11 +7901,13 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, next_vote_level > PLD_BUS_WIDTH_IDLE ? true : false; if (hdd_ctx->cur_vote_level != next_vote_level) { - hdd_debug("trigger level %d, tx_packets: %lld, rx_packets: %lld", - next_vote_level, tx_packets, rx_packets); + hdd_debug("BW Vote level %d, tx_packets: %lld, rx_packets: %lld", + next_vote_level, tx_packets, rx_packets); 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) || (next_vote_level == PLD_BUS_WIDTH_IDLE)) { if (hdd_ctx->hbw_requested) { @@ -7981,8 +7985,6 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, if (hdd_ctx->cur_rx_level != next_rx_level) { struct wlan_rx_tp_data rx_tp_data = {0}; - hdd_debug("TCP DELACK trigger level %d, average_rx: %llu", - next_rx_level, avg_rx); hdd_ctx->cur_rx_level = next_rx_level; rx_level_change = true; /* Send throughput indication only if it is enabled. @@ -7990,8 +7992,11 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, * to default delayed ack. Note that this will disable the * dynamic delayed ack mechanism across the system */ - if (hdd_ctx->en_tcp_delack_no_lro) + if (hdd_ctx->en_tcp_delack_no_lro) { rx_tp_data.rx_tp_flags |= TCP_DEL_ACK_IND; + hdd_debug("TCP DELACK trigger level %d, average_rx: %llu", + next_rx_level, avg_rx); + } if (hdd_ctx->config->enable_tcp_adv_win_scale) rx_tp_data.rx_tp_flags |= TCP_ADV_WIN_SCL; @@ -8280,9 +8285,10 @@ void wlan_hdd_display_tx_rx_histogram(struct hdd_context *hdd_ctx) int i; #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH - hdd_nofl_info("BW compute Interval: %dms", + hdd_nofl_info("BW compute Interval: %d ms", hdd_ctx->config->bus_bw_compute_interval); - hdd_nofl_info("BW High TH: %d BW Med TH: %d BW Low TH: %d", + hdd_nofl_info("BW TH - Very High: %d High: %d Med: %d Low: %d", + hdd_ctx->config->bus_bw_very_high_threshold, hdd_ctx->config->bus_bw_high_threshold, hdd_ctx->config->bus_bw_medium_threshold, hdd_ctx->config->bus_bw_low_threshold); diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index 407a72b873ed..5a99e33a8864 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -2915,6 +2915,8 @@ static void hdd_ini_tx_flow_control(struct hdd_config *config, static void hdd_ini_bus_bandwidth(struct hdd_config *config, struct wlan_objmgr_psoc *psoc) { + config->bus_bw_very_high_threshold = + cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_VERY_HIGH_THRESHOLD); config->bus_bw_high_threshold = cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_HIGH_THRESHOLD); config->bus_bw_medium_threshold = diff --git a/core/pld/inc/pld_common.h b/core/pld/inc/pld_common.h index d32d905e4746..538e02368c2c 100644 --- a/core/pld/inc/pld_common.h +++ b/core/pld/inc/pld_common.h @@ -65,13 +65,15 @@ enum pld_bus_type { * @PLD_BUS_WIDTH_LOW: vote for low bus bandwidth * @PLD_BUS_WIDTH_MEDIUM: vote for medium bus bandwidth * @PLD_BUS_WIDTH_HIGH: vote for high bus bandwidth + * @PLD_BUS_WIDTH_VERY_HIGH: vote for very high bus bandwidth */ enum pld_bus_width_type { PLD_BUS_WIDTH_NONE, PLD_BUS_WIDTH_IDLE, PLD_BUS_WIDTH_LOW, PLD_BUS_WIDTH_MEDIUM, - PLD_BUS_WIDTH_HIGH + PLD_BUS_WIDTH_HIGH, + PLD_BUS_WIDTH_VERY_HIGH, }; #define PLD_MAX_FILE_NAME NAME_MAX