qcacmn: Add support for vlan tagged traffic in IPA offload

In IPA offload, both tagged and untagged traffic cannot be handled with
a single rx pipe. Hence, add support for 2nd RX pipe for tagged and
untagged traffic respectively.

Change-Id: I77ff633327696f66df42fb592492321c1591646b
CRs-Fixed: 3226021
This commit is contained in:
Himanshu Batra
2022-05-04 15:46:14 +05:30
committed by Madan Koyyalamudi
parent 7c3316638a
commit 7be2cf3775
7 changed files with 802 additions and 38 deletions

View File

@@ -17,6 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
#include <wlan_ipa_obj_mgmt_api.h>
#include <qdf_types.h>
#include <qdf_lock.h>
#include <qdf_net_types.h>
@@ -4093,6 +4094,53 @@ static void dp_soc_disable_unused_mac_intr_mask(struct dp_soc *soc,
group_number, 0x0);
}
#ifdef IPA_OFFLOAD
#ifdef IPA_WDI3_RX_TWO_PIPES
/*
* dp_soc_reset_ipa_vlan_intr_mask() - reset interrupt mask for IPA offloaded
* ring for vlan tagged traffic
* @dp_soc - DP Soc handle
*
* Return: Return void
*/
static void dp_soc_reset_ipa_vlan_intr_mask(struct dp_soc *soc)
{
uint8_t *grp_mask = NULL;
int group_number, mask;
if (!wlan_ipa_is_vlan_enabled())
return;
grp_mask = &soc->wlan_cfg_ctx->int_rx_ring_mask[0];
group_number = dp_srng_find_ring_in_mask(IPA_ALT_REO_DEST_RING_IDX, grp_mask);
if (group_number < 0) {
dp_init_debug("%pK: ring not part of any group; ring_type: %d,ring_num %d",
soc, REO_DST, IPA_ALT_REO_DEST_RING_IDX);
return;
}
mask = wlan_cfg_get_rx_ring_mask(soc->wlan_cfg_ctx, group_number);
/* reset the interrupt mask for offloaded ring */
mask &= (~(1 << IPA_ALT_REO_DEST_RING_IDX));
/*
* set the interrupt mask to zero for rx offloaded radio.
*/
wlan_cfg_set_rx_ring_mask(soc->wlan_cfg_ctx, group_number, mask);
}
#else
static inline
void dp_soc_reset_ipa_vlan_intr_mask(struct dp_soc *soc)
{ }
#endif /* IPA_WDI3_RX_TWO_PIPES */
#else
static inline
void dp_soc_reset_ipa_vlan_intr_mask(struct dp_soc *soc)
{ }
#endif /* IPA_OFFLOAD */
/*
* dp_soc_reset_intr_mask() - reset interrupt mask
* @dp_soc - DP Soc handle
@@ -4249,10 +4297,21 @@ bool dp_reo_remap_config(struct dp_soc *soc, uint32_t *remap0,
break;
case CDP_ARCH_TYPE_LI:
hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring,
soc->num_reo_dest_rings -
USE_1_IPA_RX_REO_RING, remap1,
remap2);
if (wlan_ipa_is_vlan_enabled()) {
hal_compute_reo_remap_ix2_ix3(
soc->hal_soc, ring,
soc->num_reo_dest_rings -
USE_2_IPA_RX_REO_RINGS, remap1,
remap2);
} else {
hal_compute_reo_remap_ix2_ix3(
soc->hal_soc, ring,
soc->num_reo_dest_rings -
USE_1_IPA_RX_REO_RING, remap1,
remap2);
}
hal_compute_reo_remap_ix0(soc->hal_soc, remap0);
break;
default:
@@ -5043,6 +5102,101 @@ static int dp_setup_ipa_rx_refill_buf_ring(struct dp_soc *soc,
return QDF_STATUS_SUCCESS;
}
#ifdef IPA_WDI3_RX_TWO_PIPES
static int dp_setup_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
int entries;
if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx) &&
wlan_ipa_is_vlan_enabled()) {
soc_cfg_ctx = soc->wlan_cfg_ctx;
entries =
wlan_cfg_get_dp_soc_rxdma_refill_ring_size(soc_cfg_ctx);
/* Setup second Rx refill buffer ring */
if (dp_srng_alloc(soc, &pdev->rx_refill_buf_ring3, RXDMA_BUF,
entries, 0)) {
dp_init_err("%pK: alloc failed for 3rd rx refill ring",
soc);
return QDF_STATUS_E_FAILURE;
}
}
return QDF_STATUS_SUCCESS;
}
static int dp_init_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx) &&
wlan_ipa_is_vlan_enabled()) {
if (dp_srng_init(soc, &pdev->rx_refill_buf_ring3, RXDMA_BUF,
IPA_RX_ALT_REFILL_BUF_RING_IDX,
pdev->pdev_id)) {
dp_init_err("%pK: init failed for 3rd rx refill ring",
soc);
return QDF_STATUS_E_FAILURE;
}
}
return QDF_STATUS_SUCCESS;
}
static void dp_deinit_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx) &&
wlan_ipa_is_vlan_enabled())
dp_srng_deinit(soc, &pdev->rx_refill_buf_ring3, RXDMA_BUF, 0);
}
static void dp_free_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx) &&
wlan_ipa_is_vlan_enabled())
dp_srng_free(soc, &pdev->rx_refill_buf_ring3);
}
#else
static int dp_setup_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
return QDF_STATUS_SUCCESS;
}
static int dp_init_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
return QDF_STATUS_SUCCESS;
}
static void dp_deinit_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
}
static void dp_free_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
}
#endif
/**
* dp_deinit_ipa_rx_refill_buf_ring - deinit second Rx refill buffer ring
* @soc: data path instance
* @pdev: core txrx pdev context
*
* Return: void
*/
static void dp_deinit_ipa_rx_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
dp_srng_deinit(soc, &pdev->rx_refill_buf_ring2, RXDMA_BUF, 0);
}
/**
* dp_init_ipa_rx_refill_buf_ring - Init second Rx refill buffer ring
* @soc: data path instance
@@ -5062,21 +5216,13 @@ static int dp_init_ipa_rx_refill_buf_ring(struct dp_soc *soc,
return QDF_STATUS_E_FAILURE;
}
}
return QDF_STATUS_SUCCESS;
}
/**
* dp_deinit_ipa_rx_refill_buf_ring - deinit second Rx refill buffer ring
* @soc: data path instance
* @pdev: core txrx pdev context
*
* Return: void
*/
static void dp_deinit_ipa_rx_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx))
dp_srng_deinit(soc, &pdev->rx_refill_buf_ring2, RXDMA_BUF, 0);
if (dp_init_ipa_rx_alt_refill_buf_ring(soc, pdev)) {
dp_deinit_ipa_rx_refill_buf_ring(soc, pdev);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
/**
@@ -5114,6 +5260,22 @@ static void dp_free_ipa_rx_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
}
static int dp_setup_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
return QDF_STATUS_SUCCESS;
}
static void dp_deinit_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
}
static void dp_free_ipa_rx_alt_refill_buf_ring(struct dp_soc *soc,
struct dp_pdev *pdev)
{
}
#endif
#ifdef DP_TX_HW_DESC_HISTORY
@@ -5439,7 +5601,17 @@ QDF_STATUS dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
soc->arch_ops.txrx_pdev_attach(pdev, params);
/* Setup third Rx refill buffer ring */
if (dp_setup_ipa_rx_alt_refill_buf_ring(soc, pdev)) {
dp_init_err("%pK: dp_srng_alloc failed rxrefill3 ring",
soc);
goto fail6;
}
return QDF_STATUS_SUCCESS;
fail6:
dp_monitor_pdev_detach(pdev);
fail5:
dp_rx_pdev_desc_pool_free(pdev);
fail4:
@@ -5591,6 +5763,7 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force)
dp_pdev_srng_deinit(pdev);
dp_ipa_uc_detach(pdev->soc, pdev);
dp_deinit_ipa_rx_alt_refill_buf_ring(pdev->soc, pdev);
dp_deinit_ipa_rx_refill_buf_ring(pdev->soc, pdev);
dp_rxdma_ring_cleanup(pdev->soc, pdev);
@@ -5691,6 +5864,7 @@ static void dp_pdev_detach(struct cdp_pdev *txrx_pdev, int force)
dp_monitor_pdev_detach(pdev);
dp_rxdma_ring_free(pdev);
dp_free_ipa_rx_refill_buf_ring(soc, pdev);
dp_free_ipa_rx_alt_refill_buf_ring(soc, pdev);
dp_pdev_srng_free(pdev);
soc->pdev_count--;
@@ -6016,6 +6190,25 @@ dp_htt_setup_rxdma_err_dst_ring(struct dp_soc *soc, int mac_id,
RXDMA_DST);
}
#ifdef IPA_WDI3_RX_TWO_PIPES
static inline
void dp_rxdma_setup_refill_ring3(struct dp_soc *soc,
struct dp_pdev *pdev,
uint8_t idx)
{
if (pdev->rx_refill_buf_ring3.hal_srng)
htt_srng_setup(soc->htt_handle, idx,
pdev->rx_refill_buf_ring3.hal_srng,
RXDMA_BUF);
}
#else
static inline
void dp_rxdma_setup_refill_ring3(struct dp_soc *soc,
struct dp_pdev *pdev,
uint8_t idx)
{ }
#endif
static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc)
{
int i;
@@ -6042,6 +6235,8 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc)
.hal_srng,
RXDMA_BUF);
dp_rxdma_setup_refill_ring3(soc, pdev, i);
dp_update_num_mac_rings_for_dbs(soc, &max_mac_rings);
dp_err("pdev_id %d max_mac_rings %d",
pdev->pdev_id, max_mac_rings);
@@ -15665,6 +15860,9 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
dp_soc_reset_intr_mask(soc);
}
/* Reset the cpu ring map if radio is NSS offloaded */
dp_soc_reset_ipa_vlan_intr_mask(soc);
TAILQ_INIT(&pdev->vdev_list);
qdf_spinlock_create(&pdev->vdev_list_lock);
pdev->vdev_count = 0;