Re: More parport troubles

Andrea Arcangeli (arcangeli@mbox.queen.it)
Mon, 13 Apr 1998 19:56:30 +0200 (CEST)


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