qcacmn: Fix issues in monitor mode initialization

Current monitor mode implementation does not catch
initialization failures causing it to believe successful
monitor mode initialization.

Change-Id: I5c30ac22e3084871b86cf5e2f0627988ebbb7b5d
CRs-Fixed: 2071602
This commit is contained in:
Ravi Joshi 2017-06-17 16:43:02 -07:00 • committed by snandini
commit a9ebe0a7ca
3 changed files with 76 additions and 25 deletions

View file

@ -97,7 +97,6 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
* if desc_list is NULL, allocate the descs from freelist
*/
if (!(*desc_list)) {
num_alloc_desc = dp_rx_get_free_desc_list(dp_soc, mac_id,
rx_desc_pool,
num_req_buffers,
@ -123,8 +122,8 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
sync_hw_ptr);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
"no of availble entries in rxdma ring: %d",
num_entries_avail);
"no of availble entries in rxdma ring: %d",
num_entries_avail);
if (num_entries_avail < num_req_buffers) {
num_desc_to_free = num_req_buffers - num_entries_avail;
@ -201,7 +200,6 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
/*
* add any available free desc back to the free list
*/
if (*desc_list)
dp_rx_add_desc_list_to_free_list(dp_soc, desc_list, tail,
mac_id, rx_desc_pool);

View file

@ -760,6 +760,7 @@ dp_rx_pdev_mon_buf_attach(struct dp_pdev *pdev) {
struct dp_srng *rxdma_srng;
uint32_t rxdma_entries;
struct rx_desc_pool *rx_desc_pool;
QDF_STATUS status;
rxdma_srng = &pdev->rxdma_mon_buf_ring;
@ -773,14 +774,26 @@ dp_rx_pdev_mon_buf_attach(struct dp_pdev *pdev) {
"%s: Mon RX Desc Pool[%d] allocation size=%d\n"
, __func__, pdev_id, rxdma_entries*3);
dp_rx_desc_pool_alloc(soc, pdev_id, rxdma_entries*3, rx_desc_pool);
status = dp_rx_desc_pool_alloc(soc, pdev_id,
rxdma_entries*3, rx_desc_pool);
if (!QDF_IS_STATUS_SUCCESS(status)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: dp_rx_desc_pool_alloc() failed \n", __func__);
return status;
}
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
"%s: Mon RX Buffers Replenish pdev_id=%d\n",
__func__, pdev_id);
dp_rx_buffers_replenish(soc, pdev_id, rxdma_srng, rx_desc_pool,
rxdma_entries, &desc_list, &tail, HAL_RX_BUF_RBM_SW3_BM);
status = dp_rx_buffers_replenish(soc, pdev_id, rxdma_srng, rx_desc_pool,
rxdma_entries, &desc_list, &tail,
HAL_RX_BUF_RBM_SW3_BM);
if (!QDF_IS_STATUS_SUCCESS(status)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: dp_rx_buffers_replenish() failed \n", __func__);
return status;
}
return QDF_STATUS_SUCCESS;
}
@ -846,14 +859,22 @@ static int dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN,
"%s: total_mem_size: %d, num_link_desc_banks: %u, \
max_alloc_size: %d\n",
__func__, total_mem_size, num_link_desc_banks, max_alloc_size);
max_alloc_size: %d last_bank_size: %d\n",
__func__, total_mem_size, num_link_desc_banks, max_alloc_size,
last_bank_size);
for (i = 0; i < num_link_desc_banks; i++) {
dp_pdev->link_desc_banks[i].base_vaddr_unaligned =
qdf_mem_alloc_consistent(soc->osdev, NULL,
qdf_mem_alloc_consistent(soc->osdev, soc->osdev->dev,
max_alloc_size,
&(dp_pdev->link_desc_banks[i].base_paddr_unaligned));
if (!dp_pdev->link_desc_banks[i].base_vaddr_unaligned) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
"%s: Link desc memory allocation failed\n",
__func__);
goto fail;
}
dp_pdev->link_desc_banks[i].size = max_alloc_size;
dp_pdev->link_desc_banks[i].base_vaddr =
@ -870,13 +891,6 @@ static int dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
(dp_pdev->link_desc_banks[i].base_vaddr) -
(unsigned long)
(dp_pdev->link_desc_banks[i].base_vaddr_unaligned));
if (!dp_pdev->link_desc_banks[i].base_vaddr_unaligned) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
"%s: Link desc memory allocation failed\n",
__func__);
goto fail;
}
}
if (last_bank_size) {
@ -885,8 +899,15 @@ static int dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
*/
dp_pdev->link_desc_banks[i].base_vaddr_unaligned =
qdf_mem_alloc_consistent(soc->osdev,
NULL, last_bank_size,
soc->osdev->dev, last_bank_size,
&(dp_pdev->link_desc_banks[i].base_paddr_unaligned));
if (dp_pdev->link_desc_banks[i].base_vaddr_unaligned == NULL) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
"%s: allocation failed for mon link desc pool\n",
__func__);
goto fail;
}
dp_pdev->link_desc_banks[i].size = last_bank_size;
dp_pdev->link_desc_banks[i].base_vaddr =
@ -1002,13 +1023,33 @@ QDF_STATUS
dp_rx_pdev_mon_attach(struct dp_pdev *pdev) {
uint8_t pdev_id = pdev->pdev_id;
struct dp_soc *soc = pdev->soc;
QDF_STATUS status;
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
"%s: pdev attach id=%d\n", __func__, pdev_id);
dp_rx_pdev_mon_buf_attach(pdev);
dp_rx_pdev_mon_status_attach(pdev);
dp_mon_link_desc_pool_setup(soc, pdev_id);
status = dp_rx_pdev_mon_buf_attach(pdev);
if (!QDF_IS_STATUS_SUCCESS(status)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: dp_rx_pdev_mon_buf_attach() failed \n", __func__);
return status;
}
status = dp_rx_pdev_mon_status_attach(pdev);
if (!QDF_IS_STATUS_SUCCESS(status)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: dp_rx_pdev_mon_status_attach() failed \n",
__func__);
return status;
}
status = dp_mon_link_desc_pool_setup(soc, pdev_id);
if (!QDF_IS_STATUS_SUCCESS(status)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: dp_mon_link_desc_pool_setup() failed \n",
__func__);
return status;
}
return QDF_STATUS_SUCCESS;
}

