qcacmn: Fixes for IPA enablement for lithium/Hastings
- Support to pass IPA enabled(disabled) flag from ini to DP layer - Use ioremap call to translate tx_comp_doorbell_paddr obtained from calling ipa_setup api to tx_comp_doorbell_vaddr. This is needed to write the initial value of HP at the doorbell address. - Change REO_DST_RING_SIZE and WLAN_CFG_TX_RING_SIZE to 1023 for napier/hastings if IPA is enabled. This is needed because, ipa_setup API can handle only 16-bit values for the size param(bytes) of the ring. - Disable hash based flow steering for SAP peers in case IPA is enabled and set default reo_dest_ring_4 as default RX ring. Since IPA will be reaping RX packets from reo_dest_ring_4 only, flow steering is not needed for SAP peers. - Unmap pre-allocated TX buffers for IPA in the TX completion ring. - Donot execute IPA functionality if IPA is disabled from ini. Change-Id: I6855bfe293a457ccc0abd1ad5567f5c95232a9d2 CRs-Fixed: 2183519
这个提交包含在:
@@ -1293,6 +1293,7 @@ struct cdp_rx_indication_msdu {
|
|||||||
* @flow_steering_enable: Enable/Disable Rx Hash
|
* @flow_steering_enable: Enable/Disable Rx Hash
|
||||||
* @tcp_Udp_ChecksumOffload: Enable/Disable tcp-Udp checksum Offload
|
* @tcp_Udp_ChecksumOffload: Enable/Disable tcp-Udp checksum Offload
|
||||||
* @napi_enable: Enable/Disable Napi
|
* @napi_enable: Enable/Disable Napi
|
||||||
|
* @ipa_enable: Flag indicating if IPA is enabled or not
|
||||||
* @tx_flow_stop_queue_threshold: Value to Pause tx queues
|
* @tx_flow_stop_queue_threshold: Value to Pause tx queues
|
||||||
* @tx_flow_start_queue_offset: Available Tx descriptors to unpause
|
* @tx_flow_start_queue_offset: Available Tx descriptors to unpause
|
||||||
* tx queue
|
* tx queue
|
||||||
@@ -1303,9 +1304,11 @@ struct cdp_config_params {
|
|||||||
unsigned int flow_steering_enable:1;
|
unsigned int flow_steering_enable:1;
|
||||||
unsigned int tcp_udp_checksumoffload:1;
|
unsigned int tcp_udp_checksumoffload:1;
|
||||||
unsigned int napi_enable:1;
|
unsigned int napi_enable:1;
|
||||||
|
unsigned int ipa_enable:1;
|
||||||
/* Set when QCA_LL_TX_FLOW_CONTROL_V2 is enabled */
|
/* Set when QCA_LL_TX_FLOW_CONTROL_V2 is enabled */
|
||||||
uint8_t tx_flow_stop_queue_threshold;
|
uint8_t tx_flow_stop_queue_threshold;
|
||||||
uint8_t tx_flow_start_queue_offset;
|
uint8_t tx_flow_start_queue_offset;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -566,14 +566,10 @@ int htt_srng_setup(void *htt_soc, int mac_id, void *hal_srng,
|
|||||||
goto fail1;
|
goto fail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
dp_info("ring_type %d ring_id %d htt_ring_id %d hp_addr 0x%llx tp_addr 0x%llx",
|
||||||
"%s: ring_type %d ring_id %d",
|
hal_ring_type, srng_params.ring_id, htt_ring_id,
|
||||||
__func__, hal_ring_type, srng_params.ring_id);
|
(uint64_t)hp_addr,
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
(uint64_t)tp_addr);
|
||||||
"%s: hp_addr 0x%llx tp_addr 0x%llx",
|
|
||||||
__func__, (uint64_t)hp_addr, (uint64_t)tp_addr);
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
|
||||||
"%s: htt_ring_id %d", __func__, htt_ring_id);
|
|
||||||
break;
|
break;
|
||||||
case RXDMA_MONITOR_BUF:
|
case RXDMA_MONITOR_BUF:
|
||||||
htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING;
|
htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING;
|
||||||
|
@@ -45,15 +45,17 @@
|
|||||||
static void dp_tx_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
static void dp_tx_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
||||||
{
|
{
|
||||||
int idx;
|
int idx;
|
||||||
|
qdf_nbuf_t nbuf;
|
||||||
|
|
||||||
for (idx = 0; idx < soc->ipa_uc_tx_rsc.alloc_tx_buf_cnt; idx++) {
|
for (idx = 0; idx < soc->ipa_uc_tx_rsc.alloc_tx_buf_cnt; idx++) {
|
||||||
if (soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx]) {
|
nbuf = (qdf_nbuf_t)
|
||||||
qdf_nbuf_free((qdf_nbuf_t)
|
soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx];
|
||||||
(soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx]));
|
if (!nbuf)
|
||||||
|
continue;
|
||||||
soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx] =
|
qdf_nbuf_unmap_single(soc->osdev, nbuf, QDF_DMA_BIDIRECTIONAL);
|
||||||
(void *)NULL;
|
qdf_nbuf_free(nbuf);
|
||||||
}
|
soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx] =
|
||||||
|
(void *)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned);
|
qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned);
|
||||||
@@ -213,6 +215,9 @@ int dp_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
/* TX resource attach */
|
/* TX resource attach */
|
||||||
error = dp_tx_ipa_uc_attach(soc, pdev);
|
error = dp_tx_ipa_uc_attach(soc, pdev);
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -250,6 +255,9 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc,
|
|||||||
qdf_dma_addr_t hp_addr;
|
qdf_dma_addr_t hp_addr;
|
||||||
unsigned long addr_offset, dev_base_paddr;
|
unsigned long addr_offset, dev_base_paddr;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
/* IPA TCL_DATA Ring - HAL_SRNG_SW2TCL3 */
|
/* IPA TCL_DATA Ring - HAL_SRNG_SW2TCL3 */
|
||||||
hal_srng = soc->tcl_data_ring[IPA_TCL_DATA_RING_IDX].hal_srng;
|
hal_srng = soc->tcl_data_ring[IPA_TCL_DATA_RING_IDX].hal_srng;
|
||||||
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
||||||
@@ -272,20 +280,23 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc,
|
|||||||
soc->ipa_uc_tx_rsc.ipa_tcl_hp_paddr =
|
soc->ipa_uc_tx_rsc.ipa_tcl_hp_paddr =
|
||||||
(qdf_dma_addr_t)(addr_offset + dev_base_paddr);
|
(qdf_dma_addr_t)(addr_offset + dev_base_paddr);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
dp_info("IPA TCL_DATA Ring addr_offset=%x, dev_base_paddr=%x, hp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)",
|
||||||
"%s: addr_offset=%x, dev_base_paddr=%x, ipa_tcl_hp_paddr=%x",
|
(unsigned int)addr_offset,
|
||||||
__func__, (unsigned int)addr_offset,
|
|
||||||
(unsigned int)dev_base_paddr,
|
(unsigned int)dev_base_paddr,
|
||||||
(unsigned int)(soc->ipa_uc_tx_rsc.ipa_tcl_hp_paddr));
|
(unsigned int)(soc->ipa_uc_tx_rsc.ipa_tcl_hp_paddr),
|
||||||
|
(void *)soc->ipa_uc_tx_rsc.ipa_tcl_ring_base_paddr,
|
||||||
|
(void *)soc->ipa_uc_tx_rsc.ipa_tcl_ring_base_vaddr,
|
||||||
|
srng_params.num_entries,
|
||||||
|
soc->ipa_uc_tx_rsc.ipa_tcl_ring_size);
|
||||||
|
|
||||||
/* IPA TX COMP Ring - HAL_SRNG_WBM2SW2_RELEASE */
|
/* IPA TX COMP Ring - HAL_SRNG_WBM2SW2_RELEASE */
|
||||||
hal_srng = soc->tx_comp_ring[IPA_TX_COMP_RING_IDX].hal_srng;
|
hal_srng = soc->tx_comp_ring[IPA_TX_COMP_RING_IDX].hal_srng;
|
||||||
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
||||||
|
|
||||||
soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_paddr =
|
soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_paddr =
|
||||||
srng_params.ring_base_paddr;
|
srng_params.ring_base_paddr;
|
||||||
soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_vaddr =
|
soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_vaddr =
|
||||||
srng_params.ring_base_vaddr;
|
srng_params.ring_base_vaddr;
|
||||||
soc->ipa_uc_tx_rsc.ipa_wbm_ring_size =
|
soc->ipa_uc_tx_rsc.ipa_wbm_ring_size =
|
||||||
(srng_params.num_entries * srng_params.entry_size) << 2;
|
(srng_params.num_entries * srng_params.entry_size) << 2;
|
||||||
addr_offset = (unsigned long)(hal_srng->u.dst_ring.tp_addr) -
|
addr_offset = (unsigned long)(hal_srng->u.dst_ring.tp_addr) -
|
||||||
@@ -293,20 +304,23 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc,
|
|||||||
soc->ipa_uc_tx_rsc.ipa_wbm_tp_paddr =
|
soc->ipa_uc_tx_rsc.ipa_wbm_tp_paddr =
|
||||||
(qdf_dma_addr_t)(addr_offset + dev_base_paddr);
|
(qdf_dma_addr_t)(addr_offset + dev_base_paddr);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
dp_info("IPA TX COMP Ring addr_offset=%x, dev_base_paddr=%x, ipa_wbm_tp_paddr=%x paddr=%pK vaddr=0%pK size= %u(%u bytes)",
|
||||||
"%s: addr_offset=%x, dev_base_paddr=%x, ipa_wbm_tp_paddr=%x",
|
(unsigned int)addr_offset,
|
||||||
__func__, (unsigned int)addr_offset,
|
|
||||||
(unsigned int)dev_base_paddr,
|
(unsigned int)dev_base_paddr,
|
||||||
(unsigned int)(soc->ipa_uc_tx_rsc.ipa_wbm_tp_paddr));
|
(unsigned int)(soc->ipa_uc_tx_rsc.ipa_wbm_tp_paddr),
|
||||||
|
(void *)soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_paddr,
|
||||||
|
(void *)soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_vaddr,
|
||||||
|
srng_params.num_entries,
|
||||||
|
soc->ipa_uc_tx_rsc.ipa_wbm_ring_size);
|
||||||
|
|
||||||
/* IPA REO_DEST Ring - HAL_SRNG_REO2SW4 */
|
/* IPA REO_DEST Ring - HAL_SRNG_REO2SW4 */
|
||||||
hal_srng = soc->reo_dest_ring[IPA_REO_DEST_RING_IDX].hal_srng;
|
hal_srng = soc->reo_dest_ring[IPA_REO_DEST_RING_IDX].hal_srng;
|
||||||
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
||||||
|
|
||||||
soc->ipa_uc_rx_rsc.ipa_reo_ring_base_paddr =
|
soc->ipa_uc_rx_rsc.ipa_reo_ring_base_paddr =
|
||||||
srng_params.ring_base_paddr;
|
srng_params.ring_base_paddr;
|
||||||
soc->ipa_uc_rx_rsc.ipa_reo_ring_base_vaddr =
|
soc->ipa_uc_rx_rsc.ipa_reo_ring_base_vaddr =
|
||||||
srng_params.ring_base_vaddr;
|
srng_params.ring_base_vaddr;
|
||||||
soc->ipa_uc_rx_rsc.ipa_reo_ring_size =
|
soc->ipa_uc_rx_rsc.ipa_reo_ring_size =
|
||||||
(srng_params.num_entries * srng_params.entry_size) << 2;
|
(srng_params.num_entries * srng_params.entry_size) << 2;
|
||||||
addr_offset = (unsigned long)(hal_srng->u.dst_ring.tp_addr) -
|
addr_offset = (unsigned long)(hal_srng->u.dst_ring.tp_addr) -
|
||||||
@@ -314,11 +328,14 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc,
|
|||||||
soc->ipa_uc_rx_rsc.ipa_reo_tp_paddr =
|
soc->ipa_uc_rx_rsc.ipa_reo_tp_paddr =
|
||||||
(qdf_dma_addr_t)(addr_offset + dev_base_paddr);
|
(qdf_dma_addr_t)(addr_offset + dev_base_paddr);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
dp_info("IPA REO_DEST Ring addr_offset=%x, dev_base_paddr=%x, tp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)",
|
||||||
"%s: addr_offset=%x, dev_base_paddr=%x, ipa_reo_tp_paddr=%x",
|
(unsigned int)addr_offset,
|
||||||
__func__, (unsigned int)addr_offset,
|
|
||||||
(unsigned int)dev_base_paddr,
|
(unsigned int)dev_base_paddr,
|
||||||
(unsigned int)(soc->ipa_uc_rx_rsc.ipa_reo_tp_paddr));
|
(unsigned int)(soc->ipa_uc_rx_rsc.ipa_reo_tp_paddr),
|
||||||
|
(void *)soc->ipa_uc_rx_rsc.ipa_reo_ring_base_paddr,
|
||||||
|
(void *)soc->ipa_uc_rx_rsc.ipa_reo_ring_base_vaddr,
|
||||||
|
srng_params.num_entries,
|
||||||
|
soc->ipa_uc_rx_rsc.ipa_reo_ring_size);
|
||||||
|
|
||||||
hal_srng = pdev->rx_refill_buf_ring2.hal_srng;
|
hal_srng = pdev->rx_refill_buf_ring2.hal_srng;
|
||||||
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params);
|
||||||
@@ -331,9 +348,12 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc,
|
|||||||
hp_addr = hal_srng_get_hp_addr(hal_soc, (void *)hal_srng);
|
hp_addr = hal_srng_get_hp_addr(hal_soc, (void *)hal_srng);
|
||||||
soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr = hp_addr;
|
soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr = hp_addr;
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
dp_info("IPA REFILL_BUF Ring hp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)",
|
||||||
"%s: ipa_rx_refill_buf_hp_paddr=%x", __func__,
|
(unsigned int)(soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr),
|
||||||
(unsigned int)(soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr));
|
(void *)soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_base_paddr,
|
||||||
|
(void *)soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_base_vaddr,
|
||||||
|
srng_params.num_entries,
|
||||||
|
soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_size);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -354,6 +374,9 @@ QDF_STATUS dp_ipa_get_resource(struct cdp_pdev *ppdev)
|
|||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
struct dp_ipa_resources *ipa_res = &pdev->ipa_resource;
|
struct dp_ipa_resources *ipa_res = &pdev->ipa_resource;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
ipa_res->tx_ring_base_paddr =
|
ipa_res->tx_ring_base_paddr =
|
||||||
soc->ipa_uc_tx_rsc.ipa_tcl_ring_base_paddr;
|
soc->ipa_uc_tx_rsc.ipa_tcl_ring_base_paddr;
|
||||||
ipa_res->tx_ring_size =
|
ipa_res->tx_ring_size =
|
||||||
@@ -376,6 +399,14 @@ QDF_STATUS dp_ipa_get_resource(struct cdp_pdev *ppdev)
|
|||||||
ipa_res->rx_refill_ring_size =
|
ipa_res->rx_refill_ring_size =
|
||||||
soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_size;
|
soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_size;
|
||||||
|
|
||||||
|
dp_debug("ipa_res->tx_ring_base_paddr:%pK ipa_res->tx_ring_size:%u ipa_res->tx_comp_ring_base_paddr:%pK ipa_res->tx_comp_ring_size:%u ipa_res->rx_refill_ring_base_paddr:%pK ipa_res->rx_refill_ring_size:%u",
|
||||||
|
(void *)ipa_res->tx_ring_base_paddr,
|
||||||
|
ipa_res->tx_ring_size,
|
||||||
|
(void *)ipa_res->tx_comp_ring_base_paddr,
|
||||||
|
ipa_res->tx_comp_ring_size,
|
||||||
|
(void *)ipa_res->rx_refill_ring_base_paddr,
|
||||||
|
ipa_res->rx_refill_ring_size);
|
||||||
|
|
||||||
if ((0 == ipa_res->tx_comp_ring_base_paddr) ||
|
if ((0 == ipa_res->tx_comp_ring_base_paddr) ||
|
||||||
(0 == ipa_res->rx_rdy_ring_base_paddr))
|
(0 == ipa_res->rx_rdy_ring_base_paddr))
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
@@ -402,10 +433,27 @@ QDF_STATUS dp_ipa_set_doorbell_paddr(struct cdp_pdev *ppdev)
|
|||||||
struct hal_srng *reo_srng =
|
struct hal_srng *reo_srng =
|
||||||
soc->reo_dest_ring[IPA_REO_DEST_RING_IDX].hal_srng;
|
soc->reo_dest_ring[IPA_REO_DEST_RING_IDX].hal_srng;
|
||||||
|
|
||||||
hal_srng_dst_set_hp_paddr(wbm_srng, ipa_res->tx_comp_doorbell_paddr);
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
hal_srng_dst_init_hp(wbm_srng, ipa_res->tx_comp_doorbell_vaddr);
|
return QDF_STATUS_SUCCESS;
|
||||||
hal_srng_dst_set_hp_paddr(reo_srng, ipa_res->rx_ready_doorbell_paddr);
|
|
||||||
|
|
||||||
|
hal_srng_dst_set_hp_paddr(wbm_srng, ipa_res->tx_comp_doorbell_paddr);
|
||||||
|
|
||||||
|
ipa_res->tx_comp_doorbell_vaddr =
|
||||||
|
ioremap(ipa_res->tx_comp_doorbell_paddr, 4);
|
||||||
|
dp_info("paddr %pK vaddr %pK",
|
||||||
|
(void *)ipa_res->tx_comp_doorbell_paddr,
|
||||||
|
(void *)ipa_res->tx_comp_doorbell_vaddr);
|
||||||
|
|
||||||
|
hal_srng_dst_init_hp(wbm_srng, ipa_res->tx_comp_doorbell_vaddr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For RX, REO module on Napier/Hastings does reordering on incoming
|
||||||
|
* Ethernet packets and writes one or more descriptors to REO2IPA Rx
|
||||||
|
* ring.It then updates the ring’s Write/Head ptr and rings a doorbell
|
||||||
|
* to IPA.
|
||||||
|
* Set the doorbell addr for the REO ring.
|
||||||
|
*/
|
||||||
|
hal_srng_dst_set_hp_paddr(reo_srng, ipa_res->rx_ready_doorbell_paddr);
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,6 +468,9 @@ QDF_STATUS dp_ipa_op_response(struct cdp_pdev *ppdev, uint8_t *op_msg)
|
|||||||
{
|
{
|
||||||
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
|
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(pdev->soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
if (pdev->ipa_uc_op_cb) {
|
if (pdev->ipa_uc_op_cb) {
|
||||||
pdev->ipa_uc_op_cb(op_msg, pdev->usr_ctxt);
|
pdev->ipa_uc_op_cb(op_msg, pdev->usr_ctxt);
|
||||||
} else {
|
} else {
|
||||||
@@ -445,6 +496,9 @@ QDF_STATUS dp_ipa_register_op_cb(struct cdp_pdev *ppdev,
|
|||||||
{
|
{
|
||||||
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
|
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(pdev->soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
pdev->ipa_uc_op_cb = op_cb;
|
pdev->ipa_uc_op_cb = op_cb;
|
||||||
pdev->usr_ctxt = usr_ctxt;
|
pdev->usr_ctxt = usr_ctxt;
|
||||||
|
|
||||||
@@ -500,6 +554,9 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_pdev *ppdev)
|
|||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
uint32_t remap_val;
|
uint32_t remap_val;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
/* Call HAL API to remap REO rings to REO2IPA ring */
|
/* Call HAL API to remap REO rings to REO2IPA ring */
|
||||||
remap_val = HAL_REO_REMAP_VAL(REO_REMAP_TCL, REO_REMAP_TCL) |
|
remap_val = HAL_REO_REMAP_VAL(REO_REMAP_TCL, REO_REMAP_TCL) |
|
||||||
HAL_REO_REMAP_VAL(REO_REMAP_SW1, REO_REMAP_SW4) |
|
HAL_REO_REMAP_VAL(REO_REMAP_SW1, REO_REMAP_SW4) |
|
||||||
@@ -510,7 +567,6 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_pdev *ppdev)
|
|||||||
HAL_REO_REMAP_VAL(REO_REMAP_FW, REO_REMAP_FW) |
|
HAL_REO_REMAP_VAL(REO_REMAP_FW, REO_REMAP_FW) |
|
||||||
HAL_REO_REMAP_VAL(REO_REMAP_UNUSED, REO_REMAP_FW);
|
HAL_REO_REMAP_VAL(REO_REMAP_UNUSED, REO_REMAP_FW);
|
||||||
hal_reo_remap_IX0(soc->hal_soc, remap_val);
|
hal_reo_remap_IX0(soc->hal_soc, remap_val);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -528,6 +584,9 @@ QDF_STATUS dp_ipa_disable_autonomy(struct cdp_pdev *ppdev)
|
|||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
uint32_t remap_val;
|
uint32_t remap_val;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
/* Call HAL API to remap REO rings to REO2IPA ring */
|
/* Call HAL API to remap REO rings to REO2IPA ring */
|
||||||
remap_val = HAL_REO_REMAP_VAL(REO_REMAP_TCL, REO_REMAP_TCL) |
|
remap_val = HAL_REO_REMAP_VAL(REO_REMAP_TCL, REO_REMAP_TCL) |
|
||||||
HAL_REO_REMAP_VAL(REO_REMAP_SW1, REO_REMAP_SW1) |
|
HAL_REO_REMAP_VAL(REO_REMAP_SW1, REO_REMAP_SW1) |
|
||||||
@@ -607,6 +666,10 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb,
|
|||||||
uint32_t desc_size;
|
uint32_t desc_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
|
||||||
qdf_mem_zero(&tx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
qdf_mem_zero(&tx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
||||||
qdf_mem_zero(&rx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
qdf_mem_zero(&rx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
||||||
qdf_mem_zero(&pipe_in, sizeof(pipe_in));
|
qdf_mem_zero(&pipe_in, sizeof(pipe_in));
|
||||||
@@ -735,8 +798,9 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb,
|
|||||||
QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(&pipe_in) = ipa_w2i_cb;
|
QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(&pipe_in) = ipa_w2i_cb;
|
||||||
QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(&pipe_in) = ipa_priv;
|
QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(&pipe_in) = ipa_priv;
|
||||||
|
|
||||||
/* Connect WDI IPA PIPE */
|
/* Connect WDI IPA PIPEs */
|
||||||
ret = qdf_ipa_wdi_conn_pipes(&pipe_in, &pipe_out);
|
ret = qdf_ipa_wdi_conn_pipes(&pipe_in, &pipe_out);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
"%s: ipa_wdi_conn_pipes: IPA pipe setup failed: ret=%d",
|
"%s: ipa_wdi_conn_pipes: IPA pipe setup failed: ret=%d",
|
||||||
@@ -745,56 +809,54 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* IPA uC Doorbell registers */
|
/* IPA uC Doorbell registers */
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
dp_info("Tx DB PA=0x%x, Rx DB PA=0x%x",
|
||||||
"%s: Tx DB PA=0x%x, Rx DB PA=0x%x",
|
(unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(&pipe_out),
|
||||||
__func__,
|
(unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out));
|
||||||
(unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(&pipe_out),
|
|
||||||
(unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out));
|
|
||||||
|
|
||||||
ipa_res->tx_comp_doorbell_paddr =
|
ipa_res->tx_comp_doorbell_paddr =
|
||||||
QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(&pipe_out);
|
QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(&pipe_out);
|
||||||
ipa_res->rx_ready_doorbell_paddr =
|
ipa_res->rx_ready_doorbell_paddr =
|
||||||
QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out);
|
QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
dp_info("Tx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%pK %s=%pK",
|
||||||
"%s: Tx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%pK",
|
"transfer_ring_base_pa",
|
||||||
__func__,
|
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(tx),
|
||||||
"transfer_ring_base_pa",
|
"transfer_ring_size",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(tx),
|
QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(tx),
|
||||||
"transfer_ring_size",
|
"transfer_ring_doorbell_pa",
|
||||||
QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(tx),
|
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(tx),
|
||||||
"transfer_ring_doorbell_pa",
|
"event_ring_base_pa",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(tx),
|
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(tx),
|
||||||
"event_ring_base_pa",
|
"event_ring_size",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(tx),
|
QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(tx),
|
||||||
"event_ring_size",
|
"event_ring_doorbell_pa",
|
||||||
QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(tx),
|
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(tx),
|
||||||
"event_ring_doorbell_pa",
|
"num_pkt_buffers",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(tx),
|
QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(tx),
|
||||||
"num_pkt_buffers",
|
"tx_comp_doorbell_paddr",
|
||||||
QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(tx),
|
(void *)ipa_res->tx_comp_doorbell_paddr,
|
||||||
"tx_comp_doorbell_paddr",
|
"tx_comp_doorbell_vaddr",
|
||||||
(void *)ipa_res->tx_comp_doorbell_paddr);
|
(void *)ipa_res->tx_comp_doorbell_vaddr);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
dp_info("Rx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%u, %s=%pK",
|
||||||
"%s: Rx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%pK",
|
"transfer_ring_base_pa",
|
||||||
__func__,
|
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(rx),
|
||||||
"transfer_ring_base_pa",
|
"transfer_ring_size",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(rx),
|
QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(rx),
|
||||||
"transfer_ring_size",
|
"transfer_ring_doorbell_pa",
|
||||||
QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(rx),
|
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(rx),
|
||||||
"transfer_ring_doorbell_pa",
|
"event_ring_base_pa",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(rx),
|
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(rx),
|
||||||
"event_ring_base_pa",
|
"event_ring_size",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(rx),
|
QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(rx),
|
||||||
"event_ring_size",
|
"event_ring_doorbell_pa",
|
||||||
QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(rx),
|
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(rx),
|
||||||
"event_ring_doorbell_pa",
|
"num_pkt_buffers",
|
||||||
(void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(rx),
|
QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(rx),
|
||||||
"num_pkt_buffers",
|
"pkt_offset(rx)",
|
||||||
QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(rx),
|
QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(rx),
|
||||||
"tx_comp_doorbell_paddr",
|
"tx_comp_doorbell_paddr",
|
||||||
(void *)ipa_res->rx_ready_doorbell_paddr);
|
(void *)ipa_res->rx_ready_doorbell_paddr);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -821,10 +883,7 @@ QDF_STATUS dp_ipa_setup_iface(char *ifname, uint8_t *mac_addr,
|
|||||||
struct dp_ipa_uc_tx_hdr uc_tx_hdr_v6;
|
struct dp_ipa_uc_tx_hdr uc_tx_hdr_v6;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
dp_debug("Add Partial hdr: %s, %pM", ifname, mac_addr);
|
||||||
"%s: Add Partial hdr: %s, %pM",
|
|
||||||
__func__, ifname, mac_addr);
|
|
||||||
|
|
||||||
qdf_mem_zero(&hdr_info, sizeof(qdf_ipa_wdi_hdr_info_t));
|
qdf_mem_zero(&hdr_info, sizeof(qdf_ipa_wdi_hdr_info_t));
|
||||||
qdf_ether_addr_copy(uc_tx_hdr.eth.h_source, mac_addr);
|
qdf_ether_addr_copy(uc_tx_hdr.eth.h_source, mac_addr);
|
||||||
|
|
||||||
@@ -856,7 +915,10 @@ QDF_STATUS dp_ipa_setup_iface(char *ifname, uint8_t *mac_addr,
|
|||||||
&hdr_info, sizeof(qdf_ipa_wdi_hdr_info_t));
|
&hdr_info, sizeof(qdf_ipa_wdi_hdr_info_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dp_debug("registering for session_id: %u", session_id);
|
||||||
|
|
||||||
ret = qdf_ipa_wdi_reg_intf(&in);
|
ret = qdf_ipa_wdi_reg_intf(&in);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
"%s: ipa_wdi_reg_intf: register IPA interface falied: ret=%d",
|
"%s: ipa_wdi_reg_intf: register IPA interface falied: ret=%d",
|
||||||
@@ -901,6 +963,9 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb,
|
|||||||
uint32_t desc_size;
|
uint32_t desc_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
qdf_mem_zero(&tx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
qdf_mem_zero(&tx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
||||||
qdf_mem_zero(&rx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
qdf_mem_zero(&rx, sizeof(qdf_ipa_wdi_pipe_setup_info_t));
|
||||||
qdf_mem_zero(&pipe_in, sizeof(pipe_in));
|
qdf_mem_zero(&pipe_in, sizeof(pipe_in));
|
||||||
|
@@ -997,8 +997,6 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
|
|||||||
* See if these settings need to passed from DP layer
|
* See if these settings need to passed from DP layer
|
||||||
*/
|
*/
|
||||||
ring_params.flags = 0;
|
ring_params.flags = 0;
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW,
|
|
||||||
FL("Ring type: %d, num:%d"), ring_type, ring_num);
|
|
||||||
|
|
||||||
num_entries = (num_entries > max_entries) ? max_entries : num_entries;
|
num_entries = (num_entries > max_entries) ? max_entries : num_entries;
|
||||||
srng->hal_srng = NULL;
|
srng->hal_srng = NULL;
|
||||||
@@ -1022,6 +1020,11 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
|
|||||||
(unsigned long)srng->base_vaddr_unaligned);
|
(unsigned long)srng->base_vaddr_unaligned);
|
||||||
ring_params.num_entries = num_entries;
|
ring_params.num_entries = num_entries;
|
||||||
|
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW,
|
||||||
|
FL("Ring type: %d, num:%d vaddr %pK paddr %pK entries %u"),
|
||||||
|
ring_type, ring_num, (void *)ring_params.ring_base_vaddr,
|
||||||
|
(void *)ring_params.ring_base_paddr, ring_params.num_entries);
|
||||||
|
|
||||||
if (soc->intr_mode == DP_INTR_MSI) {
|
if (soc->intr_mode == DP_INTR_MSI) {
|
||||||
dp_srng_msi_setup(soc, &ring_params, ring_type, ring_num);
|
dp_srng_msi_setup(soc, &ring_params, ring_type, ring_num);
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
|
||||||
@@ -1935,12 +1938,23 @@ static void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef IPA_OFFLOAD
|
||||||
|
#define REO_DST_RING_SIZE_QCA6290 1023
|
||||||
|
#ifndef QCA_WIFI_QCA8074_VP
|
||||||
|
#define REO_DST_RING_SIZE_QCA8074 1023
|
||||||
|
#else
|
||||||
|
#define REO_DST_RING_SIZE_QCA8074 8
|
||||||
|
#endif /* QCA_WIFI_QCA8074_VP */
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#define REO_DST_RING_SIZE_QCA6290 1024
|
#define REO_DST_RING_SIZE_QCA6290 1024
|
||||||
#ifndef QCA_WIFI_QCA8074_VP
|
#ifndef QCA_WIFI_QCA8074_VP
|
||||||
#define REO_DST_RING_SIZE_QCA8074 2048
|
#define REO_DST_RING_SIZE_QCA8074 2048
|
||||||
#else
|
#else
|
||||||
#define REO_DST_RING_SIZE_QCA8074 8
|
#define REO_DST_RING_SIZE_QCA8074 8
|
||||||
#endif
|
#endif /* QCA_WIFI_QCA8074_VP */
|
||||||
|
#endif /* IPA_OFFLOAD */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dp_wds_aging_timer_fn() - Timer callback function for WDS aging
|
* dp_wds_aging_timer_fn() - Timer callback function for WDS aging
|
||||||
@@ -2225,13 +2239,14 @@ static bool dp_reo_remap_config(struct dp_soc *soc,
|
|||||||
uint32_t *remap1,
|
uint32_t *remap1,
|
||||||
uint32_t *remap2)
|
uint32_t *remap2)
|
||||||
{
|
{
|
||||||
|
|
||||||
*remap1 = ((0x1 << 0) | (0x2 << 3) | (0x3 << 6) | (0x1 << 9) |
|
*remap1 = ((0x1 << 0) | (0x2 << 3) | (0x3 << 6) | (0x1 << 9) |
|
||||||
(0x2 << 12) | (0x3 << 15) | (0x1 << 18) | (0x2 << 21)) << 8;
|
(0x2 << 12) | (0x3 << 15) | (0x1 << 18) | (0x2 << 21)) << 8;
|
||||||
|
|
||||||
*remap2 = ((0x3 << 0) | (0x1 << 3) | (0x2 << 6) | (0x3 << 9) |
|
*remap2 = ((0x3 << 0) | (0x1 << 3) | (0x2 << 6) | (0x3 << 9) |
|
||||||
(0x1 << 12) | (0x2 << 15) | (0x3 << 18) | (0x1 << 21)) << 8;
|
(0x1 << 12) | (0x2 << 15) | (0x3 << 18) | (0x1 << 21)) << 8;
|
||||||
|
|
||||||
|
dp_debug("remap1 %x remap2 %x", *remap1, *remap2);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -2251,7 +2266,6 @@ static bool dp_reo_remap_config(struct dp_soc *soc,
|
|||||||
(0x4 << 9) | (0x1 << 12) | (0x2 << 15) |
|
(0x4 << 9) | (0x1 << 12) | (0x2 << 15) |
|
||||||
(0x3 << 18) | (0x4 << 21)) << 8;
|
(0x3 << 18) | (0x4 << 21)) << 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
*remap1 = ((0x2 << 0) | (0x3 << 3) | (0x4 << 6) |
|
*remap1 = ((0x2 << 0) | (0x3 << 3) | (0x4 << 6) |
|
||||||
(0x2 << 9) | (0x3 << 12) | (0x4 << 15) |
|
(0x2 << 9) | (0x3 << 12) | (0x4 << 15) |
|
||||||
@@ -2276,6 +2290,9 @@ static bool dp_reo_remap_config(struct dp_soc *soc,
|
|||||||
/* return false if both radios are offloaded to NSS */
|
/* return false if both radios are offloaded to NSS */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dp_debug("remap1 %x remap2 %x offload_radio %u",
|
||||||
|
*remap1, *remap2, offload_radio);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -4027,6 +4044,98 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
|
|||||||
return (void *)peer;
|
return (void *)peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dp_vdev_get_default_reo_hash() - get reo dest ring and hash values for a vdev
|
||||||
|
* @vdev: Datapath VDEV handle
|
||||||
|
* @reo_dest: pointer to default reo_dest ring for vdev to be populated
|
||||||
|
* @hash_based: pointer to hash value (enabled/disabled) to be populated
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
void dp_vdev_get_default_reo_hash(struct dp_vdev *vdev,
|
||||||
|
enum cdp_host_reo_dest_ring *reo_dest,
|
||||||
|
bool *hash_based)
|
||||||
|
{
|
||||||
|
struct dp_soc *soc;
|
||||||
|
struct dp_pdev *pdev;
|
||||||
|
|
||||||
|
pdev = vdev->pdev;
|
||||||
|
soc = pdev->soc;
|
||||||
|
/*
|
||||||
|
* hash based steering is disabled for Radios which are offloaded
|
||||||
|
* to NSS
|
||||||
|
*/
|
||||||
|
if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
|
||||||
|
*hash_based = wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Below line of code will ensure the proper reo_dest ring is chosen
|
||||||
|
* for cases where toeplitz hash cannot be generated (ex: non TCP/UDP)
|
||||||
|
*/
|
||||||
|
*reo_dest = pdev->reo_dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef IPA_OFFLOAD
|
||||||
|
/*
|
||||||
|
* dp_peer_setup_get_reo_hash() - get reo dest ring and hash values for a peer
|
||||||
|
* @vdev: Datapath VDEV handle
|
||||||
|
* @reo_dest: pointer to default reo_dest ring for vdev to be populated
|
||||||
|
* @hash_based: pointer to hash value (enabled/disabled) to be populated
|
||||||
|
*
|
||||||
|
* If IPA is enabled in ini, for SAP mode, disable hash based
|
||||||
|
* steering, use default reo_dst ring for RX. Use config values for other modes.
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev,
|
||||||
|
enum cdp_host_reo_dest_ring *reo_dest,
|
||||||
|
bool *hash_based)
|
||||||
|
{
|
||||||
|
struct dp_soc *soc;
|
||||||
|
struct dp_pdev *pdev;
|
||||||
|
|
||||||
|
pdev = vdev->pdev;
|
||||||
|
soc = pdev->soc;
|
||||||
|
|
||||||
|
dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If IPA is enabled, disable hash-based flow steering and set
|
||||||
|
* reo_dest_ring_4 as the REO ring to receive packets on.
|
||||||
|
* IPA is configured to reap reo_dest_ring_4.
|
||||||
|
*
|
||||||
|
* Note - REO DST indexes are from 0 - 3, while cdp_host_reo_dest_ring
|
||||||
|
* value enum value is from 1 - 4.
|
||||||
|
* Hence, *reo_dest = IPA_REO_DEST_RING_IDX + 1
|
||||||
|
*/
|
||||||
|
if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) {
|
||||||
|
if (vdev->opmode == wlan_op_mode_ap) {
|
||||||
|
*reo_dest = IPA_REO_DEST_RING_IDX + 1;
|
||||||
|
*hash_based = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dp_peer_setup_get_reo_hash() - get reo dest ring and hash values for a peer
|
||||||
|
* @vdev: Datapath VDEV handle
|
||||||
|
* @reo_dest: pointer to default reo_dest ring for vdev to be populated
|
||||||
|
* @hash_based: pointer to hash value (enabled/disabled) to be populated
|
||||||
|
*
|
||||||
|
* Use system config values for hash based steering.
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev,
|
||||||
|
enum cdp_host_reo_dest_ring *reo_dest,
|
||||||
|
bool *hash_based)
|
||||||
|
{
|
||||||
|
dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based);
|
||||||
|
}
|
||||||
|
#endif /* IPA_OFFLOAD */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dp_peer_setup_wifi3() - initialize the peer
|
* dp_peer_setup_wifi3() - initialize the peer
|
||||||
* @vdev_hdl: virtual device object
|
* @vdev_hdl: virtual device object
|
||||||
@@ -4054,22 +4163,12 @@ static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl)
|
|||||||
peer->last_disassoc_rcvd = 0;
|
peer->last_disassoc_rcvd = 0;
|
||||||
peer->last_deauth_rcvd = 0;
|
peer->last_deauth_rcvd = 0;
|
||||||
|
|
||||||
/*
|
dp_peer_setup_get_reo_hash(vdev, &reo_dest, &hash_based);
|
||||||
* hash based steering is disabled for Radios which are offloaded
|
|
||||||
* to NSS
|
|
||||||
*/
|
|
||||||
if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
|
|
||||||
hash_based = wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx);
|
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
|
dp_info("pdev: %d vdev :%d opmode:%u hash-based-steering:%d default-reo_dest:%u",
|
||||||
FL("hash based steering for pdev: %d is %d"),
|
pdev->pdev_id, vdev->vdev_id,
|
||||||
pdev->pdev_id, hash_based);
|
vdev->opmode, hash_based, reo_dest);
|
||||||
|
|
||||||
/*
|
|
||||||
* Below line of code will ensure the proper reo_dest ring is chosen
|
|
||||||
* for cases where toeplitz hash cannot be generated (ex: non TCP/UDP)
|
|
||||||
*/
|
|
||||||
reo_dest = pdev->reo_dest;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are corner cases where the AD1 = AD2 = "VAPs address"
|
* There are corner cases where the AD1 = AD2 = "VAPs address"
|
||||||
@@ -5669,17 +5768,17 @@ dp_print_soc_rx_stats(struct dp_soc *soc)
|
|||||||
*
|
*
|
||||||
* Return: void
|
* Return: void
|
||||||
*/
|
*/
|
||||||
static inline void
|
static void
|
||||||
dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng,
|
dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng,
|
||||||
char *ring_name)
|
char *ring_name)
|
||||||
{
|
{
|
||||||
uint32_t tailp;
|
uint32_t tailp;
|
||||||
uint32_t headp;
|
uint32_t headp;
|
||||||
|
|
||||||
if (srng->hal_srng != NULL) {
|
if (soc && srng && srng->hal_srng) {
|
||||||
hal_api_get_tphp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
|
hal_api_get_tphp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
|
||||||
DP_PRINT_STATS("%s : Head pointer = %d Tail Pointer = %d\n",
|
DP_PRINT_STATS("%s : Head pointer = %d Tail Pointer = %d",
|
||||||
ring_name, headp, tailp);
|
ring_name, headp, tailp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5726,6 +5825,7 @@ dp_print_ring_stats(struct dp_pdev *pdev)
|
|||||||
&pdev->soc->reo_dest_ring[i],
|
&pdev->soc->reo_dest_ring[i],
|
||||||
ring_name);
|
ring_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) {
|
for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) {
|
||||||
snprintf(ring_name, STR_MAXLEN, "Tcl Data Ring %d", i);
|
snprintf(ring_name, STR_MAXLEN, "Tcl Data Ring %d", i);
|
||||||
dp_print_ring_stat_from_hal(pdev->soc,
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
@@ -7280,6 +7380,8 @@ QDF_STATUS dp_update_config_parameters(struct cdp_soc *psoc,
|
|||||||
soc->wlan_cfg_ctx->tcp_udp_checksumoffload =
|
soc->wlan_cfg_ctx->tcp_udp_checksumoffload =
|
||||||
params->tcp_udp_checksumoffload;
|
params->tcp_udp_checksumoffload;
|
||||||
soc->wlan_cfg_ctx->napi_enabled = params->napi_enable;
|
soc->wlan_cfg_ctx->napi_enabled = params->napi_enable;
|
||||||
|
soc->wlan_cfg_ctx->ipa_enabled = params->ipa_enable;
|
||||||
|
|
||||||
dp_update_flow_control_parameters(soc, params);
|
dp_update_flow_control_parameters(soc, params);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
@@ -127,27 +127,27 @@ extern void hal_detach(void *hal_soc);
|
|||||||
|
|
||||||
/* SRNG type to be passed in APIs hal_srng_get_entrysize and hal_srng_setup */
|
/* SRNG type to be passed in APIs hal_srng_get_entrysize and hal_srng_setup */
|
||||||
enum hal_ring_type {
|
enum hal_ring_type {
|
||||||
REO_DST,
|
REO_DST = 0,
|
||||||
REO_EXCEPTION,
|
REO_EXCEPTION = 1,
|
||||||
REO_REINJECT,
|
REO_REINJECT = 2,
|
||||||
REO_CMD,
|
REO_CMD = 3,
|
||||||
REO_STATUS,
|
REO_STATUS = 4,
|
||||||
TCL_DATA,
|
TCL_DATA = 5,
|
||||||
TCL_CMD,
|
TCL_CMD = 6,
|
||||||
TCL_STATUS,
|
TCL_STATUS = 7,
|
||||||
CE_SRC,
|
CE_SRC = 8,
|
||||||
CE_DST,
|
CE_DST = 9,
|
||||||
CE_DST_STATUS,
|
CE_DST_STATUS = 10,
|
||||||
WBM_IDLE_LINK,
|
WBM_IDLE_LINK = 11,
|
||||||
SW2WBM_RELEASE,
|
SW2WBM_RELEASE = 12,
|
||||||
WBM2SW_RELEASE,
|
WBM2SW_RELEASE = 13,
|
||||||
RXDMA_BUF,
|
RXDMA_BUF = 14,
|
||||||
RXDMA_DST,
|
RXDMA_DST = 15,
|
||||||
RXDMA_MONITOR_BUF,
|
RXDMA_MONITOR_BUF = 16,
|
||||||
RXDMA_MONITOR_STATUS,
|
RXDMA_MONITOR_STATUS = 17,
|
||||||
RXDMA_MONITOR_DST,
|
RXDMA_MONITOR_DST = 18,
|
||||||
RXDMA_MONITOR_DESC,
|
RXDMA_MONITOR_DESC = 19,
|
||||||
DIR_BUF_RX_DMA_SRC,
|
DIR_BUF_RX_DMA_SRC = 20,
|
||||||
#ifdef WLAN_FEATURE_CIF_CFR
|
#ifdef WLAN_FEATURE_CIF_CFR
|
||||||
WIFI_POS_SRC,
|
WIFI_POS_SRC,
|
||||||
#endif
|
#endif
|
||||||
|
@@ -93,12 +93,22 @@ static void hal_update_srng_hp_tp_address(void *hal_soc,
|
|||||||
|
|
||||||
srng = hal_get_srng(hal_soc, ring_id);
|
srng = hal_get_srng(hal_soc, ring_id);
|
||||||
|
|
||||||
if (ring_config->ring_dir == HAL_SRNG_DST_RING)
|
if (ring_config->ring_dir == HAL_SRNG_DST_RING) {
|
||||||
srng->u.dst_ring.tp_addr = SHADOW_REGISTER(shadow_config_index)
|
srng->u.dst_ring.tp_addr = SHADOW_REGISTER(shadow_config_index)
|
||||||
+ hal->dev_base_addr;
|
+ hal->dev_base_addr;
|
||||||
else
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
||||||
|
"%s: tp_addr=%pK dev base addr %pK index %u",
|
||||||
|
__func__, srng->u.dst_ring.tp_addr,
|
||||||
|
hal->dev_base_addr, shadow_config_index);
|
||||||
|
} else {
|
||||||
srng->u.src_ring.hp_addr = SHADOW_REGISTER(shadow_config_index)
|
srng->u.src_ring.hp_addr = SHADOW_REGISTER(shadow_config_index)
|
||||||
+ hal->dev_base_addr;
|
+ hal->dev_base_addr;
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
||||||
|
"%s: hp_addr=%pK dev base addr %pK index %u",
|
||||||
|
__func__, srng->u.src_ring.hp_addr,
|
||||||
|
hal->dev_base_addr, shadow_config_index);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_STATUS hal_set_one_shadow_config(void *hal_soc,
|
QDF_STATUS hal_set_one_shadow_config(void *hal_soc,
|
||||||
@@ -132,9 +142,11 @@ QDF_STATUS hal_set_one_shadow_config(void *hal_soc,
|
|||||||
ring_num);
|
ring_num);
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
||||||
"%s: target_reg %x, shadow_index %x, ring_type %d, ring num %d",
|
"%s: target_reg %x, shadow register 0x%x shadow_index 0x%x, ring_type %d, ring num %d",
|
||||||
__func__, target_register, shadow_config_index,
|
__func__, target_register,
|
||||||
ring_type, ring_num);
|
SHADOW_REGISTER(shadow_config_index),
|
||||||
|
shadow_config_index,
|
||||||
|
ring_type, ring_num);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -435,14 +447,20 @@ void hal_srng_dst_set_hp_paddr(struct hal_srng *srng,
|
|||||||
void hal_srng_dst_init_hp(struct hal_srng *srng,
|
void hal_srng_dst_init_hp(struct hal_srng *srng,
|
||||||
uint32_t *vaddr)
|
uint32_t *vaddr)
|
||||||
{
|
{
|
||||||
|
if (!srng)
|
||||||
|
return;
|
||||||
|
|
||||||
srng->u.dst_ring.hp_addr = vaddr;
|
srng->u.dst_ring.hp_addr = vaddr;
|
||||||
SRNG_DST_REG_WRITE(srng, HP, srng->u.dst_ring.cached_hp);
|
SRNG_DST_REG_WRITE(srng, HP, srng->u.dst_ring.cached_hp);
|
||||||
*(srng->u.dst_ring.hp_addr) = srng->u.dst_ring.cached_hp;
|
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
if (vaddr) {
|
||||||
"hp_addr=%pK, cached_hp=%d, hp=%d",
|
*srng->u.dst_ring.hp_addr = srng->u.dst_ring.cached_hp;
|
||||||
(void *)srng->u.dst_ring.hp_addr, srng->u.dst_ring.cached_hp,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
||||||
*(srng->u.dst_ring.hp_addr));
|
"hp_addr=%pK, cached_hp=%d, hp=%d",
|
||||||
|
(void *)srng->u.dst_ring.hp_addr,
|
||||||
|
srng->u.dst_ring.cached_hp,
|
||||||
|
*srng->u.dst_ring.hp_addr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -59,7 +59,8 @@
|
|||||||
#define WLAN_CFG_PER_PDEV_LMAC_RING 0
|
#define WLAN_CFG_PER_PDEV_LMAC_RING 0
|
||||||
#define WLAN_LRO_ENABLE 0
|
#define WLAN_LRO_ENABLE 0
|
||||||
#ifdef IPA_OFFLOAD
|
#ifdef IPA_OFFLOAD
|
||||||
#define WLAN_CFG_TX_RING_SIZE 2048
|
/* Size of TCL TX Ring */
|
||||||
|
#define WLAN_CFG_TX_RING_SIZE 1024
|
||||||
#define WLAN_CFG_PER_PDEV_TX_RING 0
|
#define WLAN_CFG_PER_PDEV_TX_RING 0
|
||||||
#define WLAN_CFG_IPA_UC_TX_BUF_SIZE 2048
|
#define WLAN_CFG_IPA_UC_TX_BUF_SIZE 2048
|
||||||
#define WLAN_CFG_IPA_UC_TX_PARTITION_BASE 3000
|
#define WLAN_CFG_IPA_UC_TX_PARTITION_BASE 3000
|
||||||
|
@@ -657,6 +657,11 @@ bool wlan_cfg_is_lro_enabled(struct wlan_cfg_dp_soc_ctxt *cfg)
|
|||||||
return cfg->lro_enabled;
|
return cfg->lro_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wlan_cfg_is_ipa_enabled(struct wlan_cfg_dp_soc_ctxt *cfg)
|
||||||
|
{
|
||||||
|
return cfg->ipa_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
void wlan_cfg_set_rx_hash(struct wlan_cfg_dp_soc_ctxt *cfg, bool val)
|
void wlan_cfg_set_rx_hash(struct wlan_cfg_dp_soc_ctxt *cfg, bool val)
|
||||||
{
|
{
|
||||||
cfg->rx_hash = val;
|
cfg->rx_hash = val;
|
||||||
|
@@ -84,50 +84,58 @@ struct wlan_cfg_dp_pdev_ctxt;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* struct wlan_cfg_dp_soc_ctxt - Configuration parameters for SoC (core TxRx)
|
* struct wlan_cfg_dp_soc_ctxt - Configuration parameters for SoC (core TxRx)
|
||||||
* @num_int_ctxts - Number of NAPI/Interrupt contexts to be registered for DP
|
* @num_int_ctxts: Number of NAPI/Interrupt contexts to be registered for DP
|
||||||
* @max_clients - Maximum number of peers/stations supported by device
|
* @max_clients: Maximum number of peers/stations supported by device
|
||||||
* @max_alloc_size - Maximum allocation size for any dynamic memory
|
* @max_alloc_size: Maximum allocation size for any dynamic memory
|
||||||
* allocation request for this device
|
* allocation request for this device
|
||||||
* @per_pdev_tx_ring - 0 - TCL ring is not mapped per radio
|
* @per_pdev_tx_ring: 0: TCL ring is not mapped per radio
|
||||||
* 1 - Each TCL ring is mapped to one radio/pdev
|
* 1: Each TCL ring is mapped to one radio/pdev
|
||||||
* @num_tcl_data_rings - Number of TCL Data rings supported by device
|
* @num_tcl_data_rings: Number of TCL Data rings supported by device
|
||||||
* @per_pdev_rx_ring - 0 - REO ring is not mapped per radio
|
* @per_pdev_rx_ring: 0: REO ring is not mapped per radio
|
||||||
* 1 - Each REO ring is mapped to one radio/pdev
|
* 1: Each REO ring is mapped to one radio/pdev
|
||||||
* @num_tx_desc_pool - Number of Tx Descriptor pools
|
* @num_tx_desc_pool: Number of Tx Descriptor pools
|
||||||
* @num_tx_ext_desc_pool - Number of Tx MSDU extension Descriptor pools
|
* @num_tx_ext_desc_pool: Number of Tx MSDU extension Descriptor pools
|
||||||
* @num_tx_desc - Number of Tx Descriptors per pool
|
* @num_tx_desc: Number of Tx Descriptors per pool
|
||||||
* @num_tx_ext_desc - Number of Tx MSDU extension Descriptors per pool
|
* @num_tx_ext_desc: Number of Tx MSDU extension Descriptors per pool
|
||||||
* @max_peer_id - Maximum value of peer id that FW can assign for a client
|
* @max_peer_id: Maximum value of peer id that FW can assign for a client
|
||||||
* @htt_packet_type - Default 802.11 encapsulation type for any VAP created
|
* @htt_packet_type: Default 802.11 encapsulation type for any VAP created
|
||||||
* @int_tx_ring_mask - Bitmap of Tx interrupts mapped to each NAPI/Intr context
|
* @int_tx_ring_mask: Bitmap of Tx interrupts mapped to each NAPI/Intr context
|
||||||
* @int_rx_ring_mask - Bitmap of Rx interrupts mapped to each NAPI/Intr context
|
* @int_rx_ring_mask: Bitmap of Rx interrupts mapped to each NAPI/Intr context
|
||||||
* @int_rx_mon_ring_mask - Bitmap of Rx monitor ring interrupts mapped to each
|
* @int_rx_mon_ring_mask: Bitmap of Rx monitor ring interrupts mapped to each
|
||||||
* NAPI/Intr context
|
* NAPI/Intr context
|
||||||
* @int_rx_err_ring_mask - Bitmap of Rx err ring interrupts mapped to each
|
* @int_rx_err_ring_mask: Bitmap of Rx err ring interrupts mapped to each
|
||||||
* NAPI/Intr context
|
* NAPI/Intr context
|
||||||
* @int_wbm_rel_ring_mask - Bitmap of wbm rel ring interrupts mapped to each
|
* @int_wbm_rel_ring_mask: Bitmap of wbm rel ring interrupts mapped to each
|
||||||
* NAPI/Intr context
|
* NAPI/Intr context
|
||||||
* @int_reo_status_ring_mask - Bitmap of reo status ring interrupts mapped to each
|
* @int_reo_status_ring_mask: Bitmap of reo status ring interrupts mapped to
|
||||||
* NAPI/Intr context
|
* each NAPI/Intr context
|
||||||
* @int_ce_ring_mask - Bitmap of CE interrupts mapped to each NAPI/Intr context
|
* @int_ce_ring_mask: Bitmap of CE interrupts mapped to each NAPI/Intr context
|
||||||
* @lro_enabled - enable/disable lro feature
|
* @lro_enabled: enable/disable lro feature
|
||||||
* @rx_hash - Enable hash based steering of rx packets
|
* @rx_hash: Enable hash based steering of rx packets
|
||||||
* @tso_enabled - enable/disable tso feature
|
* @tso_enabled: enable/disable tso feature
|
||||||
* @napi_enabled - enable/disable interrupt mode for reaping tx and rx packets
|
* @lro_enabled: enable/disable LRO feature
|
||||||
* @tcp_Udp_Checksumoffload - enable/disable checksum offload
|
* @sg_enabled: enable disable scatter gather feature
|
||||||
* @nss_cfg - nss configuration
|
* @gro_enabled: enable disable GRO feature
|
||||||
* @rx_defrag_min_timeout - rx defrag minimum timeout
|
* @ipa_enabled: Flag indicating if IPA is enabled
|
||||||
* @wbm_release_ring - wbm release ring size
|
* @ol_tx_csum_enabled: Flag indicating if TX csum is enabled
|
||||||
* @tcl_cmd_ring - tcl cmd ring size
|
* @ol_rx_csum_enabled: Flag indicating if Rx csum is enabled
|
||||||
* @tcl_status_ring - tcl status ring size
|
* @rawmode_enabled: Flag indicating if RAW mode is enabled
|
||||||
* @reo_reinject_ring - reo reinject ring
|
* @peer_flow_ctrl_enabled: Flag indicating if peer flow control is enabled
|
||||||
* @rx_release_ring - rx release ring size
|
* @napi_enabled: enable/disable interrupt mode for reaping tx and rx packets
|
||||||
* @reo_exception_ring - reo exception ring size
|
* @tcp_udp_checksumoffload: enable/disable checksum offload
|
||||||
* @reo_cmd_ring - reo cmd ring size
|
* @nss_cfg: nss configuration
|
||||||
* @reo_status_ring - reo status ting size
|
* @rx_defrag_min_timeout: rx defrag minimum timeout
|
||||||
* @rxdma_refill_ring - rxdma refill ring size
|
* @wbm_release_ring: wbm release ring size
|
||||||
* @rxdma_err_dst_ring - rxdma error detination ring size
|
* @tcl_cmd_ring: tcl cmd ring size
|
||||||
* @raw_mode_war - enable/disable raw mode war
|
* @tcl_status_ring: tcl status ring size
|
||||||
|
* @reo_reinject_ring: reo reinject ring
|
||||||
|
* @rx_release_ring: rx release ring size
|
||||||
|
* @reo_exception_ring: reo exception ring size
|
||||||
|
* @reo_cmd_ring: reo cmd ring size
|
||||||
|
* @reo_status_ring: reo status ting size
|
||||||
|
* @rxdma_refill_ring: rxdma refill ring size
|
||||||
|
* @rxdma_err_dst_ring: rxdma error detination ring size
|
||||||
|
* @raw_mode_war: enable/disable raw mode war
|
||||||
*/
|
*/
|
||||||
struct wlan_cfg_dp_soc_ctxt {
|
struct wlan_cfg_dp_soc_ctxt {
|
||||||
int num_int_ctxts;
|
int num_int_ctxts;
|
||||||
@@ -169,6 +177,7 @@ struct wlan_cfg_dp_soc_ctxt {
|
|||||||
bool lro_enabled;
|
bool lro_enabled;
|
||||||
bool sg_enabled;
|
bool sg_enabled;
|
||||||
bool gro_enabled;
|
bool gro_enabled;
|
||||||
|
bool ipa_enabled;
|
||||||
bool ol_tx_csum_enabled;
|
bool ol_tx_csum_enabled;
|
||||||
bool ol_rx_csum_enabled;
|
bool ol_rx_csum_enabled;
|
||||||
bool rawmode_enabled;
|
bool rawmode_enabled;
|
||||||
@@ -660,20 +669,28 @@ int wlan_cfg_get_num_mac_rings(struct wlan_cfg_dp_pdev_ctxt *cfg);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* wlan_cfg_is_lro_enabled - Return LRO enabled/disabled
|
* wlan_cfg_is_lro_enabled - Return LRO enabled/disabled
|
||||||
* @wlan_cfg_pdev_ctx
|
* @wlan_cfg_dp_soc_ctxt
|
||||||
*
|
*
|
||||||
* Return: true - LRO enabled false - LRO disabled
|
* Return: true - LRO enabled false - LRO disabled
|
||||||
*/
|
*/
|
||||||
bool wlan_cfg_is_lro_enabled(struct wlan_cfg_dp_soc_ctxt *cfg);
|
bool wlan_cfg_is_lro_enabled(struct wlan_cfg_dp_soc_ctxt *cfg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wlan_cfg_is_lro_enabled - Return RX hash enabled/disabled
|
* wlan_cfg_is_rx_hash_enabled - Return RX hash enabled/disabled
|
||||||
* @wlan_cfg_pdev_ctx
|
* @wlan_cfg_dp_soc_ctxt
|
||||||
*
|
*
|
||||||
* Return: true - enabled false - disabled
|
* Return: true - enabled false - disabled
|
||||||
*/
|
*/
|
||||||
bool wlan_cfg_is_rx_hash_enabled(struct wlan_cfg_dp_soc_ctxt *cfg);
|
bool wlan_cfg_is_rx_hash_enabled(struct wlan_cfg_dp_soc_ctxt *cfg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wlan_cfg_is_ipa_enabled - Return IPA enabled/disabled
|
||||||
|
* @wlan_cfg_dp_soc_ctxt
|
||||||
|
*
|
||||||
|
* Return: true - enabled false - disabled
|
||||||
|
*/
|
||||||
|
bool wlan_cfg_is_ipa_enabled(struct wlan_cfg_dp_soc_ctxt *cfg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wlan_cfg_set_rx_hash - set rx hash enabled/disabled
|
* wlan_cfg_set_rx_hash - set rx hash enabled/disabled
|
||||||
* @wlan_cfg_soc_ctx
|
* @wlan_cfg_soc_ctx
|
||||||
|
在新工单中引用
屏蔽一个用户