Pass the usbdevice_s info to device configuration and allocation code.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- src/usb-hid.c | 28 +++++++++++++++------------- src/usb-hid.h | 6 ++---- src/usb-hub.c | 8 ++++---- src/usb-hub.h | 4 ++-- src/usb-msc.c | 15 ++++++++------- src/usb-msc.h | 6 ++---- src/usb.c | 35 +++++++++++++++++++---------------- src/usb.h | 13 +++++++------ 8 files changed, 59 insertions(+), 56 deletions(-)
diff --git a/src/usb-hid.c b/src/usb-hid.c index 168b7fa..21363c3 100644 --- a/src/usb-hid.c +++ b/src/usb-hid.c @@ -49,7 +49,8 @@ set_idle(struct usb_pipe *pipe, int ms) #define KEYREPEATMS 33
static int -usb_kbd_init(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc) +usb_kbd_init(struct usbdevice_s *usbdev + , struct usb_endpoint_descriptor *epdesc) { if (! CONFIG_USB_KEYBOARD) return -1; @@ -61,15 +62,15 @@ usb_kbd_init(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc) return -1;
// Enable "boot" protocol. - int ret = set_protocol(pipe, 0); + int ret = set_protocol(usbdev->defpipe, 0); if (ret) return -1; // Periodically send reports to enable key repeat. - ret = set_idle(pipe, KEYREPEATMS); + ret = set_idle(usbdev->defpipe, KEYREPEATMS); if (ret) return -1;
- keyboard_pipe = alloc_intr_pipe(pipe, epdesc); + keyboard_pipe = alloc_intr_pipe(usbdev, epdesc); if (!keyboard_pipe) return -1;
@@ -78,7 +79,8 @@ usb_kbd_init(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc) }
static int -usb_mouse_init(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc) +usb_mouse_init(struct usbdevice_s *usbdev + , struct usb_endpoint_descriptor *epdesc) { if (! CONFIG_USB_MOUSE) return -1; @@ -90,11 +92,11 @@ usb_mouse_init(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc) return -1;
// Enable "boot" protocol. - int ret = set_protocol(pipe, 0); + int ret = set_protocol(usbdev->defpipe, 0); if (ret) return -1;
- mouse_pipe = alloc_intr_pipe(pipe, epdesc); + mouse_pipe = alloc_intr_pipe(usbdev, epdesc); if (!mouse_pipe) return -1;
@@ -104,29 +106,29 @@ usb_mouse_init(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc)
// Initialize a found USB HID device (if applicable). int -usb_hid_init(struct usb_pipe *pipe - , struct usb_interface_descriptor *iface, int imax) +usb_hid_init(struct usbdevice_s *usbdev) { if (! CONFIG_USB_KEYBOARD || ! CONFIG_USB_MOUSE) return -1; - dprintf(2, "usb_hid_init %p\n", pipe); + dprintf(2, "usb_hid_init %p\n", usbdev->defpipe);
+ struct usb_interface_descriptor *iface = usbdev->iface; if (iface->bInterfaceSubClass != USB_INTERFACE_SUBCLASS_BOOT) // Doesn't support boot protocol. return -1;
// Find intr in endpoint. struct usb_endpoint_descriptor *epdesc = findEndPointDesc( - iface, imax, USB_ENDPOINT_XFER_INT, USB_DIR_IN); + usbdev, USB_ENDPOINT_XFER_INT, USB_DIR_IN); if (!epdesc) { dprintf(1, "No usb hid intr in?\n"); return -1; }
if (iface->bInterfaceProtocol == USB_INTERFACE_PROTOCOL_KEYBOARD) - return usb_kbd_init(pipe, epdesc); + return usb_kbd_init(usbdev, epdesc); if (iface->bInterfaceProtocol == USB_INTERFACE_PROTOCOL_MOUSE) - return usb_mouse_init(pipe, epdesc); + return usb_mouse_init(usbdev, epdesc); return -1; }
diff --git a/src/usb-hid.h b/src/usb-hid.h index 7fbcf4b..bd6445c 100644 --- a/src/usb-hid.h +++ b/src/usb-hid.h @@ -2,10 +2,8 @@ #define __USB_HID_H
// usb-hid.c -struct usb_interface_descriptor; -struct usb_pipe; -int usb_hid_init(struct usb_pipe *pipe - , struct usb_interface_descriptor *iface, int imax); +struct usbdevice_s; +int usb_hid_init(struct usbdevice_s *usbdev); inline int usb_kbd_active(void); inline int usb_kbd_command(int command, u8 *param); inline int usb_mouse_active(void); diff --git a/src/usb-hub.c b/src/usb-hub.c index b2d9ff2..caa6a3b 100644 --- a/src/usb-hub.c +++ b/src/usb-hub.c @@ -158,21 +158,21 @@ static struct usbhub_op_s HubOp = {
// Configure a usb hub and then find devices connected to it. int -usb_hub_init(struct usb_pipe *pipe) +usb_hub_init(struct usbdevice_s *usbdev) { ASSERT32FLAT(); if (!CONFIG_USB_HUB) return -1;
struct usb_hub_descriptor desc; - int ret = get_hub_desc(pipe, &desc); + int ret = get_hub_desc(usbdev->defpipe, &desc); if (ret) return ret;
struct usbhub_s hub; memset(&hub, 0, sizeof(hub)); - hub.pipe = pipe; - hub.cntl = pipe->cntl; + hub.pipe = usbdev->defpipe; + hub.cntl = usbdev->defpipe->cntl; hub.powerwait = desc.bPwrOn2PwrGood * 2; hub.portcount = desc.bNbrPorts; hub.op = &HubOp; diff --git a/src/usb-hub.h b/src/usb-hub.h index 7672028..a75cbda 100644 --- a/src/usb-hub.h +++ b/src/usb-hub.h @@ -2,8 +2,8 @@ #define __USB_HUB_H
// usb-hub.c -struct usb_pipe; -int usb_hub_init(struct usb_pipe *pipe); +struct usbdevice_s; +int usb_hub_init(struct usbdevice_s *usbdev);
/**************************************************************** diff --git a/src/usb-msc.c b/src/usb-msc.c index e143401..dad90d6 100644 --- a/src/usb-msc.c +++ b/src/usb-msc.c @@ -124,13 +124,13 @@ fail:
// Configure a usb msc device. int -usb_msc_init(struct usb_pipe *pipe - , struct usb_interface_descriptor *iface, int imax) +usb_msc_init(struct usbdevice_s *usbdev) { if (!CONFIG_USB_MSC) return -1;
// Verify right kind of device + struct usb_interface_descriptor *iface = usbdev->iface; if ((iface->bInterfaceSubClass != US_SC_SCSI && iface->bInterfaceSubClass != US_SC_ATAPI_8070 && iface->bInterfaceSubClass != US_SC_ATAPI_8020) @@ -151,17 +151,18 @@ usb_msc_init(struct usb_pipe *pipe
// Find bulk in and bulk out endpoints. struct usb_endpoint_descriptor *indesc = findEndPointDesc( - iface, imax, USB_ENDPOINT_XFER_BULK, USB_DIR_IN); + usbdev, USB_ENDPOINT_XFER_BULK, USB_DIR_IN); struct usb_endpoint_descriptor *outdesc = findEndPointDesc( - iface, imax, USB_ENDPOINT_XFER_BULK, USB_DIR_OUT); + usbdev, USB_ENDPOINT_XFER_BULK, USB_DIR_OUT); if (!indesc || !outdesc) goto fail; - udrive_g->bulkin = alloc_bulk_pipe(pipe, indesc); - udrive_g->bulkout = alloc_bulk_pipe(pipe, outdesc); + udrive_g->bulkin = alloc_bulk_pipe(usbdev, indesc); + udrive_g->bulkout = alloc_bulk_pipe(usbdev, outdesc); if (!udrive_g->bulkin || !udrive_g->bulkout) goto fail;
- int prio = bootprio_find_usb(pipe->cntl->pci, pipe->path); + int prio = bootprio_find_usb(usbdev->defpipe->cntl->pci + , usbdev->defpipe->path); int ret = scsi_init_drive(&udrive_g->drive, "USB MSC", prio); if (ret) goto fail; diff --git a/src/usb-msc.h b/src/usb-msc.h index 12d749c..31c81b9 100644 --- a/src/usb-msc.h +++ b/src/usb-msc.h @@ -4,10 +4,8 @@ // usb-msc.c struct disk_op_s; int usb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize); -struct usb_interface_descriptor; -struct usb_pipe; -int usb_msc_init(struct usb_pipe *pipe - , struct usb_interface_descriptor *iface, int imax); +struct usbdevice_s; +int usb_msc_init(struct usbdevice_s *usbdev);
/**************************************************************** diff --git a/src/usb.c b/src/usb.c index 81aa429..1657bf5 100644 --- a/src/usb.c +++ b/src/usb.c @@ -86,19 +86,20 @@ send_control(struct usb_pipe *pipe, int dir, const void *cmd, int cmdsize
// Fill "pipe" endpoint info from an endpoint descriptor. static void -desc2pipe(struct usb_pipe *newpipe, struct usb_pipe *origpipe +desc2pipe(struct usb_pipe *newpipe, struct usbdevice_s *usbdev , struct usb_endpoint_descriptor *epdesc) { - memcpy(newpipe, origpipe, sizeof(*newpipe)); + memcpy(newpipe, usbdev->defpipe, sizeof(*newpipe)); newpipe->ep = epdesc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; newpipe->maxpacket = epdesc->wMaxPacketSize; }
struct usb_pipe * -alloc_bulk_pipe(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc) +alloc_bulk_pipe(struct usbdevice_s *usbdev + , struct usb_endpoint_descriptor *epdesc) { struct usb_pipe dummy; - desc2pipe(&dummy, pipe, epdesc); + desc2pipe(&dummy, usbdev, epdesc); dummy.eptype = USB_ENDPOINT_XFER_BULK; return alloc_async_pipe(&dummy); } @@ -118,18 +119,19 @@ usb_send_bulk(struct usb_pipe *pipe_fl, int dir, void *data, int datasize) }
struct usb_pipe * -alloc_intr_pipe(struct usb_pipe *pipe, struct usb_endpoint_descriptor *epdesc) +alloc_intr_pipe(struct usbdevice_s *usbdev + , struct usb_endpoint_descriptor *epdesc) { struct usb_pipe dummy; - desc2pipe(&dummy, pipe, epdesc); + desc2pipe(&dummy, usbdev, epdesc); // Find the exponential period of the requested time. int period = epdesc->bInterval; int frameexp; - if (pipe->speed != USB_HIGHSPEED) + if (usbdev->speed != USB_HIGHSPEED) frameexp = (period <= 0) ? 0 : __fls(period); else frameexp = (period <= 4) ? 0 : period - 4; - switch (pipe->type) { + switch (dummy.type) { default: case USB_TYPE_UHCI: return uhci_alloc_intr_pipe(&dummy, frameexp); @@ -161,12 +163,11 @@ usb_poll_intr(struct usb_pipe *pipe_fl, void *data)
// Find the first endpoing of a given type in an interface description. struct usb_endpoint_descriptor * -findEndPointDesc(struct usb_interface_descriptor *iface, int imax - , int type, int dir) +findEndPointDesc(struct usbdevice_s *usbdev, int type, int dir) { - struct usb_endpoint_descriptor *epdesc = (void*)&iface[1]; + struct usb_endpoint_descriptor *epdesc = (void*)&usbdev->iface[1]; for (;;) { - if ((void*)epdesc >= (void*)iface + imax + if ((void*)epdesc >= (void*)usbdev->iface + usbdev->imax || epdesc->bDescriptorType == USB_DT_INTERFACE) { return NULL; } @@ -345,13 +346,15 @@ configure_usb_device(struct usbdevice_s *usbdev) goto fail;
// Configure driver. - int imax = (void*)config + config->wTotalLength - (void*)iface; + usbdev->config = config; + usbdev->iface = iface; + usbdev->imax = (void*)config + config->wTotalLength - (void*)iface; if (iface->bInterfaceClass == USB_CLASS_HUB) - ret = usb_hub_init(pipe); + ret = usb_hub_init(usbdev); else if (iface->bInterfaceClass == USB_CLASS_MASS_STORAGE) - ret = usb_msc_init(pipe, iface, imax); + ret = usb_msc_init(usbdev); else - ret = usb_hid_init(pipe, iface, imax); + ret = usb_hid_init(usbdev); if (ret) goto fail;
diff --git a/src/usb.h b/src/usb.h index ab7f559..83ccb58 100644 --- a/src/usb.h +++ b/src/usb.h @@ -26,6 +26,9 @@ struct usbdevice_s { struct usbhub_s *hub; struct usb_pipe *defpipe; u32 port; + struct usb_config_descriptor *config; + struct usb_interface_descriptor *iface; + int imax; u8 speed; };
@@ -215,14 +218,12 @@ int send_default_control(struct usb_pipe *pipe, const struct usb_ctrlrequest *re , void *data); int usb_send_bulk(struct usb_pipe *pipe, int dir, void *data, int datasize); void free_pipe(struct usb_pipe *pipe); -struct usb_pipe *alloc_bulk_pipe(struct usb_pipe *pipe +struct usb_pipe *alloc_bulk_pipe(struct usbdevice_s *usbdev , struct usb_endpoint_descriptor *epdesc); -struct usb_pipe *alloc_intr_pipe(struct usb_pipe *pipe +struct usb_pipe *alloc_intr_pipe(struct usbdevice_s *usbdev , struct usb_endpoint_descriptor *epdesc); int usb_poll_intr(struct usb_pipe *pipe, void *data); -struct usb_endpoint_descriptor *findEndPointDesc( - struct usb_interface_descriptor *iface, int imax, int type, int dir); -u32 mkendpFromDesc(struct usb_pipe *pipe - , struct usb_endpoint_descriptor *epdesc); +struct usb_endpoint_descriptor *findEndPointDesc(struct usbdevice_s *usbdev + , int type, int dir);
#endif // usb.h