qcacmn: Add mcast enhance flow for single dev
Add mcast enhancement for single dev/bonding feature Change-Id: I8bc0c3c78e3eb8c6679e00442d607615bab38f96 CRs-Fixed: 3350461
This commit is contained in:

committed by
Madan Koyyalamudi

parent
d47d3c4723
commit
7ae4979be0
@@ -662,6 +662,7 @@ enum cdp_sec_type {
|
|||||||
* @is_intrabss_fwd:
|
* @is_intrabss_fwd:
|
||||||
* @ppdu_cookie: 16-bit ppdu cookie that has to be replayed back in completions
|
* @ppdu_cookie: 16-bit ppdu cookie that has to be replayed back in completions
|
||||||
* @is_wds_extended:
|
* @is_wds_extended:
|
||||||
|
* @is_mlo_mcast: Indicates if mlo_mcast enable or not
|
||||||
*
|
*
|
||||||
* This structure holds the parameters needed in the exception path of tx
|
* This structure holds the parameters needed in the exception path of tx
|
||||||
*
|
*
|
||||||
@@ -677,6 +678,9 @@ struct cdp_tx_exception_metadata {
|
|||||||
#ifdef QCA_SUPPORT_WDS_EXTENDED
|
#ifdef QCA_SUPPORT_WDS_EXTENDED
|
||||||
uint8_t is_wds_extended;
|
uint8_t is_wds_extended;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WLAN_MCAST_MLO
|
||||||
|
uint8_t is_mlo_mcast;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -2517,6 +2517,19 @@ static bool dp_reo_remap_config_be(struct dp_soc *soc,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_MLO_SINGLE_DEV
|
||||||
|
static inline
|
||||||
|
void dp_initialize_arch_ops_be_single_dev(struct dp_arch_ops *arch_ops)
|
||||||
|
{
|
||||||
|
arch_ops->dp_tx_mlo_mcast_send = dp_tx_mlo_mcast_send_be;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline
|
||||||
|
void dp_initialize_arch_ops_be_single_dev(struct dp_arch_ops *arch_ops)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef IPA_OFFLOAD
|
#ifdef IPA_OFFLOAD
|
||||||
static int8_t dp_ipa_get_bank_id_be(struct dp_soc *soc)
|
static int8_t dp_ipa_get_bank_id_be(struct dp_soc *soc)
|
||||||
{
|
{
|
||||||
@@ -2621,4 +2634,5 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
|
|||||||
arch_ops->reo_remap_config = dp_reo_remap_config_be;
|
arch_ops->reo_remap_config = dp_reo_remap_config_be;
|
||||||
arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_be;
|
arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_be;
|
||||||
dp_initialize_arch_ops_be_ipa(arch_ops);
|
dp_initialize_arch_ops_be_ipa(arch_ops);
|
||||||
|
dp_initialize_arch_ops_be_single_dev(arch_ops);
|
||||||
}
|
}
|
||||||
|
@@ -809,6 +809,79 @@ bool dp_tx_mlo_is_mcast_primary_be(struct dp_soc *soc,
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_MLO_SINGLE_DEV)
|
||||||
|
static void
|
||||||
|
dp_tx_mlo_mcast_enhance_be(struct dp_vdev_be *be_vdev,
|
||||||
|
struct dp_vdev *ptnr_vdev,
|
||||||
|
void *arg)
|
||||||
|
{
|
||||||
|
struct dp_vdev *vdev = (struct dp_vdev *)be_vdev;
|
||||||
|
qdf_nbuf_t nbuf = (qdf_nbuf_t)arg;
|
||||||
|
|
||||||
|
if (vdev == ptnr_vdev)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hold the reference to avoid free of nbuf in
|
||||||
|
* dp_tx_mcast_enhance() in case of successful
|
||||||
|
* conversion
|
||||||
|
*/
|
||||||
|
qdf_nbuf_ref(nbuf);
|
||||||
|
|
||||||
|
if (qdf_unlikely(!dp_tx_mcast_enhance(ptnr_vdev, nbuf)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qdf_nbuf_free(nbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
qdf_nbuf_t
|
||||||
|
dp_tx_mlo_mcast_send_be(struct dp_soc *soc, struct dp_vdev *vdev,
|
||||||
|
qdf_nbuf_t nbuf,
|
||||||
|
struct cdp_tx_exception_metadata *tx_exc_metadata)
|
||||||
|
{
|
||||||
|
struct dp_vdev_be *be_vdev = dp_get_be_vdev_from_dp_vdev(vdev);
|
||||||
|
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
||||||
|
|
||||||
|
if (!tx_exc_metadata->is_mlo_mcast)
|
||||||
|
return nbuf;
|
||||||
|
|
||||||
|
if (!be_vdev->mcast_primary) {
|
||||||
|
qdf_nbuf_free(nbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In the single netdev model avoid reinjection path as mcast
|
||||||
|
* packet is identified in upper layers while peer search to find
|
||||||
|
* primary TQM based on dest mac addr
|
||||||
|
*
|
||||||
|
* New bonding interface added into the bridge so MCSD will update
|
||||||
|
* snooping table and wifi driver populates the entries in appropriate
|
||||||
|
* child net devices.
|
||||||
|
*/
|
||||||
|
if (vdev->mcast_enhancement_en) {
|
||||||
|
/*
|
||||||
|
* As dp_tx_mcast_enhance() can consume the nbuf incase of
|
||||||
|
* successful conversion hold the reference of nbuf.
|
||||||
|
*
|
||||||
|
* Hold the reference to tx on partner links
|
||||||
|
*/
|
||||||
|
qdf_nbuf_ref(nbuf);
|
||||||
|
if (qdf_unlikely(!dp_tx_mcast_enhance(vdev, nbuf))) {
|
||||||
|
dp_mcast_mlo_iter_ptnr_vdev(be_soc, be_vdev,
|
||||||
|
dp_tx_mlo_mcast_enhance_be,
|
||||||
|
nbuf, DP_MOD_ID_TX);
|
||||||
|
qdf_nbuf_free(nbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/* release reference taken above */
|
||||||
|
qdf_nbuf_free(nbuf);
|
||||||
|
}
|
||||||
|
dp_tx_mlo_mcast_handler_be(soc, vdev, nbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
static inline void
|
static inline void
|
||||||
dp_tx_vdev_id_set_hal_tx_desc(uint32_t *hal_tx_desc_cached,
|
dp_tx_vdev_id_set_hal_tx_desc(uint32_t *hal_tx_desc_cached,
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -253,6 +253,24 @@ bool dp_tx_mlo_is_mcast_primary_be(struct dp_soc *soc,
|
|||||||
struct dp_vdev *vdev);
|
struct dp_vdev *vdev);
|
||||||
#ifdef WLAN_MCAST_MLO
|
#ifdef WLAN_MCAST_MLO
|
||||||
#ifdef WLAN_MLO_MULTI_CHIP
|
#ifdef WLAN_MLO_MULTI_CHIP
|
||||||
|
#ifdef CONFIG_MLO_SINGLE_DEV
|
||||||
|
/**
|
||||||
|
* dp_tx_mlo_mcast_send_be() - Tx send handler for mlo mcast enhance
|
||||||
|
* @soc: DP soc handle
|
||||||
|
* @vdev_id: id of DP vdev handle
|
||||||
|
* @nbuf: skb
|
||||||
|
* @tx_exc_metadata: Handle that holds exception path meta data
|
||||||
|
* @pkt_drop_st: if packet drop will set for 1
|
||||||
|
*
|
||||||
|
* Return: NULL for success
|
||||||
|
* nbuf for failure
|
||||||
|
*/
|
||||||
|
|
||||||
|
qdf_nbuf_t dp_tx_mlo_mcast_send_be(struct dp_soc *soc, struct dp_vdev *vdev,
|
||||||
|
qdf_nbuf_t nbuf,
|
||||||
|
struct cdp_tx_exception_metadata
|
||||||
|
*tx_exc_metadata);
|
||||||
|
#endif
|
||||||
/**
|
/**
|
||||||
* dp_tx_mlo_mcast_pkt_send() - handler to send MLO Mcast packets
|
* dp_tx_mlo_mcast_pkt_send() - handler to send MLO Mcast packets
|
||||||
* @be_vdev: Handle to DP be_vdev structure
|
* @be_vdev: Handle to DP be_vdev structure
|
||||||
|
@@ -3090,7 +3090,7 @@ static bool dp_check_exc_metadata(struct cdp_tx_exception_metadata *tx_exc)
|
|||||||
* Return: true on success,
|
* Return: true on success,
|
||||||
* false on failure
|
* false on failure
|
||||||
*/
|
*/
|
||||||
static inline bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
||||||
{
|
{
|
||||||
qdf_ether_header_t *eh;
|
qdf_ether_header_t *eh;
|
||||||
|
|
||||||
@@ -3122,7 +3122,7 @@ static inline bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -3395,6 +3395,19 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|||||||
*/
|
*/
|
||||||
dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue);
|
dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if the packet is mcast packet send through mlo_macst handler
|
||||||
|
* for all prnt_vdevs
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (soc->arch_ops.dp_tx_mlo_mcast_send) {
|
||||||
|
nbuf = soc->arch_ops.dp_tx_mlo_mcast_send(soc, vdev,
|
||||||
|
nbuf,
|
||||||
|
tx_exc_metadata);
|
||||||
|
if (!nbuf)
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (qdf_likely(tx_exc_metadata->is_intrabss_fwd)) {
|
if (qdf_likely(tx_exc_metadata->is_intrabss_fwd)) {
|
||||||
if (qdf_unlikely(vdev->nawds_enabled)) {
|
if (qdf_unlikely(vdev->nawds_enabled)) {
|
||||||
/*
|
/*
|
||||||
|
@@ -337,6 +337,16 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|||||||
struct dp_tx_msdu_info_s *msdu_info, uint16_t peer_id,
|
struct dp_tx_msdu_info_s *msdu_info, uint16_t peer_id,
|
||||||
struct cdp_tx_exception_metadata *tx_exc_metadata);
|
struct cdp_tx_exception_metadata *tx_exc_metadata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_tx_mcast_enhance
|
||||||
|
* @vdev: DP vdev handle
|
||||||
|
* @nbuf: network buffer to be transmitted
|
||||||
|
*
|
||||||
|
* Return: true on success
|
||||||
|
* false on failure
|
||||||
|
*/
|
||||||
|
bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t buf);
|
||||||
|
|
||||||
#if QDF_LOCK_STATS
|
#if QDF_LOCK_STATS
|
||||||
noinline qdf_nbuf_t
|
noinline qdf_nbuf_t
|
||||||
dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
||||||
|
@@ -2241,6 +2241,13 @@ struct dp_arch_ops {
|
|||||||
void (*tx_comp_get_params_from_hal_desc)(struct dp_soc *soc,
|
void (*tx_comp_get_params_from_hal_desc)(struct dp_soc *soc,
|
||||||
void *tx_comp_hal_desc,
|
void *tx_comp_hal_desc,
|
||||||
struct dp_tx_desc_s **desc);
|
struct dp_tx_desc_s **desc);
|
||||||
|
|
||||||
|
qdf_nbuf_t (*dp_tx_mlo_mcast_send)(struct dp_soc *soc,
|
||||||
|
struct dp_vdev *vdev,
|
||||||
|
qdf_nbuf_t nbuf,
|
||||||
|
struct cdp_tx_exception_metadata
|
||||||
|
*tx_exc_metadata);
|
||||||
|
|
||||||
void (*dp_tx_process_htt_completion)(struct dp_soc *soc,
|
void (*dp_tx_process_htt_completion)(struct dp_soc *soc,
|
||||||
struct dp_tx_desc_s *tx_desc,
|
struct dp_tx_desc_s *tx_desc,
|
||||||
uint8_t *status,
|
uint8_t *status,
|
||||||
|
Reference in New Issue
Block a user