aboutsummaryrefslogtreecommitdiffstats
path: root/usb.current
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2008-05-13 15:10:07 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2008-05-13 15:10:07 -0700
commit8378a096efed283bb1366b8b79647836cbc6ac06 (patch)
treeda34a74e92abeaeb5569bd35f69d8b27fc9c6992 /usb.current
parent2054c606d8001c81c24cc0e73ad48755126a17a3 (diff)
downloadpatches-8378a096efed283bb1366b8b79647836cbc6ac06.tar.gz
more patches
Diffstat (limited to 'usb.current')
-rw-r--r--usb.current/usb-atmel_usba_udc-fixes-mostly-disconnect.patch151
-rw-r--r--usb.current/usb-option-add-new-dell-5520-hsdpa-variant.patch29
-rw-r--r--usb.current/usb-pxa27x_udc-minor-fixes.patch100
-rw-r--r--usb.current/usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch48
-rw-r--r--usb.current/usbtest-comment-on-why-this-code-expects-negative-and-positive-errnos.patch58
5 files changed, 386 insertions, 0 deletions
diff --git a/usb.current/usb-atmel_usba_udc-fixes-mostly-disconnect.patch b/usb.current/usb-atmel_usba_udc-fixes-mostly-disconnect.patch
new file mode 100644
index 00000000000000..96967426573093
--- /dev/null
+++ b/usb.current/usb-atmel_usba_udc-fixes-mostly-disconnect.patch
@@ -0,0 +1,151 @@
+From david-b@pacbell.net Tue May 13 14:59:15 2008
+From: David Brownell <david-b@pacbell.net>
+Date: Sat, 10 May 2008 22:46:38 -0700
+Subject: USB: atmel_usba_udc fixes, mostly disconnect()
+To: Haavard Skinnemoen <hskinnemoen@atmel.com>, Greg KH <greg@kroah.com>
+Cc: linux-usb@vger.kernel.org
+Message-ID: <200805102246.38950.david-b@pacbell.net>
+Content-Disposition: inline
+
+
+Various fixes to Atmel's high speed UDC driver.
+
+ * Issue some missing disconnect() calls. Currently they are only made
+ when VBUS power goes away (on boards where the driver can sense such
+ changes), but that's not enough for gadget drivers to clean out all
+ the state that's needed. Missing calls were:
+
+ - After USB reset, before starting enumeration.
+ - When unregistering a gadget driver, before unbind().
+
+ * Don't assume gadget drivers provide disconnect callbacks; make sure
+ to not call through a null pointer!
+
+ * When the driver doesn't provide an unbind() callback, refuse to
+ unregister it.
+
+Also remove two bogus "error" messages:
+
+ * Related to mis-handling of disconnect() ... don't emit error messages
+ for disconnect() handlers that disable endpoints. All of them should
+ be doing that; the problem is (unfixed) oddness in atmel_usba_udc.
+
+ * Don't emit a diagnostic for a curious and transient nonfatal error
+ that shows up sometimes with EP0.
+
+Those messages spammed syslog, for no good reason.
+
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/atmel_usba_udc.c | 48 ++++++++++++++++++++++++++++++------
+ 1 file changed, 40 insertions(+), 8 deletions(-)
+
+--- a/drivers/usb/gadget/atmel_usba_udc.c
++++ b/drivers/usb/gadget/atmel_usba_udc.c
+@@ -649,7 +649,13 @@ static int usba_ep_disable(struct usb_ep
+
+ if (!ep->desc) {
+ spin_unlock_irqrestore(&udc->lock, flags);
+- DBG(DBG_ERR, "ep_disable: %s not enabled\n", ep->ep.name);
++ /* REVISIT because this driver disables endpoints in
++ * reset_all_endpoints() before calling disconnect(),
++ * most gadget drivers would trigger this non-error ...
++ */
++ if (udc->gadget.speed != USB_SPEED_UNKNOWN)
++ DBG(DBG_ERR, "ep_disable: %s not enabled\n",
++ ep->ep.name);
+ return -EINVAL;
+ }
+ ep->desc = NULL;
+@@ -1052,6 +1058,12 @@ static void reset_all_endpoints(struct u
+ request_complete(ep, req, -ECONNRESET);
+ }
+
++ /* NOTE: normally, the next call to the gadget driver is in
++ * charge of disabling endpoints... usually disconnect().
++ * The exception would be entering a high speed test mode.
++ *
++ * FIXME remove this code ... and retest thoroughly.
++ */
+ list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) {
+ if (ep->desc) {
+ spin_unlock(&udc->lock);
+@@ -1219,7 +1231,7 @@ static inline bool feature_is_ep_halt(st
+ static int handle_ep0_setup(struct usba_udc *udc, struct usba_ep *ep,
+ struct usb_ctrlrequest *crq)
+ {
+- int retval = 0;;
++ int retval = 0;
+
+ switch (crq->bRequest) {
+ case USB_REQ_GET_STATUS: {
+@@ -1693,6 +1705,14 @@ static irqreturn_t usba_udc_irq(int irq,
+ usba_writel(udc, INT_CLR, USBA_END_OF_RESET);
+ reset_all_endpoints(udc);
+
++ if (udc->gadget.speed != USB_SPEED_UNKNOWN
++ && udc->driver->disconnect) {
++ udc->gadget.speed = USB_SPEED_UNKNOWN;
++ spin_unlock(&udc->lock);
++ udc->driver->disconnect(&udc->gadget);
++ spin_lock(&udc->lock);
++ }
++
+ if (status & USBA_HIGH_SPEED) {
+ DBG(DBG_BUS, "High-speed bus reset detected\n");
+ udc->gadget.speed = USB_SPEED_HIGH;
+@@ -1716,9 +1736,13 @@ static irqreturn_t usba_udc_irq(int irq,
+ | USBA_DET_SUSPEND
+ | USBA_END_OF_RESUME));
+
++ /*
++ * Unclear why we hit this irregularly, e.g. in usbtest,
++ * but it's clearly harmless...
++ */
+ if (!(usba_ep_readl(ep0, CFG) & USBA_EPT_MAPPED))
+- dev_warn(&udc->pdev->dev,
+- "WARNING: EP0 configuration is invalid!\n");
++ dev_dbg(&udc->pdev->dev,
++ "ODD: EP0 configuration is invalid!\n");
+ }
+
+ spin_unlock(&udc->lock);
+@@ -1751,9 +1775,11 @@ static irqreturn_t usba_vbus_irq(int irq
+ reset_all_endpoints(udc);
+ toggle_bias(0);
+ usba_writel(udc, CTRL, USBA_DISABLE_MASK);
+- spin_unlock(&udc->lock);
+- udc->driver->disconnect(&udc->gadget);
+- spin_lock(&udc->lock);
++ if (udc->driver->disconnect) {
++ spin_unlock(&udc->lock);
++ udc->driver->disconnect(&udc->gadget);
++ spin_lock(&udc->lock);
++ }
+ }
+ udc->vbus_prev = vbus;
+ }
+@@ -1825,7 +1851,7 @@ int usb_gadget_unregister_driver(struct
+
+ if (!udc->pdev)
+ return -ENODEV;
+- if (driver != udc->driver)
++ if (driver != udc->driver || !driver->unbind)
+ return -EINVAL;
+
+ if (udc->vbus_pin != -1)
+@@ -1840,6 +1866,12 @@ int usb_gadget_unregister_driver(struct
+ toggle_bias(0);
+ usba_writel(udc, CTRL, USBA_DISABLE_MASK);
+
++ if (udc->driver->disconnect) {
++ spin_unlock(&udc->lock);
++ udc->driver->disconnect(&udc->gadget);
++ spin_lock(&udc->lock);
++ }
++
+ driver->unbind(&udc->gadget);
+ udc->gadget.dev.driver = NULL;
+ udc->driver = NULL;
diff --git a/usb.current/usb-option-add-new-dell-5520-hsdpa-variant.patch b/usb.current/usb-option-add-new-dell-5520-hsdpa-variant.patch
new file mode 100644
index 00000000000000..95f39ce54503cd
--- /dev/null
+++ b/usb.current/usb-option-add-new-dell-5520-hsdpa-variant.patch
@@ -0,0 +1,29 @@
+From dcbw@redhat.com Tue May 13 14:56:24 2008
+From: Dan Williams <dcbw@redhat.com>
+Date: Tue, 13 May 2008 12:53:45 -0400
+Subject: USB: option: add new Dell 5520 HSDPA variant
+To: gregkh@suse.de
+Cc: linux-usb@vger.kernel.org, stable@kernel.org, Luke Sheldrick <luke@sheldrick.co.uk>
+Message-ID: <1210697625.9976.19.camel@localhost.localdomain>
+
+
+New variant of the 5520 found by Luke Sheldrick.
+
+Signed-off-by: Dan Williams <dcbw@redhat.com>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/option.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -293,6 +293,7 @@ static struct usb_device_id option_ids[]
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
+ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
+ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+ { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
diff --git a/usb.current/usb-pxa27x_udc-minor-fixes.patch b/usb.current/usb-pxa27x_udc-minor-fixes.patch
new file mode 100644
index 00000000000000..fee895438230ff
--- /dev/null
+++ b/usb.current/usb-pxa27x_udc-minor-fixes.patch
@@ -0,0 +1,100 @@
+From david-b@pacbell.net Tue May 13 14:58:41 2008
+From: Robert Jarzmik <rjarzmik@free.fr>
+Date: Mon, 12 May 2008 10:47:56 -0700
+Subject: USB: pxa27x_udc: minor fixes
+To: Greg KH <greg@kroah.com>
+Cc: Robert Jarzmik <rjarzmik@free.fr>
+Message-ID: <200805121047.57064.david-b@pacbell.net>
+Content-Disposition: inline
+
+
+From: Robert Jarzmik <rjarzmik@free.fr>
+
+Minor fixes to pxa27x udc driver :
+ - don't clobber driver model bus_id field
+ - wrong endianess fix (no functional change; cpu is little-endian)
+ - double udc disable fix
+ - resume/suspend fix (OTG hold bit)
+ - make driver pxa27x dependant (check cpu at runtime)
+
+Signed-off-by: Robert Jarzmik <rjarzmik@free.fr>
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/pxa27x_udc.c | 17 ++++++++---------
+ drivers/usb/gadget/pxa27x_udc.h | 8 ++++++++
+ 2 files changed, 16 insertions(+), 9 deletions(-)
+
+--- a/drivers/usb/gadget/pxa27x_udc.c
++++ b/drivers/usb/gadget/pxa27x_udc.c
+@@ -1546,7 +1546,6 @@ static __init void udc_init_data(struct
+ INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);
+ dev->udc_usb_ep[0].pxa_ep = &dev->pxa_ep[0];
+ ep0_idle(dev);
+- strcpy(dev->dev->bus_id, "");
+
+ /* PXA endpoints init */
+ for (i = 0; i < NR_PXA_ENDPOINTS; i++) {
+@@ -1746,13 +1745,10 @@ static void handle_ep0_ctrl_req(struct p
+ ep_err(ep, "wrong to have extra bytes for setup : 0x%08x\n", i);
+ }
+
+- le16_to_cpus(&u.r.wValue);
+- le16_to_cpus(&u.r.wIndex);
+- le16_to_cpus(&u.r.wLength);
+-
+ ep_dbg(ep, "SETUP %02x.%02x v%04x i%04x l%04x\n",
+ u.r.bRequestType, u.r.bRequest,
+- u.r.wValue, u.r.wIndex, u.r.wLength);
++ le16_to_cpu(u.r.wValue), le16_to_cpu(u.r.wIndex),
++ le16_to_cpu(u.r.wLength));
+ if (unlikely(have_extrabytes))
+ goto stall;
+
+@@ -2296,7 +2292,8 @@ static void pxa_udc_shutdown(struct plat
+ {
+ struct pxa_udc *udc = platform_get_drvdata(_dev);
+
+- udc_disable(udc);
++ if (udc_readl(udc, UDCCR) & UDCCR_UDE)
++ udc_disable(udc);
+ }
+
+ #ifdef CONFIG_PM
+@@ -2361,9 +2358,8 @@ static int pxa_udc_resume(struct platfor
+ * Upon exit from sleep mode and before clearing OTGPH,
+ * Software must configure the USB OTG pad, UDC, and UHC
+ * to the state they were in before entering sleep mode.
+- *
+- * Should be : PSSR |= PSSR_OTGPH;
+ */
++ PSSR |= PSSR_OTGPH;
+
+ return 0;
+ }
+@@ -2387,6 +2383,9 @@ static struct platform_driver udc_driver
+
+ static int __init udc_init(void)
+ {
++ if (!cpu_is_pxa27x())
++ return -ENODEV;
++
+ printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION);
+ return platform_driver_probe(&udc_driver, pxa_udc_probe);
+ }
+--- a/drivers/usb/gadget/pxa27x_udc.h
++++ b/drivers/usb/gadget/pxa27x_udc.h
+@@ -484,4 +484,12 @@ static inline struct pxa_udc *to_gadget_
+ #define ep_warn(ep, fmt, arg...) \
+ dev_warn(ep->dev->dev, "%s:%s:" fmt, EPNAME(ep), __func__, ## arg)
+
++/*
++ * Cannot include pxa-regs.h, as register names are similar.
++ * So PSSR is redefined here. This should be removed once UDC registers will
++ * be gone from pxa-regs.h.
++ */
++#define PSSR __REG(0x40F00004) /* Power Manager Sleep Status */
++#define PSSR_OTGPH (1 << 6) /* OTG Peripheral Hold */
++
+ #endif /* __LINUX_USB_GADGET_PXA27X_H */
diff --git a/usb.current/usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch b/usb.current/usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch
new file mode 100644
index 00000000000000..f2cc7bfc2c9006
--- /dev/null
+++ b/usb.current/usb-remove-picdem-fs-usb-demo-device-from-ldusb.patch
@@ -0,0 +1,48 @@
+From xiaofanc@gmail.com Tue May 13 14:56:50 2008
+From: "Xiaofan Chen" <xiaofanc@gmail.com>
+Date: Tue, 13 May 2008 21:52:00 +0800
+Subject: USB: remove PICDEM FS USB demo (04d8:000c) device from ldusb
+To: "Greg KH" <gregkh@suse.de>
+Cc: "Joey Goncalves" <jgoncalves@peragrin.com>, "Hund, Michael" <MHund@ld-didactic.de>, "USB list" <linux-usb@vger.kernel.org>
+Message-ID: <a276da400805130652y2d743856r33c91f707fb2892a@mail.gmail.com>
+Content-Disposition: inline
+
+
+Microchip has changed the PICDEM FS USB demo device (0x04d8:000c)
+to use bulk transfer and not interrupt transfer. So I've updated the libusb
+based program here (Post #31).
+ http://forum.microchip.com/tm.aspx?m=106426&mpage=2
+
+So I believe that the in-kernel ldusb driver will no longer work with the
+demo firmware. It should be removed.
+
+
+Signed-off-by: Xiaofan Chen <xiaofanc@gmail.com>
+Cc: Michael Hund <MHund@LD-Didactic.de>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/misc/ldusb.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+--- a/drivers/usb/misc/ldusb.c
++++ b/drivers/usb/misc/ldusb.c
+@@ -63,9 +63,6 @@
+ #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
+ #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
+
+-#define USB_VENDOR_ID_MICROCHIP 0x04d8
+-#define USB_DEVICE_ID_PICDEM 0x000c
+-
+ #ifdef CONFIG_USB_DYNAMIC_MINORS
+ #define USB_LD_MINOR_BASE 0
+ #else
+@@ -92,7 +89,6 @@ static struct usb_device_id ld_usb_table
+ { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
+ { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
+ { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) },
+- { USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICDEM) },
+ { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) },
+ { } /* Terminating entry */
+ };
diff --git a/usb.current/usbtest-comment-on-why-this-code-expects-negative-and-positive-errnos.patch b/usb.current/usbtest-comment-on-why-this-code-expects-negative-and-positive-errnos.patch
new file mode 100644
index 00000000000000..358565c0b9a7cc
--- /dev/null
+++ b/usb.current/usbtest-comment-on-why-this-code-expects-negative-and-positive-errnos.patch
@@ -0,0 +1,58 @@
+From marcin.slusarz@gmail.com Tue May 13 14:58:09 2008
+From: Marcin Slusarz <marcin.slusarz@gmail.com>
+Date: Mon, 12 May 2008 20:17:25 +0200
+Subject: usbtest: comment on why this code "expects" negative and positive errnos
+To: David Brownell <david-b@pacbell.net>, LKML <linux-kernel@vger.kernel.org>
+Cc: Greg Kroah-Hartman <gregkh@suse.de>, linux-usb@vger.kernel.org
+Message-ID: <20080512181721.GA6031@joi>
+Content-Disposition: inline
+
+
+On Mon, May 12, 2008 at 01:02:22AM -0700, David Brownell wrote:
+> On Sunday 11 May 2008, Marcin Slusarz wrote:
+> >
+> > test_ctrl_queue expects (?) positive and negative errnos.
+> > what is going on here?
+>
+> The sign is just a way to flag something:
+>
+> /* some faults are allowed, not required */
+>
+> The negative ones are required. Positive codes are optional,
+> in the sense that, depending on how the peripheral happens
+> to be implemented, they won't necessarily be triggered.
+>
+> For example, the test to fetch a device qualifier desriptor
+> must succeed if the device is running at high speed. So that
+> test is marked as negative. But when it's full speed, it
+> could legitimately fail; marked as positive. And so on for
+> other tests.
+>
+> Look at how the codes are *interpreted* to see it work.
+
+Lets document it.
+
+Based on comment from David Brownell <david-b@pacbell.net>.
+
+Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
+Cc: David Brownell <david-b@pacbell.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/misc/usbtest.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/usb/misc/usbtest.c
++++ b/drivers/usb/misc/usbtest.c
+@@ -856,6 +856,11 @@ test_ctrl_queue (struct usbtest_dev *dev
+ struct urb *u;
+ struct usb_ctrlrequest req;
+ struct subcase *reqp;
++
++ /* sign of this variable means:
++ * -: tested code must return this (negative) error code
++ * +: tested code may return this (negative too) error code
++ */
+ int expected = 0;
+
+ /* requests here are mostly expected to succeed on any