Deleted Added
full compact
linux_usb.c (194227) linux_usb.c (194228)
1/* $FreeBSD: head/sys/dev/usb/usb_compat_linux.c 194227 2009-06-15 00:33:18Z thompsa $ */
1/* $FreeBSD: head/sys/dev/usb/usb_compat_linux.c 194228 2009-06-15 01:02:43Z thompsa $ */
2/*-
3 * Copyright (c) 2007 Luigi Rizzo - Universita` di Pisa. All rights reserved.
4 * Copyright (c) 2007 Hans Petter Selasky. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright

--- 15 unchanged lines hidden (view full) ---

25 * SUCH DAMAGE.
26 */
27
28#include <dev/usb/usb_mfunc.h>
29#include <dev/usb/usb.h>
30#include <dev/usb/usb_error.h>
31#include <dev/usb/usb_ioctl.h>
32
2/*-
3 * Copyright (c) 2007 Luigi Rizzo - Universita` di Pisa. All rights reserved.
4 * Copyright (c) 2007 Hans Petter Selasky. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright

--- 15 unchanged lines hidden (view full) ---

25 * SUCH DAMAGE.
26 */
27
28#include <dev/usb/usb_mfunc.h>
29#include <dev/usb/usb.h>
30#include <dev/usb/usb_error.h>
31#include <dev/usb/usb_ioctl.h>
32
33#define USB_DEBUG_VAR usb2_debug
33#define USB_DEBUG_VAR usb_debug
34
35#include <dev/usb/usb_core.h>
36#include <dev/usb/usb_compat_linux.h>
37#include <dev/usb/usb_process.h>
38#include <dev/usb/usb_device.h>
39#include <dev/usb/usb_util.h>
40#include <dev/usb/usb_busdma.h>
41#include <dev/usb/usb_transfer.h>

--- 207 unchanged lines hidden (view full) ---

249 }
250 mtx_unlock(&Giant);
251
252 if (id == NULL) {
253 return (ENXIO);
254 }
255 if (usb_linux_create_usb_device(uaa->device, dev) != 0)
256 return (ENOMEM);
34
35#include <dev/usb/usb_core.h>
36#include <dev/usb/usb_compat_linux.h>
37#include <dev/usb/usb_process.h>
38#include <dev/usb/usb_device.h>
39#include <dev/usb/usb_util.h>
40#include <dev/usb/usb_busdma.h>
41#include <dev/usb/usb_transfer.h>

--- 207 unchanged lines hidden (view full) ---

249 }
250 mtx_unlock(&Giant);
251
252 if (id == NULL) {
253 return (ENXIO);
254 }
255 if (usb_linux_create_usb_device(uaa->device, dev) != 0)
256 return (ENOMEM);
257 device_set_usb2_desc(dev);
257 device_set_usb_desc(dev);
258
259 sc->sc_fbsd_udev = uaa->device;
260 sc->sc_fbsd_dev = dev;
261 sc->sc_udrv = udrv;
262 sc->sc_ui = usb_ifnum_to_if(uaa->device, uaa->info.bIfaceNum);
263 if (sc->sc_ui == NULL) {
264 return (EINVAL);
265 }

--- 88 unchanged lines hidden (view full) ---

