Re: Linux 2.3.18ac1

Mikael Pettersson (mikpe@csd.uu.se)
Sun, 12 Sep 1999 19:24:58 +0200 (MET DST)


Here are two small fixes for Linux kernel 2.3.18:

* The patch 2.3.10->2.3.11 added a return statement to the F0 0F
bug workaround code which disabled the workaround. (I assume
this was intended as a temporary fix while ironing out other
changes.) The patch below re-enables the F0 0F workaround.

* parport_pc has one "virtual" bug and one real one:
* After placing the ECP port in configuration mode, the config
status should be read from I/O port CONFIGA(pb), not FIFO(pb).
[They denote the same I/O address, but that address changes
meaning depending on the mode of the parallel port.]
* The ISA-Level/Pulses bit (0x80) should be read from CONFIGA(pb),
not CONFIGB(pb). (0x80 in CONFIGB is the "compress" flag.)

While I'm at it: the check for IRQ conflict further down fails
on my Dell Latitude notebook: On the Latitude, CONFIGB always
reads as zero, which makes parport_pc believe there's an IRQ
conflict (there isn't). parport_pc then turns off IRQ capability,
which leaves the parport in a next to useless state (printing
is excruciatingly slow, if it works at all). I know some documents
recommend this check; I'm just not sure whether they're wrong
or whether the Dell Latitude has a crap parallel port controller.
Printing works in polling mode and IRQ-mode without FIFO/DMA.

/Mikael

--- linux-2.3.18/arch/i386/kernel/traps.c.~1~ Sun Sep 12 02:51:52 1999
+++ linux-2.3.18/arch/i386/kernel/traps.c Sun Sep 12 13:42:43 1999
@@ -489,7 +489,6 @@
pmd_t * pmd;
pte_t * pte;

-return;
/*
* Allocate a new page in virtual address space,
* move the IDT into it and write protect this page.
--- linux-2.3.18/drivers/parport/parport_pc.c.orig Thu Aug 19 18:41:54 1999
+++ linux-2.3.18/drivers/parport/parport_pc.c Sun Sep 12 13:42:20 1999
@@ -1202,7 +1202,7 @@

outb (ECR_SPP << 5, ECONTROL (pb)); /* Reset FIFO */
outb (0xf4, ECONTROL (pb)); /* Configuration mode */
- config = inb (FIFO (pb));
+ config = inb (CONFIGA (pb));
pword = (config >> 4) & 0x7;
switch (pword) {
case 0:
@@ -1225,10 +1225,10 @@
priv->pword = pword;
printk (KERN_DEBUG "0x%lx: PWord is %d bits\n", pb->base, 8 * pword);

- config = inb (CONFIGB (pb));
printk (KERN_DEBUG "0x%lx: Interrupts are ISA-%s\n", pb->base,
config & 0x80 ? "Level" : "Pulses");

+ config = inb (CONFIGB (pb));
if (!(config & 0x40)) {
printk (KERN_WARNING "0x%lx: IRQ conflict!\n", pb->base);
pb->irq = PARPORT_IRQ_NONE;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/