qcacmn: Add wds ext support for Direct switch module

1. Maintain and fetch PPEDS profile from be_soc instead of be_vdev
2. Enable WDS EXT mode for Direct Switch
3. Provide cdp API's and structures to interact with osif
layer to get PPEDS profile info

Change-Id: I997126e3b5ae85dabdcd6053115927122b8681da
CRs-Fixed: 3404778
This commit is contained in:
Parikshit Gune
2023-02-14 00:19:23 +05:30
committed by Madan Koyyalamudi
szülő 79720d811d
commit 0de42b892b
5 fájl változott, egészen pontosan 131 új sor hozzáadva és 32 régi sor törölve

Fájl megtekintése

@@ -568,14 +568,20 @@ static QDF_STATUS dp_peer_ppeds_default_route_be(struct dp_soc *soc,
}
#ifdef WLAN_FEATURE_11BE_MLO
static QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
struct dp_peer *peer,
struct dp_vdev_be *be_vdev)
QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
struct dp_peer *peer,
struct dp_vdev_be *be_vdev,
void *args)
{
struct dp_ppe_vp_profile *ppe_vp_profile = &be_vdev->ppe_vp_profile;
struct dp_peer *mld_peer;
struct dp_soc *mld_soc;
struct dp_soc_be *be_soc;
struct cdp_soc_t *cdp_soc;
struct dp_peer_be *be_peer = dp_get_be_peer_from_dp_peer(peer);
struct cdp_ds_vp_params vp_params = {0};
struct dp_ppe_vp_profile *ppe_vp_profile = (struct dp_ppe_vp_profile *)args;
uint16_t src_info = ppe_vp_profile->vp_num;
uint8_t vdev_id = be_vdev->vdev.vdev_id;
struct dp_peer_be *be_peer = dp_get_be_peer_from_dp_peer(peer);
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
if (!be_peer) {
@@ -619,19 +625,56 @@ static QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_DS);
} else {
struct dp_peer *mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer);
mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer);
if (!mld_peer)
return qdf_status;
be_vdev = dp_get_be_vdev_from_dp_vdev(mld_peer->vdev);
if (!be_vdev) {
dp_err("BE vap is null");
return QDF_STATUS_E_NULL_VALUE;
/*
* In case of MLO link peer,
* 1. WDS EXT case : use the VP profile created for the
* wds_ext netdev which is passed as an argument.
* 2. Non WDS EXT case : Fetch the VP profile from the mld vdev.
*/
if (!dp_peer_check_wds_ext_peer(mld_peer)) {
be_vdev = dp_get_be_vdev_from_dp_vdev(mld_peer->vdev);
if (!be_vdev) {
dp_err("BE vap is null");
return QDF_STATUS_E_NULL_VALUE;
}
/*
* Extract the VP profile from the vap
* in case of MLO peer, we have to get the profile form
* the MLD vdev's osif handle and not the link peer.
*/
mld_soc = mld_peer->vdev->pdev->soc;
cdp_soc = &mld_soc->cdp_soc;
if (!cdp_soc->ol_ops->get_ppeds_profile_info_for_vap) {
qdf_err("%pK: Register PPEDS profile info API before use\n", cdp_soc);
return QDF_STATUS_E_NULL_VALUE;
}
qdf_status = cdp_soc->ol_ops->get_ppeds_profile_info_for_vap(mld_soc->ctrl_psoc,
mld_peer->vdev->vdev_id,
&vp_params);
if (qdf_status == QDF_STATUS_E_NULL_VALUE) {
qdf_err("%pK: Failed to get ppeds profile for mld soc\n", mld_soc);
return qdf_status;
}
/*
* Check if PPE DS routing is enabled on
* the associated vap.
*/
if (vp_params.ppe_vp_type != PPE_VP_USER_TYPE_DS)
return qdf_status;
be_soc = dp_get_be_soc_from_dp_soc(mld_soc);
ppe_vp_profile = &be_soc->ppe_vp_profile[vp_params.ppe_vp_profile_idx];
src_info = ppe_vp_profile->vp_num;
}
ppe_vp_profile = &be_vdev->ppe_vp_profile;
src_info = ppe_vp_profile->vp_num;
qdf_status = dp_peer_ppeds_default_route_be(soc, be_peer,
vdev_id, src_info);
}
@@ -641,9 +684,10 @@ static QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
#else
static QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
struct dp_peer *peer,
struct dp_vdev_be *be_vdev)
struct dp_vdev_be *be_vdev
void *args)
{
struct dp_ppe_vp_profile *ppe_vp_profile = &be_vdev->ppe_vp_profile;
struct dp_ppe_vp_profile *vp_profile = (struct dp_ppe_vp_profile *)args;
struct dp_peer_be *be_peer = dp_get_be_peer_from_dp_peer(peer);
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
@@ -654,7 +698,7 @@ static QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
qdf_status = dp_peer_ppeds_default_route_be(soc, be_peer,
be_vdev->vdev.vdev_id,
ppe_vp_profile->vp_num);
vp_profile->vp_num);
return qdf_status;
}
@@ -680,9 +724,9 @@ static inline QDF_STATUS dp_soc_ppeds_detach_be(struct dp_soc *soc)
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc, struct dp_peer *peer,
struct dp_vdev_be *be_vdev)
struct dp_vdev_be *be_vdev,
void *args)
{
return QDF_STATUS_SUCCESS;
}
@@ -1083,6 +1127,9 @@ static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer)
{
struct dp_vdev_be *be_vdev;
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
struct cdp_ds_vp_params vp_params = {0};
struct cdp_soc_t *cdp_soc = &soc->cdp_soc;
be_vdev = dp_get_be_vdev_from_dp_vdev(peer->vdev);
if (!be_vdev) {
@@ -1090,11 +1137,29 @@ static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer)
return QDF_STATUS_E_NULL_VALUE;
}
/*
* Extract the VP profile from the VAP
*/
if (!cdp_soc->ol_ops->get_ppeds_profile_info_for_vap) {
dp_err("%pK: Register get ppeds profile info first\n", cdp_soc);
return QDF_STATUS_E_NULL_VALUE;
}
/*
* Check if PPE DS routing is enabled on the associated vap.
*/
if (be_vdev->ppe_vp_enabled == PPE_VP_USER_TYPE_DS)
qdf_status = dp_peer_setup_ppeds_be(soc, peer, be_vdev);
qdf_status = cdp_soc->ol_ops->get_ppeds_profile_info_for_vap(soc->ctrl_psoc,
peer->vdev->vdev_id,
&vp_params);
if (qdf_status == QDF_STATUS_E_NULL_VALUE) {
dp_err("%pK: Could not find ppeds profile info vdev\n", be_vdev);
return QDF_STATUS_E_NULL_VALUE;
}
if (vp_params.ppe_vp_type == PPE_VP_USER_TYPE_DS) {
qdf_status = dp_peer_setup_ppeds_be(soc, peer, be_vdev,
(void *)&be_soc->ppe_vp_profile[vp_params.ppe_vp_profile_idx]);
}
return qdf_status;
}