354 *
355 * The following function returns the maximum number of isochronous
356 * frames that we support per URB. It is not part of the Linux USB API.
357 *------------------------------------------------------------------------*/
358static uint16_t
359usb_max_isoc_frames(struct usb_device *dev)
360{
361 ; /* indent fix */
258
259 sc->sc_fbsd_udev = uaa->device;
260 sc->sc_fbsd_dev = dev;
261 sc->sc_udrv = udrv;
262 sc->sc_ui = usb_ifnum_to_if(uaa->device, uaa->info.bIfaceNum);
263 if (sc->sc_ui == NULL) {
264 return (EINVAL);
265 }

--- 88 unchanged lines hidden (view full) ---

354 *
355 * The following function returns the maximum number of isochronous
356 * frames that we support per URB. It is not part of the Linux USB API.
357 *------------------------------------------------------------------------*/
358static uint16_t
359usb_max_isoc_frames(struct usb_device *dev)
360{
361 ; /* indent fix */
362 switch (usb2_get_speed(dev)) {
362 switch (usbd_get_speed(dev)) {
363 case USB_SPEED_LOW:
364 case USB_SPEED_FULL:
365 return (USB_MAX_FULL_SPEED_ISOC_FRAMES);
366 default:
367 return (USB_MAX_HIGH_SPEED_ISOC_FRAMES);
368 }
369}
370

--- 27 unchanged lines hidden (view full) ---

398 if (uhe->bsd_xfer[0] ||
399 uhe->bsd_xfer[1]) {
400 /* we are ready! */
401
402 TAILQ_INSERT_HEAD(&uhe->bsd_urb_list, urb, bsd_urb_list);
403
404 urb->status = -EINPROGRESS;
405
363 case USB_SPEED_LOW:
364 case USB_SPEED_FULL:
365 return (USB_MAX_FULL_SPEED_ISOC_FRAMES);
366 default:
367 return (USB_MAX_HIGH_SPEED_ISOC_FRAMES);
368 }
369}
370

--- 27 unchanged lines hidden (view full) ---

398 if (uhe->bsd_xfer[0] ||
399 uhe->bsd_xfer[1]) {
400 /* we are ready! */
401
402 TAILQ_INSERT_HEAD(&uhe->bsd_urb_list, urb, bsd_urb_list);
403
404 urb->status = -EINPROGRESS;
405
406 usb2_transfer_start(uhe->bsd_xfer[0]);
407 usb2_transfer_start(uhe->bsd_xfer[1]);
406 usbd_transfer_start(uhe->bsd_xfer[0]);
407 usbd_transfer_start(uhe->bsd_xfer[1]);
408 } else {
409 /* no pipes have been setup yet! */
410 urb->status = -EINVAL;
411 return (-EINVAL);
412 }
413 return (0);
414}
415

--- 9 unchanged lines hidden (view full) ---

425 return (usb_unlink_urb_sub(urb, 0));
426}
427
428static void
429usb_unlink_bsd(struct usb_xfer *xfer,
430 struct urb *urb, uint8_t drain)
431{
432 if (xfer &&
408 } else {
409 /* no pipes have been setup yet! */
410 urb->status = -EINVAL;
411 return (-EINVAL);
412 }
413 return (0);
414}
415

--- 9 unchanged lines hidden (view full) ---

