Messages in this thread Patch in this message | | | Date | Mon, 13 Apr 1998 19:56:30 +0200 (CEST) | From | Andrea Arcangeli <> | Subject | Re: More parport troubles |
| |
On Mon, 13 Apr 1998, Andrea Arcangeli wrote:
>printing works fine (as in 2.0.3x) and if your printer don' t work using >interrupt it should be buggy. Can you print using interrupt in other
This seems a bug in the lp interrupt printing since you are not the only one is reporting this stall.
I can' t reproduce your problems on my hardware.
Could you try this patch (also you Philip)? It' s against plain 2.1.95. My hardware don' t report problems.
Andrea[s] Arcangeli
--- linux/drivers/char/lp.c.orig Mon Apr 13 19:45:05 1998 +++ linux/drivers/char/lp.c Mon Apr 13 19:49:47 1998 @@ -90,7 +90,7 @@ struct lp_struct lp_table[LP_NO] = { [0 ... LP_NO-1] = {NULL, 0, LP_INIT_CHAR, LP_INIT_TIME, LP_INIT_WAIT, - NULL, 0, 0, 0, {0}} + NULL, 0, 0, 0, {0}, ATOMIC_INIT(0) } }; /* Test if printer is ready (and optionally has no error conditions) */ @@ -160,25 +160,28 @@ static inline int lp_char(char lpchar, int minor) { - int status; unsigned int wait = 0; unsigned long count = 0; struct lp_stats *stats; for (;;) { lp_yield(minor); - status = r_str (minor); if (++count == LP_CHAR(minor)) return 0; if (LP_POLLING(minor)) { - if (LP_READY(minor, status)) + if (LP_READY(minor, r_str(minor))) break; } else { - if (!LP_READY(minor, status)) + cli(); + if (!LP_READY(minor, r_str(minor))) + { + atomic_set(&lp_table[minor].int_count, 0); + sti(); return 0; - else - break; + } + sti(); + break; } } @@ -225,6 +228,7 @@ if (waitqueue_active (&lp_dev->dev->wait_q)) wake_up_interruptible(&lp_dev->dev->wait_q); + atomic_inc(&lp_dev->int_count); } static void lp_error(int minor) @@ -302,6 +306,11 @@ lp_schedule (minor); } else { cli(); + if (atomic_read(&lp_table[minor].int_count) > 0) + { + printk("probably the lp irq problem is fixed now\n"); + goto after_irq; + } if (LP_PREEMPTED(minor)) { sti(); goto lp_polling; @@ -319,6 +328,7 @@ interruptible_sleep_on(&lp->dev->wait_q); disable_irq(lp->dev->port->irq); w_ctr(minor, LP_PSELECP | LP_PINITP); + after_irq: sti(); if (lp_check_status(minor)) return rc ? rc : -EIO; --- linux/include/linux/lp.h.orig Mon Apr 13 19:45:21 1998 +++ linux/include/linux/lp.h Mon Apr 13 19:49:54 1998 @@ -115,6 +115,7 @@ unsigned int runchars; unsigned int waittime; struct lp_stats stats; + atomic_t int_count; }; /*
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu
| |