Wait up to 20 seconds for polled commands to complete. A certain multiport
storage box needs this.
diff -urN linux-2.5.41-p/drivers/block/cciss.c linux-2.5.41-q/drivers/block/cciss.c
--- linux-2.5.41-p/drivers/block/cciss.c Wed Oct 9 15:22:14 2002
+++ linux-2.5.41-q/drivers/block/cciss.c Wed Oct 9 15:54:35 2002
@@ -1318,9 +1318,9 @@
unsigned long done;
int i;
- /* Wait (up to 2 seconds) for a command to complete */
+ /* Wait (up to 20 seconds) for a command to complete */
- for (i = 200000; i > 0; i--) {
+ for (i = 2000000; i > 0; i--) {
done = hba[ctlr]->access.command_completed(hba[ctlr]);
if (done == FIFO_EMPTY) {
udelay(10); /* a short fixed delay */
On Fri, 2002-10-11 at 16:10, Stephen Cameron wrote:
>
> Wait up to 20 seconds for polled commands to complete. A certain multiport
> storage box needs this.
>
> diff -urN linux-2.5.41-p/drivers/block/cciss.c linux-2.5.41-q/drivers/block/cciss.c
> --- linux-2.5.41-p/drivers/block/cciss.c Wed Oct 9 15:22:14 2002
> +++ linux-2.5.41-q/drivers/block/cciss.c Wed Oct 9 15:54:35 2002
> @@ -1318,9 +1318,9 @@
> unsigned long done;
> int i;
>
> - /* Wait (up to 2 seconds) for a command to complete */
> + /* Wait (up to 20 seconds) for a command to complete */
>
> - for (i = 200000; i > 0; i--) {
> + for (i = 2000000; i > 0; i--) {
> done = hba[ctlr]->access.command_completed(hba[ctlr]);
> if (done == FIFO_EMPTY) {
> udelay(10); /* a short fixed delay */
ugh 20 seconds udelay....
why can't you sleep here ?
(and yes 20 seconds WILL trigger watchdogs!)
> From: Arjan van de Ven wrote:
> On Fri, 2002-10-11 at 16:10, Stephen Cameron wrote:
> >
> > Wait up to 20 seconds for polled commands to complete. A
> certain multiport
> > storage box needs this.
> >
> > diff -urN linux-2.5.41-p/drivers/block/cciss.c
> linux-2.5.41-q/drivers/block/cciss.c
> > --- linux-2.5.41-p/drivers/block/cciss.c Wed Oct 9 15:22:14 2002
> > +++ linux-2.5.41-q/drivers/block/cciss.c Wed Oct 9 15:54:35 2002
> > @@ -1318,9 +1318,9 @@
> > unsigned long done;
> > int i;
> >
> > - /* Wait (up to 2 seconds) for a command to complete */
> > + /* Wait (up to 20 seconds) for a command to complete */
> >
> > - for (i = 200000; i > 0; i--) {
> > + for (i = 2000000; i > 0; i--) {
> > done =
> hba[ctlr]->access.command_completed(hba[ctlr]);
> > if (done == FIFO_EMPTY) {
> > udelay(10); /* a short fixed delay */
>
> ugh 20 seconds udelay....
>
> why can't you sleep here ?
> (and yes 20 seconds WILL trigger watchdogs!)
Ok. Nevermind that patch then. We'll have to rethink it.
-- steve
Arjan van de Ven wrote:
> On Fri, 2002-10-11 at 16:10, Stephen Cameron wrote:
[... a bogus patch involving a 20 second udelay ...]
> ugh 20 seconds udelay....
>
> why can't you sleep here ? [...]
No reason that I can see. Thanks for pointing it out.
Is this better? (I also changed the spaces to tabs
while I was at it.)
-- steve
diff -urN linux-2.5.41/drivers/block/cciss.c linux-2.5.41-20sec/drivers/block/cciss.c
--- linux-2.5.41/drivers/block/cciss.c Fri Oct 11 09:17:00 2002
+++ linux-2.5.41-20sec/drivers/block/cciss.c Fri Oct 11 09:07:17 2002
@@ -1297,24 +1297,25 @@
/*
* Wait polling for a command to complete.
* The memory mapped FIFO is polled for the completion.
- * Used only at init time, interrupts disabled.
+ * Used only at init time, interrupts from the HBA are disabled.
*/
static unsigned long pollcomplete(int ctlr)
{
- unsigned long done;
- int i;
+ unsigned long done;
+ int i;
+ DECLARE_WAIT_QUEUE_HEAD(polling_wqh);
- /* Wait (up to 2 seconds) for a command to complete */
+ /* Wait (up to 20 seconds) for a command to complete */
- for (i = 200000; i > 0; i--) {
- done = hba[ctlr]->access.command_completed(hba[ctlr]);
- if (done == FIFO_EMPTY) {
- udelay(10); /* a short fixed delay */
- } else
- return (done);
- }
- /* Invalid address to tell caller we ran out of time */
- return 1;
+ for (i = 20 * HZ; i > 0; i--) {
+ done = hba[ctlr]->access.command_completed(hba[ctlr]);
+ if (done == FIFO_EMPTY)
+ interruptible_sleep_on_timeout(&polling_wqh, 1);
+ else
+ return (done);
+ }
+ /* Invalid address to tell caller we ran out of time */
+ return 1;
}
/*
* Send a command to the controller, and wait for it to complete.