]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
usblp: continuously poll for status
authorPete Zaitcev <zaitcev@redhat.com>
Wed, 7 Jan 2009 00:20:42 +0000 (17:20 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 24 Mar 2009 23:20:26 +0000 (16:20 -0700)
The usblp in 2.6.18 polled for status regardless if we actually needed it.
At some point I dropped it, to save the batteries if nothing else.
As it turned out, printers exist (e.g. Canon BJC-3000) that need prodding
this way or else they stop. This patch restores the old behaviour.
If you want to save battery, don't leave jobs in the print queue.

I tested this on my printers by printing and examining usbmon traces
to make sure status is being requested and printers continue to print.
Tuomas Jäntti verified the fix on BJC-3000.

Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/class/usblp.c

index 3f3ee1351930ee44c01022e8251c172a15729355..d2747a49b9744bacf2962abbe2ea1b8bd3b087b5 100644 (file)
@@ -880,16 +880,19 @@ static int usblp_wwait(struct usblp *usblp, int nonblock)
                if (rc <= 0)
                        break;
 
-               if (usblp->flags & LP_ABORT) {
-                       if (schedule_timeout(msecs_to_jiffies(5000)) == 0) {
+               if (schedule_timeout(msecs_to_jiffies(1500)) == 0) {
+                       if (usblp->flags & LP_ABORT) {
                                err = usblp_check_status(usblp, err);
                                if (err == 1) { /* Paper out */
                                        rc = -ENOSPC;
                                        break;
                                }
+                       } else {
+                               /* Prod the printer, Gentoo#251237. */
+                               mutex_lock(&usblp->mut);
+                               usblp_read_status(usblp, usblp->statusbuf);
+                               mutex_unlock(&usblp->mut);
                        }
-               } else {
-                       schedule();
                }
        }
        set_current_state(TASK_RUNNING);