From f003397ce95441cd8de01a728affb3de7accd1dd Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 31 Aug 2011 16:09:27 +0200 Subject: usb: add max_packet_size to USBEndpoint Signed-off-by: Gerd Hoffmann --- hw/usb.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'hw/usb.c') diff --git a/hw/usb.c b/hw/usb.c index f07cb9d58c..0f163b45ff 100644 --- a/hw/usb.c +++ b/hw/usb.c @@ -449,8 +449,9 @@ void usb_ep_dump(USBDevice *dev) fprintf(stderr, " Interface %d, alternative %d\n", ifnum, dev->altsetting[ifnum]); } - fprintf(stderr, " Endpoint %d, IN, %s\n", ep, - tname[dev->ep_in[ep].type]); + fprintf(stderr, " Endpoint %d, IN, %s, %d max\n", ep, + tname[dev->ep_in[ep].type], + dev->ep_in[ep].max_packet_size); } if (dev->ep_out[ep].type != USB_ENDPOINT_XFER_INVALID && dev->ep_out[ep].ifnum == ifnum) { @@ -459,8 +460,9 @@ void usb_ep_dump(USBDevice *dev) fprintf(stderr, " Interface %d, alternative %d\n", ifnum, dev->altsetting[ifnum]); } - fprintf(stderr, " Endpoint %d, OUT, %s\n", ep, - tname[dev->ep_out[ep].type]); + fprintf(stderr, " Endpoint %d, OUT, %s, %d max\n", ep, + tname[dev->ep_out[ep].type], + dev->ep_out[ep].max_packet_size); } } } @@ -498,3 +500,30 @@ void usb_ep_set_ifnum(USBDevice *dev, int pid, int ep, uint8_t ifnum) struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); uep->ifnum = ifnum; } + +void usb_ep_set_max_packet_size(USBDevice *dev, int pid, int ep, + uint16_t raw) +{ + struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); + int size, microframes; + + size = raw & 0x7ff; + switch ((raw >> 11) & 3) { + case 1: + microframes = 2; + break; + case 2: + microframes = 3; + break; + default: + microframes = 1; + break; + } + uep->max_packet_size = size * microframes; +} + +int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep) +{ + struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); + return uep->max_packet_size; +} -- cgit v1.2.3