qcacmn: Monitor mode configuration and processing

This change is for supporting monitor mode VAP.  All the monitor mode ring
is configured. The related monitor mode ring includes:
-monitor mode buffer ring
-monitor mode destination ring
-monitor mode status ring
-monitor mode link descriptor ring
The packet is not sent to monitor mode ring unless the monitor mode VAP is
configured. This release support Multiple VAP - AP/STA VAP plus Monitor
VAP configuration. The status ring is not used in this release. However,
the ring is tested and the ring is moving and there are TLV's in the ring.

Change-Id: I782ee0c3b998d8b3bbac79b5e7fdecdbff15fa93
CRs-Fixed: 2013049
This commit is contained in:
Kai Chen
2017-01-12 10:17:53 -08:00
committed by Sandeep Puligilla
부모 f151c38600
커밋 6eca1a62da
21개의 변경된 파일3164개의 추가작업 그리고 137개의 파일을 삭제

파일 보기

@@ -25,43 +25,41 @@
*
* @soc: core txrx main context
* @pool_id: pool_id which is one of 3 mac_ids
* @pool_size: number of Rx descriptor in the pool
* @rx_desc_pool: rx descriptor pool pointer
*
* return success or failure
*/
QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id)
QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id,
uint32_t pool_size, struct rx_desc_pool *rx_desc_pool)
{
uint32_t i;
struct dp_pdev *dp_pdev = soc->pdev_list[pool_id];
struct dp_srng *rxdma_srng = &dp_pdev->rx_refill_buf_ring;
soc->rx_desc[pool_id].array = qdf_mem_malloc(
((rxdma_srng->alloc_size/hal_srng_get_entrysize(soc->hal_soc,
RXDMA_BUF)) * 3) * sizeof(union dp_rx_desc_list_elem_t));
rx_desc_pool->array =
qdf_mem_malloc(pool_size*sizeof(union dp_rx_desc_list_elem_t));
if (!(soc->rx_desc[pool_id].array)) {
if (!(rx_desc_pool->array)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
"%s: RX Desc Pool[%d] allocation failed\n",
__func__, pool_id);
return QDF_STATUS_E_NOMEM;
}
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]);
soc->rx_desc[pool_id].pool_size = (rxdma_srng->alloc_size/
hal_srng_get_entrysize(soc->hal_soc, RXDMA_BUF)) * 3;
rx_desc_pool->pool_size = pool_size;
/* link SW rx descs into a freelist */
soc->rx_desc[pool_id].freelist = &soc->rx_desc[pool_id].array[0];
for (i = 0; i < soc->rx_desc[pool_id].pool_size-1; i++) {
soc->rx_desc[pool_id].array[i].next =
&soc->rx_desc[pool_id].array[i+1];
soc->rx_desc[pool_id].array[i].rx_desc.cookie =
i | (pool_id << 18);
soc->rx_desc[pool_id].array[i].rx_desc.pool_id = pool_id;
rx_desc_pool->freelist = &rx_desc_pool->array[0];
for (i = 0; i < rx_desc_pool->pool_size-1; i++) {
rx_desc_pool->array[i].next = &rx_desc_pool->array[i+1];
rx_desc_pool->array[i].rx_desc.cookie = i | (pool_id << 18);
rx_desc_pool->array[i].rx_desc.pool_id = pool_id;
}
soc->rx_desc[pool_id].array[i].next = NULL;
soc->rx_desc[pool_id].array[i].rx_desc.cookie = i | (pool_id << 18);
soc->rx_desc[pool_id].array[i].rx_desc.pool_id = pool_id;
rx_desc_pool->array[i].next = NULL;
rx_desc_pool->array[i].rx_desc.cookie = i | (pool_id << 18);
rx_desc_pool->array[i].rx_desc.pool_id = pool_id;
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]);
return QDF_STATUS_SUCCESS;
}
@@ -72,11 +70,14 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id)
*
* @soc: core txrx main context
* @pool_id: pool_id which is one of 3 mac_ids
* @rx_desc_pool: rx descriptor pool pointer
*/
void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id)
void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id,
struct rx_desc_pool *rx_desc_pool)
{
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]);
qdf_mem_free(soc->rx_desc[pool_id].array);
qdf_mem_free(rx_desc_pool->array);
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]);
}
@@ -86,12 +87,15 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id)
*
* @soc: core txrx main context
* @pool_id: pool_id which is one of 3 mac_ids
* @rx_desc_pool: rx descriptor pool pointer
* @num_descs: number of descs requested from freelist
* @desc_list: attach the descs to this list (output parameter)
* @tail: attach the point to last desc of free list (output parameter)
*
* Return: number of descs allocated from free list.
*/
uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id,
struct rx_desc_pool *rx_desc_pool,
uint16_t num_descs,
union dp_rx_desc_list_elem_t **desc_list,
union dp_rx_desc_list_elem_t **tail)
@@ -99,7 +103,8 @@ uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id,
uint16_t count;
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]);
*desc_list = soc->rx_desc[pool_id].freelist;
*desc_list = rx_desc_pool->freelist;
if (!(*desc_list)) {
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]);
@@ -108,10 +113,9 @@ uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id,
for (count = 0; count < num_descs; count++) {
*tail = soc->rx_desc[pool_id].freelist;
soc->rx_desc[pool_id].freelist =
soc->rx_desc[pool_id].freelist->next;
if (qdf_unlikely(!soc->rx_desc[pool_id].freelist)) {
*tail = rx_desc_pool->freelist;
rx_desc_pool->freelist = rx_desc_pool->freelist->next;
if (qdf_unlikely(!rx_desc_pool->freelist)) {
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]);
return count;
}
@@ -125,24 +129,27 @@ uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id,
* freelist.
*
* @soc: core txrx main context
* @local_desc_list: local desc list provided by the caller (output param)
* @local_desc_list: local desc list provided by the caller
* @tail: attach the point to last desc of local desc list
* @pool_id: pool_id which is one of 3 mac_ids
* @rx_desc_pool: rx descriptor pool pointer
*/
void dp_rx_add_desc_list_to_free_list(struct dp_soc *soc,
union dp_rx_desc_list_elem_t **local_desc_list,
union dp_rx_desc_list_elem_t **tail,
uint16_t pool_id)
uint16_t pool_id,
struct rx_desc_pool *rx_desc_pool)
{
union dp_rx_desc_list_elem_t *temp_list = NULL;
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]);
temp_list = soc->rx_desc[pool_id].freelist;
temp_list = rx_desc_pool->freelist;
qdf_print(
"temp_list: %p, *local_desc_list: %p, *tail: %p (*tail)->next: %p\n",
temp_list, *local_desc_list, *tail, (*tail)->next);
soc->rx_desc[pool_id].freelist = *local_desc_list;
rx_desc_pool->freelist = *local_desc_list;
(*tail)->next = temp_list;
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]);