Commit 310c8c32 authored by Marko Kohtala's avatar Marko Kohtala Committed by Linus Torvalds

[PATCH] parport: daisy chain end detection fix

Daisy chain end detection failed at least with older daisy chain devices that
do not implement the last device signal.
Signed-off-by: default avatarMarko Kohtala <marko.kohtala@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 742ec650
...@@ -436,7 +436,7 @@ static int select_port (struct parport *port) ...@@ -436,7 +436,7 @@ static int select_port (struct parport *port)
static int assign_addrs (struct parport *port) static int assign_addrs (struct parport *port)
{ {
unsigned char s, last_dev; unsigned char s;
unsigned char daisy; unsigned char daisy;
int thisdev = numdevs; int thisdev = numdevs;
int detected; int detected;
...@@ -472,10 +472,13 @@ static int assign_addrs (struct parport *port) ...@@ -472,10 +472,13 @@ static int assign_addrs (struct parport *port)
} }
parport_write_data (port, 0x78); udelay (2); parport_write_data (port, 0x78); udelay (2);
last_dev = 0; /* We've just been speaking to a device, so we s = parport_read_status (port);
know there must be at least _one_ out there. */
for (daisy = 0; daisy < 4; daisy++) { for (daisy = 0;
(s & (PARPORT_STATUS_PAPEROUT|PARPORT_STATUS_SELECT))
== (PARPORT_STATUS_PAPEROUT|PARPORT_STATUS_SELECT)
&& daisy < 4;
++daisy) {
parport_write_data (port, daisy); parport_write_data (port, daisy);
udelay (2); udelay (2);
parport_frob_control (port, parport_frob_control (port,
...@@ -485,14 +488,18 @@ static int assign_addrs (struct parport *port) ...@@ -485,14 +488,18 @@ static int assign_addrs (struct parport *port)
parport_frob_control (port, PARPORT_CONTROL_STROBE, 0); parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
udelay (1); udelay (1);
if (last_dev) add_dev (numdevs++, port, daisy);
/* No more devices. */
break;
last_dev = !(parport_read_status (port) /* See if this device thought it was the last in the
& PARPORT_STATUS_BUSY); * chain. */
if (!(s & PARPORT_STATUS_BUSY))
break;
add_dev (numdevs++, port, daisy); /* We are seeing pass through status now. We see
last_dev from next device or if last_dev does not
work status lines from some non-daisy chain
device. */
s = parport_read_status (port);
} }
parport_write_data (port, 0xff); udelay (2); parport_write_data (port, 0xff); udelay (2);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment