USB fixes for 3.7-rc5
Here are some USB fixes for the 3.7 tree. Nothing huge here, just a number of tiny bugfixes resolving issues that have been found, and two reverts of patches that were found to have caused problems. All of these have been in linux-next already. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iEYEABECAAYFAlCmRoUACgkQMUfUDdst+ynwAACg2if9XANSq4+GqdR7lSF5jCRO hwMAoNh7XAM4GEXPB9m3rB395p9rHsN0 =31VS -----END PGP SIGNATURE----- Merge tag 'usb-3.7-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB fixes from Greg Kroah-Hartman: "Here are some USB fixes for the 3.7 tree. Nothing huge here, just a number of tiny bugfixes resolving issues that have been found, and two reverts of patches that were found to have caused problems. All of these have been in linux-next already. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>" * tag 'usb-3.7-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: Revert "USB/host: Cleanup unneccessary irq disable code" USB: option: add Alcatel X220/X500D USB IDs USB: option: add Novatel E362 and Dell Wireless 5800 USB IDs USB: keyspan: fix typo causing GPF on open USB: fix build with XEN and EARLY_PRINTK_DBGP enabled but USB_SUPPORT disabled USB: usb_wwan: fix bulk-urb allocation usb: otg: Fix build errors if USB_MUSB_OMAP2PLUS is selected as module usb: musb: ux500: fix 'musbid' undeclared error in ux500_remove() Revert "usb: musb: use DMA mode 1 whenever possible"
This commit is contained in:
commit
ec0148736f
|
@ -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,
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue