qcacmn: Handle mlo case for ppe ds peer setup

Handle mlo case for ppe ds peer setup by
making sure the src_info is always extracted from
primary vdev.

Change-Id: Ie4b0d8f475966e8c4264cea5cf32f0dc95e76c4a
CRs-Fixed: 3346074
Šī revīzija ir iekļauta:
Pavankumar Nandeshwar
2022-11-30 03:28:05 -08:00
revīziju iesūtīja Madan Koyyalamudi
vecāks a76b886ed4
revīzija 1f137636fa
2 mainīti faili ar 86 papildinājumiem un 20 dzēšanām

Parādīt failu

@@ -121,7 +121,8 @@ qdf_size_t dp_get_context_size_be(enum dp_context_type context_type)
#if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
/**
* dp_cc_wbm_sw_en_cfg() - configure HW cookie conversion enablement
per wbm2sw ring
* per wbm2sw ring
*
* @cc_cfg: HAL HW cookie conversion configuration structure pointer
*
* Return: None
@@ -185,7 +186,8 @@ static QDF_STATUS dp_fisa_fst_cmem_addr_init(struct dp_soc *soc)
/**
* dp_cc_reg_cfg_init() - initialize and configure HW cookie
conversion register
* conversion register
*
* @soc: SOC handle
* @is_4k_align: page address 4k aligned
*
@@ -238,9 +240,9 @@ static inline void dp_hw_cc_cmem_write(hal_soc_handle_t hal_soc_hdl,
/**
* dp_hw_cc_cmem_addr_init() - Check and initialize CMEM base address for
HW cookie conversion
* HW cookie conversion
*
* @soc: SOC handle
* @cc_ctx: cookie conversion context pointer
*
* Return: 0 in case of success, else error value
*/
@@ -506,15 +508,13 @@ static QDF_STATUS dp_soc_ppe_detach_be(struct dp_soc *soc)
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc,
struct dp_peer_be *be_peer,
struct dp_vdev_be *be_vdev)
static QDF_STATUS dp_peer_ppeds_default_route_be(struct dp_soc *soc,
struct dp_peer_be *be_peer,
uint8_t vdev_id,
uint16_t src_info)
{
uint16_t service_code;
uint8_t priority_valid;
struct dp_ppe_vp_profile *ppe_vp_profile = &be_vdev->ppe_vp_profile;
uint16_t src_info = ppe_vp_profile->vp_num;
uint8_t vdev_id = be_vdev->vdev.vdev_id;
uint8_t use_ppe = PEER_ROUTING_USE_PPE;
uint8_t peer_routing_enabled = PEER_ROUTING_ENABLED;
QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -543,6 +543,78 @@ static QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc,
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc,
struct dp_peer *peer,
struct dp_vdev_be *be_vdev)
{
struct dp_ppe_vp_profile *ppe_vp_profile = &be_vdev->ppe_vp_profile;
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) {
qdf_err("BE peer is null");
return QDF_STATUS_E_NULL_VALUE;
}
if (IS_DP_LEGACY_PEER(peer)) {
qdf_status = dp_peer_ppeds_default_route_be(soc, be_peer,
vdev_id, src_info);
} else if (IS_MLO_DP_MLD_PEER(peer)) {
int i;
struct dp_peer *link_peer = NULL;
struct dp_mld_link_peers link_peers_info;
/* get link peers with reference */
dp_get_link_peers_ref_from_mld_peer(soc, peer, &link_peers_info,
DP_MOD_ID_DS);
for (i = 0; i < link_peers_info.num_links; i++) {
link_peer = link_peers_info.link_peers[i];
be_peer = dp_get_be_peer_from_dp_peer(link_peer);
if (!be_peer) {
qdf_err("BE peer is null for peer id %d ",
link_peer->peer_id);
continue;
}
be_vdev = dp_get_be_vdev_from_dp_vdev(link_peer->vdev);
if (!be_vdev) {
qdf_err("BE vap is null for peer id %d ",
link_peer->peer_id);
continue;
}
vdev_id = be_vdev->vdev.vdev_id;
qdf_status = dp_peer_ppeds_default_route_be(soc,
be_peer,
vdev_id,
src_info);
}
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);
if (!mld_peer)
return qdf_status;
be_vdev = dp_get_be_vdev_from_dp_vdev(mld_peer->vdev);
if (!be_vdev) {
qdf_err("BE vap is null");
return QDF_STATUS_E_NULL_VALUE;
}
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);
}
return qdf_status;
}
#else
static QDF_STATUS dp_ppeds_init_soc_be(struct dp_soc *soc)
{
@@ -565,9 +637,8 @@ static inline QDF_STATUS dp_soc_ppe_detach_be(struct dp_soc *soc)
}
static inline
QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc,
struct dp_peer_be *be_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)
{
return QDF_STATUS_SUCCESS;
}
@@ -878,15 +949,9 @@ static QDF_STATUS dp_vdev_detach_be(struct dp_soc *soc, struct dp_vdev *vdev)
#ifdef WLAN_SUPPORT_PPEDS
static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer)
{
struct dp_peer_be *be_peer = dp_get_be_peer_from_dp_peer(peer);
struct dp_vdev_be *be_vdev;
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
if (!be_peer) {
qdf_err("BE peer is null");
return QDF_STATUS_E_NULL_VALUE;
}
be_vdev = dp_get_be_vdev_from_dp_vdev(peer->vdev);
if (!be_vdev) {
qdf_err("BE vap is null");
@@ -897,7 +962,7 @@ static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer)
* Check if PPE routing is enabled on the associated vap.
*/
if (be_vdev->ppe_vp_enabled == PPE_VP_USER_TYPE_DS)
qdf_status = dp_peer_setup_ppe_be(soc, be_peer, be_vdev);
qdf_status = dp_peer_setup_ppeds_be(soc, peer, be_vdev);
return qdf_status;
}

Parādīt failu

@@ -263,6 +263,7 @@ enum dp_mod_id {
DP_MOD_ID_SCS,
DP_MOD_ID_UMAC_RESET,
DP_MOD_ID_TX_MCAST,
DP_MOD_ID_DS,
DP_MOD_ID_MAX,
};