|
@@ -1,5 +1,6 @@
|
|
/*
|
|
/*
|
|
* Copyright (c) 2021 The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2021 The Linux Foundation. All rights reserved.
|
|
|
|
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for
|
|
* Permission to use, copy, modify, and/or distribute this software for
|
|
* any purpose with or without fee is hereby granted, provided that the
|
|
* any purpose with or without fee is hereby granted, provided that the
|
|
@@ -118,16 +119,15 @@ void dp_cc_wbm_sw_en_cfg(struct hal_hw_cc_config *cc_cfg)
|
|
* dp_cc_reg_cfg_init() - initialize and configure HW cookie
|
|
* dp_cc_reg_cfg_init() - initialize and configure HW cookie
|
|
conversion register
|
|
conversion register
|
|
* @soc: SOC handle
|
|
* @soc: SOC handle
|
|
- * @cc_ctx: cookie conversion context pointer
|
|
|
|
* @is_4k_align: page address 4k alignd
|
|
* @is_4k_align: page address 4k alignd
|
|
*
|
|
*
|
|
* Return: None
|
|
* Return: None
|
|
*/
|
|
*/
|
|
static void dp_cc_reg_cfg_init(struct dp_soc *soc,
|
|
static void dp_cc_reg_cfg_init(struct dp_soc *soc,
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx,
|
|
|
|
bool is_4k_align)
|
|
bool is_4k_align)
|
|
{
|
|
{
|
|
struct hal_hw_cc_config cc_cfg = { 0 };
|
|
struct hal_hw_cc_config cc_cfg = { 0 };
|
|
|
|
+ struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
|
|
|
|
if (soc->cdp_soc.ol_ops->get_con_mode &&
|
|
if (soc->cdp_soc.ol_ops->get_con_mode &&
|
|
soc->cdp_soc.ol_ops->get_con_mode() == QDF_GLOBAL_FTM_MODE)
|
|
soc->cdp_soc.ol_ops->get_con_mode() == QDF_GLOBAL_FTM_MODE)
|
|
@@ -138,7 +138,7 @@ static void dp_cc_reg_cfg_init(struct dp_soc *soc,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- cc_cfg.lut_base_addr_31_0 = cc_ctx->cmem_base;
|
|
|
|
|
|
+ cc_cfg.lut_base_addr_31_0 = be_soc->cc_cmem_base;
|
|
cc_cfg.cc_global_en = true;
|
|
cc_cfg.cc_global_en = true;
|
|
cc_cfg.page_4k_align = is_4k_align;
|
|
cc_cfg.page_4k_align = is_4k_align;
|
|
cc_cfg.cookie_offset_msb = DP_CC_DESC_ID_SPT_VA_OS_MSB;
|
|
cc_cfg.cookie_offset_msb = DP_CC_DESC_ID_SPT_VA_OS_MSB;
|
|
@@ -176,10 +176,10 @@ static inline void dp_hw_cc_cmem_write(hal_soc_handle_t hal_soc_hdl,
|
|
*
|
|
*
|
|
* Return: 0 in case of success, else error value
|
|
* Return: 0 in case of success, else error value
|
|
*/
|
|
*/
|
|
-static inline QDF_STATUS dp_hw_cc_cmem_addr_init(
|
|
|
|
- struct dp_soc *soc,
|
|
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx)
|
|
|
|
|
|
+static inline QDF_STATUS dp_hw_cc_cmem_addr_init(struct dp_soc *soc)
|
|
{
|
|
{
|
|
|
|
+ struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
|
|
+
|
|
dp_info("cmem base 0x%llx, size 0x%llx",
|
|
dp_info("cmem base 0x%llx, size 0x%llx",
|
|
soc->cmem_base, soc->cmem_size);
|
|
soc->cmem_base, soc->cmem_size);
|
|
/* get CMEM for cookie conversion */
|
|
/* get CMEM for cookie conversion */
|
|
@@ -187,8 +187,8 @@ static inline QDF_STATUS dp_hw_cc_cmem_addr_init(
|
|
dp_err("cmem_size %llu bytes < 4K", soc->cmem_size);
|
|
dp_err("cmem_size %llu bytes < 4K", soc->cmem_size);
|
|
return QDF_STATUS_E_RESOURCES;
|
|
return QDF_STATUS_E_RESOURCES;
|
|
}
|
|
}
|
|
- cc_ctx->cmem_base = (uint32_t)(soc->cmem_base +
|
|
|
|
- DP_CC_MEM_OFFSET_IN_CMEM);
|
|
|
|
|
|
+ be_soc->cc_cmem_base = (uint32_t)(soc->cmem_base +
|
|
|
|
+ DP_CC_MEM_OFFSET_IN_CMEM);
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
@@ -196,7 +196,6 @@ static inline QDF_STATUS dp_hw_cc_cmem_addr_init(
|
|
#else
|
|
#else
|
|
|
|
|
|
static inline void dp_cc_reg_cfg_init(struct dp_soc *soc,
|
|
static inline void dp_cc_reg_cfg_init(struct dp_soc *soc,
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx,
|
|
|
|
bool is_4k_align) {}
|
|
bool is_4k_align) {}
|
|
|
|
|
|
static inline void dp_hw_cc_cmem_write(hal_soc_handle_t hal_soc_hdl,
|
|
static inline void dp_hw_cc_cmem_write(hal_soc_handle_t hal_soc_hdl,
|
|
@@ -204,31 +203,26 @@ static inline void dp_hw_cc_cmem_write(hal_soc_handle_t hal_soc_hdl,
|
|
uint32_t value)
|
|
uint32_t value)
|
|
{ }
|
|
{ }
|
|
|
|
|
|
-static inline QDF_STATUS dp_hw_cc_cmem_addr_init(
|
|
|
|
- struct dp_soc *soc,
|
|
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx)
|
|
|
|
|
|
+static inline QDF_STATUS dp_hw_cc_cmem_addr_init(struct dp_soc *soc)
|
|
{
|
|
{
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-static QDF_STATUS dp_hw_cookie_conversion_attach(struct dp_soc_be *be_soc)
|
|
|
|
|
|
+QDF_STATUS
|
|
|
|
+dp_hw_cookie_conversion_attach(struct dp_soc_be *be_soc,
|
|
|
|
+ struct dp_hw_cookie_conversion_t *cc_ctx,
|
|
|
|
+ uint32_t num_descs,
|
|
|
|
+ enum dp_desc_type desc_type,
|
|
|
|
+ uint8_t desc_pool_id)
|
|
{
|
|
{
|
|
struct dp_soc *soc = DP_SOC_BE_GET_SOC(be_soc);
|
|
struct dp_soc *soc = DP_SOC_BE_GET_SOC(be_soc);
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx = &be_soc->hw_cc_ctx;
|
|
|
|
- uint32_t max_tx_rx_desc_num, num_spt_pages, i = 0;
|
|
|
|
|
|
+ uint32_t num_spt_pages, i = 0;
|
|
struct dp_spt_page_desc *spt_desc;
|
|
struct dp_spt_page_desc *spt_desc;
|
|
struct qdf_mem_dma_page_t *dma_page;
|
|
struct qdf_mem_dma_page_t *dma_page;
|
|
- QDF_STATUS qdf_status;
|
|
|
|
-
|
|
|
|
- qdf_status = dp_hw_cc_cmem_addr_init(soc, cc_ctx);
|
|
|
|
- if (!QDF_IS_STATUS_SUCCESS(qdf_status))
|
|
|
|
- return qdf_status;
|
|
|
|
|
|
|
|
/* estimate how many SPT DDR pages needed */
|
|
/* estimate how many SPT DDR pages needed */
|
|
- max_tx_rx_desc_num = WLAN_CFG_NUM_TX_DESC_MAX * MAX_TXDESC_POOLS +
|
|
|
|
- WLAN_CFG_RX_SW_DESC_NUM_SIZE_MAX * MAX_RXDESC_POOLS;
|
|
|
|
- num_spt_pages = max_tx_rx_desc_num / DP_CC_SPT_PAGE_MAX_ENTRIES;
|
|
|
|
|
|
+ num_spt_pages = num_descs / DP_CC_SPT_PAGE_MAX_ENTRIES;
|
|
num_spt_pages = num_spt_pages <= DP_CC_PPT_MAX_ENTRIES ?
|
|
num_spt_pages = num_spt_pages <= DP_CC_PPT_MAX_ENTRIES ?
|
|
num_spt_pages : DP_CC_PPT_MAX_ENTRIES;
|
|
num_spt_pages : DP_CC_PPT_MAX_ENTRIES;
|
|
dp_info("num_spt_pages needed %d", num_spt_pages);
|
|
dp_info("num_spt_pages needed %d", num_spt_pages);
|
|
@@ -247,6 +241,9 @@ static QDF_STATUS dp_hw_cookie_conversion_attach(struct dp_soc_be *be_soc)
|
|
goto fail_0;
|
|
goto fail_0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ cc_ctx->cmem_offset = dp_desc_pool_get_cmem_base(0, desc_pool_id,
|
|
|
|
+ desc_type);
|
|
|
|
+
|
|
/* initial page desc */
|
|
/* initial page desc */
|
|
spt_desc = cc_ctx->page_desc_base;
|
|
spt_desc = cc_ctx->page_desc_base;
|
|
dma_page = cc_ctx->page_pool.dma_pages;
|
|
dma_page = cc_ctx->page_pool.dma_pages;
|
|
@@ -278,10 +275,11 @@ fail_0:
|
|
return QDF_STATUS_E_FAILURE;
|
|
return QDF_STATUS_E_FAILURE;
|
|
}
|
|
}
|
|
|
|
|
|
-static QDF_STATUS dp_hw_cookie_conversion_detach(struct dp_soc_be *be_soc)
|
|
|
|
|
|
+QDF_STATUS
|
|
|
|
+dp_hw_cookie_conversion_detach(struct dp_soc_be *be_soc,
|
|
|
|
+ struct dp_hw_cookie_conversion_t *cc_ctx)
|
|
{
|
|
{
|
|
struct dp_soc *soc = DP_SOC_BE_GET_SOC(be_soc);
|
|
struct dp_soc *soc = DP_SOC_BE_GET_SOC(be_soc);
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx = &be_soc->hw_cc_ctx;
|
|
|
|
|
|
|
|
qdf_mem_free(cc_ctx->page_desc_base);
|
|
qdf_mem_free(cc_ctx->page_desc_base);
|
|
dp_desc_multi_pages_mem_free(soc, DP_HW_CC_SPT_PAGE_TYPE,
|
|
dp_desc_multi_pages_mem_free(soc, DP_HW_CC_SPT_PAGE_TYPE,
|
|
@@ -291,160 +289,193 @@ static QDF_STATUS dp_hw_cookie_conversion_detach(struct dp_soc_be *be_soc)
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
-static QDF_STATUS dp_hw_cookie_conversion_init(struct dp_soc_be *be_soc)
|
|
|
|
|
|
+QDF_STATUS
|
|
|
|
+dp_hw_cookie_conversion_init(struct dp_soc_be *be_soc,
|
|
|
|
+ struct dp_hw_cookie_conversion_t *cc_ctx)
|
|
{
|
|
{
|
|
struct dp_soc *soc = DP_SOC_BE_GET_SOC(be_soc);
|
|
struct dp_soc *soc = DP_SOC_BE_GET_SOC(be_soc);
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx = &be_soc->hw_cc_ctx;
|
|
|
|
uint32_t i = 0;
|
|
uint32_t i = 0;
|
|
struct dp_spt_page_desc *spt_desc;
|
|
struct dp_spt_page_desc *spt_desc;
|
|
|
|
+ uint32_t ppt_index;
|
|
|
|
+ uint32_t ppt_id_start;
|
|
|
|
|
|
if (!cc_ctx->total_page_num) {
|
|
if (!cc_ctx->total_page_num) {
|
|
dp_err("total page num is 0");
|
|
dp_err("total page num is 0");
|
|
return QDF_STATUS_E_INVAL;
|
|
return QDF_STATUS_E_INVAL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ ppt_id_start = DP_CMEM_OFFSET_TO_PPT_ID(cc_ctx->cmem_offset);
|
|
spt_desc = cc_ctx->page_desc_base;
|
|
spt_desc = cc_ctx->page_desc_base;
|
|
while (i < cc_ctx->total_page_num) {
|
|
while (i < cc_ctx->total_page_num) {
|
|
/* write page PA to CMEM */
|
|
/* write page PA to CMEM */
|
|
dp_hw_cc_cmem_write(soc->hal_soc,
|
|
dp_hw_cc_cmem_write(soc->hal_soc,
|
|
- (cc_ctx->cmem_base +
|
|
|
|
- i * DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED),
|
|
|
|
|
|
+ (cc_ctx->cmem_offset + be_soc->cc_cmem_base
|
|
|
|
+ + (i * DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED)),
|
|
(spt_desc[i].page_p_addr >>
|
|
(spt_desc[i].page_p_addr >>
|
|
DP_CC_PPT_ENTRY_HW_APEND_BITS_4K_ALIGNED));
|
|
DP_CC_PPT_ENTRY_HW_APEND_BITS_4K_ALIGNED));
|
|
|
|
|
|
- spt_desc[i].ppt_index = i;
|
|
|
|
- spt_desc[i].avail_entry_index = 0;
|
|
|
|
- /* link page desc */
|
|
|
|
- if ((i + 1) != cc_ctx->total_page_num)
|
|
|
|
- spt_desc[i].next = &spt_desc[i + 1];
|
|
|
|
- else
|
|
|
|
- spt_desc[i].next = NULL;
|
|
|
|
|
|
+ ppt_index = ppt_id_start + i;
|
|
|
|
+ spt_desc[i].ppt_index = ppt_index;
|
|
|
|
+
|
|
|
|
+ be_soc->page_desc_base[ppt_index].page_v_addr =
|
|
|
|
+ spt_desc[i].page_v_addr;
|
|
i++;
|
|
i++;
|
|
}
|
|
}
|
|
-
|
|
|
|
- cc_ctx->page_desc_freelist = cc_ctx->page_desc_base;
|
|
|
|
- cc_ctx->free_page_num = cc_ctx->total_page_num;
|
|
|
|
-
|
|
|
|
- /* write WBM/REO cookie conversion CFG register */
|
|
|
|
- dp_cc_reg_cfg_init(soc, cc_ctx, true);
|
|
|
|
-
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
-static QDF_STATUS dp_hw_cookie_conversion_deinit(struct dp_soc_be *be_soc)
|
|
|
|
|
|
+QDF_STATUS
|
|
|
|
+dp_hw_cookie_conversion_deinit(struct dp_soc_be *be_soc,
|
|
|
|
+ struct dp_hw_cookie_conversion_t *cc_ctx)
|
|
{
|
|
{
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx = &be_soc->hw_cc_ctx;
|
|
|
|
|
|
+ struct dp_soc *soc = DP_SOC_BE_GET_SOC(be_soc);
|
|
|
|
+ uint32_t ppt_index;
|
|
|
|
+ struct dp_spt_page_desc *spt_desc;
|
|
|
|
+ int i = 0;
|
|
|
|
|
|
- cc_ctx->page_desc_freelist = NULL;
|
|
|
|
- cc_ctx->free_page_num = 0;
|
|
|
|
|
|
+ spt_desc = cc_ctx->page_desc_base;
|
|
|
|
+ while (i < cc_ctx->total_page_num) {
|
|
|
|
+ /* reset PA in CMEM to NULL */
|
|
|
|
+ dp_hw_cc_cmem_write(soc->hal_soc,
|
|
|
|
+ (cc_ctx->cmem_offset + be_soc->cc_cmem_base
|
|
|
|
+ + (i * DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED)),
|
|
|
|
+ 0);
|
|
|
|
|
|
|
|
+ ppt_index = spt_desc[i].ppt_index;
|
|
|
|
+ be_soc->page_desc_base[ppt_index].page_v_addr = NULL;
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
-uint16_t dp_cc_spt_page_desc_alloc(struct dp_soc_be *be_soc,
|
|
|
|
- struct dp_spt_page_desc **list_head,
|
|
|
|
- struct dp_spt_page_desc **list_tail,
|
|
|
|
- uint16_t num_desc)
|
|
|
|
|
|
+static QDF_STATUS dp_soc_detach_be(struct dp_soc *soc)
|
|
{
|
|
{
|
|
- uint16_t num_pages, count;
|
|
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx = &be_soc->hw_cc_ctx;
|
|
|
|
-
|
|
|
|
- num_pages = (num_desc / DP_CC_SPT_PAGE_MAX_ENTRIES) +
|
|
|
|
- (num_desc % DP_CC_SPT_PAGE_MAX_ENTRIES ? 1 : 0);
|
|
|
|
-
|
|
|
|
- if (num_pages > cc_ctx->free_page_num) {
|
|
|
|
- dp_err("fail: num_pages required %d > free_page_num %d",
|
|
|
|
- num_pages,
|
|
|
|
- cc_ctx->free_page_num);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- qdf_spin_lock_bh(&cc_ctx->cc_lock);
|
|
|
|
-
|
|
|
|
- *list_head = *list_tail = cc_ctx->page_desc_freelist;
|
|
|
|
- for (count = 0; count < num_pages; count++) {
|
|
|
|
- if (qdf_unlikely(!cc_ctx->page_desc_freelist)) {
|
|
|
|
- cc_ctx->page_desc_freelist = *list_head;
|
|
|
|
- *list_head = *list_tail = NULL;
|
|
|
|
- qdf_spin_unlock_bh(&cc_ctx->cc_lock);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- *list_tail = cc_ctx->page_desc_freelist;
|
|
|
|
- cc_ctx->page_desc_freelist = cc_ctx->page_desc_freelist->next;
|
|
|
|
- }
|
|
|
|
- (*list_tail)->next = NULL;
|
|
|
|
- cc_ctx->free_page_num -= count;
|
|
|
|
-
|
|
|
|
- qdf_spin_unlock_bh(&cc_ctx->cc_lock);
|
|
|
|
|
|
+ struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
|
|
+ int i = 0;
|
|
|
|
|
|
- return count;
|
|
|
|
-}
|
|
|
|
|
|
+ dp_tx_deinit_bank_profiles(be_soc);
|
|
|
|
|
|
-void dp_cc_spt_page_desc_free(struct dp_soc_be *be_soc,
|
|
|
|
- struct dp_spt_page_desc **list_head,
|
|
|
|
- struct dp_spt_page_desc **list_tail,
|
|
|
|
- uint16_t page_nums)
|
|
|
|
-{
|
|
|
|
- struct dp_hw_cookie_conversion_t *cc_ctx = &be_soc->hw_cc_ctx;
|
|
|
|
- struct dp_spt_page_desc *temp_list = NULL;
|
|
|
|
|
|
+ for (i = 0; i < MAX_TXDESC_POOLS; i++)
|
|
|
|
+ dp_hw_cookie_conversion_detach(be_soc,
|
|
|
|
+ &be_soc->tx_cc_ctx[i]);
|
|
|
|
|
|
- qdf_spin_lock_bh(&cc_ctx->cc_lock);
|
|
|
|
|
|
+ for (i = 0; i < MAX_RXDESC_POOLS; i++)
|
|
|
|
+ dp_hw_cookie_conversion_detach(be_soc,
|
|
|
|
+ &be_soc->rx_cc_ctx[i]);
|
|
|
|
|
|
- temp_list = cc_ctx->page_desc_freelist;
|
|
|
|
- cc_ctx->page_desc_freelist = *list_head;
|
|
|
|
- (*list_tail)->next = temp_list;
|
|
|
|
- cc_ctx->free_page_num += page_nums;
|
|
|
|
- *list_tail = NULL;
|
|
|
|
- *list_head = NULL;
|
|
|
|
|
|
+ qdf_mem_free(be_soc->page_desc_base);
|
|
|
|
+ be_soc->page_desc_base = NULL;
|
|
|
|
|
|
- qdf_spin_unlock_bh(&cc_ctx->cc_lock);
|
|
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
static QDF_STATUS dp_soc_attach_be(struct dp_soc *soc)
|
|
static QDF_STATUS dp_soc_attach_be(struct dp_soc *soc)
|
|
{
|
|
{
|
|
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
|
|
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
|
|
|
|
+ uint32_t max_tx_rx_desc_num, num_spt_pages;
|
|
|
|
+ uint32_t num_entries;
|
|
|
|
+ int i = 0;
|
|
|
|
+
|
|
|
|
+ max_tx_rx_desc_num = WLAN_CFG_NUM_TX_DESC_MAX * MAX_TXDESC_POOLS +
|
|
|
|
+ WLAN_CFG_RX_SW_DESC_NUM_SIZE_MAX * MAX_RXDESC_POOLS;
|
|
|
|
+ /* estimate how many SPT DDR pages needed */
|
|
|
|
+ num_spt_pages = max_tx_rx_desc_num / DP_CC_SPT_PAGE_MAX_ENTRIES;
|
|
|
|
+ num_spt_pages = num_spt_pages <= DP_CC_PPT_MAX_ENTRIES ?
|
|
|
|
+ num_spt_pages : DP_CC_PPT_MAX_ENTRIES;
|
|
|
|
+
|
|
|
|
+ be_soc->page_desc_base = qdf_mem_malloc(
|
|
|
|
+ DP_CC_PPT_MAX_ENTRIES * sizeof(struct dp_spt_page_desc));
|
|
|
|
+ if (!be_soc->page_desc_base) {
|
|
|
|
+ dp_err("spt page descs allocation failed");
|
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
|
+ }
|
|
|
|
|
|
soc->wbm_sw0_bm_id = hal_tx_get_wbm_sw0_bm_id();
|
|
soc->wbm_sw0_bm_id = hal_tx_get_wbm_sw0_bm_id();
|
|
qdf_status = dp_tx_init_bank_profiles(be_soc);
|
|
qdf_status = dp_tx_init_bank_profiles(be_soc);
|
|
|
|
|
|
- /* cookie conversion */
|
|
|
|
- qdf_status = dp_hw_cookie_conversion_attach(be_soc);
|
|
|
|
|
|
+ qdf_status = dp_hw_cc_cmem_addr_init(soc);
|
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status))
|
|
|
|
+ goto fail;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < MAX_TXDESC_POOLS; i++) {
|
|
|
|
+ num_entries = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
|
|
|
|
+ qdf_status =
|
|
|
|
+ dp_hw_cookie_conversion_attach(be_soc,
|
|
|
|
+ &be_soc->tx_cc_ctx[i],
|
|
|
|
+ num_entries,
|
|
|
|
+ DP_TX_DESC_TYPE, i);
|
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status))
|
|
|
|
+ goto fail;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < MAX_RXDESC_POOLS; i++) {
|
|
|
|
+ num_entries =
|
|
|
|
+ wlan_cfg_get_dp_soc_rx_sw_desc_num(soc->wlan_cfg_ctx);
|
|
|
|
+ qdf_status =
|
|
|
|
+ dp_hw_cookie_conversion_attach(be_soc,
|
|
|
|
+ &be_soc->rx_cc_ctx[i],
|
|
|
|
+ num_entries,
|
|
|
|
+ DP_RX_DESC_BUF_TYPE, i);
|
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status))
|
|
|
|
+ goto fail;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ return qdf_status;
|
|
|
|
+fail:
|
|
|
|
+ dp_soc_detach_be(soc);
|
|
return qdf_status;
|
|
return qdf_status;
|
|
}
|
|
}
|
|
|
|
|
|
-static QDF_STATUS dp_soc_detach_be(struct dp_soc *soc)
|
|
|
|
|
|
+static QDF_STATUS dp_soc_deinit_be(struct dp_soc *soc)
|
|
{
|
|
{
|
|
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
|
|
+ int i = 0;
|
|
|
|
|
|
- dp_tx_deinit_bank_profiles(be_soc);
|
|
|
|
|
|
+ for (i = 0; i < MAX_TXDESC_POOLS; i++)
|
|
|
|
+ dp_hw_cookie_conversion_deinit(be_soc,
|
|
|
|
+ &be_soc->tx_cc_ctx[i]);
|
|
|
|
|
|
- dp_hw_cookie_conversion_detach(be_soc);
|
|
|
|
|
|
+ for (i = 0; i < MAX_RXDESC_POOLS; i++)
|
|
|
|
+ dp_hw_cookie_conversion_deinit(be_soc,
|
|
|
|
+ &be_soc->rx_cc_ctx[i]);
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
static QDF_STATUS dp_soc_init_be(struct dp_soc *soc)
|
|
static QDF_STATUS dp_soc_init_be(struct dp_soc *soc)
|
|
{
|
|
{
|
|
- struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
|
|
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
|
|
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
|
|
|
|
+ struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
|
|
+ int i = 0;
|
|
|
|
|
|
- qdf_status = dp_hw_cookie_conversion_init(be_soc);
|
|
|
|
|
|
+ for (i = 0; i < MAX_TXDESC_POOLS; i++) {
|
|
|
|
+ qdf_status =
|
|
|
|
+ dp_hw_cookie_conversion_init(be_soc,
|
|
|
|
+ &be_soc->tx_cc_ctx[i]);
|
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status))
|
|
|
|
+ goto fail;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < MAX_RXDESC_POOLS; i++) {
|
|
|
|
+ qdf_status =
|
|
|
|
+ dp_hw_cookie_conversion_init(be_soc,
|
|
|
|
+ &be_soc->rx_cc_ctx[i]);
|
|
|
|
+ if (!QDF_IS_STATUS_SUCCESS(qdf_status))
|
|
|
|
+ goto fail;
|
|
|
|
+ }
|
|
|
|
|
|
/* route vdev_id mismatch notification via FW completion */
|
|
/* route vdev_id mismatch notification via FW completion */
|
|
hal_tx_vdev_mismatch_routing_set(soc->hal_soc,
|
|
hal_tx_vdev_mismatch_routing_set(soc->hal_soc,
|
|
HAL_TX_VDEV_MISMATCH_FW_NOTIFY);
|
|
HAL_TX_VDEV_MISMATCH_FW_NOTIFY);
|
|
- return qdf_status;
|
|
|
|
-}
|
|
|
|
|
|
|
|
-static QDF_STATUS dp_soc_deinit_be(struct dp_soc *soc)
|
|
|
|
-{
|
|
|
|
- struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
|
|
|
-
|
|
|
|
- dp_hw_cookie_conversion_deinit(be_soc);
|
|
|
|
|
|
+ /* write WBM/REO cookie conversion CFG register */
|
|
|
|
+ dp_cc_reg_cfg_init(soc, true);
|
|
|
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
|
|
|
+ return qdf_status;
|
|
|
|
+fail:
|
|
|
|
+ dp_soc_deinit_be(soc);
|
|
|
|
+ return qdf_status;
|
|
}
|
|
}
|
|
|
|
|
|
static QDF_STATUS dp_pdev_attach_be(struct dp_pdev *pdev)
|
|
static QDF_STATUS dp_pdev_attach_be(struct dp_pdev *pdev)
|