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: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
c947a9e1c7
commit
403d627be9
|
@ -357,7 +357,6 @@ enum ath10k_fw_features {
|
|||
enum ath10k_dev_flags {
|
||||
/* Indicates that ath10k device is during CAC phase of DFS */
|
||||
ATH10K_CAC_RUNNING,
|
||||
ATH10K_FLAG_FIRST_BOOT_DONE,
|
||||
ATH10K_FLAG_CORE_REGISTERED,
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
ret = ath10k_core_register(ar, chip_id);
|
||||
ath10k_pci_ce_deinit(ar);
|
||||
|
||||
ret = ath10k_ce_disable_interrupts(ar);
|
||||
if (ret) {
|
||||
ath10k_err("failed to register driver core: %d\n", 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_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);
|
||||
|
|
Loading…
Reference in New Issue