All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] Char: istallion, init+locking fixes
@ 2007-06-18 20:57 Ingo Korb
  2007-06-19  7:42 ` Jiri Slaby
  0 siblings, 1 reply; 4+ messages in thread
From: Ingo Korb @ 2007-06-18 20:57 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel

Move brdp->iosize assignment in stli_initecp up a few lines to stop the
driver from requesting an I/O region of length 0.

Remove spin_lock_irqsave/spin_unlock_irqrestore from __stli_sendcmd as
all users of that function take the lock already.

Signed-off-by: Ingo Korb <ml@akana.de>
---
One thing I dislike about this driver: It polls its cards every jiffy to
look for new data. The cards are able to use interrupts (some of the
drivers for other OSes use them), but as far as I know there is no open
documentation. Unfortunately the DOS driver (probably easiest to
analyze) also uses polling. =(


diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c
index 7b279d1..0bc1c37 100644
--- a/drivers/char/istallion.c
+++ b/drivers/char/istallion.c
@@ -2168,8 +2168,6 @@ static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigne
 	unsigned char __iomem *bits;
 	unsigned long flags;
 
-	spin_lock_irqsave(&brd_lock, flags);
-
 	if (test_bit(ST_CMDING, &portp->state)) {
 		printk(KERN_ERR "STALLION: command already busy, cmd=%x!\n",
 				(int) cmd);
@@ -2194,7 +2192,6 @@ static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigne
 	writeb(readb(bits) | portp->portbit, bits);
 	set_bit(ST_CMDING, &portp->state);
 	EBRDDISABLE(brdp);
-	spin_unlock_irqrestore(&brd_lock, flags);
 }
 
 static void stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
@@ -3218,13 +3215,13 @@ static int stli_initecp(struct stlibrd *brdp)
 		goto err;
 	}
 
+	brdp->iosize = ECP_IOSIZE;
+
 	if (!request_region(brdp->iobase, brdp->iosize, "istallion")) {
 		retval = -EIO;
 		goto err;
 	}
 
-	brdp->iosize = ECP_IOSIZE;
-
 /*
  *	Based on the specific board type setup the common vars to access
  *	and enable shared memory. Set all board specific information now


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

* Re: [PATCH 1/1] Char: istallion, init+locking fixes
  2007-06-18 20:57 [PATCH 1/1] Char: istallion, init+locking fixes Ingo Korb
@ 2007-06-19  7:42 ` Jiri Slaby
  2007-06-19 14:32   ` Ingo Korb
  2007-06-19 14:39   ` [PATCH 1/1] Char: istallion, init+locking fixes (try 2) Ingo Korb
  0 siblings, 2 replies; 4+ messages in thread
From: Jiri Slaby @ 2007-06-19  7:42 UTC (permalink / raw)
  To: Ingo Korb; +Cc: Andrew Morton, linux-kernel, Alan Cox

Ingo Korb napsal(a):
> Move brdp->iosize assignment in stli_initecp up a few lines to stop the
> driver from requesting an I/O region of length 0.
> 
> Remove spin_lock_irqsave/spin_unlock_irqrestore from __stli_sendcmd as
> all users of that function take the lock already.
> 
> Signed-off-by: Ingo Korb <ml@akana.de>
> ---
> One thing I dislike about this driver: It polls its cards every jiffy to
> look for new data. The cards are able to use interrupts (some of the
> drivers for other OSes use them), but as far as I know there is no open
> documentation. Unfortunately the DOS driver (probably easiest to
> analyze) also uses polling. =(
> 
> 
> diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c
> index 7b279d1..0bc1c37 100644
> --- a/drivers/char/istallion.c
> +++ b/drivers/char/istallion.c
> @@ -2168,8 +2168,6 @@ static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigne
>  	unsigned char __iomem *bits;
>  	unsigned long flags;

Remove the flags and you will see the bug, you introduced ;).

> -	spin_lock_irqsave(&brd_lock, flags);
> -
>  	if (test_bit(ST_CMDING, &portp->state)) {
>  		printk(KERN_ERR "STALLION: command already busy, cmd=%x!\n",
>  				(int) cmd);
> @@ -2194,7 +2192,6 @@ static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigne
>  	writeb(readb(bits) | portp->portbit, bits);
>  	set_bit(ST_CMDING, &portp->state);
>  	EBRDDISABLE(brdp);
> -	spin_unlock_irqrestore(&brd_lock, flags);
>  }


