]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
ath10k: allow explicit MSI/MSI-X disabling
authorMichal Kazior <michal.kazior@tieto.com>
Mon, 25 Nov 2013 13:06:27 +0000 (14:06 +0100)
committerKalle Valo <kvalo@qca.qualcomm.com>
Wed, 27 Nov 2013 14:47:00 +0000 (16:47 +0200)
This can be useful for testing and debugging.

This introduces new ath10k_pci module parameter
`irq_mode`. By default it is 0, meaning automatic
irq mode (MSI-X as long as both target HW and host
platform supports it). The parameter works on a
best effort basis.

kvalo: fix typo "ayto"

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 0a2d1c20e4dfa74574a977305f14315d4e0428a1..1365b55e7cca7e7ea7515c938ca31df12eea98d0 100644 (file)
 #include "ce.h"
 #include "pci.h"
 
+enum ath10k_pci_irq_mode {
+       ATH10K_PCI_IRQ_AUTO = 0,
+       ATH10K_PCI_IRQ_LEGACY = 1,
+       ATH10K_PCI_IRQ_MSI = 2,
+};
+
 static unsigned int ath10k_target_ps;
+static unsigned int ath10k_pci_irq_mode = ATH10K_PCI_IRQ_AUTO;
+
 module_param(ath10k_target_ps, uint, 0644);
 MODULE_PARM_DESC(ath10k_target_ps, "Enable ath10k Target (SoC) PS option");
 
+module_param_named(irq_mode, ath10k_pci_irq_mode, uint, 0644);
+MODULE_PARM_DESC(irq_mode, "0: auto, 1: legacy, 2: msi (default: 0)");
+
 #define QCA988X_2_0_DEVICE_ID  (0x003c)
 
 static DEFINE_PCI_DEVICE_TABLE(ath10k_pci_id_table) = {
@@ -2387,27 +2398,37 @@ static void ath10k_pci_init_irq_tasklets(struct ath10k *ar)
 static int ath10k_pci_init_irq(struct ath10k *ar)
 {
        struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
+       bool msix_supported = test_bit(ATH10K_PCI_FEATURE_MSI_X,
+                                      ar_pci->features);
        int ret;
 
        ath10k_pci_init_irq_tasklets(ar);
 
-       if (!test_bit(ATH10K_PCI_FEATURE_MSI_X, ar_pci->features))
-               goto msi;
+       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);
 
        /* Try MSI-X */
-       ar_pci->num_msi_intrs = MSI_NUM_REQUEST;
-       ret = pci_enable_msi_block(ar_pci->pdev, ar_pci->num_msi_intrs);
-       if (ret == 0)
-               return 0;
-       if (ret > 0)
-               pci_disable_msi(ar_pci->pdev);
+       if (ath10k_pci_irq_mode == ATH10K_PCI_IRQ_AUTO && msix_supported) {
+               ar_pci->num_msi_intrs = MSI_NUM_REQUEST;
+               ret = pci_enable_msi_block(ar_pci->pdev, ar_pci->num_msi_intrs);
+               if (ret == 0)
+                       return 0;
+               if (ret > 0)
+                       pci_disable_msi(ar_pci->pdev);
+
+               /* fall-through */
+       }
 
-msi:
        /* Try MSI */
-       ar_pci->num_msi_intrs = 1;
-       ret = pci_enable_msi(ar_pci->pdev);
-       if (ret == 0)
-               return 0;
+       if (ath10k_pci_irq_mode != ATH10K_PCI_IRQ_LEGACY) {
+               ar_pci->num_msi_intrs = 1;
+               ret = pci_enable_msi(ar_pci->pdev);
+               if (ret == 0)
+                       return 0;
+
+               /* fall-through */
+       }
 
        /* Try legacy irq
         *