qcacld-3.0: Don't change the ROC duration for GAS frame
Currently, host multiplies ROC duration by 10 for GAS tx frame. since a one shot ULW (absence notice) has been given to peer, peer would not be available for ULW duration due to which fw can’t cancel the already communicated absence schedule. Fix is, avoid multiplying the received ROC duration for GAS frame. Change-Id: If53d5ee446fc5f4df2fcf117a436133116270b9e CRs-Fixed: 3378272
此提交包含在:
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -86,6 +86,7 @@ static QDF_STATUS p2p_scan_start(struct p2p_roc_context *roc_ctx)
|
|||||||
uint8_t ndp_num = 0, nan_disc_enabled_num = 0;
|
uint8_t ndp_num = 0, nan_disc_enabled_num = 0;
|
||||||
struct wlan_objmgr_pdev *pdev;
|
struct wlan_objmgr_pdev *pdev;
|
||||||
bool is_dbs;
|
bool is_dbs;
|
||||||
|
enum QDF_OPMODE opmode;
|
||||||
|
|
||||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
|
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
|
||||||
p2p_soc_obj->soc, roc_ctx->vdev_id,
|
p2p_soc_obj->soc, roc_ctx->vdev_id,
|
||||||
@@ -95,6 +96,8 @@ static QDF_STATUS p2p_scan_start(struct p2p_roc_context *roc_ctx)
|
|||||||
return QDF_STATUS_E_INVAL;
|
return QDF_STATUS_E_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opmode = wlan_vdev_mlme_get_opmode(vdev);
|
||||||
|
|
||||||
req = qdf_mem_malloc(sizeof(*req));
|
req = qdf_mem_malloc(sizeof(*req));
|
||||||
if (!req) {
|
if (!req) {
|
||||||
status = QDF_STATUS_E_NOMEM;
|
status = QDF_STATUS_E_NOMEM;
|
||||||
@@ -136,23 +139,32 @@ static QDF_STATUS p2p_scan_start(struct p2p_roc_context *roc_ctx)
|
|||||||
go_num, ndp_num, nan_disc_enabled_num);
|
go_num, ndp_num, nan_disc_enabled_num);
|
||||||
|
|
||||||
is_dbs = policy_mgr_is_hw_dbs_capable(p2p_soc_obj->soc);
|
is_dbs = policy_mgr_is_hw_dbs_capable(p2p_soc_obj->soc);
|
||||||
|
/* Modify the ROC duration only for P2P modes */
|
||||||
if (go_num)
|
if (opmode == QDF_P2P_DEVICE_MODE ||
|
||||||
/* Add fixed 300ms extra ROC time instead of multiplying the
|
opmode == QDF_P2P_CLIENT_MODE ||
|
||||||
* ROC duration by const value as this causes the ROC to be
|
opmode == QDF_P2P_GO_MODE) {
|
||||||
* upto 1.5 secs if GO is present. Firmware will advertize NOA
|
if (go_num)
|
||||||
* of 1.5 secs and if supplicant cancels ROC after 200 or 300ms
|
/* Check any P2P GO is already present or not. If it's
|
||||||
* then firmware cannot cancel NOA. So when supplicant sends
|
* present then add fixed ROC timer value by 300ms
|
||||||
* next ROC it will be delayed as firmware already is running
|
* instead of multiplying with const value which may
|
||||||
* previous NOA. This causes p2p find issues if GO is present.
|
* lead ROC timer to become 1.5sec. So, in this case fw
|
||||||
* So add fixed duration of 300ms and also cap max ROC to 600ms
|
* will advertize NOA for 1.5 secs and if supplicant
|
||||||
* when GO is present
|
* wants to cancel the ROC after 200 or 300ms then fw
|
||||||
*/
|
* can not cancel NOA as ROC is already set to 1.5sec.
|
||||||
req->scan_req.dwell_time_passive +=
|
* And if supplicant sends the next ROC then it might
|
||||||
|
* delay as firmware is already running the presvious
|
||||||
|
* NOA. This may cause the P2P find issue because P2P GO
|
||||||
|
* is already present.
|
||||||
|
* To fix this, add fixed 300ms duration to ROC and
|
||||||
|
* later check if max limit reaches to 600ms then set
|
||||||
|
* max ROC duartion as 600ms only.
|
||||||
|
*/
|
||||||
|
req->scan_req.dwell_time_passive +=
|
||||||
P2P_ROC_DURATION_MULTI_GO_PRESENT;
|
P2P_ROC_DURATION_MULTI_GO_PRESENT;
|
||||||
else
|
else
|
||||||
req->scan_req.dwell_time_passive *=
|
req->scan_req.dwell_time_passive *=
|
||||||
P2P_ROC_DURATION_MULTI_GO_ABSENT;
|
P2P_ROC_DURATION_MULTI_GO_ABSENT;
|
||||||
|
}
|
||||||
/* this is to protect too huge value if some customers
|
/* this is to protect too huge value if some customers
|
||||||
* give a higher value from supplicant
|
* give a higher value from supplicant
|
||||||
*/
|
*/
|
||||||
|
新增問題並參考
封鎖使用者