View file

@ -454,6 +454,7 @@ dp_rx_pdev_mon_status_attach(struct dp_pdev *pdev) {
struct dp_srng *rxdma_srng;
uint32_t rxdma_entries;
struct rx_desc_pool *rx_desc_pool;
QDF_STATUS status;
rxdma_srng = &pdev->rxdma_mon_status_ring;
@ -466,15 +467,26 @@ dp_rx_pdev_mon_status_attach(struct dp_pdev *pdev) {
"%s: Mon RX Status Pool[%d] allocation size=%d\n",
__func__, pdev_id, rxdma_entries);
dp_rx_desc_pool_alloc(soc, pdev_id, rxdma_entries+1, rx_desc_pool);
status = dp_rx_desc_pool_alloc(soc, pdev_id, rxdma_entries+1,
rx_desc_pool);
if (QDF_IS_STATUS_SUCCESS(status)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: dp_rx_desc_pool_alloc() failed \n", __func__);
return status;
}
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
"%s: Mon RX Status Buffers Replenish pdev_id=%d\n",
__func__, pdev_id);
dp_rx_mon_status_buffers_replenish(soc, pdev_id, rxdma_srng,
rx_desc_pool, rxdma_entries, &desc_list, &tail,
HAL_RX_BUF_RBM_SW3_BM);
status = dp_rx_mon_status_buffers_replenish(soc, pdev_id, rxdma_srng,
rx_desc_pool, rxdma_entries, &desc_list, &tail,
HAL_RX_BUF_RBM_SW3_BM);
if (QDF_IS_STATUS_SUCCESS(status)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: dp_rx_buffers_replenish() failed \n", __func__);
return status;
}
qdf_nbuf_queue_init(&pdev->rx_status_q);