[PATCH wg-linux-can-next devel 1/1] can: cc770: Fix indirect access deadlock on ISA cards

Subsystems: can network drivers, the rest

STALE5309d

3 messages, 2 authors, 2012-01-17 · open the first message on its own page

[PATCH wg-linux-can-next devel 1/1] can: cc770: Fix indirect access deadlock on ISA cards

From: Wolfgang Zarre <hidden>
Date: 2012-01-15 12:23:48

This fix avoids a deadlock if an interrupt occurs
during consecutive port operations on ISA cards
utilising indirect access via address and data
port.

Tested on a B&R ISA card.

CC: linux-can@vger.kernel.org
CC: netdev@vger.kernel.org
Signed-off-by: Wolfgang Zarre <redacted>
---
 drivers/net/can/cc770/cc770_isa.c |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/drivers/net/can/cc770/cc770_isa.c b/drivers/net/can/cc770/cc770_isa.c
index 4be5fe2..9f3a25c 100644
--- a/drivers/net/can/cc770/cc770_isa.c
+++ b/drivers/net/can/cc770/cc770_isa.c
@@ -110,6 +110,11 @@ MODULE_PARM_DESC(bcr, "Bus configuration register (default=0x40 [CBY])");
 #define CC770_IOSIZE          0x20
 #define CC770_IOSIZE_INDIRECT 0x02
 
+/* Spinlock for cc770_isa_port_write_reg_indirect
+ * and cc770_isa_port_read_reg_indirect
+ */
+static DEFINE_SPINLOCK(cc770_isa_port_lock);
+
 static struct platform_device *cc770_isa_devs[MAXDEV];
 
 static u8 cc770_isa_mem_read_reg(const struct cc770_priv *priv, int reg)
@@ -138,18 +143,27 @@ static u8 cc770_isa_port_read_reg_indirect(const struct cc770_priv *priv,
 					     int reg)
 {
 	unsigned long base = (unsigned long)priv->reg_base;
+	unsigned long flags;
+	u8 val;
 
+	spin_lock_irqsave(&cc770_isa_port_lock, flags);
 	outb(reg, base);
-	return inb(base + 1);
+	val = inb(base + 1);
+	spin_unlock_irqrestore(&cc770_isa_port_lock, flags);
+
+	return val;
 }
 
 static void cc770_isa_port_write_reg_indirect(const struct cc770_priv *priv,
 						int reg, u8 val)
 {
 	unsigned long base = (unsigned long)priv->reg_base;
+	unsigned long flags;
 
+	spin_lock_irqsave(&cc770_isa_port_lock, flags);
 	outb(reg, base);
 	outb(val, base + 1);
+	spin_unlock_irqrestore(&cc770_isa_port_lock, flags);
 }
 
 static int __devinit cc770_isa_probe(struct platform_device *pdev)
-- 
1.7.7.3

Re: [PATCH wg-linux-can-next devel 1/1] can: cc770: Fix indirect access deadlock on ISA cards

From: Wolfgang Grandegger <hidden>
Date: 2012-01-16 09:27:15

On 01/15/2012 01:21 PM, Wolfgang Zarre wrote:
This fix avoids a deadlock if an interrupt occurs
during consecutive port operations on ISA cards
utilising indirect access via address and data
port.

Tested on a B&R ISA card.

CC: linux-can@vger.kernel.org
CC: netdev@vger.kernel.org
Signed-off-by: Wolfgang Zarre <redacted>
Acked-by: Wolfgang Grandegger <redacted>

Next time, please drop the CC to the old BerliOS Socketcan mailing
lists. Marc, Oliver? Do we, should we, still send patches to the
"netdev@vger.kernel.org" as well.

Wolfgang.

Re: [PATCH wg-linux-can-next devel 1/1] can: cc770: Fix indirect access deadlock on ISA cards

From: Wolfgang Zarre <hidden>
Date: 2012-01-17 12:10:50

Hello Wolfgang,
On 01/15/2012 01:21 PM, Wolfgang Zarre wrote:
quoted
This fix avoids a deadlock if an interrupt occurs
during consecutive port operations on ISA cards
utilising indirect access via address and data
port.

Tested on a B&R ISA card.

CC: linux-can@vger.kernel.org
CC: netdev@vger.kernel.org
Signed-off-by: Wolfgang Zarre<redacted>
Acked-by: Wolfgang Grandegger<redacted>
Thanks.
Next time, please drop the CC to the old BerliOS Socketcan mailing
lists. Marc, Oliver? Do we, should we, still send patches to the
"netdev@vger.kernel.org" as well.
Hmmm, actually I dropped to the old BerliOS Socketcan mailing list but
not as CC statement in the email body , however, please let me know
if You prefer to have it there included as well.

Thanks.
Wolfgang.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help