Commit 7a0f8ad5 authored by Kalle Valo's avatar Kalle Valo

Merge ath-current from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git

ath.git fixes for 5.1. Major changes:

ath10k

* fix locking problem with crashdump

* fix warnings during suspend and resume
parents 5c403533 9e80ad37
...@@ -1855,7 +1855,7 @@ void ath10k_ce_dump_registers(struct ath10k *ar, ...@@ -1855,7 +1855,7 @@ void ath10k_ce_dump_registers(struct ath10k *ar,
struct ath10k_ce_crash_data ce_data; struct ath10k_ce_crash_data ce_data;
u32 addr, id; u32 addr, id;
lockdep_assert_held(&ar->data_lock); lockdep_assert_held(&ar->dump_mutex);
ath10k_err(ar, "Copy Engine register dump:\n"); ath10k_err(ar, "Copy Engine register dump:\n");
......
...@@ -3119,6 +3119,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev, ...@@ -3119,6 +3119,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
goto err_free_wq; goto err_free_wq;
mutex_init(&ar->conf_mutex); mutex_init(&ar->conf_mutex);
mutex_init(&ar->dump_mutex);
spin_lock_init(&ar->data_lock); spin_lock_init(&ar->data_lock);
INIT_LIST_HEAD(&ar->peers); INIT_LIST_HEAD(&ar->peers);
......
...@@ -1063,6 +1063,9 @@ struct ath10k { ...@@ -1063,6 +1063,9 @@ struct ath10k {
/* prevents concurrent FW reconfiguration */ /* prevents concurrent FW reconfiguration */
struct mutex conf_mutex; struct mutex conf_mutex;
/* protects coredump data */
struct mutex dump_mutex;
/* protects shared structure data */ /* protects shared structure data */
spinlock_t data_lock; spinlock_t data_lock;
......
...@@ -1102,7 +1102,7 @@ struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar) ...@@ -1102,7 +1102,7 @@ struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar)
{ {
struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data; struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;
lockdep_assert_held(&ar->data_lock); lockdep_assert_held(&ar->dump_mutex);
if (ath10k_coredump_mask == 0) if (ath10k_coredump_mask == 0)
/* coredump disabled */ /* coredump disabled */
...@@ -1146,7 +1146,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar) ...@@ -1146,7 +1146,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar)
if (!buf) if (!buf)
return NULL; return NULL;
spin_lock_bh(&ar->data_lock); mutex_lock(&ar->dump_mutex);
dump_data = (struct ath10k_dump_file_data *)(buf); dump_data = (struct ath10k_dump_file_data *)(buf);
strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP", strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP",
...@@ -1213,7 +1213,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar) ...@@ -1213,7 +1213,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar)
sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len; sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len;
} }
spin_unlock_bh(&ar->data_lock); mutex_unlock(&ar->dump_mutex);
return dump_data; return dump_data;
} }
......
...@@ -5774,7 +5774,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -5774,7 +5774,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
} }
if (changed & BSS_CHANGED_MCAST_RATE && if (changed & BSS_CHANGED_MCAST_RATE &&
!WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) { !ath10k_mac_vif_chan(arvif->vif, &def)) {
band = def.chan->band; band = def.chan->band;
rateidx = vif->bss_conf.mcast_rate[band] - 1; rateidx = vif->bss_conf.mcast_rate[band] - 1;
...@@ -5812,7 +5812,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -5812,7 +5812,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
} }
if (changed & BSS_CHANGED_BASIC_RATES) { if (changed & BSS_CHANGED_BASIC_RATES) {
if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) { if (ath10k_mac_vif_chan(vif, &def)) {
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
return; return;
} }
......
...@@ -1441,7 +1441,7 @@ static void ath10k_pci_dump_registers(struct ath10k *ar, ...@@ -1441,7 +1441,7 @@ static void ath10k_pci_dump_registers(struct ath10k *ar,
__le32 reg_dump_values[REG_DUMP_COUNT_QCA988X] = {}; __le32 reg_dump_values[REG_DUMP_COUNT_QCA988X] = {};
int i, ret; int i, ret;
lockdep_assert_held(&ar->data_lock); lockdep_assert_held(&ar->dump_mutex);
ret = ath10k_pci_diag_read_hi(ar, &reg_dump_values[0], ret = ath10k_pci_diag_read_hi(ar, &reg_dump_values[0],
hi_failure_state, hi_failure_state,
...@@ -1656,7 +1656,7 @@ static void ath10k_pci_dump_memory(struct ath10k *ar, ...@@ -1656,7 +1656,7 @@ static void ath10k_pci_dump_memory(struct ath10k *ar,
int ret, i; int ret, i;
u8 *buf; u8 *buf;
lockdep_assert_held(&ar->data_lock); lockdep_assert_held(&ar->dump_mutex);
if (!crash_data) if (!crash_data)
return; return;
...@@ -1734,14 +1734,19 @@ static void ath10k_pci_dump_memory(struct ath10k *ar, ...@@ -1734,14 +1734,19 @@ static void ath10k_pci_dump_memory(struct ath10k *ar,
} }
} }
static void ath10k_pci_fw_crashed_dump(struct ath10k *ar) static void ath10k_pci_fw_dump_work(struct work_struct *work)
{ {
struct ath10k_pci *ar_pci = container_of(work, struct ath10k_pci,
dump_work);
struct ath10k_fw_crash_data *crash_data; struct ath10k_fw_crash_data *crash_data;
struct ath10k *ar = ar_pci->ar;
char guid[UUID_STRING_LEN + 1]; char guid[UUID_STRING_LEN + 1];
spin_lock_bh(&ar->data_lock); mutex_lock(&ar->dump_mutex);
spin_lock_bh(&ar->data_lock);
ar->stats.fw_crash_counter++; ar->stats.fw_crash_counter++;
spin_unlock_bh(&ar->data_lock);
crash_data = ath10k_coredump_new(ar); crash_data = ath10k_coredump_new(ar);
...@@ -1756,11 +1761,18 @@ static void ath10k_pci_fw_crashed_dump(struct ath10k *ar) ...@@ -1756,11 +1761,18 @@ static void ath10k_pci_fw_crashed_dump(struct ath10k *ar)
ath10k_ce_dump_registers(ar, crash_data); ath10k_ce_dump_registers(ar, crash_data);
ath10k_pci_dump_memory(ar, crash_data); ath10k_pci_dump_memory(ar, crash_data);
spin_unlock_bh(&ar->data_lock); mutex_unlock(&ar->dump_mutex);
queue_work(ar->workqueue, &ar->restart_work); queue_work(ar->workqueue, &ar->restart_work);
} }
static void ath10k_pci_fw_crashed_dump(struct ath10k *ar)
{
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
queue_work(ar->workqueue, &ar_pci->dump_work);
}
void ath10k_pci_hif_send_complete_check(struct ath10k *ar, u8 pipe, void ath10k_pci_hif_send_complete_check(struct ath10k *ar, u8 pipe,
int force) int force)
{ {
...@@ -3442,6 +3454,8 @@ int ath10k_pci_setup_resource(struct ath10k *ar) ...@@ -3442,6 +3454,8 @@ int ath10k_pci_setup_resource(struct ath10k *ar)
spin_lock_init(&ar_pci->ps_lock); spin_lock_init(&ar_pci->ps_lock);
mutex_init(&ar_pci->ce_diag_mutex); mutex_init(&ar_pci->ce_diag_mutex);
INIT_WORK(&ar_pci->dump_work, ath10k_pci_fw_dump_work);
timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0); timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0);
if (QCA_REV_6174(ar) || QCA_REV_9377(ar)) if (QCA_REV_6174(ar) || QCA_REV_9377(ar))
......
...@@ -121,6 +121,8 @@ struct ath10k_pci { ...@@ -121,6 +121,8 @@ struct ath10k_pci {
/* For protecting ce_diag */ /* For protecting ce_diag */
struct mutex ce_diag_mutex; struct mutex ce_diag_mutex;
struct work_struct dump_work;
struct ath10k_ce ce; struct ath10k_ce ce;
struct timer_list rx_post_retry; struct timer_list rx_post_retry;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment