mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
[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: Marko Kohtala <marko.kohtala@gmail.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
742ec650e9
commit
310c8c324f
@ -436,7 +436,7 @@ static int select_port (struct parport *port)
|
||||
|
||||
static int assign_addrs (struct parport *port)
|
||||
{
|
||||
unsigned char s, last_dev;
|
||||
unsigned char s;
|
||||
unsigned char daisy;
|
||||
int thisdev = numdevs;
|
||||
int detected;
|
||||
@ -472,10 +472,13 @@ static int assign_addrs (struct parport *port)
|
||||
}
|
||||
|
||||
parport_write_data (port, 0x78); udelay (2);
|
||||
last_dev = 0; /* We've just been speaking to a device, so we
|
||||
know there must be at least _one_ out there. */
|
||||
s = parport_read_status (port);
|
||||
|
||||
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);
|
||||
udelay (2);
|
||||
parport_frob_control (port,
|
||||
@ -485,14 +488,18 @@ static int assign_addrs (struct parport *port)
|
||||
parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
|
||||
udelay (1);
|
||||
|
||||
if (last_dev)
|
||||
/* No more devices. */
|
||||
add_dev (numdevs++, port, daisy);
|
||||
|
||||
/* See if this device thought it was the last in the
|
||||
* chain. */
|
||||
if (!(s & PARPORT_STATUS_BUSY))
|
||||
break;
|
||||
|
||||
last_dev = !(parport_read_status (port)
|
||||
& PARPORT_STATUS_BUSY);
|
||||
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user