qcacmn: Flush ME desc while mcastenhancement disable

Flushing ME descriptor while disabling mcastenhancement feature.

Change-Id: Ieeaab082d09135b4c803d68041ebf9b4bf7bb144
CRs-Fixed: 2425078
This commit is contained in:
Ankit Kumar
2019-03-29 20:57:51 +05:30
committed by nshrivas
parent aeaa258b54
commit 14b9622193
3 changed files with 51 additions and 4 deletions

View File

@@ -203,7 +203,7 @@ static void dp_tx_tso_desc_release(struct dp_soc *soc,
*
* Return:
*/
static void
void
dp_tx_desc_release(struct dp_tx_desc_s *tx_desc, uint8_t desc_pool_id)
{
struct dp_pdev *pdev = tx_desc->pdev;
@@ -2572,8 +2572,7 @@ dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
*
* Return: none
*/
static inline void dp_tx_comp_free_buf(struct dp_soc *soc,
struct dp_tx_desc_s *desc)
void dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc)
{
struct dp_vdev *vdev = desc->vdev;
qdf_nbuf_t nbuf = desc->nbuf;
@@ -3687,8 +3686,8 @@ static void dp_tx_desc_flush(struct dp_vdev *vdev)
}
}
}
#endif /* !QCA_LL_TX_FLOW_CONTROL_V2 */
#endif /* !QCA_LL_TX_FLOW_CONTROL_V2 */
/**
* dp_tx_vdev_detach() - detach vdev from dp tx
* @vdev: virtual device instance

View File

@@ -229,4 +229,8 @@ static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc)
return;
}
/* TODO TX_FEATURE_NOT_YET */
void dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc);
void dp_tx_desc_release(struct dp_tx_desc_s *tx_desc, uint8_t desc_pool_id);
#endif

View File

@@ -157,6 +157,49 @@ dp_tx_me_exit(struct dp_pdev *pdev)
}
}
/* dp_tx_me_desc_flush() - release me resources associated to tx_desc
* @pdev: DP_PDEV handle
*
* This function will free all outstanding ME buffer
* for which either free during
* completion didn't happened or completion is not
* received.
*/
void dp_tx_me_desc_flush(struct dp_pdev *pdev)
{
uint8_t i, num_pool;
uint32_t j;
uint32_t num_desc, page_id, offset;
uint16_t num_desc_per_page;
struct dp_soc *soc = pdev->soc;
struct dp_tx_desc_s *tx_desc = NULL;
struct dp_tx_desc_pool_s *tx_desc_pool = NULL;
num_desc = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
for (i = 0; i < num_pool; i++) {
tx_desc_pool = &soc->tx_desc[i];
if (!tx_desc_pool || !tx_desc_pool->desc_pages.cacheable_pages)
continue;
num_desc_per_page =
tx_desc_pool->desc_pages.num_element_per_page;
for (j = 0; j < num_desc; j++) {
page_id = j / num_desc_per_page;
offset = j % num_desc_per_page;
tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
if (tx_desc && (tx_desc->pdev == pdev) &&
(tx_desc->flags & DP_TX_DESC_FLAG_ME) &&
(tx_desc->flags & DP_TX_DESC_FLAG_ALLOCATED)) {
dp_tx_comp_free_buf(soc, tx_desc);
dp_tx_desc_release(tx_desc, i);
}
}
}
}
/**
* dp_tx_me_free_descriptor():free ME descriptor
* @pdev_handle:DP_PDEV handle
@@ -169,6 +212,7 @@ dp_tx_me_free_descriptor(struct cdp_pdev *pdev_handle)
struct dp_pdev *pdev = (struct dp_pdev *) pdev_handle;
qdf_atomic_dec(&pdev->mc_num_vap_attached);
if (atomic_read(&pdev->mc_num_vap_attached) == 0) {
dp_tx_me_desc_flush(pdev);
dp_tx_me_exit(pdev);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
"Disable MCAST_TO_UCAST");