regards,
-- 
http://www.fi.muni.cz/~xslaby/            Jiri Slaby
faculty of informatics, masaryk university, brno, cz
e-mail: jirislaby gmail com, gpg pubkey fingerprint:
B674 9967 0407 CE62 ACC8  22A0 32CC 55C3 39D4 7A7E

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

* Re: [PATCH 1/1] Char: istallion, init+locking fixes
  2007-06-19  7:42 ` Jiri Slaby
@ 2007-06-19 14:32   ` Ingo Korb
  2007-06-19 14:39   ` [PATCH 1/1] Char: istallion, init+locking fixes (try 2) Ingo Korb
  1 sibling, 0 replies; 4+ messages in thread
From: Ingo Korb @ 2007-06-19 14:32 UTC (permalink / raw)
  To: Jiri Slaby; +Cc: Andrew Morton, linux-kernel, Alan Cox

Jiri Slaby <jirislaby@gmail.com> writes:

>>  	unsigned char __iomem *bits;
>>  	unsigned long flags;
>
> Remove the flags and you will see the bug, you introduced ;).

Oops. I guess I shouldn't try to work on kernel stuff while tired. Fixed
patch follows.

-ik


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

* [PATCH 1/1] Char: istallion, init+locking fixes (try 2)
  2007-06-19  7:42 ` Jiri Slaby
  2007-06-19 14:32   ` Ingo Korb
@ 2007-06-19 14:39   ` Ingo Korb
  1 sibling, 0 replies; 4+ messages in thread
From: Ingo Korb @ 2007-06-19 14:39 UTC (permalink / raw)
  To: Jiri Slaby; +Cc: Andrew Morton, linux-kernel, Alan Cox

Move brdp->iosize assignment in stli_initecp up a few lines to stop the
driver from requesting an I/O region of length 0.

Remove spin_lock_irqsave/spin_unlock_irqrestore from __stli_sendcmd as
all users of that function take the lock already.

Signed-off-by: Ingo Korb <ml@akana.de>
---
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c
index 7b279d1..becba24 100644
--- a/drivers/char/istallion.c
+++ b/drivers/char/istallion.c
@@ -2166,14 +2166,10 @@ static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigne
 	cdkhdr_t __iomem *hdrp;
 	cdkctrl_t __iomem *cp;
 	unsigned char __iomem *bits;
-	unsigned long flags;
-
-	spin_lock_irqsave(&brd_lock, flags);
 
 	if (test_bit(ST_CMDING, &portp->state)) {
 		printk(KERN_ERR "STALLION: command already busy, cmd=%x!\n",
 				(int) cmd);
-		spin_unlock_irqrestore(&brd_lock, flags);
 		return;
 	}
 
@@ -2194,7 +2190,6 @@ static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigne
 	writeb(readb(bits) | portp->portbit, bits);
 	set_bit(ST_CMDING, &portp->state);
 	EBRDDISABLE(brdp);
-	spin_unlock_irqrestore(&brd_lock, flags);
 }
 
 static void stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
@@ -3218,13 +3213,13 @@ static int stli_initecp(struct stlibrd *brdp)
 		goto err;
 	}
 
+	brdp->iosize = ECP_IOSIZE;
+
 	if (!request_region(brdp->iobase, brdp->iosize, "istallion")) {
 		retval = -EIO;
 		goto err;
 	}
 
-	brdp->iosize = ECP_IOSIZE;
-
 /*
  *	Based on the specific board type setup the common vars to access
  *	and enable shared memory. Set all board specific information now


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

end of thread, other threads:[~2007-06-19 14:40 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-18 20:57 [PATCH 1/1] Char: istallion, init+locking fixes Ingo Korb
2007-06-19  7:42 ` Jiri Slaby
2007-06-19 14:32   ` Ingo Korb
2007-06-19 14:39   ` [PATCH 1/1] Char: istallion, init+locking fixes (try 2) Ingo Korb

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.