425 return (usb_unlink_urb_sub(urb, 0));
426}
427
428static void
429usb_unlink_bsd(struct usb_xfer *xfer,
430 struct urb *urb, uint8_t drain)
431{
432 if (xfer &&
433 usb2_transfer_pending(xfer) &&
433 usbd_transfer_pending(xfer) &&
434 (xfer->priv_fifo == (void *)urb)) {
435 if (drain) {
436 mtx_unlock(&Giant);
434 (xfer->priv_fifo == (void *)urb)) {
435 if (drain) {
436 mtx_unlock(&Giant);
437 usb2_transfer_drain(xfer);
437 usbd_transfer_drain(xfer);
438 mtx_lock(&Giant);
439 } else {
438 mtx_lock(&Giant);
439 } else {
440 usb2_transfer_stop(xfer);
440 usbd_transfer_stop(xfer);
441 }
441 }
442 usb2_transfer_start(xfer);
442 usbd_transfer_start(xfer);
443 }
444}
445
446static int
447usb_unlink_urb_sub(struct urb *urb, uint8_t drain)
448{
449 struct usb_host_endpoint *uhe;
450 uint16_t x;

--- 59 unchanged lines hidden (view full) ---

510 addr = uhe->desc.bEndpointAddress;
511
512 bzero(cfg, sizeof(cfg));
513
514 cfg[0].type = type;
515 cfg[0].endpoint = addr & UE_ADDR;
516 cfg[0].direction = addr & (UE_DIR_OUT | UE_DIR_IN);
517
443 }
444}
445
446static int
447usb_unlink_urb_sub(struct urb *urb, uint8_t drain)
448{
449 struct usb_host_endpoint *uhe;
450 uint16_t x;

--- 59 unchanged lines hidden (view full) ---

510 addr = uhe->desc.bEndpointAddress;
511
512 bzero(cfg, sizeof(cfg));
513
514 cfg[0].type = type;
515 cfg[0].endpoint = addr & UE_ADDR;
516 cfg[0].direction = addr & (UE_DIR_OUT | UE_DIR_IN);
517
518 ep = usb2_get_endpoint(dev, uhe->bsd_iface_index, cfg);
518 ep = usbd_get_endpoint(dev, uhe->bsd_iface_index, cfg);
519 if (ep == NULL)
520 return (-EINVAL);
521
519 if (ep == NULL)
520 return (-EINVAL);
521
522 usb2_clear_data_toggle(dev, ep);
522 usbd_clear_data_toggle(dev, ep);
523
524 return (usb_control_msg(dev, &dev->ep0,
525 UR_CLEAR_FEATURE, UT_WRITE_ENDPOINT,
526 UF_ENDPOINT_HALT, addr, NULL, 0, 1000));
527}
528
529/*------------------------------------------------------------------------*
530 * usb_start_wait_urb

--- 82 unchanged lines hidden (view full) ---

613 if (type != UE_CONTROL) {
614 return (-EINVAL);
615 }
616 if (addr == 0) {
617 /*
618 * The FreeBSD USB stack supports standard control
619 * transfers on control endpoint zero:
620 */
523
524 return (usb_control_msg(dev, &dev->ep0,
525 UR_CLEAR_FEATURE, UT_WRITE_ENDPOINT,
526 UF_ENDPOINT_HALT, addr, NULL, 0, 1000));
527}
528
529/*------------------------------------------------------------------------*
530 * usb_start_wait_urb

--- 82 unchanged lines hidden (view full) ---

613 if (type != UE_CONTROL) {
614 return (-EINVAL);
615 }
616 if (addr == 0) {
617 /*
618 * The FreeBSD USB stack supports standard control
619 * transfers on control endpoint zero:
620 */
621 err = usb2_do_request_flags(dev,
621 err = usbd_do_request_flags(dev,
622 &Giant, &req, data, USB_SHORT_XFER_OK,
623 &actlen, timeout);
624 if (err) {
625 err = -EPIPE;
626 } else {
627 err = actlen;
628 }
629 return (err);

--- 54 unchanged lines hidden (view full) ---

684 struct usb_interface *p_ui = usb_ifnum_to_if(dev, iface_no);
685 int err;
686
687 if (p_ui == NULL)
688 return (-EINVAL);
689 if (alt_index >= p_ui->num_altsetting)
690 return (-EINVAL);
691 usb_linux_cleanup_interface(dev, p_ui);
622 &Giant, &req, data, USB_SHORT_XFER_OK,
623 &actlen, timeout);
624 if (err) {
625 err = -EPIPE;
626 } else {
627 err = actlen;
628 }
629 return (err);

--- 54 unchanged lines hidden (view full) ---

684 struct usb_interface *p_ui = usb_ifnum_to_if(dev, iface_no);
685 int err;
686
687 if (p_ui == NULL)
688 return (-EINVAL);
689 if (alt_index >= p_ui->num_altsetting)
690 return (-EINVAL);
691 usb_linux_cleanup_interface(dev, p_ui);
692 err = -usb2_set_alt_interface_index(dev,
692 err = -usbd_set_alt_interface_index(dev,
693 p_ui->bsd_iface_index, alt_index);
694 if (err == 0) {
695 p_ui->cur_altsetting = p_ui->altsetting + alt_index;
696 }
697 return (err);
698}
699
700/*------------------------------------------------------------------------*

--- 14 unchanged lines hidden (view full) ---

715 struct usb_config cfg[2];
716 uint8_t type = uhe->desc.bmAttributes & UE_XFERTYPE;
717 uint8_t addr = uhe->desc.bEndpointAddress;
718
719 if (uhe->fbsd_buf_size == bufsize) {
720 /* optimize */
721 return (0);
722 }
693 p_ui->bsd_iface_index, alt_index);
694 if (err == 0) {
695 p_ui->cur_altsetting = p_ui->altsetting + alt_index;
696 }
697 return (err);
698}
699
700/*------------------------------------------------------------------------*

--- 14 unchanged lines hidden (view full) ---

715 struct usb_config cfg[2];
716 uint8_t type = uhe->desc.bmAttributes & UE_XFERTYPE;
717 uint8_t addr = uhe->desc.bEndpointAddress;
718
719 if (uhe->fbsd_buf_size == bufsize) {
720 /* optimize */
721 return (0);
722 }
723 usb2_transfer_unsetup(uhe->bsd_xfer, 2);
723 usbd_transfer_unsetup(uhe->bsd_xfer, 2);
724
725 uhe->fbsd_buf_size = bufsize;
726
727 if (bufsize == 0) {
728 return (0);
729 }
730 bzero(cfg, sizeof(cfg));
731

