[PARISC] pdc_console: fix bizarre panic on boot
Commit 721fdf3416
introduced a subtle bug
by accidently removing the "static" from iodc_dbuf. This resulted in, what
appeared to be, a trap without *current set to a task. Probably the result of
a trap in real mode while calling firmware.
Also do other misc clean ups. Since the only input from firmware is non
blocking, share iodc_dbuf between input and output, and spinlock the
only callers.
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
This commit is contained in:
@@ -52,15 +52,30 @@
|
||||
#include <linux/tty.h>
|
||||
#include <asm/pdc.h> /* for iodc_call() proto and friends */
|
||||
|
||||
static spinlock_t pdc_console_lock = SPIN_LOCK_UNLOCKED;
|
||||
|
||||
static void pdc_console_write(struct console *co, const char *s, unsigned count)
|
||||
{
|
||||
pdc_iodc_print(s, count);
|
||||
int i = 0;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&pdc_console_lock, flags);
|
||||
do {
|
||||
i += pdc_iodc_print(s + i, count - i);
|
||||
} while (i < count);
|
||||
spin_unlock_irqrestore(&pdc_console_lock, flags);
|
||||
}
|
||||
|
||||
int pdc_console_poll_key(struct console *co)
|
||||
{
|
||||
return pdc_iodc_getc();
|
||||
int c;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&pdc_console_lock, flags);
|
||||
c = pdc_iodc_getc();
|
||||
spin_unlock_irqrestore(&pdc_console_lock, flags);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static int pdc_console_setup(struct console *co, char *options)
|
||||
|
Reference in New Issue
Block a user