if (!ah || ah->state == ATH12K_HW_STATE_OFF)
continue;
+ mutex_lock(&ah->hw_mutex);
+
switch (ah->state) {
case ATH12K_HW_STATE_ON:
ah->state = ATH12K_HW_STATE_RESTARTING;
"device is wedged, will not restart hw %d\n", i);
break;
}
+
+ mutex_unlock(&ah->hw_mutex);
}
complete(&ab->driver_recovery);
static int ath12k_mac_start(struct ath12k *ar)
{
+ struct ath12k_hw *ah = ar->ah;
struct ath12k_base *ab = ar->ab;
struct ath12k_pdev *pdev = ar->pdev;
int ret;
+ lockdep_assert_held(&ah->hw_mutex);
+
mutex_lock(&ar->conf_mutex);
ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
ath12k_drain_tx(ah);
+ guard(mutex)(&ah->hw_mutex);
+
switch (ah->state) {
case ATH12K_HW_STATE_OFF:
ah->state = ATH12K_HW_STATE_ON;
static void ath12k_mac_stop(struct ath12k *ar)
{
+ struct ath12k_hw *ah = ar->ah;
struct htt_ppdu_stats_info *ppdu_stats, *tmp;
int ret;
+ lockdep_assert_held(&ah->hw_mutex);
+
mutex_lock(&ar->conf_mutex);
ret = ath12k_mac_config_mon_status_default(ar, false);
if (ret && (ret != -EOPNOTSUPP))
ath12k_drain_tx(ah);
+ mutex_lock(&ah->hw_mutex);
+
ah->state = ATH12K_HW_STATE_OFF;
for_each_ar(ah, ar, i)
ath12k_mac_stop(ar);
+
+ mutex_unlock(&ah->hw_mutex);
}
static u8
if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
return;
+ guard(mutex)(&ah->hw_mutex);
+
if (ah->state != ATH12K_HW_STATE_RESTARTED)
return;
ah->ab = ab;
ah->num_radio = num_pdev_map;
+ mutex_init(&ah->hw_mutex);
+
for (i = 0; i < num_pdev_map; i++) {
ab = pdev_map[i].ab;
pdev_idx = pdev_map[i].pdev_idx;