+++ /dev/null
-From f8914a14623a79b73f72b2b1ee4cd9b2cb91b735 Mon Sep 17 00:00:00 2001
-From: Christian Lamparter <chunkeey@gmail.com>
-Date: Fri, 6 Sep 2019 23:54:23 +0200
-Subject: ath10k: restore QCA9880-AR1A (v1) detection
-
-From: Christian Lamparter <chunkeey@gmail.com>
-
-commit f8914a14623a79b73f72b2b1ee4cd9b2cb91b735 upstream.
-
-This patch restores the old behavior that read
-the chip_id on the QCA988x before resetting the
-chip. This needs to be done in this order since
-the unsupported QCA988x AR1A chips fall off the
-bus when resetted. Otherwise the next MMIO Op
-after the reset causes a BUS ERROR and panic.
-
-Cc: stable@vger.kernel.org
-Fixes: 1a7fecb766c8 ("ath10k: reset chip before reading chip_id in probe")
-Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/net/wireless/ath/ath10k/pci.c | 27 +++++++++++++++++++++------
- 1 file changed, 21 insertions(+), 6 deletions(-)
-
---- a/drivers/net/wireless/ath/ath10k/pci.c
-+++ b/drivers/net/wireless/ath/ath10k/pci.c
-@@ -2988,12 +2988,13 @@ static int ath10k_pci_probe(struct pci_d
- struct ath10k_pci *ar_pci;
- enum ath10k_hw_rev hw_rev;
- u32 chip_id;
-- bool pci_ps;
-+ bool pci_ps, is_qca988x = false;
-
- switch (pci_dev->device) {
- case QCA988X_2_0_DEVICE_ID:
- hw_rev = ATH10K_HW_QCA988X;
- pci_ps = false;
-+ is_qca988x = true;
- break;
- case QCA6164_2_1_DEVICE_ID:
- case QCA6174_2_1_DEVICE_ID:
-@@ -3087,6 +3088,19 @@ static int ath10k_pci_probe(struct pci_d
- goto err_deinit_irq;
- }
-
-+ /* Read CHIP_ID before reset to catch QCA9880-AR1A v1 devices that
-+ * fall off the bus during chip_reset. These chips have the same pci
-+ * device id as the QCA9880 BR4A or 2R4E. So that's why the check.
-+ */
-+ if (is_qca988x) {
-+ chip_id = ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
-+ if (chip_id != 0xffffffff) {
-+ if (!ath10k_pci_chip_is_supported(pdev->device,
-+ chip_id))
-+ goto err_unsupported;
-+ }
-+ }
-+
- ret = ath10k_pci_chip_reset(ar);
- if (ret) {
- ath10k_err(ar, "failed to reset chip: %d\n", ret);
-@@ -3099,11 +3113,8 @@ static int ath10k_pci_probe(struct pci_d
- goto err_free_irq;
- }
-
-- if (!ath10k_pci_chip_is_supported(pdev->device, chip_id)) {
-- ath10k_err(ar, "device %04x with chip_id %08x isn't supported\n",
-- pdev->device, chip_id);
-- goto err_free_irq;
-- }
-+ if (!ath10k_pci_chip_is_supported(pdev->device, chip_id))
-+ goto err_unsupported;
-
- ret = ath10k_core_register(ar, chip_id);
- if (ret) {
-@@ -3113,6 +3124,10 @@ static int ath10k_pci_probe(struct pci_d
-
- return 0;
-
-+err_unsupported:
-+ ath10k_err(ar, "device %04x with chip_id %08x isn't supported\n",
-+ pdev->device, bus_params.chip_id);
-+
- err_free_irq:
- ath10k_pci_free_irq(ar);
- ath10k_pci_kill_tasklet(ar);