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:

committed by
Madan Koyyalamudi

szülő
79720d811d
commit
0de42b892b
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user