--- /mnt/term/sys/src/cmd/usb/lib/parse.c Fri Jan 8 18:00:43 2010 +++ /sys/src/cmd/usb/lib/parse.c Tue Mar 23 16:19:20 2021 @@ -66,6 +66,11 @@ } if(c->iface[ifid] == nil) c->iface[ifid] = emallocz(sizeof(Iface), 1); + else{ + /* hack to avoid unsupported uasp disk interface */ + if(dip->bInterfaceClass == Clstorage && dip->bInterfaceProtocol != 0x50) + return 0; + } ip = c->iface[ifid]; class = dip->bInterfaceClass; subclass = dip->bInterfaceSubClass; @@ -164,6 +169,7 @@ Ep *ep; Altc *altc; char *hd; + int ok; assert(d != nil && c != nil); tot = 0; @@ -174,6 +180,7 @@ if(d->ddesc[nd] == nil) break; + ok = 1; while(n > 2 && b[0] != 0 && b[0] <= n){ len = b[0]; if(usbdebug>1){ @@ -189,7 +196,7 @@ ddprint(2, "%s\tparsedesc: %r", argv0); break; case Diface: - if(parseiface(d, c, b, n, &ip, &altc) < 0){ + if((ok = parseiface(d, c, b, n, &ip, &altc)) < 0){ ddprint(2, "%s\tparsedesc: %r\n", argv0); return -1; } @@ -199,6 +206,8 @@ werrstr("unexpected endpoint descriptor"); break; } + if(!ok) + break; if(parseendpt(d, c, ip, altc, b, n, &ep) < 0){ ddprint(2, "%s\tparsedesc: %r\n", argv0); return -1; --- /mnt/term/sys/src/cmd/usb/usbd/usbd.c Mon Jun 7 20:16:49 2021 +++ /sys/src/cmd/usb/usbd/usbd.c Sun Nov 14 21:12:08 2021 @@ -362,6 +362,8 @@ dd->bMaxPacketSize0 = 64; if(usbcmd(d, Rd2h|Rstd|Rdev, Rgetdesc, Ddev<<8|0, 0, buf, sizeof(buf)) < 0) return -1; + if((dd->bcdUSB[1] & 0xF) == 3) + return 1 << dd->bMaxPacketSize0; return dd->bMaxPacketSize0; }