diff options
Diffstat (limited to 'drivers/usb/gadget')
| -rw-r--r-- | drivers/usb/gadget/composite.c | 7 | ||||
| -rw-r--r-- | drivers/usb/gadget/function/f_fs.c | 15 | ||||
| -rw-r--r-- | drivers/usb/gadget/legacy/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/bdc/bdc_core.c | 1 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/core.c | 36 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/renesas_usb3.c | 2 | 
6 files changed, 38 insertions, 25 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index eec14e6ed20b..77c7ecca816a 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -146,7 +146,6 @@ int config_ep_by_speed(struct usb_gadget *g,  			struct usb_function *f,  			struct usb_ep *_ep)  { -	struct usb_composite_dev	*cdev = get_gadget_data(g);  	struct usb_endpoint_descriptor *chosen_desc = NULL;  	struct usb_descriptor_header **speed_desc = NULL; @@ -226,8 +225,12 @@ ep_found:  			_ep->maxburst = comp_desc->bMaxBurst + 1;  			break;  		default: -			if (comp_desc->bMaxBurst != 0) +			if (comp_desc->bMaxBurst != 0) { +				struct usb_composite_dev *cdev; + +				cdev = get_gadget_data(g);  				ERROR(cdev, "ep0 bMaxBurst must be 0\n"); +			}  			_ep->maxburst = 1;  			break;  		} diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 97ea059a7aa4..b6cf5ab5a0a1 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -1012,7 +1012,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)  		else  			ret = ep->status;  		goto error_mutex; -	} else if (!(req = usb_ep_alloc_request(ep->ep, GFP_KERNEL))) { +	} else if (!(req = usb_ep_alloc_request(ep->ep, GFP_ATOMIC))) {  		ret = -ENOMEM;  	} else {  		req->buf      = data; @@ -2282,9 +2282,18 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type,  		int i;  		if (len < sizeof(*d) || -		    d->bFirstInterfaceNumber >= ffs->interfaces_count || -		    !d->Reserved1) +		    d->bFirstInterfaceNumber >= ffs->interfaces_count)  			return -EINVAL; +		if (d->Reserved1 != 1) { +			/* +			 * According to the spec, Reserved1 must be set to 1 +			 * but older kernels incorrectly rejected non-zero +			 * values.  We fix it here to avoid returning EINVAL +			 * in response to values we used to accept. +			 */ +			pr_debug("usb_ext_compat_desc::Reserved1 forced to 1\n"); +			d->Reserved1 = 1; +		}  		for (i = 0; i < ARRAY_SIZE(d->Reserved2); ++i)  			if (d->Reserved2[i])  				return -EINVAL; diff --git a/drivers/usb/gadget/legacy/Kconfig b/drivers/usb/gadget/legacy/Kconfig index a12fb459dbd9..784bf86dad4f 100644 --- a/drivers/usb/gadget/legacy/Kconfig +++ b/drivers/usb/gadget/legacy/Kconfig @@ -479,7 +479,7 @@ endif  # or video class gadget drivers), or specific hardware, here.  config USB_G_WEBCAM  	tristate "USB Webcam Gadget" -	depends on VIDEO_DEV +	depends on VIDEO_V4L2  	select USB_LIBCOMPOSITE  	select VIDEOBUF2_VMALLOC  	select USB_F_UVC diff --git a/drivers/usb/gadget/udc/bdc/bdc_core.c b/drivers/usb/gadget/udc/bdc/bdc_core.c index d39f070acbd7..01b44e159623 100644 --- a/drivers/usb/gadget/udc/bdc/bdc_core.c +++ b/drivers/usb/gadget/udc/bdc/bdc_core.c @@ -642,7 +642,6 @@ static const struct of_device_id bdc_of_match[] = {  static struct platform_driver bdc_driver = {  	.driver		= {  		.name	= BRCM_BDC_NAME, -		.owner	= THIS_MODULE,  		.pm = &bdc_pm_ops,  		.of_match_table	= bdc_of_match,  	}, diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 61422d624ad0..1b3efb14aec7 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c @@ -1069,8 +1069,12 @@ static inline void usb_gadget_udc_stop(struct usb_udc *udc)  static inline void usb_gadget_udc_set_speed(struct usb_udc *udc,  					    enum usb_device_speed speed)  { -	if (udc->gadget->ops->udc_set_speed) -		udc->gadget->ops->udc_set_speed(udc->gadget, speed); +	if (udc->gadget->ops->udc_set_speed) { +		enum usb_device_speed s; + +		s = min(speed, udc->gadget->max_speed); +		udc->gadget->ops->udc_set_speed(udc->gadget, s); +	}  }  /** @@ -1143,11 +1147,7 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,  	udc = kzalloc(sizeof(*udc), GFP_KERNEL);  	if (!udc) -		goto err1; - -	ret = device_add(&gadget->dev); -	if (ret) -		goto err2; +		goto err_put_gadget;  	device_initialize(&udc->dev);  	udc->dev.release = usb_udc_release; @@ -1156,7 +1156,11 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,  	udc->dev.parent = parent;  	ret = dev_set_name(&udc->dev, "%s", kobject_name(&parent->kobj));  	if (ret) -		goto err3; +		goto err_put_udc; + +	ret = device_add(&gadget->dev); +	if (ret) +		goto err_put_udc;  	udc->gadget = gadget;  	gadget->udc = udc; @@ -1166,7 +1170,7 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,  	ret = device_add(&udc->dev);  	if (ret) -		goto err4; +		goto err_unlist_udc;  	usb_gadget_set_state(gadget, USB_STATE_NOTATTACHED);  	udc->vbus = true; @@ -1174,27 +1178,25 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,  	/* pick up one of pending gadget drivers */  	ret = check_pending_gadget_drivers(udc);  	if (ret) -		goto err5; +		goto err_del_udc;  	mutex_unlock(&udc_lock);  	return 0; -err5: + err_del_udc:  	device_del(&udc->dev); -err4: + err_unlist_udc:  	list_del(&udc->list);  	mutex_unlock(&udc_lock); -err3: -	put_device(&udc->dev);  	device_del(&gadget->dev); -err2: -	kfree(udc); + err_put_udc: +	put_device(&udc->dev); -err1: + err_put_gadget:  	put_device(&gadget->dev);  	return ret;  } diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index bc37f40baacf..6e87af248367 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c @@ -252,7 +252,7 @@  #define USB3_EP0_SS_MAX_PACKET_SIZE	512  #define USB3_EP0_HSFS_MAX_PACKET_SIZE	64  #define USB3_EP0_BUF_SIZE		8 -#define USB3_MAX_NUM_PIPES		30 +#define USB3_MAX_NUM_PIPES		6	/* This includes PIPE 0 */  #define USB3_WAIT_US			3  #define USB3_DMA_NUM_SETTING_AREA	4  /*  | 