--- 22 unchanged lines hidden (view full) ---

754 cfg[0].flags.ext_buffer = 1;
755#endif
756 cfg[0].flags.short_xfer_ok = 1;
757
758 bcopy(cfg, cfg + 1, sizeof(*cfg));
759
760 /* Allocate and setup two generic FreeBSD USB transfers */
761
724
725 uhe->fbsd_buf_size = bufsize;
726
727 if (bufsize == 0) {
728 return (0);
729 }
730 bzero(cfg, sizeof(cfg));
731

--- 22 unchanged lines hidden (view full) ---

754 cfg[0].flags.ext_buffer = 1;
755#endif
756 cfg[0].flags.short_xfer_ok = 1;
757
758 bcopy(cfg, cfg + 1, sizeof(*cfg));
759
760 /* Allocate and setup two generic FreeBSD USB transfers */
761
762 if (usb2_transfer_setup(dev, &uhe->bsd_iface_index,
762 if (usbd_transfer_setup(dev, &uhe->bsd_iface_index,
763 uhe->bsd_xfer, cfg, 2, uhe, &Giant)) {
764 return (-EINVAL);
765 }
766 } else {
767 if (bufsize > (1 << 22)) {
768 /* limit buffer size */
769 bufsize = (1 << 22);
770 }
771 /* Allocate and setup one generic FreeBSD USB transfer */
772
773 cfg[0].type = type;
774 cfg[0].endpoint = addr & UE_ADDR;
775 cfg[0].direction = addr & (UE_DIR_OUT | UE_DIR_IN);
776 cfg[0].callback = &usb_linux_non_isoc_callback;
777 cfg[0].bufsize = bufsize;
778 cfg[0].flags.ext_buffer = 1; /* enable zero-copy */
779 cfg[0].flags.proxy_buffer = 1;
780 cfg[0].flags.short_xfer_ok = 1;
781
763 uhe->bsd_xfer, cfg, 2, uhe, &Giant)) {
764 return (-EINVAL);
765 }
766 } else {
767 if (bufsize > (1 << 22)) {
768 /* limit buffer size */
769 bufsize = (1 << 22);
770 }
771 /* Allocate and setup one generic FreeBSD USB transfer */
772
773 cfg[0].type = type;
774 cfg[0].endpoint = addr & UE_ADDR;
775 cfg[0].direction = addr & (UE_DIR_OUT | UE_DIR_IN);
776 cfg[0].callback = &usb_linux_non_isoc_callback;
777 cfg[0].bufsize = bufsize;
778 cfg[0].flags.ext_buffer = 1; /* enable zero-copy */
779 cfg[0].flags.proxy_buffer = 1;
780 cfg[0].flags.short_xfer_ok = 1;
781
782 if (usb2_transfer_setup(dev, &uhe->bsd_iface_index,
782 if (usbd_transfer_setup(dev, &uhe->bsd_iface_index,
783 uhe->bsd_xfer, cfg, 1, uhe, &Giant)) {
784 return (-EINVAL);
785 }
786 }
787 return (0);
788}
789
790/*------------------------------------------------------------------------*
791 * usb_linux_create_usb_device
792 *
793 * The following function is used to build up a per USB device
794 * structure tree, that mimics the Linux one. The root structure
795 * is returned by this function.
796 *------------------------------------------------------------------------*/
797static int
798usb_linux_create_usb_device(struct usb_device *udev, device_t dev)
799{
783 uhe->bsd_xfer, cfg, 1, uhe, &Giant)) {
784 return (-EINVAL);
785 }
786 }
787 return (0);
788}
789
790/*------------------------------------------------------------------------*
791 * usb_linux_create_usb_device
792 *
793 * The following function is used to build up a per USB device
794 * structure tree, that mimics the Linux one. The root structure
795 * is returned by this function.
796 *------------------------------------------------------------------------*/
797static int
798usb_linux_create_usb_device(struct usb_device *udev, device_t dev)
799{
800 struct usb_config_descriptor *cd = usb2_get_config_descriptor(udev);
800 struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev);
801 struct usb_descriptor *desc;
802 struct usb_interface_descriptor *id;
803 struct usb_endpoint_descriptor *ed;
804 struct usb_interface *p_ui = NULL;
805 struct usb_host_interface *p_uhi = NULL;
806 struct usb_host_endpoint *p_uhe = NULL;
807 usb_size_t size;
808 uint16_t niface_total;

