Commit 403d627b authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

ath10k: setup irq method in probe

It doesn't make sense to re-init irqs completely
whenever transport is started/stopped. Do it just
once upon probing/removing.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent c947a9e1
...@@ -357,7 +357,6 @@ enum ath10k_fw_features { ...@@ -357,7 +357,6 @@ enum ath10k_fw_features {
enum ath10k_dev_flags { enum ath10k_dev_flags {
/* Indicates that ath10k device is during CAC phase of DFS */ /* Indicates that ath10k device is during CAC phase of DFS */
ATH10K_CAC_RUNNING, ATH10K_CAC_RUNNING,
ATH10K_FLAG_FIRST_BOOT_DONE,
ATH10K_FLAG_CORE_REGISTERED, ATH10K_FLAG_CORE_REGISTERED,
}; };
......
...@@ -306,6 +306,18 @@ static void ath10k_pci_free_early_irq(struct ath10k *ar) ...@@ -306,6 +306,18 @@ static void ath10k_pci_free_early_irq(struct ath10k *ar)
free_irq(ath10k_pci_priv(ar)->pdev->irq, 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. * Diagnostic read/write access is provided for startup/config/debug usage.
* Caller must guarantee proper alignment, when applicable, and single user * Caller must guarantee proper alignment, when applicable, and single user
...@@ -1922,8 +1934,6 @@ static int ath10k_pci_warm_reset(struct ath10k *ar) ...@@ -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) 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; int ret;
/* /*
...@@ -1952,22 +1962,10 @@ static int __ath10k_pci_hif_power_up(struct ath10k *ar, bool cold_reset) ...@@ -1952,22 +1962,10 @@ static int __ath10k_pci_hif_power_up(struct ath10k *ar, bool cold_reset)
goto err; 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); ret = ath10k_pci_request_early_irq(ar);
if (ret) { if (ret) {
ath10k_err("failed to request early irq: %d\n", 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); 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) ...@@ -1988,24 +1986,10 @@ static int __ath10k_pci_hif_power_up(struct ath10k *ar, bool cold_reset)
goto err_free_early_irq; 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; return 0;
err_free_early_irq: err_free_early_irq:
ath10k_pci_free_early_irq(ar); ath10k_pci_free_early_irq(ar);
err_deinit_irq:
ath10k_pci_deinit_irq(ar);
err_ce: err_ce:
ath10k_pci_ce_deinit(ar); ath10k_pci_ce_deinit(ar);
ath10k_pci_warm_reset(ar); ath10k_pci_warm_reset(ar);
...@@ -2076,8 +2060,6 @@ static void ath10k_pci_hif_power_down(struct ath10k *ar) ...@@ -2076,8 +2060,6 @@ static void ath10k_pci_hif_power_down(struct ath10k *ar)
ath10k_pci_free_early_irq(ar); ath10k_pci_free_early_irq(ar);
ath10k_pci_kill_tasklet(ar); ath10k_pci_kill_tasklet(ar);
ath10k_pci_deinit_irq(ar);
ath10k_pci_ce_deinit(ar);
ath10k_pci_warm_reset(ar); ath10k_pci_warm_reset(ar);
} }
...@@ -2369,8 +2351,7 @@ static int ath10k_pci_init_irq(struct ath10k *ar) ...@@ -2369,8 +2351,7 @@ static int ath10k_pci_init_irq(struct ath10k *ar)
ath10k_pci_init_irq_tasklets(ar); ath10k_pci_init_irq_tasklets(ar);
if (ath10k_pci_irq_mode != ATH10K_PCI_IRQ_AUTO && if (ath10k_pci_irq_mode != ATH10K_PCI_IRQ_AUTO)
!test_bit(ATH10K_FLAG_FIRST_BOOT_DONE, &ar->dev_flags))
ath10k_info("limiting irq mode to: %d\n", ath10k_pci_irq_mode); ath10k_info("limiting irq mode to: %d\n", ath10k_pci_irq_mode);
/* Try MSI-X */ /* Try MSI-X */
...@@ -2655,14 +2636,36 @@ static int ath10k_pci_probe(struct pci_dev *pdev, ...@@ -2655,14 +2636,36 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
goto err_sleep; 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); ret = ath10k_core_register(ar, chip_id);
if (ret) { if (ret) {
ath10k_err("failed to register driver core: %d\n", ret); ath10k_err("failed to register driver core: %d\n", ret);
goto err_free_ce; goto err_deinit_irq;
} }
return 0; return 0;
err_deinit_irq:
ath10k_pci_deinit_irq(ar);
err_free_ce: err_free_ce:
ath10k_pci_free_ce(ar); ath10k_pci_free_ce(ar);
...@@ -2694,6 +2697,8 @@ static void ath10k_pci_remove(struct pci_dev *pdev) ...@@ -2694,6 +2697,8 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
return; return;
ath10k_core_unregister(ar); ath10k_core_unregister(ar);
ath10k_pci_deinit_irq(ar);
ath10k_pci_ce_deinit(ar);
ath10k_pci_free_ce(ar); ath10k_pci_free_ce(ar);
ath10k_pci_sleep(ar); ath10k_pci_sleep(ar);
ath10k_pci_release(ar); ath10k_pci_release(ar);
......
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