Re: [linux-usb-devel] Re: serious 2.6 bug in USB subsystem?

From: David Brownell
Date: Tue Mar 09 2004 - 21:59:06 EST


David Mosberger wrote:

Anyhow, I have been wondering since about Sunday whether it's really
safe to write HcControlHeadED (and HcBulkHeadED) with 0. The register
description itself is ambiguous. Now I'm finding that Figure 6-5
"List Service Flow" and Section 6.4.2.2 "Locating Endpoint
Descriptors" are outright contradictory!

OHCI isn't as tightly specified as one might like. There are also
differences in how vendors implemented it (notably initialization);
but at least there don't seem to be major incompatibilities that
crept in between implementations.


So, if the HC behaves as described in the text, then there is an
obvious race:
....
So I changed ohci-q.c ... to this:

if (ed->ed_prev == NULL) {
if (!ed->hwNextED) {
ohci->hc_control &= ~OHCI_CTRL_CLE;
writel (ohci->hc_control, &ohci->regs->control);
} else

(added the ELSE)

writel (le32_to_cpup (&ed->hwNextED),
&ohci->regs->ed_controlhead);
} else ...

and now there are no more crashes when plugging in the BTC keyboard.

Interesting. I had those "else"s in the patch I was testing too,
and they were literally the last "is this really needed?" change I
removed before posting that patch yesterday. I had tested it on
four different implementations of OHCI (two on SMP) and the "else"
didn't make a difference ... as it might not, given the race
you identified. This is a good example of something better
found with a fresh set of eyes looking at spec and code!

Looks like that's really needed then! Whose OHCI silicon are
you testing with, by the way? Good catch, regardless.

- Dave



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