--- 14 unchanged lines hidden (view full) ---

823 iface_index = 0;
824 nedesc = 0;
825 desc = NULL;
826
827 /*
828 * Iterate over all the USB descriptors. Use the USB config
829 * descriptor pointer provided by the FreeBSD USB stack.
830 */
801 struct usb_descriptor *desc;
802 struct usb_interface_descriptor *id;
803 struct usb_endpoint_descriptor *ed;
804 struct usb_interface *p_ui = NULL;
805 struct usb_host_interface *p_uhi = NULL;
806 struct usb_host_endpoint *p_uhe = NULL;
807 usb_size_t size;
808 uint16_t niface_total;

--- 14 unchanged lines hidden (view full) ---

823 iface_index = 0;
824 nedesc = 0;
825 desc = NULL;
826
827 /*
828 * Iterate over all the USB descriptors. Use the USB config
829 * descriptor pointer provided by the FreeBSD USB stack.
830 */
831 while ((desc = usb2_desc_foreach(cd, desc))) {
831 while ((desc = usb_desc_foreach(cd, desc))) {
832
833 /*
834 * Build up a tree according to the descriptors we
835 * find:
836 */
837 switch (desc->bDescriptorType) {
838 case UDESC_DEVICE:
839 break;

--- 220 unchanged lines hidden (view full) ---

1060 *------------------------------------------------------------------------*/
1061void *
1062usb_buffer_alloc(struct usb_device *dev, usb_size_t size, uint16_t mem_flags, uint8_t *dma_addr)
1063{
1064 return (malloc(size, M_USBDEV, M_WAITOK | M_ZERO));
1065}
1066
1067/*------------------------------------------------------------------------*
832
833 /*
834 * Build up a tree according to the descriptors we
835 * find:
836 */
837 switch (desc->bDescriptorType) {
838 case UDESC_DEVICE:
839 break;

--- 220 unchanged lines hidden (view full) ---

1060 *------------------------------------------------------------------------*/
1061void *
1062usb_buffer_alloc(struct usb_device *dev, usb_size_t size, uint16_t mem_flags, uint8_t *dma_addr)
1063{
1064 return (malloc(size, M_USBDEV, M_WAITOK | M_ZERO));
1065}
1066
1067/*------------------------------------------------------------------------*
1068 * usb_get_intfdata
1068 * usbd_get_intfdata
1069 *------------------------------------------------------------------------*/
1070void *
1069 *------------------------------------------------------------------------*/
1070void *
1071usb_get_intfdata(struct usb_interface *intf)
1071usbd_get_intfdata(struct usb_interface *intf)
1072{
1073 return (intf->bsd_priv_sc);
1074}
1075
1076/*------------------------------------------------------------------------*
1077 * usb_linux_register
1078 *
1079 * The following function is used by the "USB_DRIVER_EXPORT()" macro,

--- 6 unchanged lines hidden (view full) ---

1086usb_linux_register(void *arg)
1087{
1088 struct usb_driver *drv = arg;
1089
1090 mtx_lock(&Giant);
1091 LIST_INSERT_HEAD(&usb_linux_driver_list, drv, linux_driver_list);
1092 mtx_unlock(&Giant);
1093
1072{
1073 return (intf->bsd_priv_sc);
1074}
1075
1076/*------------------------------------------------------------------------*
1077 * usb_linux_register
1078 *
1079 * The following function is used by the "USB_DRIVER_EXPORT()" macro,

--- 6 unchanged lines hidden (view full) ---

1086usb_linux_register(void *arg)
1087{
1088 struct usb_driver *drv = arg;
1089
1090 mtx_lock(&Giant);
1091 LIST_INSERT_HEAD(&usb_linux_driver_list, drv, linux_driver_list);
1092 mtx_unlock(&Giant);
1093
1094 usb2_needs_explore_all();
1094 usb_needs_explore_all();
1095}
1096
1097/*------------------------------------------------------------------------*
1098 * usb_linux_deregister
1099 *
1100 * The following function is used by the "USB_DRIVER_EXPORT()" macro,
1101 * and is used to deregister a Linux USB driver. This function will
1102 * ensure that all driver instances belonging to the Linux USB device

--- 198 unchanged lines hidden (view full) ---

1301
1302 offset = 0;
1303
1304 for (x = 0; x < urb->number_of_packets; x++) {
1305 uipd = urb->iso_frame_desc + x;
1306 uipd->actual_length = xfer->frlengths[x];
1307 uipd->status = 0;
1308 if (!xfer->flags.ext_buffer) {
1095}
1096
1097/*------------------------------------------------------------------------*
1098 * usb_linux_deregister
1099 *
1100 * The following function is used by the "USB_DRIVER_EXPORT()" macro,
1101 * and is used to deregister a Linux USB driver. This function will
1102 * ensure that all driver instances belonging to the Linux USB device

--- 198 unchanged lines hidden (view full) ---

1301
1302 offset = 0;
1303
1304 for (x = 0; x < urb->number_of_packets; x++) {
1305 uipd = urb->iso_frame_desc + x;
1306 uipd->actual_length = xfer->frlengths[x];
1307 uipd->status = 0;
1308 if (!xfer->flags.ext_buffer) {
1309 usb2_copy_out(xfer->frbuffers, offset,
1309 usbd_copy_out(xfer->frbuffers, offset,
1310 USB_ADD_BYTES(urb->transfer_buffer,
1311 uipd->offset), uipd->actual_length);
1312 }
1313 offset += max_frame;
1314 }
1315 } else {
1316 for (x = 0; x < urb->number_of_packets; x++) {
1317 uipd = urb->iso_frame_desc + x;

--- 54 unchanged lines hidden (view full) ---

1372 /* copy out data with regard to the URB */
1373
1374 offset = 0;
1375
1376 for (x = 0; x < urb->number_of_packets; x++) {
1377 uipd = urb->iso_frame_desc + x;
1378 xfer->frlengths[x] = uipd->length;
1379 if (!xfer->flags.ext_buffer) {
1310 USB_ADD_BYTES(urb->transfer_buffer,
1311 uipd->offset), uipd->actual_length);
1312 }
1313 offset += max_frame;
1314 }
1315 } else {
1316 for (x = 0; x < urb->number_of_packets; x++) {
1317 uipd = urb->iso_frame_desc + x;

--- 54 unchanged lines hidden (view full) ---

1372 /* copy out data with regard to the URB */
1373
1374 offset = 0;
1375
1376 for (x = 0; x < urb->number_of_packets; x++) {
1377 uipd = urb->iso_frame_desc + x;
1378 xfer->frlengths[x] = uipd->length;
1379 if (!xfer->flags.ext_buffer) {
1380 usb2_copy_in(xfer->frbuffers, offset,
1380 usbd_copy_in(xfer->frbuffers, offset,
1381 USB_ADD_BYTES(urb->transfer_buffer,
1382 uipd->offset), uipd->length);
1383 }
1384 offset += uipd->length;
1385 }
1386 } else {
1387
1388 /*

--- 8 unchanged lines hidden (view full) ---

1397 for (x = 0; x < urb->number_of_packets; x++) {
1398 uipd = urb->iso_frame_desc + x;
1399 xfer->frlengths[x] = max_frame;
1400 }
1401 }
1402
1403 if (xfer->flags.ext_buffer) {
1404 /* set virtual address to load */
1381 USB_ADD_BYTES(urb->transfer_buffer,
1382 uipd->offset), uipd->length);
1383 }
1384 offset += uipd->length;
1385 }
1386 } else {
1387
1388 /*

--- 8 unchanged lines hidden (view full) ---

1397 for (x = 0; x < urb->number_of_packets; x++) {
1398 uipd = urb->iso_frame_desc + x;
1399 xfer->frlengths[x] = max_frame;
1400 }
1401 }
1402
1403 if (xfer->flags.ext_buffer) {
1404 /* set virtual address to load */
1405 usb2_set_frame_data(xfer,
1405 usbd_set_frame_data(xfer,
1406 urb->transfer_buffer, 0);
1407 }
1408 xfer->priv_fifo = urb;
1409 xfer->flags.force_short_xfer = 0;
1410 xfer->timeout = urb->timeout;
1411 xfer->nframes = urb->number_of_packets;
1406 urb->transfer_buffer, 0);
1407 }
1408 xfer->priv_fifo = urb;
1409 xfer->flags.force_short_xfer = 0;
1410 xfer->timeout = urb->timeout;
1411 xfer->nframes = urb->number_of_packets;
1412 usb2_start_hardware(xfer);
1412 usbd_transfer_submit(xfer);
1413 return;
1414
1415 default: /* Error */
1416 if (xfer->error == USB_ERR_CANCELLED) {
1417 urb->status = -ECONNRESET;
1418 } else {
1419 urb->status = -EPIPE; /* stalled */
1420 }

