public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
@ 2006-08-03 16:53 Jukka Partanen
  2006-08-03 17:31 ` Karsten Keil
  2006-08-03 17:56 ` Alan Cox
  0 siblings, 2 replies; 9+ messages in thread
From: Jukka Partanen @ 2006-08-03 16:53 UTC (permalink / raw)
  To: kkeil; +Cc: linux-kernel

AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
(they are there in 2.6.17.7 too), to fix module initialization
problems appearing with at least some newer Celerons and
Pentium III.

Signed-off-by: Jukka Partanen <jspartanen@gmail.com>

--- drivers/isdn/avmb1/c4.c.orig	2006-08-03 19:32:17.000000000 +0000
+++ drivers/isdn/avmb1/c4.c	2006-08-03 19:32:55.000000000 +0000
@@ -151,6 +151,7 @@
 	while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
 		if (!time_before(jiffies, stop))
 			return -1;
+		mb();
 	}
 	return 0;
 }
@@ -305,6 +306,7 @@
 		if (!time_before(jiffies, stop))
 			return;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
+		mb();
 	}

 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
@@ -328,6 +330,7 @@
 		if (!time_before(jiffies, stop))
 			return 2;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
+		mb();
 	}

 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-03 16:53 [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs Jukka Partanen
@ 2006-08-03 17:31 ` Karsten Keil
  2006-08-04 10:00   ` Alan Cox
  2006-08-03 17:56 ` Alan Cox
  1 sibling, 1 reply; 9+ messages in thread
From: Karsten Keil @ 2006-08-03 17:31 UTC (permalink / raw)
  To: Jukka Partanen; +Cc: linux-kernel

Yes, that should be go in.

AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
(they are there in 2.6.17.7 too), to fix module initialization
problems appearing with at least some newer Celerons and
Pentium III.

Acked-by: Karsten Keil <kkeil@suse.de>
Signed-off-by: Jukka Partanen <jspartanen@gmail.com>

--- drivers/isdn/avmb1/c4.c.orig	2006-08-03 19:32:17.000000000 +0000
+++ drivers/isdn/avmb1/c4.c	2006-08-03 19:32:55.000000000 +0000
@@ -151,6 +151,7 @@
 	while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
 		if (!time_before(jiffies, stop))
 			return -1;
+		mb();
 	}
 	return 0;
 }
@@ -305,6 +306,7 @@
 		if (!time_before(jiffies, stop))
 			return;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
+		mb();
 	}

 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
@@ -328,6 +330,7 @@
 		if (!time_before(jiffies, stop))
 			return 2;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
+		mb();
 	}

 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);

-- 
Karsten Keil
SuSE Labs
ISDN development

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-03 16:53 [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs Jukka Partanen
  2006-08-03 17:31 ` Karsten Keil
@ 2006-08-03 17:56 ` Alan Cox
  2006-08-04  5:08   ` Willy Tarreau
  2006-08-04  6:56   ` Willy Tarreau
  1 sibling, 2 replies; 9+ messages in thread
From: Alan Cox @ 2006-08-03 17:56 UTC (permalink / raw)
  To: Jukka Partanen; +Cc: kkeil, linux-kernel

Ar Iau, 2006-08-03 am 19:53 +0300, ysgrifennodd Jukka Partanen:
> AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
> (they are there in 2.6.17.7 too), to fix module initialization
> problems appearing with at least some newer Celerons and
> Pentium III.

Should be using cpu_relax() I think. Its a polled busy loop so you want
other CPU threads to run if possible. Otherwise the code seems quite
logical depending how c4inmeml is defined.

Alan


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-03 17:56 ` Alan Cox
@ 2006-08-04  5:08   ` Willy Tarreau
  2006-08-04  6:56   ` Willy Tarreau
  1 sibling, 0 replies; 9+ messages in thread
From: Willy Tarreau @ 2006-08-04  5:08 UTC (permalink / raw)
  To: Alan Cox; +Cc: Jukka Partanen, kkeil, linux-kernel

On Thu, Aug 03, 2006 at 06:56:15PM +0100, Alan Cox wrote:
> Ar Iau, 2006-08-03 am 19:53 +0300, ysgrifennodd Jukka Partanen:
> > AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
> > (they are there in 2.6.17.7 too), to fix module initialization
> > problems appearing with at least some newer Celerons and
> > Pentium III.
> 
> Should be using cpu_relax() I think. Its a polled busy loop so you want
> other CPU threads to run if possible.

Agreed, but I think it should be a second patch since 2.6 would need it
too.

> Otherwise the code seems quite logical depending how c4inmeml is defined.

OK, I'm queuing it for 2.4.34.

> Alan

Willy


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-03 17:56 ` Alan Cox
  2006-08-04  5:08   ` Willy Tarreau
@ 2006-08-04  6:56   ` Willy Tarreau
  2006-08-04 10:39     ` Michael Buesch
  1 sibling, 1 reply; 9+ messages in thread
From: Willy Tarreau @ 2006-08-04  6:56 UTC (permalink / raw)
  To: Alan Cox; +Cc: Jukka Partanen, kkeil, linux-kernel

On Thu, Aug 03, 2006 at 06:56:15PM +0100, Alan Cox wrote:
> Ar Iau, 2006-08-03 am 19:53 +0300, ysgrifennodd Jukka Partanen:
> > AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
> > (they are there in 2.6.17.7 too), to fix module initialization
> > problems appearing with at least some newer Celerons and
> > Pentium III.
> 
> Should be using cpu_relax() I think. Its a polled busy loop so you want
> other CPU threads to run if possible.

You mean like this ? Here's the patch for 2.6, I'll queue the same for 2.4
if it's alright.

> Alan

Regards,
Willy

>From 512d12bd7ce9c0a15dfd91a6f7c2970c92b3abdd Mon Sep 17 00:00:00 2001
From: Willy Tarreau <w@1wt.eu>
Date: Fri, 4 Aug 2006 08:50:10 +0200
Subject: [PATCH] AVM C4 ISDN card : use cpu_relax() in busy loops

As suggested by Alan, use cpu_relax() in 3 busy loops : "It's a
polled busy loop so you want other CPU threads to run if possible".

Signed-off-by: Willy Tarreau <w@1wt.eu>
---
 drivers/isdn/hardware/avm/c4.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c
index f7253b2..aee278e 100644
--- a/drivers/isdn/hardware/avm/c4.c
+++ b/drivers/isdn/hardware/avm/c4.c
@@ -22,6 +22,7 @@ #include <linux/capi.h>
 #include <linux/kernelcapi.h>
 #include <linux/init.h>
 #include <asm/io.h>
+#include <asm/processor.h>
 #include <asm/uaccess.h>
 #include <linux/netdevice.h>
 #include <linux/isdn/capicmd.h>
@@ -150,6 +151,7 @@ static inline int wait_for_doorbell(avmc
 		if (!time_before(jiffies, stop))
 			return -1;
 		mb();
+		cpu_relax();
 	}
 	return 0;
 }
