Просмотр исходного кода

USB: musb: use right poll limit for low speed devices

Remove wrongly applied upper limit on the interrupt transfer
interval for low speed devices (not much of an error per se,
according to USB specs).

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Sergei Shtylyov 16 лет назад
Родитель
Сommit
136733d612
1 измененных файлов с 10 добавлено и 8 удалено
  1. 10 8
      drivers/usb/musb/musb_host.c

+ 10 - 8
drivers/usb/musb/musb_host.c

@@ -1863,19 +1863,21 @@ static int musb_urb_enqueue(
 	}
 	}
 	qh->type_reg = type_reg;
 	qh->type_reg = type_reg;
 
 
-	/* precompute rxinterval/txinterval register */
-	interval = min((u8)16, epd->bInterval);	/* log encoding */
+	/* Precompute RXINTERVAL/TXINTERVAL register */
 	switch (qh->type) {
 	switch (qh->type) {
 	case USB_ENDPOINT_XFER_INT:
 	case USB_ENDPOINT_XFER_INT:
-		/* fullspeed uses linear encoding */
-		if (USB_SPEED_FULL == urb->dev->speed) {
-			interval = epd->bInterval;
-			if (!interval)
-				interval = 1;
+		/*
+		 * Full/low speeds use the  linear encoding,
+		 * high speed uses the logarithmic encoding.
+		 */
+		if (urb->dev->speed <= USB_SPEED_FULL) {
+			interval = max_t(u8, epd->bInterval, 1);
+			break;
 		}
 		}
 		/* FALLTHROUGH */
 		/* FALLTHROUGH */
 	case USB_ENDPOINT_XFER_ISOC:
 	case USB_ENDPOINT_XFER_ISOC:
-		/* iso always uses log encoding */
+		/* ISO always uses logarithmic encoding */
+		interval = min_t(u8, epd->bInterval, 16);
 		break;
 		break;
 	default:
 	default:
 		/* REVISIT we actually want to use NAK limits, hinting to the
 		/* REVISIT we actually want to use NAK limits, hinting to the