aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorVladimir Kondratiev <QCA_vkondrat@QCA.qualcomm.com>2015-07-30 06:52:02 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2015-08-06 02:43:37 -0400
commitbd2d18b50631c027af7674c3f328913c3b87d422 (patch)
tree6bc435805458157a52d4064b34ce25b6ae52f75c /drivers/net/wireless
parent91a8edcc3173958fd8102343a8a7919a7b703ef0 (diff)
wil6210: remove 3-MSI support
In the recent kernel versions, multiple MSI is not well supported. In particular, it is not supported on x86 and ARM architectures. Also, internal interrupt handling logic is simpler and more effective when using single interrupt. Remove support for 3 MSI, convert module parameter "use_msi" from int with range [0,1,3] to boolean. Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/ath/wil6210/interrupt.c55
-rw-r--r--drivers/net/wireless/ath/wil6210/pcie_bus.c56
-rw-r--r--drivers/net/wireless/ath/wil6210/wil6210.h3
3 files changed, 18 insertions, 96 deletions
diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c
index 28ffc18466c4..596d09b8c60a 100644
--- a/drivers/net/wireless/ath/wil6210/interrupt.c
+++ b/drivers/net/wireless/ath/wil6210/interrupt.c
@@ -541,42 +541,6 @@ static irqreturn_t wil6210_hardirq(int irq, void *cookie)
541 return rc; 541 return rc;
542} 542}
543 543
544static int wil6210_request_3msi(struct wil6210_priv *wil, int irq)
545{
546 int rc;
547 /*
548 * IRQ's are in the following order:
549 * - Tx
550 * - Rx
551 * - Misc
552 */
553
554 rc = request_irq(irq, wil6210_irq_tx, IRQF_SHARED,
555 WIL_NAME"_tx", wil);
556 if (rc)
557 return rc;
558
559 rc = request_irq(irq + 1, wil6210_irq_rx, IRQF_SHARED,
560 WIL_NAME"_rx", wil);
561 if (rc)
562 goto free0;
563
564 rc = request_threaded_irq(irq + 2, wil6210_irq_misc,
565 wil6210_irq_misc_thread,
566 IRQF_SHARED, WIL_NAME"_misc", wil);
567 if (rc)
568 goto free1;
569
570 return 0;
571 /* error branch */
572free1:
573 free_irq(irq + 1, wil);
574free0:
575 free_irq(irq, wil);
576
577 return rc;
578}
579
580/* can't use wil_ioread32_and_clear because ICC value is not set yet */ 544/* can't use wil_ioread32_and_clear because ICC value is not set yet */
581static inline void wil_clear32(void __iomem *addr) 545static inline void wil_clear32(void __iomem *addr)
582{ 546{
@@ -596,19 +560,16 @@ void wil6210_clear_irq(struct wil6210_priv *wil)
596 wmb(); /* make sure write completed */ 560 wmb(); /* make sure write completed */
597} 561}
598 562
599int wil6210_init_irq(struct wil6210_priv *wil, int irq) 563int wil6210_init_irq(struct wil6210_priv *wil, int irq, bool use_msi)
600{ 564{
601 int rc; 565 int rc;
602 566
603 wil_dbg_misc(wil, "%s() n_msi=%d\n", __func__, wil->n_msi); 567 wil_dbg_misc(wil, "%s(%s)\n", __func__, use_msi ? "MSI" : "INTx");
604 568
605 if (wil->n_msi == 3) 569 rc = request_threaded_irq(irq, wil6210_hardirq,
606 rc = wil6210_request_3msi(wil, irq); 570 wil6210_thread_irq,
607 else 571 use_msi ? 0 : IRQF_SHARED,
608 rc = request_threaded_irq(irq, wil6210_hardirq, 572 WIL_NAME, wil);
609 wil6210_thread_irq,
610 wil->n_msi ? 0 : IRQF_SHARED,
611 WIL_NAME, wil);
612 return rc; 573 return rc;
613} 574}
614 575
@@ -618,8 +579,4 @@ void wil6210_fini_irq(struct wil6210_priv *wil, int irq)
618 579
619 wil_mask_irq(wil); 580 wil_mask_irq(wil);
620 free_irq(irq, wil); 581 free_irq(irq, wil);
621 if (wil->n_msi == 3) {
622 free_irq(irq + 1, wil);
623 free_irq(irq + 2, wil);
624 }
625} 582}
diff --git a/drivers/net/wireless/ath/wil6210/pcie_bus.c b/drivers/net/wireless/ath/wil6210/pcie_bus.c
index aa3ecc607ca3..d065b796d67e 100644
--- a/drivers/net/wireless/ath/wil6210/pcie_bus.c
+++ b/drivers/net/wireless/ath/wil6210/pcie_bus.c
@@ -21,11 +21,9 @@
21 21
22#include "wil6210.h" 22#include "wil6210.h"
23 23
24static int use_msi = 1; 24static bool use_msi = true;
25module_param(use_msi, int, S_IRUGO); 25module_param(use_msi, bool, S_IRUGO);
26MODULE_PARM_DESC(use_msi, 26MODULE_PARM_DESC(use_msi, " Use MSI interrupt, default - true");
27 " Use MSI interrupt: "
28 "0 - don't, 1 - (default) - single, or 3");
29 27
30static 28static
31void wil_set_capabilities(struct wil6210_priv *wil) 29void wil_set_capabilities(struct wil6210_priv *wil)
@@ -50,24 +48,12 @@ void wil_set_capabilities(struct wil6210_priv *wil)
50 48
51void wil_disable_irq(struct wil6210_priv *wil) 49void wil_disable_irq(struct wil6210_priv *wil)
52{ 50{
53 int irq = wil->pdev->irq; 51 disable_irq(wil->pdev->irq);
54
55 disable_irq(irq);
56 if (wil->n_msi == 3) {
57 disable_irq(irq + 1);
58 disable_irq(irq + 2);
59 }
60} 52}
61 53
62void wil_enable_irq(struct wil6210_priv *wil) 54void wil_enable_irq(struct wil6210_priv *wil)
63{ 55{
64 int irq = wil->pdev->irq; 56 enable_irq(wil->pdev->irq);
65
66 enable_irq(irq);
67 if (wil->n_msi == 3) {
68 enable_irq(irq + 1);
69 enable_irq(irq + 2);
70 }
71} 57}
72 58
73/* Bus ops */ 59/* Bus ops */
@@ -80,6 +66,7 @@ static int wil_if_pcie_enable(struct wil6210_priv *wil)
80 * and only MSI should be used 66 * and only MSI should be used
81 */ 67 */
82 int msi_only = pdev->msi_enabled; 68 int msi_only = pdev->msi_enabled;
69 bool _use_msi = use_msi;
83 70
84 wil_dbg_misc(wil, "%s()\n", __func__); 71 wil_dbg_misc(wil, "%s()\n", __func__);
85 72
@@ -87,41 +74,20 @@ static int wil_if_pcie_enable(struct wil6210_priv *wil)
87 74
88 pci_set_master(pdev); 75 pci_set_master(pdev);
89 76
90 /* 77 wil_dbg_misc(wil, "Setup %s interrupt\n", use_msi ? "MSI" : "INTx");
91 * how many MSI interrupts to request?
92 */
93 switch (use_msi) {
94 case 3:
95 case 1:
96 wil_dbg_misc(wil, "Setup %d MSI interrupts\n", use_msi);
97 break;
98 case 0:
99 wil_dbg_misc(wil, "MSI interrupts disabled, use INTx\n");
100 break;
101 default:
102 wil_err(wil, "Invalid use_msi=%d, default to 1\n", use_msi);
103 use_msi = 1;
104 }
105
106 if (use_msi == 3 && pci_enable_msi_range(pdev, 3, 3) < 0) {
107 wil_err(wil, "3 MSI mode failed, try 1 MSI\n");
108 use_msi = 1;
109 }
110 78
111 if (use_msi == 1 && pci_enable_msi(pdev)) { 79 if (use_msi && pci_enable_msi(pdev)) {
112 wil_err(wil, "pci_enable_msi failed, use INTx\n"); 80 wil_err(wil, "pci_enable_msi failed, use INTx\n");
113 use_msi = 0; 81 _use_msi = false;
114 } 82 }
115 83
116 wil->n_msi = use_msi; 84 if (!_use_msi && msi_only) {
117
118 if ((wil->n_msi == 0) && msi_only) {
119 wil_err(wil, "Interrupt pin not routed, unable to use INTx\n"); 85 wil_err(wil, "Interrupt pin not routed, unable to use INTx\n");
120 rc = -ENODEV; 86 rc = -ENODEV;
121 goto stop_master; 87 goto stop_master;
122 } 88 }
123 89
124 rc = wil6210_init_irq(wil, pdev->irq); 90 rc = wil6210_init_irq(wil, pdev->irq, _use_msi);
125 if (rc) 91 if (rc)
126 goto stop_master; 92 goto stop_master;
127 93
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h
index c72272449652..3c22178f6729 100644
--- a/drivers/net/wireless/ath/wil6210/wil6210.h
+++ b/drivers/net/wireless/ath/wil6210/wil6210.h
@@ -536,7 +536,6 @@ struct pmc_ctx {
536 536
537struct wil6210_priv { 537struct wil6210_priv {
538 struct pci_dev *pdev; 538 struct pci_dev *pdev;
539 int n_msi;
540 struct wireless_dev *wdev; 539 struct wireless_dev *wdev;
541 void __iomem *csr; 540 void __iomem *csr;
542 DECLARE_BITMAP(status, wil_status_last); 541 DECLARE_BITMAP(status, wil_status_last);
@@ -739,7 +738,7 @@ void wil_back_tx_worker(struct work_struct *work);
739void wil_back_tx_flush(struct wil6210_priv *wil); 738void wil_back_tx_flush(struct wil6210_priv *wil);
740 739
741void wil6210_clear_irq(struct wil6210_priv *wil); 740void wil6210_clear_irq(struct wil6210_priv *wil);
742int wil6210_init_irq(struct wil6210_priv *wil, int irq); 741int wil6210_init_irq(struct wil6210_priv *wil, int irq, bool use_msi);
743void wil6210_fini_irq(struct wil6210_priv *wil, int irq); 742void wil6210_fini_irq(struct wil6210_priv *wil, int irq);
744void wil_mask_irq(struct wil6210_priv *wil); 743void wil_mask_irq(struct wil6210_priv *wil);
745void wil_unmask_irq(struct wil6210_priv *wil); 744void wil_unmask_irq(struct wil6210_priv *wil);