git: 9front

Download patch

ref: 847b1b85a0e9dd6f362bd359a35da25fe1613079
parent: a34d2432071666b09b04ef402b9456036945da4a
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Tue Aug 16 20:46:33 EDT 2011

usb/ptp: ignore zero reads

--- a/sys/src/cmd/nusb/ptp/usbptp.c
+++ b/sys/src/cmd/nusb/ptp/usbptp.c
@@ -122,10 +122,13 @@
 static int
 usbread(Dev *ep, void *data, int len)
 {
-	int n;
+	int n, try;
 
-	for(;;){
+	n = 0;
+	for(try = 0; try < 4; try++){
 		n = read(ep->dfd, data, len);
+		if(n == 0)
+			continue;
 		if(n >= 0 || !isinterrupt())
 			break;
 	}
@@ -135,10 +138,13 @@
 static int
 usbwrite(Dev *ep, void *data, int len)
 {
-	int n;
+	int n, try;
 
-	for(;;){
+	n = 0;
+	for(try = 0; try < 4; try++){
 		n = write(ep->dfd, data, len);
+		if(n == 0)
+			continue;
 		if(n >= 0 || !isinterrupt())
 			break;
 	}
@@ -198,7 +204,7 @@
 	char *s;
 
 	if(length < 4+2+2+4){
-		werrstr("short response");
+		werrstr("short response: %d < %d", length, 4+2+2+4);
 		return -1;
 	}
 	if(GET4(rpc->length) < length){
@@ -291,6 +297,7 @@
 
 		if((n = usbread(usbep[In], &rpc, sizeof(rpc))) < 0)
 			return -1;
+		
 		if(debug)
 			hexdump("data<", (uchar*)&rpc, n);
 		if(ptpcheckerr(&rpc, 2, t, n))
--