@@ -303,6 +305,7 @@ static void c4_reset(avmcard *card)
 			return;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
 		mb();
+		cpu_relax();
 	}
 
 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
@@ -327,6 +330,7 @@ static int c4_detect(avmcard *card)
 			return 2;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
 		mb();
+		cpu_relax();
 	}
 
 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
-- 
1.4.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-03 17:31 ` Karsten Keil
@ 2006-08-04 10:00   ` Alan Cox
  0 siblings, 0 replies; 9+ messages in thread
From: Alan Cox @ 2006-08-04 10:00 UTC (permalink / raw)
  To: Karsten Keil; +Cc: Jukka Partanen, linux-kernel

Ar Iau, 2006-08-03 am 19:31 +0200, ysgrifennodd Karsten Keil:
> Yes, that should be go in.
> 
> AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
> (they are there in 2.6.17.7 too), to fix module initialization
> problems appearing with at least some newer Celerons and
> Pentium III.
> 
> Acked-by: Karsten Keil <kkeil@suse.de>
> Signed-off-by: Jukka Partanen <jspartanen@gmail.com>

NAK: Alan Cox <alan@redhat.com>

Two reasons

#1	You should use cpu_relax in such loops
#2	The readl (which c4inmeml is a pointless #define of) is defined to be
a volatile reference itself

That means that the real bug would appear to be different and either you
have a gcc bug which is possible or you have something stranger going
on, such as the continued polling busying the microcontroller the other
end, in which case you need a delay not the lucky chance that mb() is
slowish on some x86 systems.

So you either want

		cpu_relax + other fixes
	or	udelay(something)


Alan


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-04  6:56   ` Willy Tarreau
@ 2006-08-04 10:39     ` Michael Buesch
  2006-08-04 12:21       ` Willy Tarreau
  2006-08-04 20:14       ` Willy Tarreau
  0 siblings, 2 replies; 9+ messages in thread
From: Michael Buesch @ 2006-08-04 10:39 UTC (permalink / raw)
  To: Willy Tarreau; +Cc: Jukka Partanen, kkeil, linux-kernel, Alan Cox

