aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/wil6210/interrupt.c
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/ath/wil6210/interrupt.c
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/ath/wil6210/interrupt.c')
-rw-r--r--drivers/net/wireless/ath/wil6210/interrupt.c55
1 files changed, 6 insertions, 49 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}