ath10k: reset chip before reading chip_id in probe
authorMichal Kazior <michal.kazior@tieto.com>
Sat, 24 Jan 2015 10:14:48 +0000 (12:14 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 27 Jan 2015 13:59:27 +0000 (15:59 +0200)
There are some very rare cases with some hardware
configuration that the device doesn't init quickly
enough in which case reading chip_id yielded 0.
This caused driver to subsequently fail to setup
the device.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/pci.c

index b98354c004f59683cbb9247577d61ed8961e84d9..e0c9f4633a82456c934293fe367e5a6e9ee5c756 100644 (file)
@@ -2544,18 +2544,6 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
                goto err_release;
        }
 
-       chip_id = ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
-       if (chip_id == 0xffffffff) {
-               ath10k_err(ar, "failed to get chip id\n");
-               goto err_sleep;
-       }
-
-       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_sleep;
-       }
-
        ret = ath10k_pci_alloc_pipes(ar);
        if (ret) {
                ath10k_err(ar, "failed to allocate copy engine pipes: %d\n",
@@ -2582,6 +2570,24 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
                goto err_deinit_irq;
        }
 
+       ret = ath10k_pci_chip_reset(ar);
+       if (ret) {
+               ath10k_err(ar, "failed to reset chip: %d\n", ret);
+               goto err_free_irq;
+       }
+
+       chip_id = ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
+       if (chip_id == 0xffffffff) {
+               ath10k_err(ar, "failed to get chip id\n");
+               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_sleep;
+       }
+
        ath10k_pci_sleep(ar);
 
        ret = ath10k_core_register(ar, chip_id);