qcacld-3.0: Set link agnostic flag for all action frames
FW drops the management frames received on the inactive link, so timeout happens on SCS action frames from userspace that are sent on inactive link. Set link agnostic flag in all management frame of subtype action so that FW can send the packet OTA on the active link. Change-Id: I4677617b52eca3f933aae2c4a7584750a95b3302 CRs-Fixed: 3486974
这个提交包含在:
@@ -37,6 +37,7 @@
|
|||||||
#include <wlan_mlme_main.h>
|
#include <wlan_mlme_main.h>
|
||||||
#include "wlan_mlme_api.h"
|
#include "wlan_mlme_api.h"
|
||||||
#include <wlan_cm_api.h>
|
#include <wlan_cm_api.h>
|
||||||
|
#include <wlan_mlo_mgr_sta.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* p2p_psoc_get_tx_ops() - get p2p tx ops
|
* p2p_psoc_get_tx_ops() - get p2p tx ops
|
||||||
@@ -1209,6 +1210,13 @@ static QDF_STATUS p2p_mgmt_tx(struct tx_action_context *tx_ctx,
|
|||||||
mac_addr = wh->i_addr1;
|
mac_addr = wh->i_addr1;
|
||||||
pdev_id = wlan_get_pdev_id_from_vdev_id(psoc, tx_ctx->vdev_id,
|
pdev_id = wlan_get_pdev_id_from_vdev_id(psoc, tx_ctx->vdev_id,
|
||||||
WLAN_P2P_ID);
|
WLAN_P2P_ID);
|
||||||
|
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, tx_ctx->vdev_id,
|
||||||
|
WLAN_P2P_ID);
|
||||||
|
if (!vdev) {
|
||||||
|
p2p_err("VDEV null");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr, WLAN_P2P_ID);
|
peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr, WLAN_P2P_ID);
|
||||||
if (!peer) {
|
if (!peer) {
|
||||||
mac_addr = wh->i_addr2;
|
mac_addr = wh->i_addr2;
|
||||||
@@ -1216,34 +1224,26 @@ static QDF_STATUS p2p_mgmt_tx(struct tx_action_context *tx_ctx,
|
|||||||
WLAN_P2P_ID);
|
WLAN_P2P_ID);
|
||||||
}
|
}
|
||||||
if (!peer) {
|
if (!peer) {
|
||||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
|
opmode = wlan_vdev_mlme_get_opmode(vdev);
|
||||||
tx_ctx->vdev_id,
|
/*
|
||||||
WLAN_P2P_ID);
|
* For NAN iface, retrieves mac address from vdev
|
||||||
if (vdev) {
|
* as it is self peer. Also, rand_mac_tx would be
|
||||||
opmode = wlan_vdev_mlme_get_opmode(vdev);
|
* false as tx channel is not available.
|
||||||
/*
|
*/
|
||||||
* For NAN iface, retrieves mac address from vdev
|
if (opmode == QDF_NAN_DISC_MODE || tx_ctx->rand_mac_tx) {
|
||||||
* as it is self peer. Also, rand_mac_tx would be
|
mac_addr = wlan_vdev_mlme_get_mldaddr(vdev);
|
||||||
* false as tx channel is not available.
|
/* for non-MLO case, mld address will zero */
|
||||||
*/
|
if (qdf_is_macaddr_zero(
|
||||||
if (opmode == QDF_NAN_DISC_MODE ||
|
(struct qdf_mac_addr *)mac_addr))
|
||||||
tx_ctx->rand_mac_tx) {
|
mac_addr = wlan_vdev_mlme_get_macaddr(vdev);
|
||||||
mac_addr = wlan_vdev_mlme_get_mldaddr(vdev);
|
|
||||||
/* for non-MLO case, mld address will zero */
|
|
||||||
if (qdf_is_macaddr_zero(
|
|
||||||
(struct qdf_mac_addr *)mac_addr))
|
|
||||||
mac_addr =
|
|
||||||
wlan_vdev_mlme_get_macaddr(vdev);
|
|
||||||
|
|
||||||
peer = wlan_objmgr_get_peer(psoc, pdev_id,
|
peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr,
|
||||||
mac_addr,
|
WLAN_P2P_ID);
|
||||||
WLAN_P2P_ID);
|
|
||||||
}
|
|
||||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!peer) {
|
if (!peer) {
|
||||||
p2p_err("no valid peer");
|
p2p_err("no valid peer");
|
||||||
|
wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
|
||||||
return QDF_STATUS_E_INVAL;
|
return QDF_STATUS_E_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1264,11 +1264,17 @@ static QDF_STATUS p2p_mgmt_tx(struct tx_action_context *tx_ctx,
|
|||||||
|
|
||||||
tx_ctx->nbuf = packet;
|
tx_ctx->nbuf = packet;
|
||||||
|
|
||||||
|
if (mlo_is_mld_sta(vdev) && tx_ctx->frame_info.type == P2P_FRAME_MGMT &&
|
||||||
|
tx_ctx->frame_info.sub_type == P2P_MGMT_ACTION) {
|
||||||
|
mgmt_param.mlo_link_agnostic = true;
|
||||||
|
}
|
||||||
|
|
||||||
status = wlan_mgmt_txrx_mgmt_frame_tx(peer, tx_ctx->p2p_soc_obj,
|
status = wlan_mgmt_txrx_mgmt_frame_tx(peer, tx_ctx->p2p_soc_obj,
|
||||||
packet, tx_comp_cb, tx_ota_comp_cb,
|
packet, tx_comp_cb, tx_ota_comp_cb,
|
||||||
WLAN_UMAC_COMP_P2P, &mgmt_param);
|
WLAN_UMAC_COMP_P2P, &mgmt_param);
|
||||||
|
|
||||||
wlan_objmgr_peer_release_ref(peer, WLAN_P2P_ID);
|
wlan_objmgr_peer_release_ref(peer, WLAN_P2P_ID);
|
||||||
|
wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
在新工单中引用
屏蔽一个用户