qcacmn: update dp_vdev for TDLS based on MLO connection
Update dp_vdev for TDLS based on MLO connection, if TDLS connection is from secondary dp_vdev, then (1) update vdev->osif_vdev same as primary vdev to support RX (2) update primary vdev's TX search to support TX over TDLS peer else if TDLS connection is based on primary vdev, then keep same as earlier. Change-Id: I4b76afaa481e98c36bb5374eede8046b6cc69b4c CRs-Fixed: 3469845
This commit is contained in:

committad av
Madan Koyyalamudi

förälder
47c6e8b612
incheckning
d1152e8af9
@@ -7334,6 +7334,107 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#if defined(FEATURE_WLAN_TDLS) && defined(WLAN_FEATURE_11BE_MLO)
|
||||
/**
|
||||
* dp_update_mlo_vdev_for_tdls() - update mlo vdev configuration
|
||||
* for TDLS
|
||||
* @cdp_soc: DP soc handle
|
||||
* @vdev_id: id of DP vdev handle
|
||||
* @param: parameter type for vdev
|
||||
* @val: value
|
||||
*
|
||||
* If TDLS connection is from secondary vdev, then copy osif_vdev from
|
||||
* primary vdev to support RX, update TX bank register info for primary
|
||||
* vdev as well.
|
||||
* If TDLS connection is from primary vdev, same as before.
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void
|
||||
dp_update_mlo_vdev_for_tdls(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
|
||||
enum cdp_vdev_param_type param,
|
||||
cdp_config_param_type val)
|
||||
{
|
||||
struct dp_soc *soc = (struct dp_soc *)cdp_soc;
|
||||
struct dp_peer *peer;
|
||||
struct dp_peer *tmp_peer;
|
||||
struct dp_peer *mld_peer;
|
||||
struct dp_vdev *vdev = NULL;
|
||||
struct dp_vdev *pri_vdev = NULL;
|
||||
uint8_t pri_vdev_id = CDP_INVALID_VDEV_ID;
|
||||
|
||||
if (param != CDP_UPDATE_TDLS_FLAGS)
|
||||
return;
|
||||
|
||||
dp_info("update TDLS flag for vdev_id %d, val %d",
|
||||
vdev_id, val.cdp_vdev_param_tdls_flags);
|
||||
vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_MISC);
|
||||
/* only check for STA mode vdev */
|
||||
if (!vdev || vdev->opmode != wlan_op_mode_sta) {
|
||||
dp_info("vdev is not as expected for TDLS");
|
||||
goto comp_ret;
|
||||
}
|
||||
|
||||
/* Find primary vdev_id */
|
||||
qdf_spin_lock_bh(&vdev->peer_list_lock);
|
||||
TAILQ_FOREACH_SAFE(peer, &vdev->peer_list,
|
||||
peer_list_elem,
|
||||
tmp_peer) {
|
||||
if (dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG) ==
|
||||
QDF_STATUS_SUCCESS) {
|
||||
/* do check only if MLO link peer exist */
|
||||
if (IS_MLO_DP_LINK_PEER(peer)) {
|
||||
mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer);
|
||||
pri_vdev_id = mld_peer->vdev->vdev_id;
|
||||
dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
|
||||
break;
|
||||
}
|
||||
dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
|
||||
}
|
||||
}
|
||||
qdf_spin_unlock_bh(&vdev->peer_list_lock);
|
||||
|
||||
if (pri_vdev_id != CDP_INVALID_VDEV_ID)
|
||||
pri_vdev = dp_vdev_get_ref_by_id(soc, pri_vdev_id,
|
||||
DP_MOD_ID_MISC);
|
||||
|
||||
/* If current vdev is not same as primary vdev */
|
||||
if (pri_vdev && pri_vdev != vdev) {
|
||||
dp_info("primary vdev [%d] %pK different with vdev [%d] %pK",
|
||||
pri_vdev->vdev_id, pri_vdev,
|
||||
vdev->vdev_id, vdev);
|
||||
/* update osif_vdev to support RX for vdev */
|
||||
vdev->osif_vdev = pri_vdev->osif_vdev;
|
||||
dp_set_vdev_param(cdp_soc, pri_vdev->vdev_id,
|
||||
CDP_UPDATE_TDLS_FLAGS, val);
|
||||
}
|
||||
|
||||
comp_ret:
|
||||
if (pri_vdev)
|
||||
dp_vdev_unref_delete(soc, pri_vdev, DP_MOD_ID_MISC);
|
||||
if (vdev)
|
||||
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MISC);
|
||||
}
|
||||
|
||||
static QDF_STATUS
|
||||
dp_set_vdev_param_wrapper(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
|
||||
enum cdp_vdev_param_type param,
|
||||
cdp_config_param_type val)
|
||||
{
|
||||
dp_update_mlo_vdev_for_tdls(cdp_soc, vdev_id, param, val);
|
||||
|
||||
return dp_set_vdev_param(cdp_soc, vdev_id, param, val);
|
||||
}
|
||||
#else
|
||||
static QDF_STATUS
|
||||
dp_set_vdev_param_wrapper(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
|
||||
enum cdp_vdev_param_type param,
|
||||
cdp_config_param_type val)
|
||||
{
|
||||
return dp_set_vdev_param(cdp_soc, vdev_id, param, val);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dp_set_psoc_param: function to set parameters in psoc
|
||||
* @cdp_soc: DP soc handle
|
||||
@@ -10398,7 +10499,7 @@ static struct cdp_ctrl_ops dp_ops_ctrl = {
|
||||
dp_is_vdev_peer_protocol_count_enabled,
|
||||
.txrx_get_peer_protocol_drop_mask = dp_get_vdev_peer_protocol_drop_mask,
|
||||
#endif
|
||||
.txrx_set_vdev_param = dp_set_vdev_param,
|
||||
.txrx_set_vdev_param = dp_set_vdev_param_wrapper,
|
||||
.txrx_set_psoc_param = dp_set_psoc_param,
|
||||
.txrx_get_psoc_param = dp_get_psoc_param,
|
||||
#ifndef WLAN_SOFTUMAC_SUPPORT
|
||||
|
Referens i nytt ärende
Block a user