On Friday 04 August 2006 08:56, Willy Tarreau wrote:
> On Thu, Aug 03, 2006 at 06:56:15PM +0100, Alan Cox wrote:
> > Ar Iau, 2006-08-03 am 19:53 +0300, ysgrifennodd Jukka Partanen:
> > > AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
> > > (they are there in 2.6.17.7 too), to fix module initialization
> > > problems appearing with at least some newer Celerons and
> > > Pentium III.
> > 
> > Should be using cpu_relax() I think. Its a polled busy loop so you want
> > other CPU threads to run if possible.
> 
> You mean like this ? Here's the patch for 2.6, I'll queue the same for 2.4
> if it's alright.
> 
> > Alan
> 
> Regards,
> Willy
> 
> From 512d12bd7ce9c0a15dfd91a6f7c2970c92b3abdd Mon Sep 17 00:00:00 2001
> From: Willy Tarreau <w@1wt.eu>
> Date: Fri, 4 Aug 2006 08:50:10 +0200
> Subject: [PATCH] AVM C4 ISDN card : use cpu_relax() in busy loops
> 
> As suggested by Alan, use cpu_relax() in 3 busy loops : "It's a
> polled busy loop so you want other CPU threads to run if possible".
> 
> Signed-off-by: Willy Tarreau <w@1wt.eu>
> ---
>  drivers/isdn/hardware/avm/c4.c |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c
> index f7253b2..aee278e 100644
> --- a/drivers/isdn/hardware/avm/c4.c
> +++ b/drivers/isdn/hardware/avm/c4.c
> @@ -22,6 +22,7 @@ #include <linux/capi.h>
>  #include <linux/kernelcapi.h>
>  #include <linux/init.h>
>  #include <asm/io.h>
> +#include <asm/processor.h>
>  #include <asm/uaccess.h>
>  #include <linux/netdevice.h>
>  #include <linux/isdn/capicmd.h>
> @@ -150,6 +151,7 @@ static inline int wait_for_doorbell(avmc
>  		if (!time_before(jiffies, stop))
>  			return -1;
>  		mb();
> +		cpu_relax();

cpu_relax() implies a memory barrier.

-- 
Greetings Michael.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-04 10:39     ` Michael Buesch
@ 2006-08-04 12:21       ` Willy Tarreau
  2006-08-04 20:14       ` Willy Tarreau
  1 sibling, 0 replies; 9+ messages in thread
From: Willy Tarreau @ 2006-08-04 12:21 UTC (permalink / raw)
  To: Michael Buesch; +Cc: Jukka Partanen, kkeil, linux-kernel, Alan Cox

On Fri, Aug 04, 2006 at 12:39:12PM +0200, Michael Buesch wrote:
> On Friday 04 August 2006 08:56, Willy Tarreau wrote:
> > On Thu, Aug 03, 2006 at 06:56:15PM +0100, Alan Cox wrote:
> > > Ar Iau, 2006-08-03 am 19:53 +0300, ysgrifennodd Jukka Partanen:
> > > > AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
> > > > (they are there in 2.6.17.7 too), to fix module initialization
> > > > problems appearing with at least some newer Celerons and
> > > > Pentium III.
> > > 
> > > Should be using cpu_relax() I think. Its a polled busy loop so you want
> > > other CPU threads to run if possible.
> > 
> > You mean like this ? Here's the patch for 2.6, I'll queue the same for 2.4
> > if it's alright.
> > 
> > > Alan
> > 
> > Regards,
> > Willy
> > 
> > From 512d12bd7ce9c0a15dfd91a6f7c2970c92b3abdd Mon Sep 17 00:00:00 2001
> > From: Willy Tarreau <w@1wt.eu>
> > Date: Fri, 4 Aug 2006 08:50:10 +0200
> > Subject: [PATCH] AVM C4 ISDN card : use cpu_relax() in busy loops
> > 
> > As suggested by Alan, use cpu_relax() in 3 busy loops : "It's a
> > polled busy loop so you want other CPU threads to run if possible".
> > 
> > Signed-off-by: Willy Tarreau <w@1wt.eu>
> > ---
> >  drivers/isdn/hardware/avm/c4.c |    4 ++++
> >  1 files changed, 4 insertions(+), 0 deletions(-)
> > 
> > diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c
> > index f7253b2..aee278e 100644
> > --- a/drivers/isdn/hardware/avm/c4.c
> > +++ b/drivers/isdn/hardware/avm/c4.c
> > @@ -22,6 +22,7 @@ #include <linux/capi.h>
> >  #include <linux/kernelcapi.h>
> >  #include <linux/init.h>
> >  #include <asm/io.h>
> > +#include <asm/processor.h>
> >  #include <asm/uaccess.h>
> >  #include <linux/netdevice.h>
> >  #include <linux/isdn/capicmd.h>
> > @@ -150,6 +151,7 @@ static inline int wait_for_doorbell(avmc
> >  		if (!time_before(jiffies, stop))
> >  			return -1;
> >  		mb();
> > +		cpu_relax();
> 
> cpu_relax() implies a memory barrier.

OK fine. Reading from various asm-xxx/processor.h files, I was not sure about this.
I will repost it fixed and queue it for next 2.4 too.

> Greetings Michael.

Thanks,
Willy


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs
  2006-08-04 10:39     ` Michael Buesch
  2006-08-04 12:21       ` Willy Tarreau
@ 2006-08-04 20:14       ` Willy Tarreau
  1 sibling, 0 replies; 9+ messages in thread
From: Willy Tarreau @ 2006-08-04 20:14 UTC (permalink / raw)
  To: Michael Buesch; +Cc: Jukka Partanen, kkeil, linux-kernel, Alan Cox

On Fri, Aug 04, 2006 at 12:39:12PM +0200, Michael Buesch wrote:
> On Friday 04 August 2006 08:56, Willy Tarreau wrote:
> > On Thu, Aug 03, 2006 at 06:56:15PM +0100, Alan Cox wrote:
> > > Ar Iau, 2006-08-03 am 19:53 +0300, ysgrifennodd Jukka Partanen:
> > > > AVM C4 ISDN NIC: Add three memory barriers, taken from 2.6.7,
> > > > (they are there in 2.6.17.7 too), to fix module initialization
> > > > problems appearing with at least some newer Celerons and
> > > > Pentium III.
> > > 
> > > Should be using cpu_relax() I think. Its a polled busy loop so you want
> > > other CPU threads to run if possible.
(...)
> cpu_relax() implies a memory barrier.

Ok, here's the updated patch for 2.6 using cpu_relax() instead of
mb(), as suggested by Alan and Michael.

Regards,
Willy

> Greetings Michael.

>From b76136dc1ac989081933d28ec958ecdd32d368e4 Mon Sep 17 00:00:00 2001
From: Willy Tarreau <w@1wt.eu>
Date: Fri, 4 Aug 2006 22:11:23 +0200
Subject: [PATCH] AVM C4 ISDN card : use cpu_relax() in busy loops

As suggested by Alan, use cpu_relax() in 3 busy loops : "It's a
polled busy loop so you want other CPU threads to run if possible".

Signed-off-by: Willy Tarreau <w@1wt.eu>
---
 drivers/isdn/hardware/avm/c4.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c
index f7253b2..8149dce 100644
--- a/drivers/isdn/hardware/avm/c4.c
+++ b/drivers/isdn/hardware/avm/c4.c
@@ -22,6 +22,7 @@ #include <linux/capi.h>
 #include <linux/kernelcapi.h>
 #include <linux/init.h>
 #include <asm/io.h>
+#include <asm/processor.h>
 #include <asm/uaccess.h>
 #include <linux/netdevice.h>
 #include <linux/isdn/capicmd.h>
@@ -149,7 +150,7 @@ static inline int wait_for_doorbell(avmc
 	while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
 		if (!time_before(jiffies, stop))
 			return -1;
-		mb();
+		cpu_relax();
 	}
 	return 0;
 }
@@ -302,7 +303,7 @@ static void c4_reset(avmcard *card)
 		if (!time_before(jiffies, stop))
 			return;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
-		mb();
+		cpu_relax();
 	}
 
 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
@@ -326,7 +327,7 @@ static int c4_detect(avmcard *card)
 		if (!time_before(jiffies, stop))
 			return 2;
 		c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
-		mb();
+		cpu_relax();
 	}
 
 	c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
-- 
1.4.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2006-08-04 20:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-03 16:53 [PATCH 2.4.32] Fix AVM C4 ISDN card init problems with newer CPUs Jukka Partanen
2006-08-03 17:31 ` Karsten Keil
2006-08-04 10:00   ` Alan Cox
2006-08-03 17:56 ` Alan Cox
2006-08-04  5:08   ` Willy Tarreau
2006-08-04  6:56   ` Willy Tarreau
2006-08-04 10:39     ` Michael Buesch
2006-08-04 12:21       ` Willy Tarreau
2006-08-04 20:14       ` Willy Tarreau

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox