diff options
Diffstat (limited to 'include/linux/usb.h')
| -rw-r--r-- | include/linux/usb.h | 50 | 
1 files changed, 37 insertions, 13 deletions
diff --git a/include/linux/usb.h b/include/linux/usb.h index 10278d18709..689b14b26c8 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -482,6 +482,7 @@ struct usb3_lpm_parameters {   * @connect_time: time device was first connected   * @do_remote_wakeup:  remote wakeup should be enabled   * @reset_resume: needs reset instead of resume + * @port_is_suspended: the upstream port is suspended (L2 or U3)   * @wusb_dev: if this is a Wireless USB device, link to the WUSB   *	specific data for the device.   * @slot_id: Slot ID assigned by xHCI @@ -560,6 +561,7 @@ struct usb_device {  	unsigned do_remote_wakeup:1;  	unsigned reset_resume:1; +	unsigned port_is_suspended:1;  #endif  	struct wusb_dev *wusb_dev;  	int slot_id; @@ -588,8 +590,9 @@ extern struct usb_device *usb_hub_find_child(struct usb_device *hdev,   */  #define usb_hub_for_each_child(hdev, port1, child) \  	for (port1 = 1,	child =	usb_hub_find_child(hdev, port1); \ -		port1 <= hdev->maxchild; \ -		child = usb_hub_find_child(hdev, ++port1)) +			port1 <= hdev->maxchild; \ +			child = usb_hub_find_child(hdev, ++port1)) \ +		if (!child) continue; else  /* USB device locking */  #define usb_lock_device(udev)		device_lock(&(udev)->dev) @@ -805,6 +808,22 @@ static inline int usb_make_path(struct usb_device *dev, char *buf, size_t size)  	.bcdDevice_hi = (hi)  /** + * USB_DEVICE_INTERFACE_CLASS - describe a usb device with a specific interface class + * @vend: the 16 bit USB Vendor ID + * @prod: the 16 bit USB Product ID + * @cl: bInterfaceClass value + * + * This macro is used to create a struct usb_device_id that matches a + * specific interface class of devices. + */ +#define USB_DEVICE_INTERFACE_CLASS(vend, prod, cl) \ +	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ +		       USB_DEVICE_ID_MATCH_INT_CLASS, \ +	.idVendor = (vend), \ +	.idProduct = (prod), \ +	.bInterfaceClass = (cl) + +/**   * USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol   * @vend: the 16 bit USB Vendor ID   * @prod: the 16 bit USB Product ID @@ -1129,8 +1148,8 @@ extern int usb_disabled(void);   * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb().   */  #define URB_SHORT_NOT_OK	0x0001	/* report short reads as errors */ -#define URB_ISO_ASAP		0x0002	/* iso-only, urb->start_frame -					 * ignored */ +#define URB_ISO_ASAP		0x0002	/* iso-only; use the first unexpired +					 * slot in the schedule */  #define URB_NO_TRANSFER_DMA_MAP	0x0004	/* urb->transfer_dma valid on submit */  #define URB_NO_FSBR		0x0020	/* UHCI-specific */  #define URB_ZERO_PACKET		0x0040	/* Finish bulk OUT with short packet */ @@ -1309,15 +1328,20 @@ typedef void (*usb_complete_t)(struct urb *);   * the transfer interval in the endpoint descriptor is logarithmic.   * Device drivers must convert that value to linear units themselves.)   * - * Isochronous URBs normally use the URB_ISO_ASAP transfer flag, telling - * the host controller to schedule the transfer as soon as bandwidth - * utilization allows, and then set start_frame to reflect the actual frame - * selected during submission.  Otherwise drivers must specify the start_frame - * and handle the case where the transfer can't begin then.  However, drivers - * won't know how bandwidth is currently allocated, and while they can - * find the current frame using usb_get_current_frame_number () they can't - * know the range for that frame number.  (Ranges for frame counter values - * are HC-specific, and can go from 256 to 65536 frames from "now".) + * If an isochronous endpoint queue isn't already running, the host + * controller will schedule a new URB to start as soon as bandwidth + * utilization allows.  If the queue is running then a new URB will be + * scheduled to start in the first transfer slot following the end of the + * preceding URB, if that slot has not already expired.  If the slot has + * expired (which can happen when IRQ delivery is delayed for a long time), + * the scheduling behavior depends on the URB_ISO_ASAP flag.  If the flag + * is clear then the URB will be scheduled to start in the expired slot, + * implying that some of its packets will not be transferred; if the flag + * is set then the URB will be scheduled in the first unexpired slot, + * breaking the queue's synchronization.  Upon URB completion, the + * start_frame field will be set to the (micro)frame number in which the + * transfer was scheduled.  Ranges for frame counter values are HC-specific + * and can go from as low as 256 to as high as 65536 frames.   *   * Isochronous URBs have a different data transfer model, in part because   * the quality of service is only "best effort".  Callers provide specially  |