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