All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 05/11] rt2x00: rt61pci interrupts are called on MCU CMD done
@ 2007-07-25 20:50 Ivo van Doorn
  0 siblings, 0 replies; only message in thread
From: Ivo van Doorn @ 2007-07-25 20:50 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, rt2400-devel

>From 9b5d818acb77b4211623fee6a9000a4d94f8b1ca Mon Sep 17 00:00:00 2001
From: Ivo van Doorn <IvDoorn@gmail.com>
Date: Tue, 24 Jul 2007 14:21:41 +0200
Subject: [PATCH 05/11] rt2x00: rt61pci interrupts are called on MCU CMD done

There 2 reasons for rt61pci interrupts to be triggered,
the first is because the INT_SOURCE_CSR register is set
(beacondone, txdone, rxdone).
But the second reason is the MCU_INT_SOURCE_SRC register,
this is called for completed MCU commands.

Make sure that the interrupt handler only returns IRQ_NONE
when neither of the 2 registers are set. And correctly
handle the MCU_INT_SOURCE_CSR events.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/mac80211/rt2x00/rt61pci.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mac80211/rt2x00/rt61pci.c b/drivers/net/wireless/mac80211/rt2x00/rt61pci.c
index c935a43..ad66cc1 100644
--- a/drivers/net/wireless/mac80211/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/mac80211/rt2x00/rt61pci.c
@@ -1857,19 +1857,20 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
 static irqreturn_t rt61pci_interrupt(int irq, void *dev_instance)
 {
 	struct rt2x00_dev *rt2x00dev = dev_instance;
+	u32 reg_mcu;
 	u32 reg;
 
 	/*
 	 * Get the interrupt sources & saved to local variable.
 	 * Write register value back to clear pending interrupts.
 	 */
-	rt2x00pci_register_read(rt2x00dev, MCU_INT_SOURCE_CSR, &reg);
-	rt2x00pci_register_write(rt2x00dev, MCU_INT_SOURCE_CSR, reg);
+	rt2x00pci_register_read(rt2x00dev, MCU_INT_SOURCE_CSR, &reg_mcu);
+	rt2x00pci_register_write(rt2x00dev, MCU_INT_SOURCE_CSR, reg_mcu);
 
 	rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, &reg);
 	rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
 
-	if (!reg)
+	if (!reg && !reg_mcu)
 		return IRQ_NONE;
 
 	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
@@ -1899,6 +1900,13 @@ static irqreturn_t rt61pci_interrupt(int irq, void *dev_instance)
 	if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TXDONE))
 		rt61pci_txdone(rt2x00dev);
 
+	/*
+	 * 4 - Handle MCU command done.
+	 */
+	if (reg_mcu)
+		rt2x00pci_register_write(rt2x00dev,
+			M2H_CMD_DONE_CSR, 0xffffffff);
+
 	return IRQ_HANDLED;
 }
 
-- 
1.5.2.2


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2007-07-25 20:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-25 20:50 [PATCH 05/11] rt2x00: rt61pci interrupts are called on MCU CMD done Ivo van Doorn

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.