1 /*****************************************************************************
2 * Copyright (c) 2013 IBM Corporation
4 * This program and the accompanying materials
5 * are made available under the terms of the BSD License
6 * which accompanies this distribution, and is available at
7 * http://www.opensource.org/licenses/bsd-license.php
10 * IBM Corporation - initial implementation
11 *****************************************************************************/
19 #define dprintf(_x ...) do { printf(_x); } while(0)
21 #define dprintf(_x ...)
24 #define __unused __attribute__((unused))
26 struct usb_hcd_ops *head;
27 struct usb_dev *devpool;
28 #define USB_DEVPOOL_SIZE 4096
30 static struct usb_dev *usb_alloc_devpool(void)
32 struct usb_dev *head, *curr, *prev;
33 unsigned int dev_count = 0, i;
35 head = SLOF_alloc_mem(USB_DEVPOOL_SIZE);
39 dev_count = USB_DEVPOOL_SIZE/sizeof(struct usb_dev);
40 dprintf("%s: %d number of devices\n", __func__, dev_count);
41 /* Although an array, link them*/
42 for (i = 0, curr = head, prev = NULL; i < dev_count; i++, curr++) {
50 for (i = 0, curr = head; curr; curr = curr->next)
51 printf("%s: %d dev %p\n", __func__, i++, curr);
57 struct usb_dev *usb_devpool_get(void)
62 devpool = usb_alloc_devpool();
68 devpool = devpool->next;
69 memset(new, 0, sizeof(*new));
74 void usb_devpool_put(struct usb_dev *dev)
88 #define validate_hcd_ops(dev) (dev && dev->hcidev && dev->hcidev->ops)
90 int validate_hcd_ops(struct usb_dev *dev)
95 printf("dev is NULL\n");
97 } else if (!dev->hcidev) {
98 printf("hcidev is NULL\n");
100 } else if (!dev->hcidev->ops) {
101 printf("ops is NULL\n");
108 struct usb_pipe *usb_get_pipe(struct usb_dev *dev, struct usb_ep_descr *ep,
109 char *buf, size_t len)
111 if (validate_hcd_ops(dev) && dev->hcidev->ops->get_pipe)
112 return dev->hcidev->ops->get_pipe(dev, ep, buf, len);
114 printf("%s: Failed\n", __func__);
119 void usb_put_pipe(struct usb_pipe *pipe)
121 struct usb_dev *dev = NULL;
122 if (pipe && pipe->dev) {
124 if (validate_hcd_ops(dev) && dev->hcidev->ops->put_pipe)
125 dev->hcidev->ops->put_pipe(pipe);
129 int usb_poll_intr(struct usb_pipe *pipe, uint8_t *buf)
131 struct usb_dev *dev = NULL;
132 if (pipe && pipe->dev) {
134 if (validate_hcd_ops(dev) && dev->hcidev->ops->poll_intr)
135 return dev->hcidev->ops->poll_intr(pipe, buf);
140 void usb_hcd_register(struct usb_hcd_ops *ops)
142 struct usb_hcd_ops *list;
146 dprintf("Registering %s %d\n", ops->name, ops->usb_type);
157 void usb_hcd_init(void *hcidev)
159 struct usb_hcd_dev *dev = hcidev;
160 struct usb_hcd_ops *list = head;
163 printf("Device Error");
168 if (list->usb_type == dev->type) {
169 dprintf("usb_ops(%p) for the controller found\n", list);
177 dprintf("usb_ops for the controller not found\n");
180 void usb_hcd_exit(void *_hcidev)
182 struct usb_hcd_dev *hcidev = _hcidev;
184 dprintf("%s: enter \n", __func__);
186 printf("Device Error");
190 if (hcidev->ops->exit)
191 hcidev->ops->exit(hcidev);
194 int usb_send_ctrl(struct usb_pipe *pipe, struct usb_dev_req *req, void *data)
196 struct usb_dev *dev = NULL;
200 if (validate_hcd_ops(dev) && dev->hcidev->ops->send_ctrl)
201 return dev->hcidev->ops->send_ctrl(pipe, req, data);
203 printf("%s: Failed\n", __func__);
208 int usb_transfer_ctrl(void *dev, void *req, void *data)
210 struct usb_pipe *pipe = NULL;
211 struct usb_dev *usbdev;
215 usbdev = (struct usb_dev *)dev;
216 pipe = usbdev->control;
217 return usb_send_ctrl(pipe, req, data);
220 int usb_transfer_bulk(void *dev, int dir, void *td, void *td_phys, void *data, int size)
222 struct usb_pipe *pipe = NULL;
223 struct usb_dev *usbdev;
227 usbdev = (struct usb_dev *)dev;
228 pipe = (dir == USB_PIPE_OUT) ? usbdev->bulk_out : usbdev->bulk_in;
231 if (validate_hcd_ops(usbdev) && usbdev->hcidev->ops->transfer_bulk)
232 return usbdev->hcidev->ops->transfer_bulk(pipe, td, td_phys, data, size);
234 printf("%s: Failed\n", __func__);
240 * USB Specification 1.1
241 * 9.3 USB Device Requests
242 * 9.4 Standard Device Requests
244 static int usb_set_address(struct usb_dev *dev, uint32_t port)
246 struct usb_dev_req req;
247 struct usb_hcd_dev *hcidev;
252 hcidev = dev->hcidev;
253 req.bmRequestType = 0;
254 req.bRequest = REQ_SET_ADDRESS;
257 req.wValue = cpu_to_le16((uint16_t)(hcidev->nextaddr));
258 if (usb_send_ctrl(dev->control, &req, NULL)) {
259 dev->addr = hcidev->nextaddr++;
265 static int usb_get_device_descr(struct usb_dev *dev, void *data, size_t size)
267 struct usb_dev_req req;
272 req.bmRequestType = 0x80;
273 req.bRequest = REQ_GET_DESCRIPTOR;
275 req.wLength = cpu_to_le16((uint16_t) size);
276 req.wValue = cpu_to_le16(DESCR_TYPE_DEVICE << 8);
277 return usb_send_ctrl(dev->control, &req, data);
280 static int usb_get_config_descr(struct usb_dev *dev, void *data, size_t size)
282 struct usb_dev_req req;
287 req.bmRequestType = 0x80;
288 req.bRequest = REQ_GET_DESCRIPTOR;
290 req.wLength = cpu_to_le16((uint16_t) size);
291 req.wValue = cpu_to_le16(DESCR_TYPE_CONFIGURATION << 8);
292 return usb_send_ctrl(dev->control, &req, data);
296 static int usb_set_config(struct usb_dev *dev, uint8_t cfg_value)
298 struct usb_dev_req req;
303 req.bmRequestType = 0x00;
304 req.bRequest = REQ_SET_CONFIGURATION;
307 req.wValue = cpu_to_le16(0x00FF & cfg_value);
308 return usb_send_ctrl(dev->control, &req, NULL);
311 static int usb_clear_halt(struct usb_pipe *pipe)
313 struct usb_dev_req req;
316 if (pipe && pipe->dev) {
318 dprintf("Clearing port %d dir %d type %d\n",
319 pipe->epno, pipe->dir, pipe->type);
320 req.bmRequestType = REQT_DIR_OUT | REQT_REC_EP;
321 req.bRequest = REQ_CLEAR_FEATURE;
322 req.wValue = FEATURE_ENDPOINT_HALT;
323 req.wIndex = cpu_to_le16(pipe->epno | pipe->dir);
325 return usb_send_ctrl(dev->control, &req, NULL);
330 int usb_dev_populate_pipe(struct usb_dev *dev, struct usb_ep_descr *ep,
331 void *buf, size_t len)
335 dir = (ep->bEndpointAddress & 0x80) >> 7;
336 type = ep->bmAttributes & USB_EP_TYPE_MASK;
338 dprintf("EP: %s: %d size %d type %d\n", dir ? "IN " : "OUT",
339 ep->bEndpointAddress & 0xF, le16_to_cpu(ep->wMaxPacketSize),
341 if (type == USB_EP_TYPE_BULK) {
343 dev->bulk_in = usb_get_pipe(dev, ep, buf, len);
345 dev->bulk_out = usb_get_pipe(dev, ep, buf, len);
346 } else if (type == USB_EP_TYPE_INTR)
347 dev->intr = usb_get_pipe(dev, ep, buf, len);
352 static void usb_dev_copy_epdesc(struct usb_dev *dev, struct usb_ep_descr *ep)
356 ep_cnt = dev->ep_cnt;
357 if (ep_cnt < USB_DEV_EP_MAX)
358 memcpy((void *)&dev->ep[ep_cnt], ep, sizeof(*ep));
360 dprintf("usb-core: only %d EPs supported\n", USB_DEV_EP_MAX);
364 int usb_hid_init(void *vdev)
367 dev = (struct usb_dev *) vdev;
370 if (dev->class == DEV_HID_KEYB)
371 usb_hid_kbd_init(dev);
375 int usb_hid_exit(void *vdev)
378 dev = (struct usb_dev *) vdev;
381 if (dev->class == DEV_HID_KEYB)
382 usb_hid_kbd_exit(dev);
386 int usb_msc_init(void *vdev)
391 dev = (struct usb_dev *) vdev;
392 dprintf("%s: enter %x\n", __func__, dev->class);
395 if (usb_get_intf_class(dev->class) == 8) {
396 for (i = 0; i < dev->ep_cnt; i++) {
397 if ((dev->ep[i].bmAttributes & USB_EP_TYPE_MASK)
399 usb_dev_populate_pipe(dev, &dev->ep[i], NULL, 0);
405 int usb_msc_exit(void *vdev)
408 dev = (struct usb_dev *) vdev;
409 dprintf("%s: enter %x\n", __func__, dev->class);
412 if (usb_get_intf_class(dev->class) == 8) {
414 usb_put_pipe(dev->bulk_in);
416 usb_put_pipe(dev->bulk_out);
421 int usb_msc_reset(struct usb_dev *dev)
423 struct usb_dev_req req;
428 req.bmRequestType = REQT_TYPE_CLASS | REQT_REC_INTERFACE | REQT_DIR_OUT;
432 req.wIndex = cpu_to_le16(dev->intf_num);
433 return usb_send_ctrl(dev->control, &req, NULL);
436 void usb_msc_resetrecovery(struct usb_dev *dev)
438 // usb_msc_reset(dev);
439 usb_clear_halt(dev->bulk_in);
440 usb_clear_halt(dev->bulk_out);
444 static int usb_handle_device(struct usb_dev *dev, struct usb_dev_config_descr *cfg,
445 uint8_t *ptr, uint16_t len)
447 struct usb_dev_intf_descr *intf = NULL;
448 struct usb_ep_descr *ep = NULL;
449 struct usb_dev_hid_descr *hid __unused = NULL;
450 uint8_t desc_len, desc_type;
452 len -= sizeof(struct usb_dev_config_descr);
453 ptr = (uint8_t *)(ptr + sizeof(struct usb_dev_config_descr));
457 desc_type = *(ptr + 1);
459 case DESCR_TYPE_INTERFACE:
460 intf = (struct usb_dev_intf_descr *)ptr;
461 dev->class = intf->bInterfaceClass << 16 |
462 intf->bInterfaceSubClass << 8 |
463 intf->bInterfaceProtocol;
465 case DESCR_TYPE_ENDPOINT:
466 ep = (struct usb_ep_descr *)ptr;
467 dev->intf_num = intf->bInterfaceNumber;
468 usb_dev_copy_epdesc(dev, ep);
471 hid = (struct usb_dev_hid_descr *)ptr;
472 dprintf("hid-report %d size %d\n",
473 hid->bReportType, le16_to_cpu(hid->wReportLength));
478 dprintf("ptr %p desc_type %d\n", ptr, desc_type);
486 int usb_setup_new_device(struct usb_dev *dev, unsigned int port)
488 struct usb_dev_descr descr;
489 struct usb_dev_config_descr cfg;
490 struct usb_ep_descr ep;
494 dprintf("usb: %s - port %d\n", __func__, port);
498 ep.bEndpointAddress = 0;
499 ep.bmAttributes = USB_EP_TYPE_CONTROL;
500 ep.wMaxPacketSize = cpu_to_le16(8);
501 dev->control = usb_get_pipe(dev, &ep, NULL, 0);
503 if (!usb_get_device_descr(dev, &descr, 8))
505 dev->control->mps = descr.bMaxPacketSize0;
508 * For USB3.0 ADDRESS-SLOT command takes care of setting
509 * address, skip this during generic device setup for USB3.0
512 if (dev->speed != USB_SUPER_SPEED) {
514 * Qemu starts the port number from 1 which was
515 * revealed in bootindex and resulted in mismatch for
516 * storage devices names. Adjusting this here for
519 dev->port = port + 1;
520 if(!usb_set_address(dev, dev->port))
526 if (!usb_get_device_descr(dev, &descr, sizeof(struct usb_dev_descr)))
529 if (!usb_get_config_descr(dev, &cfg, sizeof(struct usb_dev_config_descr)))
532 len = le16_to_cpu(cfg.wTotalLength);
533 /* No device config descriptor present */
534 if (len == sizeof(struct usb_dev_config_descr))
537 data = SLOF_dma_alloc(len);
539 printf("%s: alloc failed %d\n", __func__, port);
543 if (!usb_get_config_descr(dev, data, len))
545 if (!usb_set_config(dev, cfg.bConfigurationValue))
550 if (!usb_handle_device(dev, &cfg, data, len))
553 SLOF_dma_free(data, len);
556 SLOF_dma_free(data, len);