--- 47 unchanged lines hidden (view full) ---

1468 if (xfer->flags_int.control_xfr) {
1469
1470 /* don't transfer the setup packet again: */
1471
1472 xfer->frlengths[0] = 0;
1473 }
1474 if (urb->bsd_isread && (!xfer->flags.ext_buffer)) {
1475 /* copy in data with regard to the URB */
1413 return;
1414
1415 default: /* Error */
1416 if (xfer->error == USB_ERR_CANCELLED) {
1417 urb->status = -ECONNRESET;
1418 } else {
1419 urb->status = -EPIPE; /* stalled */
1420 }

--- 47 unchanged lines hidden (view full) ---

1468 if (xfer->flags_int.control_xfr) {
1469
1470 /* don't transfer the setup packet again: */
1471
1472 xfer->frlengths[0] = 0;
1473 }
1474 if (urb->bsd_isread && (!xfer->flags.ext_buffer)) {
1475 /* copy in data with regard to the URB */
1476 usb2_copy_out(xfer->frbuffers + data_frame, 0,
1476 usbd_copy_out(xfer->frbuffers + data_frame, 0,
1477 urb->bsd_data_ptr, xfer->frlengths[data_frame]);
1478 }
1479 urb->bsd_length_rem -= xfer->frlengths[data_frame];
1480 urb->bsd_data_ptr += xfer->frlengths[data_frame];
1481 urb->actual_length += xfer->frlengths[data_frame];
1482
1483 /* check for short transfer */
1484 if (xfer->actlen < xfer->sumlen) {

--- 34 unchanged lines hidden (view full) ---

1519
1520 if (xfer->flags_int.control_xfr) {
1521
1522 /*
1523 * USB control transfers need special handling.
1524 * First copy in the header, then copy in data!
1525 */
1526 if (!xfer->flags.ext_buffer) {
1477 urb->bsd_data_ptr, xfer->frlengths[data_frame]);
1478 }
1479 urb->bsd_length_rem -= xfer->frlengths[data_frame];
1480 urb->bsd_data_ptr += xfer->frlengths[data_frame];
1481 urb->actual_length += xfer->frlengths[data_frame];
1482
1483 /* check for short transfer */
1484 if (xfer->actlen < xfer->sumlen) {

--- 34 unchanged lines hidden (view full) ---

1519
1520 if (xfer->flags_int.control_xfr) {
1521
1522 /*
1523 * USB control transfers need special handling.
1524 * First copy in the header, then copy in data!
1525 */
1526 if (!xfer->flags.ext_buffer) {
1527 usb2_copy_in(xfer->frbuffers, 0,
1527 usbd_copy_in(xfer->frbuffers, 0,
1528 urb->setup_packet, REQ_SIZE);
1529 } else {
1530 /* set virtual address to load */
1528 urb->setup_packet, REQ_SIZE);
1529 } else {
1530 /* set virtual address to load */
1531 usb2_set_frame_data(xfer,
1531 usbd_set_frame_data(xfer,
1532 urb->setup_packet, 0);
1533 }
1534
1535 xfer->frlengths[0] = REQ_SIZE;
1536
1537 ptr = urb->setup_packet;
1538
1539 /* setup data transfer direction and length */

--- 22 unchanged lines hidden (view full) ---

1562 (urb->transfer_flags & URB_ZERO_PACKET) &&
1563 (!xfer->flags_int.control_xfr)) {
1564 xfer->flags.force_short_xfer = 1;
1565 }
1566 /* check if we need to copy in data */
1567
1568 if (xfer->flags.ext_buffer) {
1569 /* set virtual address to load */
1532 urb->setup_packet, 0);
1533 }
1534
1535 xfer->frlengths[0] = REQ_SIZE;
1536
1537 ptr = urb->setup_packet;
1538
1539 /* setup data transfer direction and length */

--- 22 unchanged lines hidden (view full) ---

1562 (urb->transfer_flags & URB_ZERO_PACKET) &&
1563 (!xfer->flags_int.control_xfr)) {
1564 xfer->flags.force_short_xfer = 1;
1565 }
1566 /* check if we need to copy in data */
1567
1568 if (xfer->flags.ext_buffer) {
1569 /* set virtual address to load */
1570 usb2_set_frame_data(xfer, urb->bsd_data_ptr,
1570 usbd_set_frame_data(xfer, urb->bsd_data_ptr,
1571 data_frame);
1572 } else if (!urb->bsd_isread) {
1573 /* copy out data with regard to the URB */
1571 data_frame);
1572 } else if (!urb->bsd_isread) {
1573 /* copy out data with regard to the URB */
1574 usb2_copy_in(xfer->frbuffers + data_frame, 0,
1574 usbd_copy_in(xfer->frbuffers + data_frame, 0,
1575 urb->bsd_data_ptr, max_bulk);
1576 }
1577 xfer->frlengths[data_frame] = max_bulk;
1578 if (xfer->flags_int.control_xfr) {
1579 if (max_bulk > 0) {
1580 xfer->nframes = 2;
1581 } else {
1582 xfer->nframes = 1;
1583 }
1584 } else {
1585 xfer->nframes = 1;
1586 }
1575 urb->bsd_data_ptr, max_bulk);
1576 }
1577 xfer->frlengths[data_frame] = max_bulk;
1578 if (xfer->flags_int.control_xfr) {
1579 if (max_bulk > 0) {
1580 xfer->nframes = 2;
1581 } else {
1582 xfer->nframes = 1;
1583 }
1584 } else {
1585 xfer->nframes = 1;
1586 }
1587 usb2_start_hardware(xfer);
1587 usbd_transfer_submit(xfer);
1588 return;
1589
1590 default:
1591 if (xfer->error == USB_ERR_CANCELLED) {
1592 urb->status = -ECONNRESET;
1593 } else {
1594 urb->status = -EPIPE;
1595 }

--- 14 unchanged lines hidden ---
1588 return;
1589
1590 default:
1591 if (xfer->error == USB_ERR_CANCELLED) {
1592 urb->status = -ECONNRESET;
1593 } else {
1594 urb->status = -EPIPE;
1595 }

--- 14 unchanged lines hidden ---