diff options
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/core/hcd.c | 16 | ||||
| -rw-r--r-- | drivers/usb/early/ehci-dbgp.c | 15 | ||||
| -rw-r--r-- | drivers/usb/gadget/u_ether.c | 3 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-ls1x.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-xls.c | 2 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 30 | ||||
| -rw-r--r-- | drivers/usb/musb/ux500.c | 2 | ||||
| -rw-r--r-- | drivers/usb/otg/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/usb/serial/keyspan.c | 3 | ||||
| -rw-r--r-- | drivers/usb/serial/option.c | 9 | ||||
| -rw-r--r-- | drivers/usb/serial/usb_wwan.c | 10 | ||||
| -rw-r--r-- | drivers/usb/storage/scsiglue.c | 6 | 
12 files changed, 79 insertions, 23 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 1e741bca026..f034716190f 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2151,8 +2151,15 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum);  irqreturn_t usb_hcd_irq (int irq, void *__hcd)  {  	struct usb_hcd		*hcd = __hcd; +	unsigned long		flags;  	irqreturn_t		rc; +	/* IRQF_DISABLED doesn't work correctly with shared IRQs +	 * when the first handler doesn't use it.  So let's just +	 * assume it's never used. +	 */ +	local_irq_save(flags); +  	if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd)))  		rc = IRQ_NONE;  	else if (hcd->driver->irq(hcd) == IRQ_NONE) @@ -2160,6 +2167,7 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd)  	else  		rc = IRQ_HANDLED; +	local_irq_restore(flags);  	return rc;  }  EXPORT_SYMBOL_GPL(usb_hcd_irq); @@ -2347,6 +2355,14 @@ static int usb_hcd_request_irqs(struct usb_hcd *hcd,  	int retval;  	if (hcd->driver->irq) { + +		/* IRQF_DISABLED doesn't work as advertised when used together +		 * with IRQF_SHARED. As usb_hcd_irq() will always disable +		 * interrupts we can remove it here. +		 */ +		if (irqflags & IRQF_SHARED) +			irqflags &= ~IRQF_DISABLED; +  		snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d",  				hcd->driver->description, hcd->self.busnum);  		retval = request_irq(irqnum, &usb_hcd_irq, irqflags, diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index e426ad626d7..4bfa78af379 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c @@ -20,6 +20,7 @@  #include <linux/usb/ehci_def.h>  #include <linux/delay.h>  #include <linux/serial_core.h> +#include <linux/kconfig.h>  #include <linux/kgdb.h>  #include <linux/kthread.h>  #include <asm/io.h> @@ -614,12 +615,6 @@ err:  	return -ENODEV;  } -int dbgp_external_startup(struct usb_hcd *hcd) -{ -	return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup(); -} -EXPORT_SYMBOL_GPL(dbgp_external_startup); -  static int ehci_reset_port(int port)  {  	u32 portsc; @@ -979,6 +974,7 @@ struct console early_dbgp_console = {  	.index =	-1,  }; +#if IS_ENABLED(CONFIG_USB_EHCI_HCD)  int dbgp_reset_prep(struct usb_hcd *hcd)  {  	int ret = xen_dbgp_reset_prep(hcd); @@ -1007,6 +1003,13 @@ int dbgp_reset_prep(struct usb_hcd *hcd)  }  EXPORT_SYMBOL_GPL(dbgp_reset_prep); +int dbgp_external_startup(struct usb_hcd *hcd) +{ +	return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup(); +} +EXPORT_SYMBOL_GPL(dbgp_external_startup); +#endif /* USB_EHCI_HCD */ +  #ifdef CONFIG_KGDB  static char kgdbdbgp_buf[DBGP_MAX_PACKET]; diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c index 6458764994e..4ec3c0d7a18 100644 --- a/drivers/usb/gadget/u_ether.c +++ b/drivers/usb/gadget/u_ether.c @@ -20,6 +20,7 @@  #include <linux/ctype.h>  #include <linux/etherdevice.h>  #include <linux/ethtool.h> +#include <linux/if_vlan.h>  #include "u_ether.h" @@ -295,7 +296,7 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req)  		while (skb2) {  			if (status < 0  					|| ETH_HLEN > skb2->len -					|| skb2->len > ETH_FRAME_LEN) { +					|| skb2->len > VLAN_ETH_FRAME_LEN) {  				dev->net->stats.rx_errors++;  				dev->net->stats.rx_length_errors++;  				DBG(dev, "rx length %d\n", skb2->len); diff --git a/drivers/usb/host/ehci-ls1x.c b/drivers/usb/host/ehci-ls1x.c index ca759652626..aa0f328922d 100644 --- a/drivers/usb/host/ehci-ls1x.c +++ b/drivers/usb/host/ehci-ls1x.c @@ -113,7 +113,7 @@ static int ehci_hcd_ls1x_probe(struct platform_device *pdev)  		goto err_put_hcd;  	} -	ret = usb_add_hcd(hcd, irq, IRQF_SHARED); +	ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);  	if (ret)  		goto err_put_hcd; diff --git a/drivers/usb/host/ohci-xls.c b/drivers/usb/host/ohci-xls.c index 84201cd1a47..41e378f17c6 100644 --- a/drivers/usb/host/ohci-xls.c +++ b/drivers/usb/host/ohci-xls.c @@ -56,7 +56,7 @@ static int ohci_xls_probe_internal(const struct hc_driver *driver,  		goto err3;  	} -	retval = usb_add_hcd(hcd, irq, IRQF_SHARED); +	retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);  	if (retval != 0)  		goto err4;  	return retval; diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index d0b87e7b4ab..b6b84dacc79 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -707,11 +707,12 @@ static void rxstate(struct musb *musb, struct musb_request *req)  		fifo_count = musb_readw(epio, MUSB_RXCOUNT);  		/* -		 *  use mode 1 only if we expect data of at least ep packet_sz -		 *  and have not yet received a short packet +		 * Enable Mode 1 on RX transfers only when short_not_ok flag +		 * is set. Currently short_not_ok flag is set only from +		 * file_storage and f_mass_storage drivers  		 */ -		if ((request->length - request->actual >= musb_ep->packet_sz) && -			(fifo_count >= musb_ep->packet_sz)) + +		if (request->short_not_ok && fifo_count == musb_ep->packet_sz)  			use_mode_1 = 1;  		else  			use_mode_1 = 0; @@ -727,6 +728,27 @@ static void rxstate(struct musb *musb, struct musb_request *req)  				c = musb->dma_controller;  				channel = musb_ep->dma; +	/* We use DMA Req mode 0 in rx_csr, and DMA controller operates in +	 * mode 0 only. So we do not get endpoint interrupts due to DMA +	 * completion. We only get interrupts from DMA controller. +	 * +	 * We could operate in DMA mode 1 if we knew the size of the tranfer +	 * in advance. For mass storage class, request->length = what the host +	 * sends, so that'd work.  But for pretty much everything else, +	 * request->length is routinely more than what the host sends. For +	 * most these gadgets, end of is signified either by a short packet, +	 * or filling the last byte of the buffer.  (Sending extra data in +	 * that last pckate should trigger an overflow fault.)  But in mode 1, +	 * we don't get DMA completion interrupt for short packets. +	 * +	 * Theoretically, we could enable DMAReq irq (MUSB_RXCSR_DMAMODE = 1), +	 * to get endpoint interrupt on every DMA req, but that didn't seem +	 * to work reliably. +	 * +	 * REVISIT an updated g_file_storage can set req->short_not_ok, which +	 * then becomes usable as a runtime "use mode 1" hint... +	 */ +  				/* Experimental: Mode1 works with mass storage use cases */  				if (use_mode_1) {  					csr |= MUSB_RXCSR_AUTOCLEAR; diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index d62a91fedc2..0e62f504410 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c @@ -65,7 +65,7 @@ static int __devinit ux500_probe(struct platform_device *pdev)  	struct platform_device		*musb;  	struct ux500_glue		*glue;  	struct clk			*clk; - +	int				musbid;  	int				ret = -ENOMEM;  	glue = kzalloc(sizeof(*glue), GFP_KERNEL); diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig index d8c8a42bff3..6223062d5d1 100644 --- a/drivers/usb/otg/Kconfig +++ b/drivers/usb/otg/Kconfig @@ -58,7 +58,7 @@ config USB_ULPI_VIEWPORT  config TWL4030_USB  	tristate "TWL4030 USB Transceiver Driver" -	depends on TWL4030_CORE && REGULATOR_TWL4030 +	depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS  	select USB_OTG_UTILS  	help  	  Enable this to support the USB OTG transceiver on TWL4030 @@ -68,7 +68,7 @@ config TWL4030_USB  config TWL6030_USB  	tristate "TWL6030 USB Transceiver Driver" -	depends on TWL4030_CORE && OMAP_USB2 +	depends on TWL4030_CORE && OMAP_USB2 && USB_MUSB_OMAP2PLUS  	select USB_OTG_UTILS  	help  	  Enable this to support the USB OTG transceiver on TWL6030 diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 7179b0c5f81..cff8dd5b462 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -2430,7 +2430,7 @@ static void keyspan_release(struct usb_serial *serial)  static int keyspan_port_probe(struct usb_serial_port *port)  {  	struct usb_serial *serial = port->serial; -	struct keyspan_port_private *s_priv; +	struct keyspan_serial_private *s_priv;  	struct keyspan_port_private *p_priv;  	const struct keyspan_device_details *d_details;  	struct callbacks *cback; @@ -2445,7 +2445,6 @@ static int keyspan_port_probe(struct usb_serial_port *port)  	if (!p_priv)  		return -ENOMEM; -	s_priv = usb_get_serial_data(port->serial);  	p_priv->device_details = d_details;  	/* Setup values for the various callback routines */ diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 5dee7d61241..edc64bb6f45 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -158,6 +158,7 @@ static void option_instat_callback(struct urb *urb);  #define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED	0x8001  #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED	0x9000  #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED	0x9001 +#define NOVATELWIRELESS_PRODUCT_E362		0x9010  #define NOVATELWIRELESS_PRODUCT_G1		0xA001  #define NOVATELWIRELESS_PRODUCT_G1_M		0xA002  #define NOVATELWIRELESS_PRODUCT_G2		0xA010 @@ -193,6 +194,9 @@ static void option_instat_callback(struct urb *urb);  #define DELL_PRODUCT_5730_MINICARD_TELUS	0x8181  #define DELL_PRODUCT_5730_MINICARD_VZW		0x8182 +#define DELL_PRODUCT_5800_MINICARD_VZW		0x8195  /* Novatel E362 */ +#define DELL_PRODUCT_5800_V2_MINICARD_VZW	0x8196  /* Novatel E362 */ +  #define KYOCERA_VENDOR_ID			0x0c88  #define KYOCERA_PRODUCT_KPC650			0x17da  #define KYOCERA_PRODUCT_KPC680			0x180a @@ -283,6 +287,7 @@ static void option_instat_callback(struct urb *urb);  /* ALCATEL PRODUCTS */  #define ALCATEL_VENDOR_ID			0x1bbb  #define ALCATEL_PRODUCT_X060S_X200		0x0000 +#define ALCATEL_PRODUCT_X220_X500D		0x0017  #define PIRELLI_VENDOR_ID			0x1266  #define PIRELLI_PRODUCT_C100_1			0x1002 @@ -706,6 +711,7 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_G2) },  	/* Novatel Ovation MC551 a.k.a. Verizon USB551L */  	{ USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC551, 0xff, 0xff, 0xff) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E362, 0xff, 0xff, 0xff) },  	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },  	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) }, @@ -728,6 +734,8 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) },	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) },	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, 	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ +	{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_MINICARD_VZW, 0xff, 0xff, 0xff) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_V2_MINICARD_VZW, 0xff, 0xff, 0xff) },  	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },	/* ADU-E100, ADU-310 */  	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },  	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, @@ -1157,6 +1165,7 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),  	  .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist  	}, +	{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D) },  	{ USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },  	{ USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },  	{ USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index 61a73ad1a18..a3e9c095f0d 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c @@ -455,9 +455,6 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,  	struct usb_serial *serial = port->serial;  	struct urb *urb; -	if (endpoint == -1) -		return NULL;	/* endpoint not needed */ -  	urb = usb_alloc_urb(0, GFP_KERNEL);	/* No ISO */  	if (urb == NULL) {  		dev_dbg(&serial->interface->dev, @@ -489,6 +486,9 @@ int usb_wwan_port_probe(struct usb_serial_port *port)  	init_usb_anchor(&portdata->delayed);  	for (i = 0; i < N_IN_URB; i++) { +		if (!port->bulk_in_size) +			break; +  		buffer = (u8 *)__get_free_page(GFP_KERNEL);  		if (!buffer)  			goto bail_out_error; @@ -502,8 +502,8 @@ int usb_wwan_port_probe(struct usb_serial_port *port)  	}  	for (i = 0; i < N_OUT_URB; i++) { -		if (port->bulk_out_endpointAddress == -1) -			continue; +		if (!port->bulk_out_size) +			break;  		buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL);  		if (!buffer) diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index a3d54366afc..92f35abee92 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -186,6 +186,12 @@ static int slave_configure(struct scsi_device *sdev)  		/* Some devices don't handle VPD pages correctly */  		sdev->skip_vpd_pages = 1; +		/* Do not attempt to use REPORT SUPPORTED OPERATION CODES */ +		sdev->no_report_opcodes = 1; + +		/* Do not attempt to use WRITE SAME */ +		sdev->no_write_same = 1; +  		/* Some disks return the total number of blocks in response  		 * to READ CAPACITY rather than the highest block number.  		 * If this device makes that mistake, tell the sd driver. */  |