summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo Chang <schang@qca.qualcomm.com>2014-02-05 13:29:04 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-07 23:06:10 -0800
commit1f342175db9079dd8bab11a1396263b0bdba77fc (patch)
tree954714658bf0522c324463bee7defdf93d821db3
parenteb32b295f7bd82c1dc2c7efb7066bf0fec81205a (diff)
wlan: Multiple TX PAUSE type event handle
FW will send multiple PAUSE type to host for MCC MAX throughput. Current host code only support CHOP event. Host functionality should be extended to handle multiple PAUSE type. Change-Id: Iaa9d0a596a40fee2b87dab8fbb7f7dd22bd3b241 CRs-fixed: 609952
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_queue.c7
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx.c1
-rw-r--r--CORE/SERVICES/COMMON/wdi_in.h7
-rw-r--r--CORE/SERVICES/WMA/wma.c65
-rw-r--r--CORE/SERVICES/WMA/wma.h1
5 files changed, 44 insertions, 37 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_queue.c b/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
index cea3006b9b92..a8141edf8485 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
@@ -521,8 +521,11 @@ ol_txrx_vdev_unpause(ol_txrx_vdev_handle vdev)
adf_os_spin_unlock(&pdev->tx_queue_spinlock);
#endif /* defined(CONFIG_HL_SUPPORT) */
} else {
- vdev->ll_pause.is_paused = A_FALSE;
- ol_tx_vdev_ll_pause_queue_send(vdev);
+ if (vdev->ll_pause.is_paused)
+ {
+ vdev->ll_pause.is_paused = A_FALSE;
+ ol_tx_vdev_ll_pause_queue_send(vdev);
+ }
}
TX_SCHED_DEBUG_PRINT("Leave %s\n", __func__);
}
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c
index e8217c7f4813..6d632683966c 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c
@@ -827,6 +827,7 @@ ol_txrx_vdev_attach(
}
#endif /* defined(CONFIG_HL_SUPPORT) */
+ adf_os_spinlock_init(&vdev->ll_pause.mutex);
vdev->ll_pause.is_paused = A_FALSE;
vdev->ll_pause.txq.head = vdev->ll_pause.txq.tail = NULL;
vdev->ll_pause.txq.depth = 0;
diff --git a/CORE/SERVICES/COMMON/wdi_in.h b/CORE/SERVICES/COMMON/wdi_in.h
index 69ae4d1b68f1..8c266f0114df 100644
--- a/CORE/SERVICES/COMMON/wdi_in.h
+++ b/CORE/SERVICES/COMMON/wdi_in.h
@@ -1199,19 +1199,12 @@ ol_tx_queue_log_display(ol_txrx_pdev_handle pdev);
#define wdi_in_peer_attach ol_txrx_peer_attach
#define wdi_in_peer_update ol_txrx_peer_update
#define wdi_in_peer_pause ol_txrx_peer_pause
-#define wdi_in_peer_pause ol_txrx_peer_pause
-#define wdi_in_peer_tid_unpause ol_txrx_peer_tid_unpause
#define wdi_in_peer_tid_unpause ol_txrx_peer_tid_unpause
#define wdi_in_tx_release ol_txrx_tx_release
-#define wdi_in_tx_release ol_txrx_tx_release
-#define wdi_in_vdev_pause ol_txrx_vdev_pause
#define wdi_in_vdev_pause ol_txrx_vdev_pause
#define wdi_in_vdev_unpause ol_txrx_vdev_unpause
-#define wdi_in_vdev_unpause ol_txrx_vdev_unpause
-#define wdi_in_pdev_pause ol_txrx_pdev_pause
#define wdi_in_pdev_pause ol_txrx_pdev_pause
#define wdi_in_pdev_unpause ol_txrx_pdev_unpause
-#define wdi_in_pdev_unpause ol_txrx_pdev_unpause
#define wdi_in_tx_sync ol_txrx_tx_sync
#define wdi_in_peer_detach ol_txrx_peer_detach
#define wdi_in_vdev_detach ol_txrx_vdev_detach
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 765254829b51..2d650b892777 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -3269,10 +3269,7 @@ static ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle,
self_sta_req->selfMacAddr,
self_sta_req->sessionId,
txrx_vdev_type);
-#ifdef QCA_SUPPORT_TXRX_VDEV_LL_TXQ
- WMA_LOGD("LL TX Pause Mutex init");
- adf_os_spinlock_init(&txrx_vdev_handle->ll_pause.mutex);
-#endif /* QCA_SUPPORT_TXRX_VDEV_LL_TXQ */
+ wma_handle->interfaces[self_sta_req->sessionId].pause_bitmap = 0;
WMA_LOGA("vdev_id %hu, txrx_vdev_handle = %p", self_sta_req->sessionId,
txrx_vdev_handle);
@@ -14890,12 +14887,12 @@ static int wma_mcc_vdev_tx_pause_evt_handler(void *handle, u_int8_t *event,
tp_wma_handle wma = (tp_wma_handle) handle;
WMI_TX_PAUSE_EVENTID_param_tlvs *param_buf;
wmi_tx_pause_event_fixed_param *wmi_event;
- ol_txrx_vdev_handle txrx_vdev;
u_int8_t vdev_id;
A_UINT32 vdev_map;
param_buf = (WMI_TX_PAUSE_EVENTID_param_tlvs *) event;
- if (!param_buf) {
+ if (!param_buf)
+ {
WMA_LOGE("Invalid roam event buffer");
return -EINVAL;
}
@@ -14909,35 +14906,47 @@ static int wma_mcc_vdev_tx_pause_evt_handler(void *handle, u_int8_t *event,
{
if (!(vdev_map & 0x1))
{
- vdev_map >>= 1;
+ /* No Vdev */
}
else
{
- WMA_LOGI("Found vdev %d", vdev_id);
- break;
- }
- }
+ if (!wma->interfaces[vdev_id].handle)
+ {
+ WMA_LOGE("%s: invalid vdev ID %d", __func__, vdev_id);
+ /* Test Next VDEV */
+ vdev_map >>= 1;
+ continue;
+ }
- WMA_LOGI("vdev_id %d, vdev_map 0x%x, tid_map 0x%x,"
- " pause_type 0x%x, action 0x%x, peer_id 0x%x",
- vdev_id, wmi_event->vdev_map, wmi_event->tid_map,
- wmi_event->pause_type, wmi_event->action, wmi_event->peer_id);
+ /* PAUSE action, add bitmap */
+ if (ACTION_PAUSE == wmi_event->action)
+ {
+ wma->interfaces[vdev_id].pause_bitmap |= (1 << wmi_event->pause_type);
+ wdi_in_vdev_pause(wma->interfaces[vdev_id].handle);
+ }
+ /* UNPAUSE action, clean bitmap */
+ else if (ACTION_UNPAUSE == wmi_event->action)
+ {
+ wma->interfaces[vdev_id].pause_bitmap &= ~(1 << wmi_event->pause_type);
+ if (!wma->interfaces[vdev_id].pause_bitmap)
+ {
+ /* PAUSE BIT MAP is cleared
+ * UNPAUSE VDEV */
+ wdi_in_vdev_unpause(wma->interfaces[vdev_id].handle);
+ }
+ }
+ else
+ {
+ WMA_LOGE("Not Valid Action Type %d", wmi_event->action);
+ }
- txrx_vdev = wma->interfaces[vdev_id].handle;
- if (txrx_vdev)
- {
- if ((PAUSE_TYPE_CHOP == wmi_event->pause_type) &&
- (!wmi_event->action))
- {
- wdi_in_vdev_pause(txrx_vdev);
- }
- if ((PAUSE_TYPE_CHOP == wmi_event->pause_type) &&
- (wmi_event->action))
- {
- wdi_in_vdev_unpause(txrx_vdev);
+ WMA_LOGD("vdev_id %d, pause_map 0x%x, pause type %d, action %d",
+ vdev_id, wma->interfaces[vdev_id].pause_bitmap,
+ wmi_event->pause_type, wmi_event->action);
}
- /* TODO, other types of pause should be added */
+ /* Test Next VDEV */
+ vdev_map >>= 1;
}
return 0;
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 1ee7d74ddef6..dc20ffbd4900 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -430,6 +430,7 @@ struct wma_txrx_node {
tANI_U8 rate_flags;
tANI_U8 nss;
v_BOOL_t is_channel_switch;
+ u_int16_t pause_bitmap;
};
#if defined(QCA_WIFI_FTM) && !defined(QCA_WIFI_ISOC)