|
@@ -306,6 +306,18 @@ static void ath10k_pci_free_early_irq(struct ath10k *ar)
|
|
|
free_irq(ath10k_pci_priv(ar)->pdev->irq, ar);
|
|
|
}
|
|
|
|
|
|
+static inline const char *ath10k_pci_get_irq_method(struct ath10k *ar)
|
|
|
+{
|
|
|
+ struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
|
|
+
|
|
|
+ if (ar_pci->num_msi_intrs > 1)
|
|
|
+ return "msi-x";
|
|
|
+ else if (ar_pci->num_msi_intrs == 1)
|
|
|
+ return "msi";
|
|
|
+ else
|
|
|
+ return "legacy";
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Diagnostic read/write access is provided for startup/config/debug usage.
|
|
|
* Caller must guarantee proper alignment, when applicable, and single user
|
|
@@ -1922,8 +1934,6 @@ static int ath10k_pci_warm_reset(struct ath10k *ar)
|
|
|
|
|
|
static int __ath10k_pci_hif_power_up(struct ath10k *ar, bool cold_reset)
|
|
|
{
|
|
|
- struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
|
|
- const char *irq_mode;
|
|
|
int ret;
|
|
|
|
|
|
/*
|
|
@@ -1952,22 +1962,10 @@ static int __ath10k_pci_hif_power_up(struct ath10k *ar, bool cold_reset)
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- ret = ath10k_ce_disable_interrupts(ar);
|
|
|
- if (ret) {
|
|
|
- ath10k_err("failed to disable CE interrupts: %d\n", ret);
|
|
|
- goto err_ce;
|
|
|
- }
|
|
|
-
|
|
|
- ret = ath10k_pci_init_irq(ar);
|
|
|
- if (ret) {
|
|
|
- ath10k_err("failed to init irqs: %d\n", ret);
|
|
|
- goto err_ce;
|
|
|
- }
|
|
|
-
|
|
|
ret = ath10k_pci_request_early_irq(ar);
|
|
|
if (ret) {
|
|
|
ath10k_err("failed to request early irq: %d\n", ret);
|
|
|
- goto err_deinit_irq;
|
|
|
+ goto err_ce;
|
|
|
}
|
|
|
|
|
|
ret = ath10k_pci_wait_for_target_init(ar);
|
|
@@ -1988,24 +1986,10 @@ static int __ath10k_pci_hif_power_up(struct ath10k *ar, bool cold_reset)
|
|
|
goto err_free_early_irq;
|
|
|
}
|
|
|
|
|
|
- if (ar_pci->num_msi_intrs > 1)
|
|
|
- irq_mode = "MSI-X";
|
|
|
- else if (ar_pci->num_msi_intrs == 1)
|
|
|
- irq_mode = "MSI";
|
|
|
- else
|
|
|
- irq_mode = "legacy";
|
|
|
-
|
|
|
- if (!test_bit(ATH10K_FLAG_FIRST_BOOT_DONE, &ar->dev_flags))
|
|
|
- ath10k_info("pci irq %s irq_mode %d reset_mode %d\n",
|
|
|
- irq_mode, ath10k_pci_irq_mode,
|
|
|
- ath10k_pci_reset_mode);
|
|
|
-
|
|
|
return 0;
|
|
|
|
|
|
err_free_early_irq:
|
|
|
ath10k_pci_free_early_irq(ar);
|
|
|
-err_deinit_irq:
|
|
|
- ath10k_pci_deinit_irq(ar);
|
|
|
err_ce:
|
|
|
ath10k_pci_ce_deinit(ar);
|
|
|
ath10k_pci_warm_reset(ar);
|
|
@@ -2076,8 +2060,6 @@ static void ath10k_pci_hif_power_down(struct ath10k *ar)
|
|
|
|
|
|
ath10k_pci_free_early_irq(ar);
|
|
|
ath10k_pci_kill_tasklet(ar);
|
|
|
- ath10k_pci_deinit_irq(ar);
|
|
|
- ath10k_pci_ce_deinit(ar);
|
|
|
ath10k_pci_warm_reset(ar);
|
|
|
}
|
|
|
|
|
@@ -2369,8 +2351,7 @@ static int ath10k_pci_init_irq(struct ath10k *ar)
|
|
|
|
|
|
ath10k_pci_init_irq_tasklets(ar);
|
|
|
|
|
|
- if (ath10k_pci_irq_mode != ATH10K_PCI_IRQ_AUTO &&
|
|
|
- !test_bit(ATH10K_FLAG_FIRST_BOOT_DONE, &ar->dev_flags))
|
|
|
+ if (ath10k_pci_irq_mode != ATH10K_PCI_IRQ_AUTO)
|
|
|
ath10k_info("limiting irq mode to: %d\n", ath10k_pci_irq_mode);
|
|
|
|
|
|
/* Try MSI-X */
|
|
@@ -2655,14 +2636,36 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
|
|
goto err_sleep;
|
|
|
}
|
|
|
|
|
|
+ ath10k_pci_ce_deinit(ar);
|
|
|
+
|
|
|
+ ret = ath10k_ce_disable_interrupts(ar);
|
|
|
+ if (ret) {
|
|
|
+ ath10k_err("failed to disable copy engine interrupts: %d\n",
|
|
|
+ ret);
|
|
|
+ goto err_free_ce;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = ath10k_pci_init_irq(ar);
|
|
|
+ if (ret) {
|
|
|
+ ath10k_err("failed to init irqs: %d\n", ret);
|
|
|
+ goto err_free_ce;
|
|
|
+ }
|
|
|
+
|
|
|
+ ath10k_info("pci irq %s interrupts %d irq_mode %d reset_mode %d\n",
|
|
|
+ ath10k_pci_get_irq_method(ar), ar_pci->num_msi_intrs,
|
|
|
+ ath10k_pci_irq_mode, ath10k_pci_reset_mode);
|
|
|
+
|
|
|
ret = ath10k_core_register(ar, chip_id);
|
|
|
if (ret) {
|
|
|
ath10k_err("failed to register driver core: %d\n", ret);
|
|
|
- goto err_free_ce;
|
|
|
+ goto err_deinit_irq;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
+err_deinit_irq:
|
|
|
+ ath10k_pci_deinit_irq(ar);
|
|
|
+
|
|
|
err_free_ce:
|
|
|
ath10k_pci_free_ce(ar);
|
|
|
|
|
@@ -2694,6 +2697,8 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
|
|
|
return;
|
|
|
|
|
|
ath10k_core_unregister(ar);
|
|
|
+ ath10k_pci_deinit_irq(ar);
|
|
|
+ ath10k_pci_ce_deinit(ar);
|
|
|
ath10k_pci_free_ce(ar);
|
|
|
ath10k_pci_sleep(ar);
|
|
|
ath10k_pci_release(ar);
|