diff options
Diffstat (limited to 'drivers/usb')
26 files changed, 298 insertions, 335 deletions
| diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index de98a94d1853..a6bd53ace035 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -1272,8 +1272,7 @@ static int usb_resume_both(struct usb_device *udev, pm_message_t msg)  static void choose_wakeup(struct usb_device *udev, pm_message_t msg)  { -	int			w, i; -	struct usb_interface	*intf; +	int	w;  	/* Remote wakeup is needed only when we actually go to sleep.  	 * For things like FREEZE and QUIESCE, if the device is already @@ -1285,16 +1284,10 @@ static void choose_wakeup(struct usb_device *udev, pm_message_t msg)  		return;  	} -	/* If remote wakeup is permitted, see whether any interface drivers +	/* Enable remote wakeup if it is allowed, even if no interface drivers  	 * actually want it.  	 */ -	w = 0; -	if (device_may_wakeup(&udev->dev) && udev->actconfig) { -		for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { -			intf = udev->actconfig->interface[i]; -			w |= intf->needs_remote_wakeup; -		} -	} +	w = device_may_wakeup(&udev->dev);  	/* If the device is autosuspended with the wrong wakeup setting,  	 * autoresume now so the setting can be changed. diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index a73e08fdab36..fd4c36ea5e46 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -416,8 +416,11 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,  			/* A length of zero means transfer the whole sg list */  			len = length;  			if (len == 0) { -				for_each_sg(sg, sg, nents, i) -					len += sg->length; +				struct scatterlist	*sg2; +				int			j; + +				for_each_sg(sg, sg2, nents, j) +					len += sg2->length;  			}  		} else {  			/* diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c index 38226e9a371d..95dd4662d6a8 100644 --- a/drivers/usb/gadget/f_eem.c +++ b/drivers/usb/gadget/f_eem.c @@ -469,8 +469,7 @@ static int eem_unwrap(struct gether *port,  				crc = get_unaligned_le32(skb->data + len  							- ETH_FCS_LEN);  				crc2 = ~crc32_le(~0, -						skb->data, -						skb->len - ETH_FCS_LEN); +						skb->data, len - ETH_FCS_LEN);  			} else {  				crc = get_unaligned_be32(skb->data + len  							- ETH_FCS_LEN); diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 7d05a0be5c60..4ce899c9b165 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -321,8 +321,8 @@ struct fsg_dev;  /* Data shared by all the FSG instances. */  struct fsg_common {  	struct usb_gadget	*gadget; -	struct fsg_dev		*fsg; -	struct fsg_dev		*prev_fsg; +	struct fsg_dev		*fsg, *new_fsg; +	wait_queue_head_t	fsg_wait;  	/* filesem protects: backing files in use */  	struct rw_semaphore	filesem; @@ -351,7 +351,6 @@ struct fsg_common {  	enum fsg_state		state;		/* For exception handling */  	unsigned int		exception_req_tag; -	u8			config, new_config;  	enum data_direction	data_dir;  	u32			data_size;  	u32			data_size_from_cmnd; @@ -595,7 +594,7 @@ static int fsg_setup(struct usb_function *f,  	u16			w_value = le16_to_cpu(ctrl->wValue);  	u16			w_length = le16_to_cpu(ctrl->wLength); -	if (!fsg->common->config) +	if (!fsg_is_set(fsg->common))  		return -EOPNOTSUPP;  	switch (ctrl->bRequest) { @@ -2303,24 +2302,20 @@ static int alloc_request(struct fsg_common *common, struct usb_ep *ep,  	return -ENOMEM;  } -/* - * Reset interface setting and re-init endpoint state (toggle etc). - * Call with altsetting < 0 to disable the interface.  The only other - * available altsetting is 0, which enables the interface. - */ -static int do_set_interface(struct fsg_common *common, int altsetting) +/* Reset interface setting and re-init endpoint state (toggle etc). */ +static int do_set_interface(struct fsg_common *common, struct fsg_dev *new_fsg)  { -	int	rc = 0; -	int	i; -	const struct usb_endpoint_descriptor	*d; +	const struct usb_endpoint_descriptor *d; +	struct fsg_dev *fsg; +	int i, rc = 0;  	if (common->running)  		DBG(common, "reset interface\n");  reset:  	/* Deallocate the requests */ -	if (common->prev_fsg) { -		struct fsg_dev *fsg = common->prev_fsg; +	if (common->fsg) { +		fsg = common->fsg;  		for (i = 0; i < FSG_NUM_BUFFERS; ++i) {  			struct fsg_buffhd *bh = &common->buffhds[i]; @@ -2345,88 +2340,53 @@ reset:  			fsg->bulk_out_enabled = 0;  		} -		common->prev_fsg = 0; +		common->fsg = NULL; +		wake_up(&common->fsg_wait);  	}  	common->running = 0; -	if (altsetting < 0 || rc != 0) +	if (!new_fsg || rc)  		return rc; -	DBG(common, "set interface %d\n", altsetting); +	common->fsg = new_fsg; +	fsg = common->fsg; -	if (fsg_is_set(common)) { -		struct fsg_dev *fsg = common->fsg; -		common->prev_fsg = common->fsg; +	/* Enable the endpoints */ +	d = fsg_ep_desc(common->gadget, +			&fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc); +	rc = enable_endpoint(common, fsg->bulk_in, d); +	if (rc) +		goto reset; +	fsg->bulk_in_enabled = 1; + +	d = fsg_ep_desc(common->gadget, +			&fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc); +	rc = enable_endpoint(common, fsg->bulk_out, d); +	if (rc) +		goto reset; +	fsg->bulk_out_enabled = 1; +	common->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize); +	clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); -		/* Enable the endpoints */ -		d = fsg_ep_desc(common->gadget, -				&fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc); -		rc = enable_endpoint(common, fsg->bulk_in, d); +	/* Allocate the requests */ +	for (i = 0; i < FSG_NUM_BUFFERS; ++i) { +		struct fsg_buffhd	*bh = &common->buffhds[i]; + +		rc = alloc_request(common, fsg->bulk_in, &bh->inreq);  		if (rc)  			goto reset; -		fsg->bulk_in_enabled = 1; - -		d = fsg_ep_desc(common->gadget, -				&fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc); -		rc = enable_endpoint(common, fsg->bulk_out, d); +		rc = alloc_request(common, fsg->bulk_out, &bh->outreq);  		if (rc)  			goto reset; -		fsg->bulk_out_enabled = 1; -		common->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize); -		clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); - -		/* Allocate the requests */ -		for (i = 0; i < FSG_NUM_BUFFERS; ++i) { -			struct fsg_buffhd	*bh = &common->buffhds[i]; - -			rc = alloc_request(common, fsg->bulk_in, &bh->inreq); -			if (rc) -				goto reset; -			rc = alloc_request(common, fsg->bulk_out, &bh->outreq); -			if (rc) -				goto reset; -			bh->inreq->buf = bh->outreq->buf = bh->buf; -			bh->inreq->context = bh->outreq->context = bh; -			bh->inreq->complete = bulk_in_complete; -			bh->outreq->complete = bulk_out_complete; -		} - -		common->running = 1; -		for (i = 0; i < common->nluns; ++i) -			common->luns[i].unit_attention_data = SS_RESET_OCCURRED; -		return rc; -	} else { -		return -EIO; -	} -} - - -/* - * Change our operational configuration.  This code must agree with the code - * that returns config descriptors, and with interface altsetting code. - * - * It's also responsible for power management interactions.  Some - * configurations might not work with our current power sources. - * For now we just assume the gadget is always self-powered. - */ -static int do_set_config(struct fsg_common *common, u8 new_config) -{ -	int	rc = 0; - -	/* Disable the single interface */ -	if (common->config != 0) { -		DBG(common, "reset config\n"); -		common->config = 0; -		rc = do_set_interface(common, -1); +		bh->inreq->buf = bh->outreq->buf = bh->buf; +		bh->inreq->context = bh->outreq->context = bh; +		bh->inreq->complete = bulk_in_complete; +		bh->outreq->complete = bulk_out_complete;  	} -	/* Enable the interface */ -	if (new_config != 0) { -		common->config = new_config; -		rc = do_set_interface(common, 0); -		if (rc != 0) -			common->config = 0;	/* Reset on errors */ -	} +	common->running = 1; +	for (i = 0; i < common->nluns; ++i) +		common->luns[i].unit_attention_data = SS_RESET_OCCURRED;  	return rc;  } @@ -2437,9 +2397,7 @@ static int do_set_config(struct fsg_common *common, u8 new_config)  static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)  {  	struct fsg_dev *fsg = fsg_from_func(f); -	fsg->common->prev_fsg = fsg->common->fsg; -	fsg->common->fsg = fsg; -	fsg->common->new_config = 1; +	fsg->common->new_fsg = fsg;  	raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);  	return 0;  } @@ -2447,9 +2405,7 @@ static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)  static void fsg_disable(struct usb_function *f)  {  	struct fsg_dev *fsg = fsg_from_func(f); -	fsg->common->prev_fsg = fsg->common->fsg; -	fsg->common->fsg = fsg; -	fsg->common->new_config = 0; +	fsg->common->new_fsg = NULL;  	raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);  } @@ -2459,19 +2415,17 @@ static void fsg_disable(struct usb_function *f)  static void handle_exception(struct fsg_common *common)  {  	siginfo_t		info; -	int			sig;  	int			i;  	struct fsg_buffhd	*bh;  	enum fsg_state		old_state; -	u8			new_config;  	struct fsg_lun		*curlun;  	unsigned int		exception_req_tag; -	int			rc;  	/* Clear the existing signals.  Anything but SIGUSR1 is converted  	 * into a high-priority EXIT exception. */  	for (;;) { -		sig = dequeue_signal_lock(current, ¤t->blocked, &info); +		int sig = +			dequeue_signal_lock(current, ¤t->blocked, &info);  		if (!sig)  			break;  		if (sig != SIGUSR1) { @@ -2482,7 +2436,7 @@ static void handle_exception(struct fsg_common *common)  	}  	/* Cancel all the pending transfers */ -	if (fsg_is_set(common)) { +	if (likely(common->fsg)) {  		for (i = 0; i < FSG_NUM_BUFFERS; ++i) {  			bh = &common->buffhds[i];  			if (bh->inreq_busy) @@ -2523,7 +2477,6 @@ static void handle_exception(struct fsg_common *common)  	common->next_buffhd_to_fill = &common->buffhds[0];  	common->next_buffhd_to_drain = &common->buffhds[0];  	exception_req_tag = common->exception_req_tag; -	new_config = common->new_config;  	old_state = common->state;  	if (old_state == FSG_STATE_ABORT_BULK_OUT) @@ -2573,12 +2526,12 @@ static void handle_exception(struct fsg_common *common)  		break;  	case FSG_STATE_CONFIG_CHANGE: -		rc = do_set_config(common, new_config); +		do_set_interface(common, common->new_fsg);  		break;  	case FSG_STATE_EXIT:  	case FSG_STATE_TERMINATED: -		do_set_config(common, 0);		/* Free resources */ +		do_set_interface(common, NULL);		/* Free resources */  		spin_lock_irq(&common->lock);  		common->state = FSG_STATE_TERMINATED;	/* Stop the thread */  		spin_unlock_irq(&common->lock); @@ -2863,6 +2816,7 @@ buffhds_first_it:  		goto error_release;  	}  	init_completion(&common->thread_notifier); +	init_waitqueue_head(&common->fsg_wait);  #undef OR @@ -2957,9 +2911,17 @@ static void fsg_common_release(struct kref *ref)  static void fsg_unbind(struct usb_configuration *c, struct usb_function *f)  {  	struct fsg_dev		*fsg = fsg_from_func(f); +	struct fsg_common	*common = fsg->common;  	DBG(fsg, "unbind\n"); -	fsg_common_put(fsg->common); +	if (fsg->common->fsg == fsg) { +		fsg->common->new_fsg = NULL; +		raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); +		/* FIXME: make interruptible or killable somehow? */ +		wait_event(common->fsg_wait, common->fsg != fsg); +	} + +	fsg_common_put(common);  	usb_free_descriptors(fsg->function.descriptors);  	usb_free_descriptors(fsg->function.hs_descriptors);  	kfree(fsg); @@ -2970,7 +2932,6 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f)  {  	struct fsg_dev		*fsg = fsg_from_func(f);  	struct usb_gadget	*gadget = c->cdev->gadget; -	int			rc;  	int			i;  	struct usb_ep		*ep; @@ -2996,6 +2957,11 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f)  	ep->driver_data = fsg->common;	/* claim the endpoint */  	fsg->bulk_out = ep; +	/* Copy descriptors */ +	f->descriptors = usb_copy_descriptors(fsg_fs_function); +	if (unlikely(!f->descriptors)) +		return -ENOMEM; +  	if (gadget_is_dualspeed(gadget)) {  		/* Assume endpoint addresses are the same for both speeds */  		fsg_hs_bulk_in_desc.bEndpointAddress = @@ -3003,16 +2969,17 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f)  		fsg_hs_bulk_out_desc.bEndpointAddress =  			fsg_fs_bulk_out_desc.bEndpointAddress;  		f->hs_descriptors = usb_copy_descriptors(fsg_hs_function); -		if (unlikely(!f->hs_descriptors)) +		if (unlikely(!f->hs_descriptors)) { +			usb_free_descriptors(f->descriptors);  			return -ENOMEM; +		}  	}  	return 0;  autoconf_fail:  	ERROR(fsg, "unable to autoconfigure all endpoints\n"); -	rc = -ENOTSUPP; -	return rc; +	return -ENOTSUPP;  } @@ -3036,11 +3003,6 @@ static int fsg_add(struct usb_composite_dev *cdev,  	fsg->function.name        = FSG_DRIVER_DESC;  	fsg->function.strings     = fsg_strings_array; -	fsg->function.descriptors = usb_copy_descriptors(fsg_fs_function); -	if (unlikely(!fsg->function.descriptors)) { -		rc = -ENOMEM; -		goto error_free_fsg; -	}  	fsg->function.bind        = fsg_bind;  	fsg->function.unbind      = fsg_unbind;  	fsg->function.setup       = fsg_setup; @@ -3056,19 +3018,9 @@ static int fsg_add(struct usb_composite_dev *cdev,  	rc = usb_add_function(c, &fsg->function);  	if (unlikely(rc)) -		goto error_free_all; - -	fsg_common_get(fsg->common); -	return 0; - -error_free_all: -	usb_free_descriptors(fsg->function.descriptors); -	/* fsg_bind() might have copied those; or maybe not? who cares -	 * -- free it just in case. */ -	usb_free_descriptors(fsg->function.hs_descriptors); -error_free_fsg: -	kfree(fsg); - +		kfree(fsg); +	else +		fsg_common_get(fsg->common);  	return rc;  } diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c index fc2611f8b326..dbe6db0184fd 100644 --- a/drivers/usb/gadget/f_uvc.c +++ b/drivers/usb/gadget/f_uvc.c @@ -28,7 +28,7 @@  #include "uvc.h" -unsigned int uvc_trace_param; +unsigned int uvc_gadget_trace_param;  /* --------------------------------------------------------------------------   * Function descriptors @@ -656,6 +656,6 @@ error:  	return ret;  } -module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR); +module_param_named(trace, uvc_gadget_trace_param, uint, S_IRUGO|S_IWUSR);  MODULE_PARM_DESC(trace, "Trace level bitmask"); diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 4b0e4a040d6f..d1af253a9105 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c @@ -392,6 +392,17 @@ static int __gfs_do_config(struct usb_configuration *c,  	if (unlikely(ret < 0))  		return ret; +	/* After previous do_configs there may be some invalid +	 * pointers in c->interface array.  This happens every time +	 * a user space function with fewer interfaces than a user +	 * space function that was run before the new one is run.  The +	 * compasit's set_config() assumes that if there is no more +	 * then MAX_CONFIG_INTERFACES interfaces in a configuration +	 * then there is a NULL pointer after the last interface in +	 * c->interface array.  We need to make sure this is true. */ +	if (c->next_interface_id < ARRAY_SIZE(c->interface)) +		c->interface[c->next_interface_id] = NULL; +  	return 0;  } diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index 43abf55d8c60..4c3ac5c42237 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c @@ -82,7 +82,7 @@ static struct class *usb_gadget_class;  struct printer_dev {  	spinlock_t		lock;		/* lock this structure */  	/* lock buffer lists during read/write calls */ -	spinlock_t		lock_printer_io; +	struct mutex		lock_printer_io;  	struct usb_gadget	*gadget;  	struct usb_request	*req;		/* for control responses */  	u8			config; @@ -567,7 +567,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)  	DBG(dev, "printer_read trying to read %d bytes\n", (int)len); -	spin_lock(&dev->lock_printer_io); +	mutex_lock(&dev->lock_printer_io);  	spin_lock_irqsave(&dev->lock, flags);  	/* We will use this flag later to check if a printer reset happened @@ -601,7 +601,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)  		 * call or not.  		 */  		if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { -			spin_unlock(&dev->lock_printer_io); +			mutex_unlock(&dev->lock_printer_io);  			return -EAGAIN;  		} @@ -648,7 +648,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)  		if (dev->reset_printer) {  			list_add(¤t_rx_req->list, &dev->rx_reqs);  			spin_unlock_irqrestore(&dev->lock, flags); -			spin_unlock(&dev->lock_printer_io); +			mutex_unlock(&dev->lock_printer_io);  			return -EAGAIN;  		} @@ -673,7 +673,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)  	dev->current_rx_buf = current_rx_buf;  	spin_unlock_irqrestore(&dev->lock, flags); -	spin_unlock(&dev->lock_printer_io); +	mutex_unlock(&dev->lock_printer_io);  	DBG(dev, "printer_read returned %d bytes\n", (int)bytes_copied); @@ -697,7 +697,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)  	if (len == 0)  		return -EINVAL; -	spin_lock(&dev->lock_printer_io); +	mutex_lock(&dev->lock_printer_io);  	spin_lock_irqsave(&dev->lock, flags);  	/* Check if a printer reset happens while we have interrupts on */ @@ -713,7 +713,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)  		 * a NON-Blocking call or not.  		 */  		if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { -			spin_unlock(&dev->lock_printer_io); +			mutex_unlock(&dev->lock_printer_io);  			return -EAGAIN;  		} @@ -752,7 +752,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)  		if (copy_from_user(req->buf, buf, size)) {  			list_add(&req->list, &dev->tx_reqs); -			spin_unlock(&dev->lock_printer_io); +			mutex_unlock(&dev->lock_printer_io);  			return bytes_copied;  		} @@ -766,14 +766,14 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)  		if (dev->reset_printer) {  			list_add(&req->list, &dev->tx_reqs);  			spin_unlock_irqrestore(&dev->lock, flags); -			spin_unlock(&dev->lock_printer_io); +			mutex_unlock(&dev->lock_printer_io);  			return -EAGAIN;  		}  		if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) {  			list_add(&req->list, &dev->tx_reqs);  			spin_unlock_irqrestore(&dev->lock, flags); -			spin_unlock(&dev->lock_printer_io); +			mutex_unlock(&dev->lock_printer_io);  			return -EAGAIN;  		} @@ -782,7 +782,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)  	}  	spin_unlock_irqrestore(&dev->lock, flags); -	spin_unlock(&dev->lock_printer_io); +	mutex_unlock(&dev->lock_printer_io);  	DBG(dev, "printer_write sent %d bytes\n", (int)bytes_copied); @@ -820,11 +820,11 @@ printer_poll(struct file *fd, poll_table *wait)  	unsigned long		flags;  	int			status = 0; -	spin_lock(&dev->lock_printer_io); +	mutex_lock(&dev->lock_printer_io);  	spin_lock_irqsave(&dev->lock, flags);  	setup_rx_reqs(dev);  	spin_unlock_irqrestore(&dev->lock, flags); -	spin_unlock(&dev->lock_printer_io); +	mutex_unlock(&dev->lock_printer_io);  	poll_wait(fd, &dev->rx_wait, wait);  	poll_wait(fd, &dev->tx_wait, wait); @@ -1461,7 +1461,7 @@ autoconf_fail:  	}  	spin_lock_init(&dev->lock); -	spin_lock_init(&dev->lock_printer_io); +	mutex_init(&dev->lock_printer_io);  	INIT_LIST_HEAD(&dev->tx_reqs);  	INIT_LIST_HEAD(&dev->tx_reqs_active);  	INIT_LIST_HEAD(&dev->rx_reqs); @@ -1594,7 +1594,7 @@ cleanup(void)  {  	int status; -	spin_lock(&usb_printer_gadget.lock_printer_io); +	mutex_lock(&usb_printer_gadget.lock_printer_io);  	class_destroy(usb_gadget_class);  	unregister_chrdev_region(g_printer_devno, 2); @@ -1602,6 +1602,6 @@ cleanup(void)  	if (status)  		ERROR(dev, "usb_gadget_unregister_driver %x\n", status); -	spin_unlock(&usb_printer_gadget.lock_printer_io); +	mutex_unlock(&usb_printer_gadget.lock_printer_io);  }  module_exit(cleanup); diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index d5f4c1d45c97..e724a051bfdd 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c @@ -1700,9 +1700,13 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)  	if (!driver || driver != udc->driver || !driver->unbind)  		return -EINVAL; -	dprintk(DEBUG_NORMAL,"usb_gadget_register_driver() '%s'\n", +	dprintk(DEBUG_NORMAL, "usb_gadget_unregister_driver() '%s'\n",  		driver->driver.name); +	/* report disconnect */ +	if (driver->disconnect) +		driver->disconnect(&udc->gadget); +  	driver->unbind(&udc->gadget);  	device_del(&udc->gadget.dev); diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index 16bdf77f582a..3e8dcb5455e3 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c @@ -536,17 +536,11 @@ recycle:  		list_move(&req->list, &port->read_pool);  	} -	/* Push from tty to ldisc; this is immediate with low_latency, and -	 * may trigger callbacks to this driver ... so drop the spinlock. +	/* Push from tty to ldisc; without low_latency set this is handled by +	 * a workqueue, so we won't get callbacks and can hold port_lock  	 */  	if (tty && do_push) { -		spin_unlock_irq(&port->port_lock);  		tty_flip_buffer_push(tty); -		wake_up_interruptible(&tty->read_wait); -		spin_lock_irq(&port->port_lock); - -		/* tty may have been closed */ -		tty = port->port_tty;  	} @@ -784,11 +778,6 @@ static int gs_open(struct tty_struct *tty, struct file *file)  	port->open_count = 1;  	port->openclose = false; -	/* low_latency means ldiscs work in tasklet context, without -	 * needing a workqueue schedule ... easier to keep up. -	 */ -	tty->low_latency = 1; -  	/* if connected, start the I/O stream */  	if (port->port_usb) {  		struct gserial	*gser = port->port_usb; @@ -1195,6 +1184,7 @@ void gserial_cleanup(void)  	n_ports = 0;  	tty_unregister_driver(gs_tty_driver); +	put_tty_driver(gs_tty_driver);  	gs_tty_driver = NULL;  	pr_debug("%s: cleaned up ttyGS* support\n", __func__); diff --git a/drivers/usb/gadget/uvc.h b/drivers/usb/gadget/uvc.h index 0a705e63c936..e92454cddd7d 100644 --- a/drivers/usb/gadget/uvc.h +++ b/drivers/usb/gadget/uvc.h @@ -107,11 +107,11 @@ struct uvc_streaming_control {  #define UVC_WARN_MINMAX				0  #define UVC_WARN_PROBE_DEF			1 -extern unsigned int uvc_trace_param; +extern unsigned int uvc_gadget_trace_param;  #define uvc_trace(flag, msg...) \  	do { \ -		if (uvc_trace_param & flag) \ +		if (uvc_gadget_trace_param & flag) \  			printk(KERN_DEBUG "uvcvideo: " msg); \  	} while (0) @@ -220,16 +220,10 @@ struct uvc_file_handle  #define to_uvc_file_handle(handle) \  	container_of(handle, struct uvc_file_handle, vfh) -extern struct v4l2_file_operations uvc_v4l2_fops; -  /* ------------------------------------------------------------------------   * Functions   */ -extern int uvc_video_enable(struct uvc_video *video, int enable); -extern int uvc_video_init(struct uvc_video *video); -extern int uvc_video_pump(struct uvc_video *video); -  extern void uvc_endpoint_stream(struct uvc_device *dev);  extern void uvc_function_connect(struct uvc_device *uvc); diff --git a/drivers/usb/gadget/uvc_queue.c b/drivers/usb/gadget/uvc_queue.c index 43891991bf21..f7395ac5dc17 100644 --- a/drivers/usb/gadget/uvc_queue.c +++ b/drivers/usb/gadget/uvc_queue.c @@ -78,7 +78,8 @@   *   */ -void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type) +static void +uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)  {  	mutex_init(&queue->mutex);  	spin_lock_init(&queue->irqlock); @@ -88,6 +89,28 @@ void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)  }  /* + * Free the video buffers. + * + * This function must be called with the queue lock held. + */ +static int uvc_free_buffers(struct uvc_video_queue *queue) +{ +	unsigned int i; + +	for (i = 0; i < queue->count; ++i) { +		if (queue->buffer[i].vma_use_count != 0) +			return -EBUSY; +	} + +	if (queue->count) { +		vfree(queue->mem); +		queue->count = 0; +	} + +	return 0; +} + +/*   * Allocate the video buffers.   *   * Pages are reserved to make sure they will not be swapped, as they will be @@ -95,8 +118,9 @@ void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)   *   * Buffers will be individually mapped, so they must all be page aligned.   */ -int uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers, -		unsigned int buflength) +static int +uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers, +		  unsigned int buflength)  {  	unsigned int bufsize = PAGE_ALIGN(buflength);  	unsigned int i; @@ -150,28 +174,6 @@ done:  	return ret;  } -/* - * Free the video buffers. - * - * This function must be called with the queue lock held. - */ -int uvc_free_buffers(struct uvc_video_queue *queue) -{ -	unsigned int i; - -	for (i = 0; i < queue->count; ++i) { -		if (queue->buffer[i].vma_use_count != 0) -			return -EBUSY; -	} - -	if (queue->count) { -		vfree(queue->mem); -		queue->count = 0; -	} - -	return 0; -} -  static void __uvc_query_buffer(struct uvc_buffer *buf,  		struct v4l2_buffer *v4l2_buf)  { @@ -195,8 +197,8 @@ static void __uvc_query_buffer(struct uvc_buffer *buf,  	}  } -int uvc_query_buffer(struct uvc_video_queue *queue, -		struct v4l2_buffer *v4l2_buf) +static int +uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf)  {  	int ret = 0; @@ -217,8 +219,8 @@ done:   * Queue a video buffer. Attempting to queue a buffer that has already been   * queued will return -EINVAL.   */ -int uvc_queue_buffer(struct uvc_video_queue *queue, -	struct v4l2_buffer *v4l2_buf) +static int +uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf)  {  	struct uvc_buffer *buf;  	unsigned long flags; @@ -298,8 +300,9 @@ static int uvc_queue_waiton(struct uvc_buffer *buf, int nonblocking)   * Dequeue a video buffer. If nonblocking is false, block until a buffer is   * available.   */ -int uvc_dequeue_buffer(struct uvc_video_queue *queue, -		struct v4l2_buffer *v4l2_buf, int nonblocking) +static int +uvc_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf, +		   int nonblocking)  {  	struct uvc_buffer *buf;  	int ret = 0; @@ -359,8 +362,9 @@ done:   * This function implements video queue polling and is intended to be used by   * the device poll handler.   */ -unsigned int uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, -		poll_table *wait) +static unsigned int +uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, +	       poll_table *wait)  {  	struct uvc_buffer *buf;  	unsigned int mask = 0; @@ -407,7 +411,8 @@ static struct vm_operations_struct uvc_vm_ops = {   * This function implements video buffer memory mapping and is intended to be   * used by the device mmap handler.   */ -int uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma) +static int +uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)  {  	struct uvc_buffer *uninitialized_var(buffer);  	struct page *page; @@ -458,6 +463,42 @@ done:  }  /* + * Cancel the video buffers queue. + * + * Cancelling the queue marks all buffers on the irq queue as erroneous, + * wakes them up and removes them from the queue. + * + * If the disconnect parameter is set, further calls to uvc_queue_buffer will + * fail with -ENODEV. + * + * This function acquires the irq spinlock and can be called from interrupt + * context. + */ +static void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect) +{ +	struct uvc_buffer *buf; +	unsigned long flags; + +	spin_lock_irqsave(&queue->irqlock, flags); +	while (!list_empty(&queue->irqqueue)) { +		buf = list_first_entry(&queue->irqqueue, struct uvc_buffer, +				       queue); +		list_del(&buf->queue); +		buf->state = UVC_BUF_STATE_ERROR; +		wake_up(&buf->wait); +	} +	/* This must be protected by the irqlock spinlock to avoid race +	 * conditions between uvc_queue_buffer and the disconnection event that +	 * could result in an interruptible wait in uvc_dequeue_buffer. Do not +	 * blindly replace this logic by checking for the UVC_DEV_DISCONNECTED +	 * state outside the queue code. +	 */ +	if (disconnect) +		queue->flags |= UVC_QUEUE_DISCONNECTED; +	spin_unlock_irqrestore(&queue->irqlock, flags); +} + +/*   * Enable or disable the video buffers queue.   *   * The queue must be enabled before starting video acquisition and must be @@ -474,7 +515,7 @@ done:   * This function can't be called from interrupt context. Use   * uvc_queue_cancel() instead.   */ -int uvc_queue_enable(struct uvc_video_queue *queue, int enable) +static int uvc_queue_enable(struct uvc_video_queue *queue, int enable)  {  	unsigned int i;  	int ret = 0; @@ -503,44 +544,8 @@ done:  	return ret;  } -/* - * Cancel the video buffers queue. - * - * Cancelling the queue marks all buffers on the irq queue as erroneous, - * wakes them up and removes them from the queue. - * - * If the disconnect parameter is set, further calls to uvc_queue_buffer will - * fail with -ENODEV. - * - * This function acquires the irq spinlock and can be called from interrupt - * context. - */ -void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect) -{ -	struct uvc_buffer *buf; -	unsigned long flags; - -	spin_lock_irqsave(&queue->irqlock, flags); -	while (!list_empty(&queue->irqqueue)) { -		buf = list_first_entry(&queue->irqqueue, struct uvc_buffer, -				       queue); -		list_del(&buf->queue); -		buf->state = UVC_BUF_STATE_ERROR; -		wake_up(&buf->wait); -	} -	/* This must be protected by the irqlock spinlock to avoid race -	 * conditions between uvc_queue_buffer and the disconnection event that -	 * could result in an interruptible wait in uvc_dequeue_buffer. Do not -	 * blindly replace this logic by checking for the UVC_DEV_DISCONNECTED -	 * state outside the queue code. -	 */ -	if (disconnect) -		queue->flags |= UVC_QUEUE_DISCONNECTED; -	spin_unlock_irqrestore(&queue->irqlock, flags); -} - -struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, -		struct uvc_buffer *buf) +static struct uvc_buffer * +uvc_queue_next_buffer(struct uvc_video_queue *queue, struct uvc_buffer *buf)  {  	struct uvc_buffer *nextbuf;  	unsigned long flags; @@ -568,7 +573,7 @@ struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,  	return nextbuf;  } -struct uvc_buffer *uvc_queue_head(struct uvc_video_queue *queue) +static struct uvc_buffer *uvc_queue_head(struct uvc_video_queue *queue)  {  	struct uvc_buffer *buf = NULL; diff --git a/drivers/usb/gadget/uvc_queue.h b/drivers/usb/gadget/uvc_queue.h index 7f5a33fe7ae2..1812a8ecc5d0 100644 --- a/drivers/usb/gadget/uvc_queue.h +++ b/drivers/usb/gadget/uvc_queue.h @@ -58,30 +58,10 @@ struct uvc_video_queue {  	struct list_head irqqueue;  }; -extern void uvc_queue_init(struct uvc_video_queue *queue, -		enum v4l2_buf_type type); -extern int uvc_alloc_buffers(struct uvc_video_queue *queue, -		unsigned int nbuffers, unsigned int buflength); -extern int uvc_free_buffers(struct uvc_video_queue *queue); -extern int uvc_query_buffer(struct uvc_video_queue *queue, -		struct v4l2_buffer *v4l2_buf); -extern int uvc_queue_buffer(struct uvc_video_queue *queue, -		struct v4l2_buffer *v4l2_buf); -extern int uvc_dequeue_buffer(struct uvc_video_queue *queue, -		struct v4l2_buffer *v4l2_buf, int nonblocking); -extern int uvc_queue_enable(struct uvc_video_queue *queue, int enable); -extern void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect); -extern struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, -		struct uvc_buffer *buf); -extern unsigned int uvc_queue_poll(struct uvc_video_queue *queue, -		struct file *file, poll_table *wait); -extern int uvc_queue_mmap(struct uvc_video_queue *queue, -		struct vm_area_struct *vma);  static inline int uvc_queue_streaming(struct uvc_video_queue *queue)  {  	return queue->flags & UVC_QUEUE_STREAMING;  } -extern struct uvc_buffer *uvc_queue_head(struct uvc_video_queue *queue);  #endif /* __KERNEL__ */ diff --git a/drivers/usb/gadget/uvc_v4l2.c b/drivers/usb/gadget/uvc_v4l2.c index a7989f29837e..2dcffdac86d2 100644 --- a/drivers/usb/gadget/uvc_v4l2.c +++ b/drivers/usb/gadget/uvc_v4l2.c @@ -363,7 +363,7 @@ uvc_v4l2_poll(struct file *file, poll_table *wait)  	return mask;  } -struct v4l2_file_operations uvc_v4l2_fops = { +static struct v4l2_file_operations uvc_v4l2_fops = {  	.owner		= THIS_MODULE,  	.open		= uvc_v4l2_open,  	.release	= uvc_v4l2_release, diff --git a/drivers/usb/gadget/uvc_video.c b/drivers/usb/gadget/uvc_video.c index de8cbc46518d..b08f35438d70 100644 --- a/drivers/usb/gadget/uvc_video.c +++ b/drivers/usb/gadget/uvc_video.c @@ -271,7 +271,7 @@ error:   * This function fills the available USB requests (listed in req_free) with   * video data from the queued buffers.   */ -int +static int  uvc_video_pump(struct uvc_video *video)  {  	struct usb_request *req; @@ -328,7 +328,7 @@ uvc_video_pump(struct uvc_video *video)  /*   * Enable or disable the video stream.   */ -int +static int  uvc_video_enable(struct uvc_video *video, int enable)  {  	unsigned int i; @@ -367,7 +367,7 @@ uvc_video_enable(struct uvc_video *video, int enable)  /*   * Initialize the UVC video stream.   */ -int +static int  uvc_video_init(struct uvc_video *video)  {  	INIT_LIST_HEAD(&video->req_free); diff --git a/drivers/usb/gadget/webcam.c b/drivers/usb/gadget/webcam.c index 417fd6887698..f5f3030cc416 100644 --- a/drivers/usb/gadget/webcam.c +++ b/drivers/usb/gadget/webcam.c @@ -28,10 +28,10 @@  #include "config.c"  #include "epautoconf.c" -#include "f_uvc.c"  #include "uvc_queue.c" -#include "uvc_v4l2.c"  #include "uvc_video.c" +#include "uvc_v4l2.c" +#include "f_uvc.c"  /* --------------------------------------------------------------------------   * Device descriptor diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 544ccfd7056e..bd4027745aa7 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c @@ -207,10 +207,17 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)  	/* Initialize the transceiver */  	if (pdata->otg) {  		pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; -		if (otg_init(pdata->otg) != 0) -			dev_err(dev, "unable to init transceiver\n"); -		else if (otg_set_vbus(pdata->otg, 1) != 0) +		ret = otg_init(pdata->otg); +		if (ret) { +			dev_err(dev, "unable to init transceiver, probably missing\n"); +			ret = -ENODEV; +			goto err_add; +		} +		ret = otg_set_vbus(pdata->otg, 1); +		if (ret) {  			dev_err(dev, "unable to enable vbus on transceiver\n"); +			goto err_add; +		}  	}  	priv->hcd = hcd; diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c index 20a0dfe0fe36..0587ad4ce5c2 100644 --- a/drivers/usb/host/isp1362-hcd.c +++ b/drivers/usb/host/isp1362-hcd.c @@ -2224,12 +2224,9 @@ static void remove_debug_file(struct isp1362_hcd *isp1362_hcd)  /*-------------------------------------------------------------------------*/ -static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) +static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)  {  	int tmp = 20; -	unsigned long flags; - -	spin_lock_irqsave(&isp1362_hcd->lock, flags);  	isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC);  	isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR); @@ -2240,6 +2237,14 @@ static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)  	}  	if (!tmp)  		pr_err("Software reset timeout\n"); +} + +static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) +{ +	unsigned long flags; + +	spin_lock_irqsave(&isp1362_hcd->lock, flags); +	__isp1362_sw_reset(isp1362_hcd);  	spin_unlock_irqrestore(&isp1362_hcd->lock, flags);  } @@ -2418,7 +2423,7 @@ static void isp1362_hc_stop(struct usb_hcd *hcd)  	if (isp1362_hcd->board && isp1362_hcd->board->reset)  		isp1362_hcd->board->reset(hcd->self.controller, 1);  	else -		isp1362_sw_reset(isp1362_hcd); +		__isp1362_sw_reset(isp1362_hcd);  	if (isp1362_hcd->board && isp1362_hcd->board->clock)  		isp1362_hcd->board->clock(hcd->self.controller, 0); diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index 1a2bb4ce638f..77be3c24a427 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c @@ -1065,7 +1065,7 @@ static void r8a66597_usb_connect(struct r8a66597 *r8a66597, int port)  	else if (speed == LSMODE)  		rh->port |= USB_PORT_STAT_LOW_SPEED; -	rh->port &= USB_PORT_STAT_RESET; +	rh->port &= ~USB_PORT_STAT_RESET;  	rh->port |= USB_PORT_STAT_ENABLE;  } diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 9012098add6b..94e6934edb09 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -182,8 +182,12 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer   * set, but other sections talk about dealing with the chain bit set.  This was   * fixed in the 0.96 specification errata, but we have to assume that all 0.95   * xHCI hardware can't handle the chain bit being cleared on a link TRB. + * + * @more_trbs_coming:	Will you enqueue more TRBs before calling + *			prepare_transfer()?   */ -static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer) +static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, +		bool consumer, bool more_trbs_coming)  {  	u32 chain;  	union xhci_trb *next; @@ -199,15 +203,28 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer  	while (last_trb(xhci, ring, ring->enq_seg, next)) {  		if (!consumer) {  			if (ring != xhci->event_ring) { -				if (chain) { -					next->link.control |= TRB_CHAIN; - -					/* Give this link TRB to the hardware */ -					wmb(); -					next->link.control ^= TRB_CYCLE; -				} else { +				/* +				 * If the caller doesn't plan on enqueueing more +				 * TDs before ringing the doorbell, then we +				 * don't want to give the link TRB to the +				 * hardware just yet.  We'll give the link TRB +				 * back in prepare_ring() just before we enqueue +				 * the TD at the top of the ring. +				 */ +				if (!chain && !more_trbs_coming)  					break; + +				/* If we're not dealing with 0.95 hardware, +				 * carry over the chain bit of the previous TRB +				 * (which may mean the chain bit is cleared). +				 */ +				if (!xhci_link_trb_quirk(xhci)) { +					next->link.control &= ~TRB_CHAIN; +					next->link.control |= chain;  				} +				/* Give this link TRB to the hardware */ +				wmb(); +				next->link.control ^= TRB_CYCLE;  			}  			/* Toggle the cycle bit after the last ring segment. */  			if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { @@ -1707,9 +1724,12 @@ void xhci_handle_event(struct xhci_hcd *xhci)  /*   * Generic function for queueing a TRB on a ring.   * The caller must have checked to make sure there's room on the ring. + * + * @more_trbs_coming:	Will you enqueue more TRBs before calling + *			prepare_transfer()?   */  static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, -		bool consumer, +		bool consumer, bool more_trbs_coming,  		u32 field1, u32 field2, u32 field3, u32 field4)  {  	struct xhci_generic_trb *trb; @@ -1719,7 +1739,7 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring,  	trb->field[1] = field2;  	trb->field[2] = field3;  	trb->field[3] = field4; -	inc_enq(xhci, ring, consumer); +	inc_enq(xhci, ring, consumer, more_trbs_coming);  }  /* @@ -1988,6 +2008,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	int trb_buff_len, this_sg_len, running_total;  	bool first_trb;  	u64 addr; +	bool more_trbs_coming;  	struct xhci_generic_trb *start_trb;  	int start_cycle; @@ -2073,7 +2094,11 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		length_field = TRB_LEN(trb_buff_len) |  			remainder |  			TRB_INTR_TARGET(0); -		queue_trb(xhci, ep_ring, false, +		if (num_trbs > 1) +			more_trbs_coming = true; +		else +			more_trbs_coming = false; +		queue_trb(xhci, ep_ring, false, more_trbs_coming,  				lower_32_bits(addr),  				upper_32_bits(addr),  				length_field, @@ -2124,6 +2149,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	int num_trbs;  	struct xhci_generic_trb *start_trb;  	bool first_trb; +	bool more_trbs_coming;  	int start_cycle;  	u32 field, length_field; @@ -2212,7 +2238,11 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		length_field = TRB_LEN(trb_buff_len) |  			remainder |  			TRB_INTR_TARGET(0); -		queue_trb(xhci, ep_ring, false, +		if (num_trbs > 1) +			more_trbs_coming = true; +		else +			more_trbs_coming = false; +		queue_trb(xhci, ep_ring, false, more_trbs_coming,  				lower_32_bits(addr),  				upper_32_bits(addr),  				length_field, @@ -2291,7 +2321,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	/* Queue setup TRB - see section 6.4.1.2.1 */  	/* FIXME better way to translate setup_packet into two u32 fields? */  	setup = (struct usb_ctrlrequest *) urb->setup_packet; -	queue_trb(xhci, ep_ring, false, +	queue_trb(xhci, ep_ring, false, true,  			/* FIXME endianness is probably going to bite my ass here. */  			setup->bRequestType | setup->bRequest << 8 | setup->wValue << 16,  			setup->wIndex | setup->wLength << 16, @@ -2307,7 +2337,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	if (urb->transfer_buffer_length > 0) {  		if (setup->bRequestType & USB_DIR_IN)  			field |= TRB_DIR_IN; -		queue_trb(xhci, ep_ring, false, +		queue_trb(xhci, ep_ring, false, true,  				lower_32_bits(urb->transfer_dma),  				upper_32_bits(urb->transfer_dma),  				length_field, @@ -2324,7 +2354,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		field = 0;  	else  		field = TRB_DIR_IN; -	queue_trb(xhci, ep_ring, false, +	queue_trb(xhci, ep_ring, false, false,  			0,  			0,  			TRB_INTR_TARGET(0), @@ -2361,7 +2391,7 @@ static int queue_command(struct xhci_hcd *xhci, u32 field1, u32 field2,  					"unfailable commands failed.\n");  		return -ENOMEM;  	} -	queue_trb(xhci, xhci->cmd_ring, false, field1, field2, field3, +	queue_trb(xhci, xhci->cmd_ring, false, false, field1, field2, field3,  			field4 | xhci->cmd_ring->cycle_state);  	return 0;  } diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index fad70bc83555..3b795c56221f 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -219,8 +219,8 @@ static int musb_ulpi_write(struct otg_transceiver *otg,  	return 0;  }  #else -#define musb_ulpi_read(a, b)		NULL -#define musb_ulpi_write(a, b, c)	NULL +#define musb_ulpi_read		NULL +#define musb_ulpi_write		NULL  #endif  static struct otg_io_access_ops musb_ulpi_access = { @@ -451,10 +451,6 @@ void musb_hnp_stop(struct musb *musb)   * @param power   */ -#define STAGE0_MASK (MUSB_INTR_RESUME | MUSB_INTR_SESSREQ \ -		| MUSB_INTR_VBUSERROR | MUSB_INTR_CONNECT \ -		| MUSB_INTR_RESET) -  static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  				u8 devctl, u8 power)  { @@ -642,7 +638,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  		handled = IRQ_HANDLED;  	} - +#endif  	if (int_usb & MUSB_INTR_SUSPEND) {  		DBG(1, "SUSPEND (%s) devctl %02x power %02x\n",  				otg_state_string(musb), devctl, power); @@ -705,6 +701,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  		}  	} +#ifdef CONFIG_USB_MUSB_HDRC_HCD  	if (int_usb & MUSB_INTR_CONNECT) {  		struct usb_hcd *hcd = musb_to_hcd(musb);  		void __iomem *mbase = musb->mregs; @@ -1597,7 +1594,7 @@ irqreturn_t musb_interrupt(struct musb *musb)  	/* the core can interrupt us for multiple reasons; docs have  	 * a generic interrupt flowchart to follow  	 */ -	if (musb->int_usb & STAGE0_MASK) +	if (musb->int_usb)  		retval |= musb_stage0_irq(musb, musb->int_usb,  				devctl, power); diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index b22d02dea7d3..91d67794e350 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h @@ -470,7 +470,8 @@ struct musb_csr_regs {  struct musb_context_registers { -#ifdef CONFIG_PM +#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \ +    defined(CONFIG_ARCH_OMAP4)  	u32 otg_sysconfig, otg_forcestandby;  #endif  	u8 power; @@ -484,7 +485,8 @@ struct musb_context_registers {  	struct musb_csr_regs index_regs[MUSB_C_NUM_EPS];  }; -#ifdef CONFIG_PM +#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \ +    defined(CONFIG_ARCH_OMAP4)  extern void musb_platform_save_context(struct musb *musb,  		struct musb_context_registers *musb_context);  extern void musb_platform_restore_context(struct musb *musb, diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index 1008044a3bbc..dc66e4376d49 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c @@ -132,18 +132,9 @@ static void configure_channel(struct dma_channel *channel,  	if (mode) {  		csr |= 1 << MUSB_HSDMA_MODE1_SHIFT;  		BUG_ON(len < packet_sz); - -		if (packet_sz >= 64) { -			csr |= MUSB_HSDMA_BURSTMODE_INCR16 -					<< MUSB_HSDMA_BURSTMODE_SHIFT; -		} else if (packet_sz >= 32) { -			csr |= MUSB_HSDMA_BURSTMODE_INCR8 -					<< MUSB_HSDMA_BURSTMODE_SHIFT; -		} else if (packet_sz >= 16) { -			csr |= MUSB_HSDMA_BURSTMODE_INCR4 -					<< MUSB_HSDMA_BURSTMODE_SHIFT; -		}  	} +	csr |= MUSB_HSDMA_BURSTMODE_INCR16 +				<< MUSB_HSDMA_BURSTMODE_SHIFT;  	csr |= (musb_channel->epnum << MUSB_HSDMA_ENDPOINT_SHIFT)  		| (1 << MUSB_HSDMA_ENABLE_SHIFT) diff --git a/drivers/usb/otg/ulpi.c b/drivers/usb/otg/ulpi.c index b1b346932946..d331b222ad21 100644 --- a/drivers/usb/otg/ulpi.c +++ b/drivers/usb/otg/ulpi.c @@ -59,12 +59,17 @@ static int ulpi_set_flags(struct otg_transceiver *otg)  static int ulpi_init(struct otg_transceiver *otg)  { -	int i, vid, pid; - -	vid = (otg_io_read(otg, ULPI_VENDOR_ID_HIGH) << 8) | -	       otg_io_read(otg, ULPI_VENDOR_ID_LOW); -	pid = (otg_io_read(otg, ULPI_PRODUCT_ID_HIGH) << 8) | -	       otg_io_read(otg, ULPI_PRODUCT_ID_LOW); +	int i, vid, pid, ret; +	u32 ulpi_id = 0; + +	for (i = 0; i < 4; i++) { +		ret = otg_io_read(otg, ULPI_PRODUCT_ID_HIGH - i); +		if (ret < 0) +			return ret; +		ulpi_id = (ulpi_id << 8) | ret; +	} +	vid = ulpi_id & 0xffff; +	pid = ulpi_id >> 16;  	pr_info("ULPI transceiver vendor/product ID 0x%04x/0x%04x\n", vid, pid); diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 79dd1ae195e5..da7e334b0407 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -653,7 +653,6 @@ static struct usb_device_id id_table_combined [] = {  	{ USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },  	{ USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },  	{ USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) }, -	{ USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },  	{ USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },  	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },  	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) }, diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 94d86c3febcb..bbc159a1df45 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h @@ -501,13 +501,6 @@  #define CONTEC_COM1USBH_PID	0x8311	/* COM-1(USB)H */  /* - * Contec products (http://www.contec.com) - * Submitted by Daniel Sangorrin - */ -#define CONTEC_VID		0x06CE	/* Vendor ID */ -#define CONTEC_COM1USBH_PID	0x8311	/* COM-1(USB)H */ - -/*   * Definitions for B&B Electronics products.   */  #define BANDB_VID		0x0856	/* B&B Electronics Vendor ID */ diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 04bb759536bb..93d72eb8cafc 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c @@ -139,6 +139,7 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  					"Could not set interface, error %d\n",  					retval);  				retval = -ENODEV; +				kfree(data);  			}  			return retval;  		} @@ -155,6 +156,7 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  					"Could not set interface, error %d\n",  					retval);  				retval = -ENODEV; +				kfree(data);  			}  			return retval;  		} @@ -163,6 +165,7 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  	default:  		dev_err(&serial->dev->dev,  			"unknown number of interfaces: %d\n", nintf); +		kfree(data);  		return -ENODEV;  	} | 
