diff mbox series

[1/2] wifi: ath12k: fix WARN_ON during ath12k_mac_update_vif_chan

Message ID 20230802085852.19821-2-quic_mdharane@quicinc.com
State New
Headers show
Series wifi: ath12k: fix radar detection in secondary 80 MHz | expand

Commit Message

Manish Dharanenthiran Aug. 2, 2023, 8:58 a.m. UTC
Fix WARN_ON() from ath12k_mac_update_vif_chan() if vdev is not up.
Since change_chanctx can be called even before vdev_up.

Do vdev stop followed by a vdev start in case of vdev is down.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0-02903-QCAHKSWPL_SILICONZ-1

Signed-off-by: Manish Dharanenthiran <quic_mdharane@quicinc.com>
---
 drivers/net/wireless/ath/ath12k/mac.c | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

Comments

Wen Gong Aug. 8, 2023, 10:26 a.m. UTC | #1
On 8/2/2023 10:59 PM, Jeff Johnson wrote:
> On 8/2/2023 1:58 AM, Manish Dharanenthiran wrote:
>> Fix WARN_ON() from ath12k_mac_update_vif_chan() if vdev is not up.
>> Since change_chanctx can be called even before vdev_up.
>>
>> Do vdev stop followed by a vdev start in case of vdev is down.
>>
>> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0-02903-QCAHKSWPL_SILICONZ-1
>
> Has this been tested on WCN7850? My understanding is that firmware may 
> expect vdev down and then vdev restart
>
For WCN7850, firmware do not expect vdev down for station vdev type here.

And this patch only take effect when arvif->is_up is not set,

it is hard to happen that for MCC station mode.

Because this function is entered for channel switch for MCC station mode,

it means station is connected to the AP, then arvif->is_up is set, then 
this patch not take effect.

[...]

>
Manish Dharanenthiran Aug. 17, 2023, 11:19 a.m. UTC | #2
On 8/8/2023 3:56 PM, Wen Gong wrote:
> On 8/2/2023 10:59 PM, Jeff Johnson wrote:
>> On 8/2/2023 1:58 AM, Manish Dharanenthiran wrote:
>>> Fix WARN_ON() from ath12k_mac_update_vif_chan() if vdev is not up.
>>> Since change_chanctx can be called even before vdev_up.
>>>
>>> Do vdev stop followed by a vdev start in case of vdev is down.
>>>
>>> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0-02903-QCAHKSWPL_SILICONZ-1
>>
>> Has this been tested on WCN7850? My understanding is that firmware may 
>> expect vdev down and then vdev restart
>>
> For WCN7850, firmware do not expect vdev down for station vdev type here.
> 
> And this patch only take effect when arvif->is_up is not set,
> 
> it is hard to happen that for MCC station mode.
> 
> Because this function is entered for channel switch for MCC station mode,
> 
> it means station is connected to the AP, then arvif->is_up is set, then 
> this patch not take effect.
> 
> [...]
> 
>>
Thanks Wen for checking this change!

Hi Jeff,

Kindly review the changes and provide your comments.

Regards
Manish Dharanenthiran
Jeff Johnson Aug. 17, 2023, 2:20 p.m. UTC | #3
On 8/2/2023 1:58 AM, Manish Dharanenthiran wrote:
> Fix WARN_ON() from ath12k_mac_update_vif_chan() if vdev is not up.
> Since change_chanctx can be called even before vdev_up.
> 
> Do vdev stop followed by a vdev start in case of vdev is down.
> 
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0-02903-QCAHKSWPL_SILICONZ-1
> 
> Signed-off-by: Manish Dharanenthiran <quic_mdharane@quicinc.com>

Reviewed-by: Jeff Johnson <quic_jjohnson@quicinc.com>
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index 1bb9802ef569..0ab95e138d1d 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -5698,13 +5698,28 @@  ath12k_mac_update_vif_chan(struct ath12k *ar,
 		if (WARN_ON(!arvif->is_started))
 			continue;
 
-		if (WARN_ON(!arvif->is_up))
-			continue;
+		/* Firmware expect vdev_restart only if vdev is up.
+		 * If vdev is down then it expect vdev_stop->vdev_start.
+		 */
+		if (arvif->is_up) {
+			ret = ath12k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def);
+			if (ret) {
+				ath12k_warn(ab, "failed to restart vdev %d: %d\n",
+					    arvif->vdev_id, ret);
+				continue;
+			}
+		} else {
+			ret = ath12k_mac_vdev_stop(arvif);
+			if (ret) {
+				ath12k_warn(ab, "failed to stop vdev %d: %d\n",
+					    arvif->vdev_id, ret);
+				continue;
+			}
 
-		ret = ath12k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def);
-		if (ret) {
-			ath12k_warn(ab, "failed to restart vdev %d: %d\n",
-				    arvif->vdev_id, ret);
+			ret = ath12k_mac_vdev_start(arvif, &vifs[i].new_ctx->def);
+			if (ret)
+				ath12k_warn(ab, "failed to start vdev %d: %d\n",
+					    arvif->vdev_id, ret);
 			continue;
 		}