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:

committed by
Madan Koyyalamudi

parent
7c3316638a
commit
7be2cf3775
@@ -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;
|
||||
|
Reference in New Issue
Block a user