qcacld-2.0: Fix tx pause count and unpause count different

On high latency platform host driver has pause/unpause count per vdev,
so should do pause/unpause with pair. wma_unpause_vdev() want to unpause
all pausing with all reasons, and clear pause reason bitmap forcedly,
it works on low latency platform which depends on reason bitmap to
unpause, but it possible has unpause count less then paused count on HL
platform and lead to vdev peer tx queue can’t unpause after resume and
data stall in host tx queue.

Fix it by unpause reason by reason in wma_unpause_vdev().

Change-Id: I3aef06eeec42de5a56a98322670efa3ee453a94c
CRs-Fixed: 2525548
This commit is contained in:
Will Huang 2019-10-09 10:14:17 +08:00 committed by L R
parent d38cf54d99
commit 1dae7178e7
1 changed files with 9 additions and 2 deletions

View File

@ -21929,6 +21929,7 @@ static bool wma_is_wow_prtn_cached(tp_wma_handle wma, u_int8_t vdev_id)
static void wma_unpause_vdev(tp_wma_handle wma) {
int8_t vdev_id;
struct wma_txrx_node *iface;
int i, tmp_reason;
for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
if (!wma->interfaces[vdev_id].handle)
@ -21937,8 +21938,14 @@ static void wma_unpause_vdev(tp_wma_handle wma) {
#if defined(CONFIG_HL_SUPPORT) || defined(QCA_SUPPORT_TXRX_VDEV_PAUSE_LL)
/* When host resume, by default, unpause all active vdev */
if (wma->interfaces[vdev_id].pause_bitmap) {
wdi_in_vdev_unpause(wma->interfaces[vdev_id].handle,
0xffffffff);
for (i = 0; i < sizeof(wma->interfaces[vdev_id].pause_bitmap); i++) {
tmp_reason = 1 << i;
if (wma->interfaces[vdev_id].pause_bitmap & tmp_reason) {
WMA_LOGD("%s: unpause reason %d", __func__, tmp_reason);
wdi_in_vdev_unpause(wma->interfaces[vdev_id].handle,
tmp_reason);
}
}
wma->interfaces[vdev_id].pause_bitmap = 0;
}
#endif /* QCA_SUPPORT_TXRX_VDEV_PAUSE_LL || CONFIG_HL_SUPPORT */