Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 397f519a authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Greg Kroah-Hartman
Browse files

usb: r8a66597-hcd: fix iinterval for Full/Low speed device



fix interrupt transfer interval for Full/Low speed device.

Signed-off-by: default avatarYoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 0bf32b80
Loading
Loading
Loading
Loading
+27 −4
Original line number Original line Diff line number Diff line
@@ -863,6 +863,32 @@ static void disable_r8a66597_pipe_all(struct r8a66597 *r8a66597,
	dev->dma_map = 0;
	dev->dma_map = 0;
}
}


static u16 get_interval(struct urb *urb, __u8 interval)
{
	u16 time = 1;
	int i;

	if (urb->dev->speed == USB_SPEED_HIGH) {
		if (interval > IITV)
			time = IITV;
		else
			time = interval ? interval - 1 : 0;
	} else {
		if (interval > 128) {
			time = IITV;
		} else {
			/* calculate the nearest value for PIPEPERI */
			for (i = 0; i < 7; i++) {
				if ((1 << i) < interval &&
				    (1 << (i + 1) > interval))
					time = 1 << i;
			}
		}
	}

	return time;
}

static unsigned long get_timer_interval(struct urb *urb, __u8 interval)
static unsigned long get_timer_interval(struct urb *urb, __u8 interval)
{
{
	__u8 i;
	__u8 i;
@@ -901,10 +927,7 @@ static void init_pipe_info(struct r8a66597 *r8a66597, struct urb *urb,
		info.interval = 0;
		info.interval = 0;
		info.timer_interval = 0;
		info.timer_interval = 0;
	} else {
	} else {
		if (ep->bInterval > IITV)
		info.interval = get_interval(urb, ep->bInterval);
			info.interval = IITV;
		else
			info.interval = ep->bInterval ? ep->bInterval - 1 : 0;
		info.timer_interval = get_timer_interval(urb, ep->bInterval);
		info.timer_interval = get_timer_interval(urb, ep->bInterval);
	}
	}
	if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
	if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)