--- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -4215,15 +4215,28 @@ static void ath11k_mgmt_over_wmi_tx_work while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) { info = IEEE80211_SKB_CB(skb); - arvif = ath11k_vif_to_arvif(info->control.vif); - - ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb); - if (ret) { - ath11k_warn(ar->ab, "failed to transmit management frame %d\n", - ret); + if (!info->control.vif) { + ath11k_warn(ar->ab, "no vif found for mgmt frame, flags 0x%x\n", + info->control.flags); ieee80211_free_txskb(ar->hw, skb); + continue; + } + + arvif = ath11k_vif_to_arvif(info->control.vif); + if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { + ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb); + if (ret) { + ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", + arvif->vdev_id, ret); + ieee80211_free_txskb(ar->hw, skb); + } else { + atomic_inc(&ar->num_pending_mgmt_tx); + } } else { - atomic_inc(&ar->num_pending_mgmt_tx); + ath11k_warn(ar->ab, + "dropping mgmt frame for deleted vdev %d, flags 0x%x\n", + arvif->vdev_id, info->control.flags); + ieee80211_free_txskb(ar->hw, skb); } } } @@ -4573,6 +4586,9 @@ static int ath11k_mac_op_add_interface(s arvif->vdev_id, ret); goto err; } + ath11k_info(ab, "vdev %pM created, vdev_id %d\n", + vif->addr, arvif->vdev_id); + ar->num_created_vdevs++; ar->allocated_vdev_map |= 1LL << arvif->vdev_id; ab->free_vdev_map &= ~(1LL << arvif->vdev_id); @@ -4777,6 +4793,8 @@ static void ath11k_mac_op_remove_interfa if (time_left == 0) { ath11k_warn(ab, "Timeout in receiving vdev delete response\n"); } else { + ath11k_info(ab, "vdev %pM deleted, vdev_id %d\n", + vif->addr, arvif->vdev_id); ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); ab->free_vdev_map |= 1LL << (arvif->vdev_id); ar->num_created_vdevs--; @@ -5035,6 +5053,8 @@ ath11k_mac_vdev_start_restart(struct ath return ret; } + ath11k_info(ar->ab, "vdev %pM started, vdev_id %d\n", + arvif->vif->addr, arvif->vdev_id); ar->num_started_vdevs++; /* Enable CAC Flag in the driver by checking the channel DFS cac time, @@ -5087,6 +5107,8 @@ static int ath11k_mac_vdev_stop(struct a WARN_ON(ar->num_started_vdevs == 0); + ath11k_info(ar->ab, "vdev %pM stopped, vdev_id %d\n", + arvif->vif->addr, arvif->vdev_id); ar->num_started_vdevs--; if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {