OSDN Git Service

ath11k: Handle errors if peer creation fails
authorAlex Dewar <alex.dewar90@gmail.com>
Sat, 7 Nov 2020 08:16:29 +0000 (10:16 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 10 Nov 2020 18:14:36 +0000 (20:14 +0200)
ath11k_peer_create() is called without its return value being checked,
meaning errors will be unhandled. Add missing check and, as the mutex is
unconditionally unlocked on leaving this function, simplify the exit
path.

Addresses-Coverity-ID: 1497531 ("Code maintainability issues")
Fixes: 701e48a43e15 ("ath11k: add packet log support for QCA6390")
Signed-off-by: Alex Dewar <alex.dewar90@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20201004100218.311653-1-alex.dewar90@gmail.com
drivers/net/wireless/ath/ath11k/mac.c

index 591dceb..f4aedd5 100644 (file)
@@ -5275,20 +5275,26 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
            arvif->vdev_type != WMI_VDEV_TYPE_AP &&
            arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
                memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
-               mutex_unlock(&ar->conf_mutex);
-               return 0;
+               ret = 0;
+               goto out;
        }
 
        if (WARN_ON(arvif->is_started)) {
-               mutex_unlock(&ar->conf_mutex);
-               return -EBUSY;
+               ret = -EBUSY;
+               goto out;
        }
 
        if (ab->hw_params.vdev_start_delay) {
                param.vdev_id = arvif->vdev_id;
                param.peer_type = WMI_PEER_TYPE_DEFAULT;
                param.peer_addr = ar->mac_addr;
+
                ret = ath11k_peer_create(ar, arvif, NULL, &param);
+               if (ret) {
+                       ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
+                                   ret);
+                       goto out;
+               }
        }
 
        ret = ath11k_mac_vdev_start(arvif, &ctx->def);
@@ -5296,23 +5302,21 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
                ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
                            arvif->vdev_id, vif->addr,
                            ctx->def.chan->center_freq, ret);
-               goto err;
+               goto out;
        }
        if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
                ret = ath11k_monitor_vdev_up(ar, arvif->vdev_id);
                if (ret)
-                       goto err;
+                       goto out;
        }
 
        arvif->is_started = true;
 
        /* TODO: Setup ps and cts/rts protection */
 
-       mutex_unlock(&ar->conf_mutex);
-
-       return 0;
+       ret = 0;
 
-err:
+out:
        mutex_unlock(&ar->conf_mutex);
 
        return ret;