|
@@ -1165,6 +1165,33 @@ static void dp_rx_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
qdf_mem_free_sgtable(&ipa_res->rx_refill_ring.sgtable);
|
|
qdf_mem_free_sgtable(&ipa_res->rx_refill_ring.sgtable);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * dp_rx_alt_ipa_uc_detach - free autonomy RX resources
|
|
|
|
+ * @soc: data path instance
|
|
|
|
+ * @pdev: core txrx pdev context
|
|
|
|
+ *
|
|
|
|
+ * This function will detach DP RX into main device context
|
|
|
|
+ * will free DP Rx resources.
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+#ifdef IPA_WDI3_RX_TWO_PIPES
|
|
|
|
+static void dp_rx_alt_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
|
|
+{
|
|
|
|
+ struct dp_ipa_resources *ipa_res = &pdev->ipa_resource;
|
|
|
|
+
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ qdf_mem_free_sgtable(&ipa_res->rx_alt_rdy_ring.sgtable);
|
|
|
|
+ qdf_mem_free_sgtable(&ipa_res->rx_alt_refill_ring.sgtable);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline
|
|
|
|
+void dp_rx_alt_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
|
|
+{ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
int dp_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
int dp_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
{
|
|
{
|
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
|
if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
|
|
@@ -1179,6 +1206,9 @@ int dp_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
/* RX resource detach */
|
|
/* RX resource detach */
|
|
dp_rx_ipa_uc_detach(soc, pdev);
|
|
dp_rx_ipa_uc_detach(soc, pdev);
|
|
|
|
|
|
|
|
+ /* Cleanup 2nd RX pipe resources */
|
|
|
|
+ dp_rx_alt_ipa_uc_detach(soc, pdev);
|
|
|
|
+
|
|
return QDF_STATUS_SUCCESS; /* success */
|
|
return QDF_STATUS_SUCCESS; /* success */
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1356,6 +1386,85 @@ int dp_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
return QDF_STATUS_SUCCESS; /* success */
|
|
return QDF_STATUS_SUCCESS; /* success */
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef IPA_WDI3_RX_TWO_PIPES
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_rx_alt_ring_resource_setup() - setup IPA 2nd RX ring resources
|
|
|
|
+ * @soc: data path SoC handle
|
|
|
|
+ * @pdev: data path pdev handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static
|
|
|
|
+void dp_ipa_rx_alt_ring_resource_setup(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
|
|
+{
|
|
|
|
+ struct hal_soc *hal_soc = (struct hal_soc *)soc->hal_soc;
|
|
|
|
+ struct hal_srng *hal_srng;
|
|
|
|
+ struct hal_srng_params srng_params;
|
|
|
|
+ unsigned long addr_offset, dev_base_paddr;
|
|
|
|
+ qdf_dma_addr_t hp_addr;
|
|
|
|
+
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ dev_base_paddr =
|
|
|
|
+ (unsigned long)
|
|
|
|
+ ((struct hif_softc *)(hal_soc->hif_handle))->mem_pa;
|
|
|
|
+
|
|
|
|
+ /* IPA REO_DEST Ring - HAL_SRNG_REO2SW3 */
|
|
|
|
+ hal_srng = (struct hal_srng *)
|
|
|
|
+ soc->reo_dest_ring[IPA_ALT_REO_DEST_RING_IDX].hal_srng;
|
|
|
|
+ hal_get_srng_params(hal_soc_to_hal_soc_handle(hal_soc),
|
|
|
|
+ hal_srng_to_hal_ring_handle(hal_srng),
|
|
|
|
+ &srng_params);
|
|
|
|
+
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_base_paddr =
|
|
|
|
+ srng_params.ring_base_paddr;
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_base_vaddr =
|
|
|
|
+ srng_params.ring_base_vaddr;
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_size =
|
|
|
|
+ (srng_params.num_entries * srng_params.entry_size) << 2;
|
|
|
|
+ addr_offset = (unsigned long)(hal_srng->u.dst_ring.tp_addr) -
|
|
|
|
+ (unsigned long)(hal_soc->dev_base_addr);
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_tp_paddr =
|
|
|
|
+ (qdf_dma_addr_t)(addr_offset + dev_base_paddr);
|
|
|
|
+
|
|
|
|
+ dp_info("IPA REO_DEST Ring addr_offset=%x, dev_base_paddr=%x, tp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)",
|
|
|
|
+ (unsigned int)addr_offset,
|
|
|
|
+ (unsigned int)dev_base_paddr,
|
|
|
|
+ (unsigned int)(soc->ipa_uc_rx_rsc_alt.ipa_reo_tp_paddr),
|
|
|
|
+ (void *)soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_base_paddr,
|
|
|
|
+ (void *)soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_base_vaddr,
|
|
|
|
+ srng_params.num_entries,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_size);
|
|
|
|
+
|
|
|
|
+ hal_srng = (struct hal_srng *)
|
|
|
|
+ pdev->rx_refill_buf_ring3.hal_srng;
|
|
|
|
+ hal_get_srng_params(hal_soc_to_hal_soc_handle(hal_soc),
|
|
|
|
+ hal_srng_to_hal_ring_handle(hal_srng),
|
|
|
|
+ &srng_params);
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_base_paddr =
|
|
|
|
+ srng_params.ring_base_paddr;
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_base_vaddr =
|
|
|
|
+ srng_params.ring_base_vaddr;
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_size =
|
|
|
|
+ (srng_params.num_entries * srng_params.entry_size) << 2;
|
|
|
|
+ hp_addr = hal_srng_get_hp_addr(hal_soc_to_hal_soc_handle(hal_soc),
|
|
|
|
+ hal_srng_to_hal_ring_handle(hal_srng));
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_hp_paddr =
|
|
|
|
+ qdf_mem_paddr_from_dmaaddr(soc->osdev, hp_addr);
|
|
|
|
+
|
|
|
|
+ dp_info("IPA REFILL_BUF Ring hp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)",
|
|
|
|
+ (unsigned int)(soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_hp_paddr),
|
|
|
|
+ (void *)soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_base_paddr,
|
|
|
|
+ (void *)soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_base_vaddr,
|
|
|
|
+ srng_params.num_entries,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_size);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_rx_alt_ring_resource_setup(struct dp_soc *soc, struct dp_pdev *pdev)
|
|
|
|
+{ }
|
|
|
|
+#endif
|
|
/*
|
|
/*
|
|
* dp_ipa_ring_resource_setup() - setup IPA ring resources
|
|
* dp_ipa_ring_resource_setup() - setup IPA ring resources
|
|
* @soc: data path SoC handle
|
|
* @soc: data path SoC handle
|
|
@@ -1510,9 +1619,51 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc,
|
|
|
|
|
|
hal_reo_read_write_ctrl_ix(soc->hal_soc, false, &ix0, NULL, NULL, NULL);
|
|
hal_reo_read_write_ctrl_ix(soc->hal_soc, false, &ix0, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
+ dp_ipa_rx_alt_ring_resource_setup(soc, pdev);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef IPA_WDI3_RX_TWO_PIPES
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_rx_alt_ring_get_resource() - get IPA 2nd RX ring resources
|
|
|
|
+ * @pdev: data path pdev handle
|
|
|
|
+ *
|
|
|
|
+ * Return: Success if resourece is found
|
|
|
|
+ */
|
|
|
|
+static QDF_STATUS dp_ipa_rx_alt_ring_get_resource(struct dp_pdev *pdev)
|
|
|
|
+{
|
|
|
|
+ struct dp_soc *soc = pdev->soc;
|
|
|
|
+ struct dp_ipa_resources *ipa_res = &pdev->ipa_resource;
|
|
|
|
+
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
|
+
|
|
|
|
+ dp_ipa_get_shared_mem_info(soc->osdev, &ipa_res->rx_alt_rdy_ring,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_base_vaddr,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_base_paddr,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_ring_size);
|
|
|
|
+
|
|
|
|
+ dp_ipa_get_shared_mem_info(
|
|
|
|
+ soc->osdev, &ipa_res->rx_alt_refill_ring,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_base_vaddr,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_base_paddr,
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_ring_size);
|
|
|
|
+
|
|
|
|
+ if (!qdf_mem_get_dma_addr(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_rdy_ring.mem_info) ||
|
|
|
|
+ !qdf_mem_get_dma_addr(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_refill_ring.mem_info))
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline QDF_STATUS dp_ipa_rx_alt_ring_get_resource(struct dp_pdev *pdev)
|
|
|
|
+{
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
QDF_STATUS dp_ipa_get_resource(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
QDF_STATUS dp_ipa_get_resource(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
{
|
|
{
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
@@ -1564,6 +1715,9 @@ QDF_STATUS dp_ipa_get_resource(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
if (dp_ipa_tx_alt_ring_get_resource(pdev))
|
|
if (dp_ipa_tx_alt_ring_get_resource(pdev))
|
|
return QDF_STATUS_E_FAILURE;
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
|
|
|
|
|
+ if (dp_ipa_rx_alt_ring_get_resource(pdev))
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1574,6 +1728,70 @@ QDF_STATUS dp_ipa_get_resource(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
dp_ipa_set_tx_doorbell_paddr(soc, ipa_res)
|
|
dp_ipa_set_tx_doorbell_paddr(soc, ipa_res)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#ifdef IPA_WDI3_RX_TWO_PIPES
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_map_rx_alt_ring_doorbell_paddr() - Map 2nd rx ring doorbell paddr
|
|
|
|
+ * @pdev: data path pdev handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static void dp_ipa_map_rx_alt_ring_doorbell_paddr(struct dp_pdev *pdev)
|
|
|
|
+{
|
|
|
|
+ struct dp_ipa_resources *ipa_res = &pdev->ipa_resource;
|
|
|
|
+ uint32_t rx_ready_doorbell_dmaaddr;
|
|
|
|
+ struct dp_soc *soc = pdev->soc;
|
|
|
|
+ struct hal_srng *reo_srng = (struct hal_srng *)
|
|
|
|
+ soc->reo_dest_ring[IPA_ALT_REO_DEST_RING_IDX].hal_srng;
|
|
|
|
+ int ret = 0;
|
|
|
|
+
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (qdf_mem_smmu_s1_enabled(soc->osdev)) {
|
|
|
|
+ ret = pld_smmu_map(soc->osdev->dev,
|
|
|
|
+ ipa_res->rx_alt_ready_doorbell_paddr,
|
|
|
|
+ &rx_ready_doorbell_dmaaddr,
|
|
|
|
+ sizeof(uint32_t));
|
|
|
|
+ ipa_res->rx_alt_ready_doorbell_paddr =
|
|
|
|
+ rx_ready_doorbell_dmaaddr;
|
|
|
|
+ qdf_assert_always(!ret);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ hal_srng_dst_set_hp_paddr_confirm(reo_srng,
|
|
|
|
+ ipa_res->rx_alt_ready_doorbell_paddr);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_unmap_rx_alt_ring_doorbell_paddr() - Unmap 2nd rx ring doorbell paddr
|
|
|
|
+ * @pdev: data path pdev handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static void dp_ipa_unmap_rx_alt_ring_doorbell_paddr(struct dp_pdev *pdev)
|
|
|
|
+{
|
|
|
|
+ struct dp_ipa_resources *ipa_res = &pdev->ipa_resource;
|
|
|
|
+ struct dp_soc *soc = pdev->soc;
|
|
|
|
+ int ret = 0;
|
|
|
|
+
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (!qdf_mem_smmu_s1_enabled(soc->osdev))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ ret = pld_smmu_unmap(soc->osdev->dev,
|
|
|
|
+ ipa_res->rx_alt_ready_doorbell_paddr,
|
|
|
|
+ sizeof(uint32_t));
|
|
|
|
+ qdf_assert_always(!ret);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline void dp_ipa_map_rx_alt_ring_doorbell_paddr(struct dp_pdev *pdev)
|
|
|
|
+{ }
|
|
|
|
+
|
|
|
|
+static inline void dp_ipa_unmap_rx_alt_ring_doorbell_paddr(struct dp_pdev *pdev)
|
|
|
|
+{ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
QDF_STATUS dp_ipa_set_doorbell_paddr(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
QDF_STATUS dp_ipa_set_doorbell_paddr(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
{
|
|
{
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
@@ -1593,6 +1811,7 @@ QDF_STATUS dp_ipa_set_doorbell_paddr(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
|
|
|
|
dp_ipa_map_ring_doorbell_paddr(pdev);
|
|
dp_ipa_map_ring_doorbell_paddr(pdev);
|
|
|
|
+ dp_ipa_map_rx_alt_ring_doorbell_paddr(pdev);
|
|
|
|
|
|
DP_IPA_SET_TX_DB_PADDR(soc, ipa_res);
|
|
DP_IPA_SET_TX_DB_PADDR(soc, ipa_res);
|
|
|
|
|
|
@@ -1776,7 +1995,10 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
|
ix_map[0] = REO_REMAP_SW1;
|
|
ix_map[0] = REO_REMAP_SW1;
|
|
ix_map[1] = REO_REMAP_SW4;
|
|
ix_map[1] = REO_REMAP_SW4;
|
|
ix_map[2] = REO_REMAP_SW1;
|
|
ix_map[2] = REO_REMAP_SW1;
|
|
- ix_map[3] = REO_REMAP_SW4;
|
|
|
|
|
|
+ if (wlan_ipa_is_vlan_enabled())
|
|
|
|
+ ix_map[3] = REO_REMAP_SW3;
|
|
|
|
+ else
|
|
|
|
+ ix_map[3] = REO_REMAP_SW4;
|
|
ix_map[4] = REO_REMAP_SW4;
|
|
ix_map[4] = REO_REMAP_SW4;
|
|
ix_map[5] = REO_REMAP_RELEASE;
|
|
ix_map[5] = REO_REMAP_RELEASE;
|
|
ix_map[6] = REO_REMAP_FW;
|
|
ix_map[6] = REO_REMAP_FW;
|
|
@@ -2064,6 +2286,208 @@ dp_ipa_wdi_rx_smmu_params(struct dp_soc *soc,
|
|
soc->rx_pkt_tlv_size + L3_HEADER_PADDING;
|
|
soc->rx_pkt_tlv_size + L3_HEADER_PADDING;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef IPA_WDI3_RX_TWO_PIPES
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_wdi_rx_alt_pipe_smmu_params() - Setup 2nd rx pipe smmu params
|
|
|
|
+ * @soc: data path soc handle
|
|
|
|
+ * @ipa_res: ipa resource pointer
|
|
|
|
+ * @rx_smmu: smmu pipe info handle
|
|
|
|
+ * @over_gsi: flag for IPA offload over gsi
|
|
|
|
+ * @hdl: ipa registered handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static void
|
|
|
|
+dp_ipa_wdi_rx_alt_pipe_smmu_params(struct dp_soc *soc,
|
|
|
|
+ struct dp_ipa_resources *ipa_res,
|
|
|
|
+ qdf_ipa_wdi_pipe_setup_info_smmu_t *rx_smmu,
|
|
|
|
+ bool over_gsi,
|
|
|
|
+ qdf_ipa_wdi_hdl_t hdl)
|
|
|
|
+{
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (over_gsi) {
|
|
|
|
+ if (hdl == DP_IPA_HDL_FIRST)
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(rx_smmu) =
|
|
|
|
+ IPA_CLIENT_WLAN2_PROD1;
|
|
|
|
+ else if (hdl == DP_IPA_HDL_SECOND)
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(rx_smmu) =
|
|
|
|
+ IPA_CLIENT_WLAN3_PROD1;
|
|
|
|
+ } else {
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(rx_smmu) =
|
|
|
|
+ IPA_CLIENT_WLAN1_PROD;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ qdf_mem_copy(&QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_BASE(rx_smmu),
|
|
|
|
+ &ipa_res->rx_alt_rdy_ring.sgtable,
|
|
|
|
+ sizeof(sgtable_t));
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_SIZE(rx_smmu) =
|
|
|
|
+ qdf_mem_get_dma_size(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_rdy_ring.mem_info);
|
|
|
|
+ /* REO Tail Pointer Address */
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_DOORBELL_PA(rx_smmu) =
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_tp_paddr;
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_IS_TXR_RN_DB_PCIE_ADDR(rx_smmu) = true;
|
|
|
|
+
|
|
|
|
+ qdf_mem_copy(&QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_BASE(rx_smmu),
|
|
|
|
+ &ipa_res->rx_alt_refill_ring.sgtable,
|
|
|
|
+ sizeof(sgtable_t));
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_SIZE(rx_smmu) =
|
|
|
|
+ qdf_mem_get_dma_size(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_refill_ring.mem_info);
|
|
|
|
+
|
|
|
|
+ /* FW Head Pointer Address */
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_DOORBELL_PA(rx_smmu) =
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_hp_paddr;
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_IS_EVT_RN_DB_PCIE_ADDR(rx_smmu) = false;
|
|
|
|
+
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_PKT_OFFSET(rx_smmu) =
|
|
|
|
+ soc->rx_pkt_tlv_size + L3_HEADER_PADDING;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_wdi_rx_alt_pipe_smmu_params() - Setup 2nd rx pipe params
|
|
|
|
+ * @soc: data path soc handle
|
|
|
|
+ * @ipa_res: ipa resource pointer
|
|
|
|
+ * @rx: pipe info handle
|
|
|
|
+ * @over_gsi: flag for IPA offload over gsi
|
|
|
|
+ * @hdl: ipa registered handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static void dp_ipa_wdi_rx_alt_pipe_params(struct dp_soc *soc,
|
|
|
|
+ struct dp_ipa_resources *ipa_res,
|
|
|
|
+ qdf_ipa_wdi_pipe_setup_info_t *rx,
|
|
|
|
+ bool over_gsi,
|
|
|
|
+ qdf_ipa_wdi_hdl_t hdl)
|
|
|
|
+{
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (over_gsi) {
|
|
|
|
+ if (hdl == DP_IPA_HDL_FIRST)
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(rx_smmu) =
|
|
|
|
+ IPA_CLIENT_WLAN2_PROD1;
|
|
|
|
+ else if (hdl == DP_IPA_HDL_SECOND)
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(rx_smmu) =
|
|
|
|
+ IPA_CLIENT_WLAN3_PROD1;
|
|
|
|
+ } else {
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_CLIENT(rx) =
|
|
|
|
+ IPA_CLIENT_WLAN1_PROD;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(rx) =
|
|
|
|
+ qdf_mem_get_dma_addr(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_rdy_ring.mem_info);
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(rx) =
|
|
|
|
+ qdf_mem_get_dma_size(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_rdy_ring.mem_info);
|
|
|
|
+
|
|
|
|
+ /* REO Tail Pointer Address */
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(rx) =
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_reo_tp_paddr;
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_IS_TXR_RN_DB_PCIE_ADDR(rx) = true;
|
|
|
|
+
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(rx) =
|
|
|
|
+ qdf_mem_get_dma_addr(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_refill_ring.mem_info);
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(rx) =
|
|
|
|
+ qdf_mem_get_dma_size(soc->osdev,
|
|
|
|
+ &ipa_res->rx_alt_refill_ring.mem_info);
|
|
|
|
+
|
|
|
|
+ /* FW Head Pointer Address */
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(rx) =
|
|
|
|
+ soc->ipa_uc_rx_rsc_alt.ipa_rx_refill_buf_hp_paddr;
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_IS_EVT_RN_DB_PCIE_ADDR(rx) = false;
|
|
|
|
+
|
|
|
|
+ QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(rx) =
|
|
|
|
+ soc->rx_pkt_tlv_size + L3_HEADER_PADDING;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_setup_rx_alt_pipe() - Setup 2nd rx pipe for IPA offload
|
|
|
|
+ * @soc: data path soc handle
|
|
|
|
+ * @res: ipa resource pointer
|
|
|
|
+ * @in: pipe in handle
|
|
|
|
+ * @over_gsi: flag for IPA offload over gsi
|
|
|
|
+ * @hdl: ipa registered handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static void dp_ipa_setup_rx_alt_pipe(struct dp_soc *soc,
|
|
|
|
+ struct dp_ipa_resources *res,
|
|
|
|
+ qdf_ipa_wdi_conn_in_params_t *in,
|
|
|
|
+ bool over_gsi,
|
|
|
|
+ qdf_ipa_wdi_hdl_t hdl)
|
|
|
|
+{
|
|
|
|
+ qdf_ipa_wdi_pipe_setup_info_smmu_t *rx_smmu = NULL;
|
|
|
|
+ qdf_ipa_wdi_pipe_setup_info_t *rx = NULL;
|
|
|
|
+ qdf_ipa_ep_cfg_t *rx_cfg;
|
|
|
|
+
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ QDF_IPA_WDI_CONN_IN_PARAMS_IS_RX1_USED(in) = true;
|
|
|
|
+ if (qdf_mem_smmu_s1_enabled(soc->osdev)) {
|
|
|
|
+ rx_smmu = &QDF_IPA_WDI_CONN_IN_PARAMS_RX_ALT_SMMU(in);
|
|
|
|
+ rx_cfg = &QDF_IPA_WDI_SETUP_INFO_SMMU_EP_CFG(rx_smmu);
|
|
|
|
+ dp_ipa_wdi_rx_alt_pipe_smmu_params(soc, res, rx_smmu,
|
|
|
|
+ over_gsi, hdl);
|
|
|
|
+ } else {
|
|
|
|
+ rx = &QDF_IPA_WDI_CONN_IN_PARAMS_RX_ALT(in);
|
|
|
|
+ rx_cfg = &QDF_IPA_WDI_SETUP_INFO_SMMU_EP_CFG(rx);
|
|
|
|
+ dp_ipa_wdi_rx_alt_pipe_params(soc, res, rx, over_gsi, hdl);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ QDF_IPA_EP_CFG_NAT_EN(rx_cfg) = IPA_BYPASS_NAT;
|
|
|
|
+ /* Update with wds len(96) + 4 if wds support is enabled */
|
|
|
|
+ if (ucfg_ipa_is_wds_enabled())
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_LEN(rx_cfg) = DP_IPA_UC_WLAN_RX_HDR_LEN_AST_VLAN;
|
|
|
|
+ else
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_LEN(rx_cfg) = DP_IPA_UC_WLAN_TX_VLAN_HDR_LEN;
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE_VALID(rx_cfg) = 1;
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE(rx_cfg) = 0;
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_ADDITIONAL_CONST_LEN(rx_cfg) = 0;
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_OFST_METADATA_VALID(rx_cfg) = 0;
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_METADATA_REG_VALID(rx_cfg) = 1;
|
|
|
|
+ QDF_IPA_EP_CFG_MODE(rx_cfg) = IPA_BASIC;
|
|
|
|
+ QDF_IPA_EP_CFG_HDR_LITTLE_ENDIAN(rx_cfg) = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_set_rx_alt_pipe_db() - Setup 2nd rx pipe doorbell
|
|
|
|
+ * @res: ipa resource pointer
|
|
|
|
+ * @out: pipe out handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static void dp_ipa_set_rx_alt_pipe_db(struct dp_ipa_resources *res,
|
|
|
|
+ qdf_ipa_wdi_conn_out_params_t *out)
|
|
|
|
+{
|
|
|
|
+ if (!wlan_ipa_is_vlan_enabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ res->rx_alt_ready_doorbell_paddr =
|
|
|
|
+ QDF_IPA_WDI_CONN_OUT_PARAMS_RX_ALT_UC_DB_PA(out);
|
|
|
|
+ dp_debug("Setting DB 0x%x for RX alt pipe",
|
|
|
|
+ res->rx_alt_ready_doorbell_paddr);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_setup_rx_alt_pipe(struct dp_soc *soc,
|
|
|
|
+ struct dp_ipa_resources *res,
|
|
|
|
+ qdf_ipa_wdi_conn_in_params_t *in,
|
|
|
|
+ bool over_gsi,
|
|
|
|
+ qdf_ipa_wdi_hdl_t hdl)
|
|
|
|
+{ }
|
|
|
|
+
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_set_rx_alt_pipe_db(struct dp_ipa_resources *res,
|
|
|
|
+ qdf_ipa_wdi_conn_out_params_t *out)
|
|
|
|
+{ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
|
QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
|
void *ipa_i2w_cb, void *ipa_w2i_cb,
|
|
void *ipa_i2w_cb, void *ipa_w2i_cb,
|
|
void *ipa_wdi_meter_notifier_cb,
|
|
void *ipa_wdi_meter_notifier_cb,
|
|
@@ -2174,6 +2598,9 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
|
else
|
|
else
|
|
dp_ipa_wdi_rx_params(soc, ipa_res, rx, over_gsi);
|
|
dp_ipa_wdi_rx_params(soc, ipa_res, rx, over_gsi);
|
|
|
|
|
|
|
|
+ /* setup 2nd rx pipe */
|
|
|
|
+ dp_ipa_setup_rx_alt_pipe(soc, ipa_res, pipe_in, over_gsi, id);
|
|
|
|
+
|
|
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;
|
|
QDF_IPA_WDI_CONN_IN_PARAMS_HANDLE(pipe_in) = hdl;
|
|
QDF_IPA_WDI_CONN_IN_PARAMS_HANDLE(pipe_in) = hdl;
|
|
@@ -2196,6 +2623,7 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
|
(unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out));
|
|
(unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out));
|
|
|
|
|
|
dp_ipa_set_pipe_db(ipa_res, &pipe_out);
|
|
dp_ipa_set_pipe_db(ipa_res, &pipe_out);
|
|
|
|
+ dp_ipa_set_rx_alt_pipe_db(ipa_res, &pipe_out);
|
|
|
|
|
|
ipa_res->is_db_ddr_mapped =
|
|
ipa_res->is_db_ddr_mapped =
|
|
QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(&pipe_out);
|
|
QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(&pipe_out);
|
|
@@ -2209,6 +2637,64 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
|
return QDF_STATUS_SUCCESS;
|
|
return QDF_STATUS_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef IPA_WDI3_RX_TWO_PIPES
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_set_rx1_used() - Set rx1 used flag for 2nd rx offload ring
|
|
|
|
+ * @in: pipe in handle
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_set_rx1_used(qdf_ipa_wdi_reg_intf_in_params_t *in)
|
|
|
|
+{
|
|
|
|
+ QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_RX1_USED(in) = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_set_v4_vlan_hdr() - Set v4 vlan hdr
|
|
|
|
+ * @in: pipe in handle
|
|
|
|
+ * hdr: pointer to hdr
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_set_v4_vlan_hdr(qdf_ipa_wdi_reg_intf_in_params_t *in,
|
|
|
|
+ qdf_ipa_wdi_hdr_info_t *hdr)
|
|
|
|
+{
|
|
|
|
+ qdf_mem_copy(&(QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)[IPA_IP_v4_VLAN]),
|
|
|
|
+ hdr, sizeof(qdf_ipa_wdi_hdr_info_t));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * dp_ipa_set_v6_vlan_hdr() - Set v6 vlan hdr
|
|
|
|
+ * @in: pipe in handle
|
|
|
|
+ * hdr: pointer to hdr
|
|
|
|
+ *
|
|
|
|
+ * Return: none
|
|
|
|
+ */
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_set_v6_vlan_hdr(qdf_ipa_wdi_reg_intf_in_params_t *in,
|
|
|
|
+ qdf_ipa_wdi_hdr_info_t *hdr)
|
|
|
|
+{
|
|
|
|
+ qdf_mem_copy(&(QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)[IPA_IP_v6_VLAN]),
|
|
|
|
+ hdr, sizeof(qdf_ipa_wdi_hdr_info_t));
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_set_rx1_used(qdf_ipa_wdi_reg_intf_in_params_t *in)
|
|
|
|
+{ }
|
|
|
|
+
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_set_v4_vlan_hdr(qdf_ipa_wdi_reg_intf_in_params_t *in,
|
|
|
|
+ qdf_ipa_wdi_hdr_info_t *hdr)
|
|
|
|
+{ }
|
|
|
|
+
|
|
|
|
+static inline
|
|
|
|
+void dp_ipa_set_v6_vlan_hdr(qdf_ipa_wdi_reg_intf_in_params_t *in,
|
|
|
|
+ qdf_ipa_wdi_hdr_info_t *hdr)
|
|
|
|
+{ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* dp_ipa_setup_iface() - Setup IPA header and register interface
|
|
* dp_ipa_setup_iface() - Setup IPA header and register interface
|
|
* @ifname: Interface name
|
|
* @ifname: Interface name
|
|
@@ -2231,6 +2717,8 @@ QDF_STATUS dp_ipa_setup_iface(char *ifname, uint8_t *mac_addr,
|
|
qdf_ipa_wdi_hdr_info_t hdr_info;
|
|
qdf_ipa_wdi_hdr_info_t hdr_info;
|
|
struct dp_ipa_uc_tx_hdr uc_tx_hdr;
|
|
struct dp_ipa_uc_tx_hdr uc_tx_hdr;
|
|
struct dp_ipa_uc_tx_hdr uc_tx_hdr_v6;
|
|
struct dp_ipa_uc_tx_hdr uc_tx_hdr_v6;
|
|
|
|
+ struct dp_ipa_uc_tx_vlan_hdr uc_tx_vlan_hdr;
|
|
|
|
+ struct dp_ipa_uc_tx_vlan_hdr uc_tx_vlan_hdr_v6;
|
|
int ret = -EINVAL;
|
|
int ret = -EINVAL;
|
|
|
|
|
|
qdf_mem_zero(&in, sizeof(qdf_ipa_wdi_reg_intf_in_params_t));
|
|
qdf_mem_zero(&in, sizeof(qdf_ipa_wdi_reg_intf_in_params_t));
|
|
@@ -2258,6 +2746,7 @@ QDF_STATUS dp_ipa_setup_iface(char *ifname, uint8_t *mac_addr,
|
|
QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(&in) = WLAN_IPA_META_DATA_MASK;
|
|
QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(&in) = WLAN_IPA_META_DATA_MASK;
|
|
QDF_IPA_WDI_REG_INTF_IN_PARAMS_HANDLE(&in) = hdl;
|
|
QDF_IPA_WDI_REG_INTF_IN_PARAMS_HANDLE(&in) = hdl;
|
|
dp_ipa_setup_iface_session_id(&in, session_id);
|
|
dp_ipa_setup_iface_session_id(&in, session_id);
|
|
|
|
+ dp_debug("registering for session_id: %u", session_id);
|
|
|
|
|
|
/* IPV6 header */
|
|
/* IPV6 header */
|
|
if (is_ipv6_enabled) {
|
|
if (is_ipv6_enabled) {
|
|
@@ -2269,14 +2758,50 @@ 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);
|
|
|
|
|
|
+ if (wlan_ipa_is_vlan_enabled()) {
|
|
|
|
+ /* Add vlan specific headers if vlan supporti is enabled */
|
|
|
|
+ qdf_mem_zero(&hdr_info, sizeof(qdf_ipa_wdi_hdr_info_t));
|
|
|
|
+ dp_ipa_set_rx1_used(&in);
|
|
|
|
+ qdf_ether_addr_copy(uc_tx_vlan_hdr.eth.h_source, mac_addr);
|
|
|
|
+ /* IPV4 Vlan header */
|
|
|
|
+ uc_tx_vlan_hdr.eth.h_vlan_proto = qdf_htons(ETH_P_8021Q);
|
|
|
|
+ uc_tx_vlan_hdr.eth.h_vlan_encapsulated_proto = qdf_htons(ETH_P_IP);
|
|
|
|
+
|
|
|
|
+ QDF_IPA_WDI_HDR_INFO_HDR(&hdr_info) =
|
|
|
|
+ (uint8_t *)&uc_tx_vlan_hdr;
|
|
|
|
+ QDF_IPA_WDI_HDR_INFO_HDR_LEN(&hdr_info) =
|
|
|
|
+ DP_IPA_UC_WLAN_TX_VLAN_HDR_LEN;
|
|
|
|
+ if (ucfg_ipa_is_wds_enabled())
|
|
|
|
+ QDF_IPA_WDI_HDR_INFO_HDR_TYPE(&hdr_info) =
|
|
|
|
+ IPA_HDR_L2_802_1Q_AST;
|
|
|
|
+ else
|
|
|
|
+ QDF_IPA_WDI_HDR_INFO_HDR_TYPE(&hdr_info) =
|
|
|
|
+ IPA_HDR_L2_802_1Q;
|
|
|
|
+
|
|
|
|
+ QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(&hdr_info) =
|
|
|
|
+ DP_IPA_UC_WLAN_HDR_DES_MAC_OFFSET;
|
|
|
|
+
|
|
|
|
+ dp_ipa_set_v4_vlan_hdr(&in, &hdr_info);
|
|
|
|
+
|
|
|
|
+ /* IPV6 Vlan header */
|
|
|
|
+ if (is_ipv6_enabled) {
|
|
|
|
+ qdf_mem_copy(&uc_tx_vlan_hdr_v6, &uc_tx_vlan_hdr,
|
|
|
|
+ DP_IPA_UC_WLAN_TX_VLAN_HDR_LEN);
|
|
|
|
+ uc_tx_vlan_hdr_v6.eth.h_vlan_proto =
|
|
|
|
+ qdf_htons(ETH_P_8021Q);
|
|
|
|
+ uc_tx_vlan_hdr_v6.eth.h_vlan_encapsulated_proto =
|
|
|
|
+ qdf_htons(ETH_P_IPV6);
|
|
|
|
+ QDF_IPA_WDI_HDR_INFO_HDR(&hdr_info) =
|
|
|
|
+ (uint8_t *)&uc_tx_vlan_hdr_v6;
|
|
|
|
+ dp_ipa_set_v6_vlan_hdr(&in, &hdr_info);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
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",
|
|
|
|
- __func__, ret);
|
|
|
|
|
|
+ "%s: ipa_wdi_reg_intf: register IPA interface falied: ret=%d",
|
|
|
|
+ __func__, ret);
|
|
return QDF_STATUS_E_FAILURE;
|
|
return QDF_STATUS_E_FAILURE;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2581,6 +3106,7 @@ QDF_STATUS dp_ipa_cleanup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
|
}
|
|
}
|
|
|
|
|
|
dp_ipa_unmap_ring_doorbell_paddr(pdev);
|
|
dp_ipa_unmap_ring_doorbell_paddr(pdev);
|
|
|
|
+ dp_ipa_unmap_rx_alt_ring_doorbell_paddr(pdev);
|
|
exit:
|
|
exit:
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|