qcacmn: Handle special tx descriptor pool cases
Fix the missing special tx descriptor pool cases Change-Id: Ie6a7539e77b805483c32cb7bcfbc3143f9ef8034 CRs-Fixed: 3610126
This commit is contained in:

committed by
Rahul Choudhary

parent
3b7d208620
commit
a9d8a404fc
@@ -12562,7 +12562,8 @@ void dp_find_missing_tx_comp(struct dp_soc *soc)
|
|||||||
desc_pages.cacheable_pages)))
|
desc_pages.cacheable_pages)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
|
tx_desc = dp_tx_desc_find(soc, i, page_id, offset,
|
||||||
|
false);
|
||||||
if (tx_desc->magic == DP_TX_MAGIC_PATTERN_FREE) {
|
if (tx_desc->magic == DP_TX_MAGIC_PATTERN_FREE) {
|
||||||
continue;
|
continue;
|
||||||
} else if (tx_desc->magic ==
|
} else if (tx_desc->magic ==
|
||||||
|
@@ -6249,6 +6249,9 @@ void dp_print_soc_tx_stats(struct dp_soc *soc)
|
|||||||
tx_desc_pool = dp_get_tx_desc_pool(soc, desc_pool_id);
|
tx_desc_pool = dp_get_tx_desc_pool(soc, desc_pool_id);
|
||||||
soc->stats.tx.desc_in_use +=
|
soc->stats.tx.desc_in_use +=
|
||||||
tx_desc_pool->num_allocated;
|
tx_desc_pool->num_allocated;
|
||||||
|
tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, desc_pool_id);
|
||||||
|
soc->stats.tx.desc_in_use +=
|
||||||
|
tx_desc_pool->num_allocated;
|
||||||
}
|
}
|
||||||
|
|
||||||
DP_PRINT_STATS("Tx Descriptors In Use = %u",
|
DP_PRINT_STATS("Tx Descriptors In Use = %u",
|
||||||
|
@@ -6360,7 +6360,8 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|||||||
desc_pages.cacheable_pages)))
|
desc_pages.cacheable_pages)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
|
tx_desc = dp_tx_desc_find(soc, i, page_id, offset,
|
||||||
|
false);
|
||||||
|
|
||||||
if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
|
if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
|
||||||
/*
|
/*
|
||||||
@@ -6389,14 +6390,16 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|||||||
* @soc: Handle to DP soc structure
|
* @soc: Handle to DP soc structure
|
||||||
* @tx_desc: pointer of one TX desc
|
* @tx_desc: pointer of one TX desc
|
||||||
* @desc_pool_id: TX Desc pool id
|
* @desc_pool_id: TX Desc pool id
|
||||||
|
* @spcl_pool: Special pool
|
||||||
*/
|
*/
|
||||||
static inline void
|
static inline void
|
||||||
dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
|
dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
|
||||||
uint8_t desc_pool_id)
|
uint8_t desc_pool_id, bool spcl_pool)
|
||||||
{
|
{
|
||||||
struct dp_tx_desc_pool_s *pool = NULL;
|
struct dp_tx_desc_pool_s *pool = NULL;
|
||||||
|
|
||||||
pool = dp_get_tx_desc_pool(soc, desc_pool_id);
|
pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, desc_pool_id) :
|
||||||
|
dp_get_tx_desc_pool(soc, desc_pool_id);
|
||||||
TX_DESC_LOCK_LOCK(&pool->lock);
|
TX_DESC_LOCK_LOCK(&pool->lock);
|
||||||
|
|
||||||
tx_desc->vdev_id = DP_INVALID_VDEV_ID;
|
tx_desc->vdev_id = DP_INVALID_VDEV_ID;
|
||||||
@@ -6404,8 +6407,8 @@ dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
|
|||||||
TX_DESC_LOCK_UNLOCK(&pool->lock);
|
TX_DESC_LOCK_UNLOCK(&pool->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
void __dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
||||||
bool force_free)
|
bool force_free, bool spcl_pool)
|
||||||
{
|
{
|
||||||
uint8_t i, num_pool;
|
uint8_t i, num_pool;
|
||||||
uint32_t j;
|
uint32_t j;
|
||||||
@@ -6420,22 +6423,30 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_desc = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
|
num_desc = spcl_pool ? wlan_cfg_get_num_tx_spl_desc(soc->wlan_cfg_ctx) :
|
||||||
|
wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
|
||||||
|
|
||||||
num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
|
num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
|
||||||
|
|
||||||
for (i = 0; i < num_pool; i++) {
|
for (i = 0; i < num_pool; i++) {
|
||||||
tx_desc_pool = dp_get_tx_desc_pool(soc, i);
|
tx_desc_pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, i) :
|
||||||
|
dp_get_tx_desc_pool(soc, i);
|
||||||
if (!tx_desc_pool->desc_pages.cacheable_pages)
|
if (!tx_desc_pool->desc_pages.cacheable_pages)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (spcl_pool)
|
||||||
|
num_desc_t = num_desc;
|
||||||
|
else
|
||||||
num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i,
|
num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i,
|
||||||
num_desc);
|
num_desc);
|
||||||
|
|
||||||
num_desc_per_page =
|
num_desc_per_page =
|
||||||
tx_desc_pool->desc_pages.num_element_per_page;
|
tx_desc_pool->desc_pages.num_element_per_page;
|
||||||
for (j = 0; j < num_desc_t; j++) {
|
for (j = 0; j < num_desc_t; j++) {
|
||||||
page_id = j / num_desc_per_page;
|
page_id = j / num_desc_per_page;
|
||||||
offset = j % num_desc_per_page;
|
offset = j % num_desc_per_page;
|
||||||
tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
|
tx_desc = dp_tx_desc_find(soc, i, page_id, offset,
|
||||||
|
spcl_pool);
|
||||||
|
|
||||||
if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
|
if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
|
||||||
if (force_free) {
|
if (force_free) {
|
||||||
@@ -6444,12 +6455,19 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|||||||
dp_tx_desc_release(soc, tx_desc, i);
|
dp_tx_desc_release(soc, tx_desc, i);
|
||||||
} else {
|
} else {
|
||||||
dp_tx_desc_reset_vdev(soc, tx_desc,
|
dp_tx_desc_reset_vdev(soc, tx_desc,
|
||||||
i);
|
i, spcl_pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
||||||
|
bool force_free)
|
||||||
|
{
|
||||||
|
__dp_tx_desc_flush(pdev, vdev, force_free, false);
|
||||||
|
__dp_tx_desc_flush(pdev, vdev, force_free, true);
|
||||||
|
}
|
||||||
#endif /* !QCA_LL_TX_FLOW_CONTROL_V2 */
|
#endif /* !QCA_LL_TX_FLOW_CONTROL_V2 */
|
||||||
|
|
||||||
QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev)
|
QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev)
|
||||||
|
@@ -104,6 +104,16 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list)
|
|||||||
for (i = 0; i < num_pool; i++) {
|
for (i = 0; i < num_pool; i++) {
|
||||||
tx_desc_pool = dp_get_tx_desc_pool(soc, i);
|
tx_desc_pool = dp_get_tx_desc_pool(soc, i);
|
||||||
|
|
||||||
|
if (tx_desc_pool)
|
||||||
|
qdf_tx_desc_pool_free_bufs(soc,
|
||||||
|
&tx_desc_pool->desc_pages,
|
||||||
|
tx_desc_pool->elem_size,
|
||||||
|
tx_desc_pool->elem_count,
|
||||||
|
true, &dp_tx_desc_clean_up,
|
||||||
|
nbuf_list);
|
||||||
|
|
||||||
|
tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, i);
|
||||||
|
|
||||||
if (tx_desc_pool)
|
if (tx_desc_pool)
|
||||||
qdf_tx_desc_pool_free_bufs(soc,
|
qdf_tx_desc_pool_free_bufs(soc,
|
||||||
&tx_desc_pool->desc_pages,
|
&tx_desc_pool->desc_pages,
|
||||||
|
@@ -26,6 +26,8 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* 21 bits cookie
|
* 21 bits cookie
|
||||||
|
* 1 bit special pool indicator
|
||||||
|
* 3 bits unused
|
||||||
* 2 bits pool id 0 ~ 3,
|
* 2 bits pool id 0 ~ 3,
|
||||||
* 10 bits page id 0 ~ 1023
|
* 10 bits page id 0 ~ 1023
|
||||||
* 5 bits offset id 0 ~ 31 (Desc size = 128, Num descs per page = 4096/128 = 32)
|
* 5 bits offset id 0 ~ 31 (Desc size = 128, Num descs per page = 4096/128 = 32)
|
||||||
@@ -34,6 +36,8 @@
|
|||||||
|
|
||||||
/* TODO: Need to revisit this change for Rhine */
|
/* TODO: Need to revisit this change for Rhine */
|
||||||
#ifdef WLAN_SOFTUMAC_SUPPORT
|
#ifdef WLAN_SOFTUMAC_SUPPORT
|
||||||
|
#define DP_TX_DESC_ID_SPCL_MASK 0x100000
|
||||||
|
#define DP_TX_DESC_ID_SPCL_OS 20
|
||||||
#define DP_TX_DESC_ID_POOL_MASK 0x018000
|
#define DP_TX_DESC_ID_POOL_MASK 0x018000
|
||||||
#define DP_TX_DESC_ID_POOL_OS 15
|
#define DP_TX_DESC_ID_POOL_OS 15
|
||||||
#define DP_TX_DESC_ID_PAGE_MASK 0x007FF0
|
#define DP_TX_DESC_ID_PAGE_MASK 0x007FF0
|
||||||
@@ -41,6 +45,8 @@
|
|||||||
#define DP_TX_DESC_ID_OFFSET_MASK 0x00000F
|
#define DP_TX_DESC_ID_OFFSET_MASK 0x00000F
|
||||||
#define DP_TX_DESC_ID_OFFSET_OS 0
|
#define DP_TX_DESC_ID_OFFSET_OS 0
|
||||||
#else
|
#else
|
||||||
|
#define DP_TX_DESC_ID_SPCL_MASK 0x100000
|
||||||
|
#define DP_TX_DESC_ID_SPCL_OS 20
|
||||||
#define DP_TX_DESC_ID_POOL_MASK 0x018000
|
#define DP_TX_DESC_ID_POOL_MASK 0x018000
|
||||||
#define DP_TX_DESC_ID_POOL_OS 15
|
#define DP_TX_DESC_ID_POOL_OS 15
|
||||||
#define DP_TX_DESC_ID_PAGE_MASK 0x007FE0
|
#define DP_TX_DESC_ID_PAGE_MASK 0x007FE0
|
||||||
@@ -1289,21 +1295,25 @@ static inline void dp_tx_desc_update_fast_comp_flag(struct dp_soc *soc,
|
|||||||
/**
|
/**
|
||||||
* dp_tx_desc_find() - find dp tx descriptor from pool/page/offset
|
* dp_tx_desc_find() - find dp tx descriptor from pool/page/offset
|
||||||
* @soc: handle for the device sending the data
|
* @soc: handle for the device sending the data
|
||||||
* @pool_id:
|
* @pool_id: pool id
|
||||||
* @page_id:
|
* @page_id: page id
|
||||||
* @offset:
|
* @offset: offset from base address
|
||||||
|
* @spcl_pool: bit to indicate if this is a special pool
|
||||||
*
|
*
|
||||||
* Use page and offset to find the corresponding descriptor object in
|
* Use page and offset to find the corresponding descriptor object in
|
||||||
* the given descriptor pool.
|
* the given descriptor pool.
|
||||||
*
|
*
|
||||||
* Return: the descriptor object that has the specified ID
|
* Return: the descriptor object that has the specified ID
|
||||||
*/
|
*/
|
||||||
static inline struct dp_tx_desc_s *dp_tx_desc_find(struct dp_soc *soc,
|
static inline
|
||||||
uint8_t pool_id, uint16_t page_id, uint16_t offset)
|
struct dp_tx_desc_s *dp_tx_desc_find(struct dp_soc *soc,
|
||||||
|
uint8_t pool_id, uint16_t page_id,
|
||||||
|
uint16_t offset, bool spcl_pool)
|
||||||
{
|
{
|
||||||
struct dp_tx_desc_pool_s *tx_desc_pool = NULL;
|
struct dp_tx_desc_pool_s *tx_desc_pool = NULL;
|
||||||
|
|
||||||
tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id);
|
tx_desc_pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, pool_id) :
|
||||||
|
dp_get_tx_desc_pool(soc, pool_id);
|
||||||
|
|
||||||
return tx_desc_pool->desc_pages.cacheable_pages[page_id] +
|
return tx_desc_pool->desc_pages.cacheable_pages[page_id] +
|
||||||
tx_desc_pool->elem_size * offset;
|
tx_desc_pool->elem_size * offset;
|
||||||
|
@@ -744,7 +744,8 @@ void dp_tx_comp_get_prefetched_params_from_hal_desc(
|
|||||||
(tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
|
(tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
|
||||||
DP_TX_DESC_ID_PAGE_OS,
|
DP_TX_DESC_ID_PAGE_OS,
|
||||||
(tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
|
(tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
|
||||||
DP_TX_DESC_ID_OFFSET_OS);
|
DP_TX_DESC_ID_OFFSET_OS,
|
||||||
|
(tx_desc_id & DP_TX_DESC_ID_SPCL_MASK));
|
||||||
qdf_prefetch((uint8_t *)*r_tx_desc);
|
qdf_prefetch((uint8_t *)*r_tx_desc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -49,7 +49,8 @@ void dp_tx_comp_get_params_from_hal_desc_li(struct dp_soc *soc,
|
|||||||
(tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
|
(tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
|
||||||
DP_TX_DESC_ID_PAGE_OS,
|
DP_TX_DESC_ID_PAGE_OS,
|
||||||
(tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
|
(tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
|
||||||
DP_TX_DESC_ID_OFFSET_OS);
|
DP_TX_DESC_ID_OFFSET_OS,
|
||||||
|
(tx_desc_id & DP_TX_DESC_ID_SPCL_MASK));
|
||||||
/* Pool id is not matching. Error */
|
/* Pool id is not matching. Error */
|
||||||
if ((*r_tx_desc)->pool_id != pool_id) {
|
if ((*r_tx_desc)->pool_id != pool_id) {
|
||||||
dp_tx_comp_alert("Tx Comp pool id %d not matched %d",
|
dp_tx_comp_alert("Tx Comp pool id %d not matched %d",
|
||||||
@@ -603,7 +604,8 @@ QDF_STATUS dp_tx_desc_pool_init_li(struct dp_soc *soc,
|
|||||||
while (tx_desc) {
|
while (tx_desc) {
|
||||||
page_id = count / num_desc_per_page;
|
page_id = count / num_desc_per_page;
|
||||||
offset = count % num_desc_per_page;
|
offset = count % num_desc_per_page;
|
||||||
id = ((pool_id_32 << DP_TX_DESC_ID_POOL_OS) |
|
id = ((!!spcl_tx_desc) << DP_TX_DESC_ID_SPCL_OS |
|
||||||
|
(pool_id_32 << DP_TX_DESC_ID_POOL_OS) |
|
||||||
(page_id << DP_TX_DESC_ID_PAGE_OS) | offset);
|
(page_id << DP_TX_DESC_ID_PAGE_OS) | offset);
|
||||||
|
|
||||||
tx_desc->id = id;
|
tx_desc->id = id;
|
||||||
|
Reference in New Issue
Block a user