ath11k: Refactor the fallback routine when peer create fails
authorKarthikeyan Periyasamy <periyasa@codeaurora.org>
Mon, 10 Jan 2022 14:24:14 +0000 (16:24 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Tue, 11 Jan 2022 14:39:15 +0000 (16:39 +0200)
When there is an error in peer create process from
ath11k_peer_find(), the code attempts to handle a fallback
for peer create. When this fallback fails, the driver returns
the fallback return code rather than actual error code
(-ENOENT). So refactor the fallback routine to return
the actual error code.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01067-QCAHKSWPL_SILICONZ-1

Signed-off-by: Karthikeyan Periyasamy <periyasa@codeaurora.org>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/1640244819-21183-1-git-send-email-quic_periyasa@quicinc.com
drivers/net/wireless/ath/ath11k/peer.c

index 85471f8..332886b 100644 (file)
@@ -252,7 +252,7 @@ int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif,
 {
        struct ath11k_peer *peer;
        struct ath11k_sta *arsta;
-       int ret;
+       int ret, fbret;
 
        lockdep_assert_held(&ar->conf_mutex);
 
@@ -291,22 +291,8 @@ int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif,
                ath11k_warn(ar->ab, "failed to find peer %pM on vdev %i after creation\n",
                            param->peer_addr, param->vdev_id);
 
-               reinit_completion(&ar->peer_delete_done);
-
-               ret = ath11k_wmi_send_peer_delete_cmd(ar, param->peer_addr,
-                                                     param->vdev_id);
-               if (ret) {
-                       ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
-                                   param->vdev_id, param->peer_addr);
-                       return ret;
-               }
-
-               ret = ath11k_wait_for_peer_delete_done(ar, param->vdev_id,
-                                                      param->peer_addr);
-               if (ret)
-                       return ret;
-
-               return -ENOENT;
+               ret = -ENOENT;
+               goto cleanup;
        }
 
        peer->pdev_idx = ar->pdev_idx;
@@ -335,4 +321,24 @@ int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif,
        spin_unlock_bh(&ar->ab->base_lock);
 
        return 0;
+
+cleanup:
+       reinit_completion(&ar->peer_delete_done);
+
+       fbret = ath11k_wmi_send_peer_delete_cmd(ar, param->peer_addr,
+                                               param->vdev_id);
+       if (fbret) {
+               ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
+                           param->vdev_id, param->peer_addr);
+               goto exit;
+       }
+
+       fbret = ath11k_wait_for_peer_delete_done(ar, param->vdev_id,
+                                                param->peer_addr);
+       if (fbret)
+               ath11k_warn(ar->ab, "failed wait for peer %pM delete done id %d fallback ret %d\n",
+                           param->peer_addr, param->vdev_id, fbret);
+
+exit:
+       return ret;
 }