Re: 2.6.15: usb storage device not detected

From: Pete Zaitcev
Date: Sun Feb 19 2006 - 01:48:07 EST


On Sun, 19 Feb 2006 16:19:15 +1100, CaT <cat@xxxxxxxxxx> wrote:

Thanks for the trace, CaT!

> c31f414c 744561726 S Bo:005:02 -115 31 = 55534243 00000000 00000000 00000600 00000000 00000000 00000000 000000
> c31f414c 744561854 C Bo:005:02 0 31 >
> c31f414c 744561863 S Bi:005:01 -115 13 <
> c31f414c 745057444 C Bi:005:01 0 13 = 55534253 00000000 00000000 00
> c31f414c 745057463 S Ci:005:00 s a1 fe 0000 0000 0001 1 <
> c31f414c 745057691 C Ci:005:00 -32 0
> c31f414c 745057750 S Co:005:00 s 02 01 0000 0081 0000 0
> c31f414c 745058065 C Co:005:00 0 0
> c31f414c 745058072 S Co:005:00 s 02 01 0000 0002 0000 0
> c31f414c 745058314 C Co:005:00 0 0
> c31f414c 745058386 S Bo:005:02 -115 31 = 55534243 01000000 00000000 00000600 00000000 00000000 00000000 000000
> c31f414c 745058437 C Bo:005:02 0 31 >
> c31f414c 745058444 S Bi:005:01 -115 13 <
> c31f414c 750057024 C Bi:005:01 -104 0

I see... This is a device which dislikes the stall clear when called after
a stall on the control pipe.

I knew this was inevitable ever since Wolfgang pointed me at it when we
debugged Martin's Elitegroup K7S5A.

I'm going to send the attached patch to Greg to get it into 2.6.17
(this way it will be separated from all the reset machinery which goes
into 2.6.16). I have tested it on my honest to goodness ZIP-100, and
yes, it stalls the control pipe at the GetMaxLUN, and yes, it works
after that. Here's the hope that it is some kind of an urban legend.

Thanks again,
-- Pete

--- linux-2.6.16-rc2/drivers/block/ub.c 2006-02-11 00:31:36.000000000 -0800
+++ linux-2.6.16-rc2-lem/drivers/block/ub.c 2006-02-18 22:21:30.000000000 -0800
@@ -2480,19 +2477,8 @@ static int ub_probe(struct usb_interface

nluns = 1;
for (i = 0; i < 3; i++) {
- if ((rc = ub_sync_getmaxlun(sc)) < 0) {
- /*
- * This segment is taken from usb-storage. They say
- * that ZIP-100 needs this, but my own ZIP-100 works
- * fine without this.
- * Still, it does not seem to hurt anything.
- */
- if (rc == -EPIPE) {
- ub_probe_clear_stall(sc, sc->recv_bulk_pipe);
- ub_probe_clear_stall(sc, sc->send_bulk_pipe);
- }
+ if ((rc = ub_sync_getmaxlun(sc)) < 0)
break;
- }
if (rc != 0) {
nluns = rc;
break;
-
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/