usb: Add max_streams attribute to endpoint info

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Hans de Goede 2013-11-19 14:36:56 +01:00 committed by Gerd Hoffmann
parent 5007c940a9
commit 04b300f85f
3 changed files with 27 additions and 0 deletions

View File

@ -623,6 +623,7 @@ void usb_ep_reset(USBDevice *dev)
dev->ep_ctl.type = USB_ENDPOINT_XFER_CONTROL; dev->ep_ctl.type = USB_ENDPOINT_XFER_CONTROL;
dev->ep_ctl.ifnum = 0; dev->ep_ctl.ifnum = 0;
dev->ep_ctl.max_packet_size = 64; dev->ep_ctl.max_packet_size = 64;
dev->ep_ctl.max_streams = 0;
dev->ep_ctl.dev = dev; dev->ep_ctl.dev = dev;
dev->ep_ctl.pipeline = false; dev->ep_ctl.pipeline = false;
for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) {
@ -636,6 +637,8 @@ void usb_ep_reset(USBDevice *dev)
dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID; dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID;
dev->ep_in[ep].max_packet_size = 0; dev->ep_in[ep].max_packet_size = 0;
dev->ep_out[ep].max_packet_size = 0; dev->ep_out[ep].max_packet_size = 0;
dev->ep_in[ep].max_streams = 0;
dev->ep_out[ep].max_streams = 0;
dev->ep_in[ep].dev = dev; dev->ep_in[ep].dev = dev;
dev->ep_out[ep].dev = dev; dev->ep_out[ep].dev = dev;
dev->ep_in[ep].pipeline = false; dev->ep_in[ep].pipeline = false;
@ -764,6 +767,25 @@ int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep)
return uep->max_packet_size; return uep->max_packet_size;
} }
void usb_ep_set_max_streams(USBDevice *dev, int pid, int ep, uint8_t raw)
{
struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
int MaxStreams;
MaxStreams = raw & 0x1f;
if (MaxStreams) {
uep->max_streams = 1 << MaxStreams;
} else {
uep->max_streams = 0;
}
}
int usb_ep_get_max_streams(USBDevice *dev, int pid, int ep)
{
struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
return uep->max_streams;
}
void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled) void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled)
{ {
struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);

View File

@ -385,6 +385,8 @@ static void usb_desc_ep_init(USBDevice *dev)
usb_ep_set_ifnum(dev, pid, ep, iface->bInterfaceNumber); usb_ep_set_ifnum(dev, pid, ep, iface->bInterfaceNumber);
usb_ep_set_max_packet_size(dev, pid, ep, usb_ep_set_max_packet_size(dev, pid, ep,
iface->eps[e].wMaxPacketSize); iface->eps[e].wMaxPacketSize);
usb_ep_set_max_streams(dev, pid, ep,
iface->eps[e].bmAttributes_super);
} }
} }
} }

View File

@ -189,6 +189,7 @@ struct USBEndpoint {
uint8_t type; uint8_t type;
uint8_t ifnum; uint8_t ifnum;
int max_packet_size; int max_packet_size;
int max_streams;
bool pipeline; bool pipeline;
bool halted; bool halted;
USBDevice *dev; USBDevice *dev;
@ -421,6 +422,8 @@ void usb_ep_set_ifnum(USBDevice *dev, int pid, int ep, uint8_t ifnum);
void usb_ep_set_max_packet_size(USBDevice *dev, int pid, int ep, void usb_ep_set_max_packet_size(USBDevice *dev, int pid, int ep,
uint16_t raw); uint16_t raw);
int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep); int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep);
void usb_ep_set_max_streams(USBDevice *dev, int pid, int ep, uint8_t raw);
int usb_ep_get_max_streams(USBDevice *dev, int pid, int ep);
void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled); void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled);
void usb_ep_set_halted(USBDevice *dev, int pid, int ep, bool halted); void usb_ep_set_halted(USBDevice *dev, int pid, int ep, bool halted);
USBPacket *usb_ep_find_packet_by_id(USBDevice *dev, int pid, int ep, USBPacket *usb_ep_find_packet_by_id(USBDevice *dev, int pid, int ep,