aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-06-16 15:31:08 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-06-16 15:31:08 -0700
commit5b88ea4d35a4788dcfbc3047149276898e194a4b (patch)
tree3873bcbf682aeb9ef089f69f4c88d8d2d5bc0073 /usb
parent3ab23ec21bc7eb5f1cc934b7c8ab126d01dd3f51 (diff)
downloadpatches-5b88ea4d35a4788dcfbc3047149276898e194a4b.tar.gz
lots of new patches
Diffstat (limited to 'usb')
-rw-r--r--usb/airprime.c-add-kyocera-wireless-kpc650-passport-support.patch29
-rw-r--r--usb/airprime_major_update.patch6
-rw-r--r--usb/usb-allow-multiple-types-of-ehci-controllers-to-be-built-as-modules.patch2
-rw-r--r--usb/usb-ehci-works-again-on-nvidia-controllers-with-2gb-ram.patch86
-rw-r--r--usb/usb-gadget-serial-do-not-save-restore-irq-flags-in-gs_close.patch80
-rw-r--r--usb/usb-gadget-serial-fix-a-deadlock-when-closing-the-serial-device.patch143
-rw-r--r--usb/usb-gotemp.patch6
-rw-r--r--usb/usb-implement-error-event-in-usbmon.patch112
-rw-r--r--usb/usb-io_edgeport-touch-up.patch39
-rw-r--r--usb/usb-new-driver-for-cypress-cy7c63xxx-mirco-controllers.patch318
-rw-r--r--usb/usb-serial-clean-tty-fields-on-failed-device-open.patch33
-rw-r--r--usb/usb-serial-dynamic-id.patch6
-rw-r--r--usb/usb-trivial-debug-message-correction-in-gadget-ether-driver.patch30
-rw-r--r--usb/usb-update-usbmon-fix-glued-lines.patch122
-rw-r--r--usb/usb-update-usbmon.txt.patch82
15 files changed, 1084 insertions, 10 deletions
diff --git a/usb/airprime.c-add-kyocera-wireless-kpc650-passport-support.patch b/usb/airprime.c-add-kyocera-wireless-kpc650-passport-support.patch
new file mode 100644
index 00000000000000..3da59343fd2615
--- /dev/null
+++ b/usb/airprime.c-add-kyocera-wireless-kpc650-passport-support.patch
@@ -0,0 +1,29 @@
+From timothy.sipples@us.ibm.com Fri Jun 16 04:36:01 2006
+From: Timothy Sipples <Timothy.Sipples@us.ibm.com>
+To: greg@kroah.com
+Subject: airprime.c: add Kyocera Wireless KPC650/Passport support
+Message-ID: <OF9CDBE0E1.1FFB454D-ON4925718F.003F5473-4925718F.003F9499@us.ibm.com>
+Date: Fri, 16 Jun 2006 20:42:59 +0900
+
+From: Timothy Sipples <Timothy.Sipples@us.ibm.com>
+
+Adds vendor & product IDs to drivers/usb/serial/airprime.c for Kyocera
+Wireless KPC650/Passport EV-DO/1xRTT PC Cards.
+
+Signed-off-by: Timothy Sipples <Timothy.Sipples@us.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/airprime.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/airprime.c
++++ gregkh-2.6/drivers/usb/serial/airprime.c
+@@ -16,6 +16,7 @@
+ #include "usb-serial.h"
+
+ static struct usb_device_id id_table [] = {
++ { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */
+ { USB_DEVICE(0xf3d, 0x0112) }, /* AirPrime CDMA Wireless PC Card */
+ { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */
+ { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless Aircard 580 */
diff --git a/usb/airprime_major_update.patch b/usb/airprime_major_update.patch
index df4f69569409bb..b4459ddb90d39a 100644
--- a/usb/airprime_major_update.patch
+++ b/usb/airprime_major_update.patch
@@ -36,7 +36,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
#include <linux/module.h>
#include <linux/usb.h>
#include "usb-serial.h"
-@@ -24,6 +25,201 @@ static struct usb_device_id id_table []
+@@ -25,6 +26,201 @@ static struct usb_device_id id_table []
};
MODULE_DEVICE_TABLE(usb, id_table);
@@ -238,7 +238,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
static struct usb_driver airprime_driver = {
.name = "airprime",
.probe = usb_serial_probe,
-@@ -42,6 +238,9 @@ static struct usb_serial_driver airprime
+@@ -43,6 +239,9 @@ static struct usb_serial_driver airprime
.num_bulk_in = NUM_DONT_CARE,
.num_bulk_out = NUM_DONT_CARE,
.num_ports = 1,
@@ -248,7 +248,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
};
static int __init airprime_init(void)
-@@ -66,3 +265,8 @@ static void __exit airprime_exit(void)
+@@ -67,3 +266,8 @@ static void __exit airprime_exit(void)
module_init(airprime_init);
module_exit(airprime_exit);
MODULE_LICENSE("GPL");
diff --git a/usb/usb-allow-multiple-types-of-ehci-controllers-to-be-built-as-modules.patch b/usb/usb-allow-multiple-types-of-ehci-controllers-to-be-built-as-modules.patch
index 641a4c5a816723..3a4eb5fc2e5166 100644
--- a/usb/usb-allow-multiple-types-of-ehci-controllers-to-be-built-as-modules.patch
+++ b/usb/usb-allow-multiple-types-of-ehci-controllers-to-be-built-as-modules.patch
@@ -317,7 +317,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
--- gregkh-2.6.orig/drivers/usb/host/ehci-pci.c
+++ gregkh-2.6/drivers/usb/host/ehci-pci.c
-@@ -370,23 +370,3 @@ static struct pci_driver ehci_pci_driver
+@@ -379,23 +379,3 @@ static struct pci_driver ehci_pci_driver
.resume = usb_hcd_pci_resume,
#endif
};
diff --git a/usb/usb-ehci-works-again-on-nvidia-controllers-with-2gb-ram.patch b/usb/usb-ehci-works-again-on-nvidia-controllers-with-2gb-ram.patch
new file mode 100644
index 00000000000000..59bcc3c6a1cb7d
--- /dev/null
+++ b/usb/usb-ehci-works-again-on-nvidia-controllers-with-2gb-ram.patch
@@ -0,0 +1,86 @@
+From david-b@pacbell.net Wed Jun 7 10:35:34 2006
+From: David Brownell <david-b@pacbell.net>
+To: Linus Torvalds <torvalds@osdl.org>
+Subject: USB: EHCI works again on NVidia controllers with >2GB RAM
+Date: Wed, 7 Jun 2006 10:23:38 -0700
+Cc: Greg KH <greg@kroah.com>, Andrew Morton <akpm@osdl.org>, Paul Serice <paul@serice.net>
+Message-Id: <200606071023.38788.david-b@pacbell.net>
+
+
+From: Paul Serice <paul@serice.net>
+
+The workaround in commit f7201c3dcd7799f2aa3d6ec427b194225360ecee
+broke. The work around requires memory for DMA transfers for some
+NVidia EHCI controllers to be below 2GB, but recent changes have
+caused some DMA memory to be allocated before the DMA mask is set.
+
+Signed-off-by: Paul Serice <paul@serice.net>
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/ehci-pci.c | 39 ++++++++++++++++++++++++---------------
+ 1 file changed, 24 insertions(+), 15 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/host/ehci-pci.c
++++ gregkh-2.6/drivers/usb/host/ehci-pci.c
+@@ -76,6 +76,30 @@ static int ehci_pci_setup(struct usb_hcd
+ dbg_hcs_params(ehci, "reset");
+ dbg_hcc_params(ehci, "reset");
+
++ /* ehci_init() causes memory for DMA transfers to be
++ * allocated. Thus, any vendor-specific workarounds based on
++ * limiting the type of memory used for DMA transfers must
++ * happen before ehci_init() is called. */
++ switch (pdev->vendor) {
++ case PCI_VENDOR_ID_NVIDIA:
++ /* NVidia reports that certain chips don't handle
++ * QH, ITD, or SITD addresses above 2GB. (But TD,
++ * data buffer, and periodic schedule are normal.)
++ */
++ switch (pdev->device) {
++ case 0x003c: /* MCP04 */
++ case 0x005b: /* CK804 */
++ case 0x00d8: /* CK8 */
++ case 0x00e8: /* CK8S */
++ if (pci_set_consistent_dma_mask(pdev,
++ DMA_31BIT_MASK) < 0)
++ ehci_warn(ehci, "can't enable NVidia "
++ "workaround for >2GB RAM\n");
++ break;
++ }
++ break;
++ }
++
+ /* cache this readonly data; minimize chip reads */
+ ehci->hcs_params = readl(&ehci->caps->hcs_params);
+
+@@ -88,8 +112,6 @@ static int ehci_pci_setup(struct usb_hcd
+ if (retval)
+ return retval;
+
+- /* NOTE: only the parts below this line are PCI-specific */
+-
+ switch (pdev->vendor) {
+ case PCI_VENDOR_ID_TDI:
+ if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
+@@ -107,19 +129,6 @@ static int ehci_pci_setup(struct usb_hcd
+ break;
+ case PCI_VENDOR_ID_NVIDIA:
+ switch (pdev->device) {
+- /* NVidia reports that certain chips don't handle
+- * QH, ITD, or SITD addresses above 2GB. (But TD,
+- * data buffer, and periodic schedule are normal.)
+- */
+- case 0x003c: /* MCP04 */
+- case 0x005b: /* CK804 */
+- case 0x00d8: /* CK8 */
+- case 0x00e8: /* CK8S */
+- if (pci_set_consistent_dma_mask(pdev,
+- DMA_31BIT_MASK) < 0)
+- ehci_warn(ehci, "can't enable NVidia "
+- "workaround for >2GB RAM\n");
+- break;
+ /* Some NForce2 chips have problems with selective suspend;
+ * fixed in newer silicon.
+ */
diff --git a/usb/usb-gadget-serial-do-not-save-restore-irq-flags-in-gs_close.patch b/usb/usb-gadget-serial-do-not-save-restore-irq-flags-in-gs_close.patch
new file mode 100644
index 00000000000000..60536f894370b4
--- /dev/null
+++ b/usb/usb-gadget-serial-do-not-save-restore-irq-flags-in-gs_close.patch
@@ -0,0 +1,80 @@
+From vagabon.xyz@gmail.com Wed Jun 14 01:47:35 2006
+Message-ID: <cda58cb80606140147v76b3198jaad106a8121952b2@mail.gmail.com>
+Date: Wed, 14 Jun 2006 10:47:18 +0200
+From: "Franck Bui-Huu" <vagabon.xyz@gmail.com>
+To: "David Brownell" <david-b@pacbell.net>
+Subject: USB: gadget-serial: do not save/restore IRQ flags in gs_close()
+Cc: "Greg KH" <greg@kroah.com>, "Alan Stern" <stern@rowland.harvard.edu>, <alborchers@steinerpoint.com>
+Content-Disposition: inline
+
+As pointed out by David Brownell, we know that IRQs are never
+blocked when calling gs_close function. So the save/restore
+IRQ flags are pointless.
+
+Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/serial.c | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/gadget/serial.c
++++ gregkh-2.6/drivers/usb/gadget/serial.c
+@@ -53,8 +53,8 @@
+
+ /* Defines */
+
+-#define GS_VERSION_STR "v2.1"
+-#define GS_VERSION_NUM 0x0201
++#define GS_VERSION_STR "v2.2"
++#define GS_VERSION_NUM 0x0202
+
+ #define GS_LONG_NAME "Gadget Serial"
+ #define GS_SHORT_NAME "g_serial"
+@@ -774,12 +774,11 @@ exit_unlock_dev:
+
+ #define GS_WRITE_FINISHED_EVENT_SAFELY(p) \
+ ({ \
+- unsigned long flags; \
+ int cond; \
+ \
+- spin_lock_irqsave(&(p)->port_lock, flags); \
++ spin_lock_irq(&(p)->port_lock); \
+ cond = !(p)->port_dev || !gs_buf_data_avail((p)->port_write_buf); \
+- spin_unlock_irqrestore(&(p)->port_lock, flags); \
++ spin_unlock_irq(&(p)->port_lock); \
+ cond; \
+ })
+
+@@ -799,7 +798,7 @@ static void gs_close(struct tty_struct *
+ sem = &gs_open_close_sem[port->port_num];
+ down(sem);
+
+- spin_lock_irqsave(&port->port_lock, flags);
++ spin_lock_irq(&port->port_lock);
+
+ if (port->port_open_count == 0) {
+ printk(KERN_ERR
+@@ -827,11 +826,11 @@ static void gs_close(struct tty_struct *
+ /* wait for write buffer to drain, or */
+ /* at most GS_CLOSE_TIMEOUT seconds */
+ if (gs_buf_data_avail(port->port_write_buf) > 0) {
+- spin_unlock_irqrestore(&port->port_lock, flags);
++ spin_unlock_irq(&port->port_lock);
+ wait_event_interruptible_timeout(port->port_write_wait,
+ GS_WRITE_FINISHED_EVENT_SAFELY(port),
+ GS_CLOSE_TIMEOUT * HZ);
+- spin_lock_irqsave(&port->port_lock, flags);
++ spin_lock_irq(&port->port_lock);
+ }
+
+ /* free disconnected port on final close */
+@@ -851,7 +850,7 @@ static void gs_close(struct tty_struct *
+ port->port_num, tty, file);
+
+ exit:
+- spin_unlock_irqrestore(&port->port_lock, flags);
++ spin_unlock_irq(&port->port_lock);
+ up(sem);
+ }
+
diff --git a/usb/usb-gadget-serial-fix-a-deadlock-when-closing-the-serial-device.patch b/usb/usb-gadget-serial-fix-a-deadlock-when-closing-the-serial-device.patch
new file mode 100644
index 00000000000000..d50f294f9a3eb6
--- /dev/null
+++ b/usb/usb-gadget-serial-fix-a-deadlock-when-closing-the-serial-device.patch
@@ -0,0 +1,143 @@
+From vagabon.xyz@gmail.com Wed Jun 14 01:29:32 2006
+Message-ID: <cda58cb80606140129u51944c86l6195fe12125c2494@mail.gmail.com>
+Date: Wed, 14 Jun 2006 10:29:21 +0200
+From: "Franck Bui-Huu" <vagabon.xyz@gmail.com>
+To: "David Brownell" <david-b@pacbell.net>
+Subject: USB: gadget-serial: fix a deadlock when closing the serial device
+Cc: "Greg KH" <greg@kroah.com>, "Alan Stern" <stern@rowland.harvard.edu>, <alborchers@steinerpoint.com>
+Content-Disposition: inline
+
+When closing the device, the driver acquires/release twice the
+port lock before/after waiting for the data to be completely
+sent. Therefore it will dead lock.
+
+This patch fixes it and also uses the generic scheduler services
+for waiting for an event.
+
+Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/serial.c | 95 +++++++-------------------------------------
+ 1 file changed, 17 insertions(+), 78 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/gadget/serial.c
++++ gregkh-2.6/drivers/usb/gadget/serial.c
+@@ -51,82 +51,10 @@
+ #include "gadget_chips.h"
+
+
+-/* Wait Cond */
+-
+-#define __wait_cond_interruptible(wq, condition, lock, flags, ret) \
+-do { \
+- wait_queue_t __wait; \
+- init_waitqueue_entry(&__wait, current); \
+- \
+- add_wait_queue(&wq, &__wait); \
+- for (;;) { \
+- set_current_state(TASK_INTERRUPTIBLE); \
+- if (condition) \
+- break; \
+- if (!signal_pending(current)) { \
+- spin_unlock_irqrestore(lock, flags); \
+- schedule(); \
+- spin_lock_irqsave(lock, flags); \
+- continue; \
+- } \
+- ret = -ERESTARTSYS; \
+- break; \
+- } \
+- current->state = TASK_RUNNING; \
+- remove_wait_queue(&wq, &__wait); \
+-} while (0)
+-
+-#define wait_cond_interruptible(wq, condition, lock, flags) \
+-({ \
+- int __ret = 0; \
+- if (!(condition)) \
+- __wait_cond_interruptible(wq, condition, lock, flags, \
+- __ret); \
+- __ret; \
+-})
+-
+-#define __wait_cond_interruptible_timeout(wq, condition, lock, flags, \
+- timeout, ret) \
+-do { \
+- signed long __timeout = timeout; \
+- wait_queue_t __wait; \
+- init_waitqueue_entry(&__wait, current); \
+- \
+- add_wait_queue(&wq, &__wait); \
+- for (;;) { \
+- set_current_state(TASK_INTERRUPTIBLE); \
+- if (__timeout == 0) \
+- break; \
+- if (condition) \
+- break; \
+- if (!signal_pending(current)) { \
+- spin_unlock_irqrestore(lock, flags); \
+- __timeout = schedule_timeout(__timeout); \
+- spin_lock_irqsave(lock, flags); \
+- continue; \
+- } \
+- ret = -ERESTARTSYS; \
+- break; \
+- } \
+- current->state = TASK_RUNNING; \
+- remove_wait_queue(&wq, &__wait); \
+-} while (0)
+-
+-#define wait_cond_interruptible_timeout(wq, condition, lock, flags, \
+- timeout) \
+-({ \
+- int __ret = 0; \
+- if (!(condition)) \
+- __wait_cond_interruptible_timeout(wq, condition, lock, \
+- flags, timeout, __ret); \
+- __ret; \
+-})
+-
+-
+ /* Defines */
+
+-#define GS_VERSION_STR "v2.0"
+-#define GS_VERSION_NUM 0x0200
++#define GS_VERSION_STR "v2.1"
++#define GS_VERSION_NUM 0x0201
+
+ #define GS_LONG_NAME "Gadget Serial"
+ #define GS_SHORT_NAME "g_serial"
+@@ -843,6 +771,18 @@ exit_unlock_dev:
+ /*
+ * gs_close
+ */
++
++#define GS_WRITE_FINISHED_EVENT_SAFELY(p) \
++({ \
++ unsigned long flags; \
++ int cond; \
++ \
++ spin_lock_irqsave(&(p)->port_lock, flags); \
++ cond = !(p)->port_dev || !gs_buf_data_avail((p)->port_write_buf); \
++ spin_unlock_irqrestore(&(p)->port_lock, flags); \
++ cond; \
++})
++
+ static void gs_close(struct tty_struct *tty, struct file *file)
+ {
+ unsigned long flags;
+@@ -888,10 +828,9 @@ static void gs_close(struct tty_struct *
+ /* at most GS_CLOSE_TIMEOUT seconds */
+ if (gs_buf_data_avail(port->port_write_buf) > 0) {
+ spin_unlock_irqrestore(&port->port_lock, flags);
+- wait_cond_interruptible_timeout(port->port_write_wait,
+- port->port_dev == NULL
+- || gs_buf_data_avail(port->port_write_buf) == 0,
+- &port->port_lock, flags, GS_CLOSE_TIMEOUT * HZ);
++ wait_event_interruptible_timeout(port->port_write_wait,
++ GS_WRITE_FINISHED_EVENT_SAFELY(port),
++ GS_CLOSE_TIMEOUT * HZ);
+ spin_lock_irqsave(&port->port_lock, flags);
+ }
+
diff --git a/usb/usb-gotemp.patch b/usb/usb-gotemp.patch
index 52b9a2d3745b20..9c5e389b3c394c 100644
--- a/usb/usb-gotemp.patch
+++ b/usb/usb-gotemp.patch
@@ -21,7 +21,7 @@ This is only a teaching tool.
--- gregkh-2.6.orig/drivers/usb/Makefile
+++ gregkh-2.6/drivers/usb/Makefile
-@@ -53,6 +53,7 @@ obj-$(CONFIG_USB_AUERSWALD) += misc/
+@@ -54,6 +54,7 @@ obj-$(CONFIG_USB_CY7C63) += misc/
obj-$(CONFIG_USB_CYTHERM) += misc/
obj-$(CONFIG_USB_EMI26) += misc/
obj-$(CONFIG_USB_EMI62) += misc/
@@ -31,7 +31,7 @@ This is only a teaching tool.
obj-$(CONFIG_USB_LD) += misc/
--- gregkh-2.6.orig/drivers/usb/misc/Kconfig
+++ gregkh-2.6/drivers/usb/misc/Kconfig
-@@ -101,6 +101,16 @@ config USB_CYTHERM
+@@ -115,6 +115,16 @@ config USB_CYTHERM
To compile this driver as a module, choose M here: the
module will be called cytherm.
@@ -50,7 +50,7 @@ This is only a teaching tool.
depends on USB
--- gregkh-2.6.orig/drivers/usb/misc/Makefile
+++ gregkh-2.6/drivers/usb/misc/Makefile
-@@ -7,6 +7,7 @@ obj-$(CONFIG_USB_AUERSWALD) += auerswald
+@@ -8,6 +8,7 @@ obj-$(CONFIG_USB_CY7C63) += cy7c63.o
obj-$(CONFIG_USB_CYTHERM) += cytherm.o
obj-$(CONFIG_USB_EMI26) += emi26.o
obj-$(CONFIG_USB_EMI62) += emi62.o
diff --git a/usb/usb-implement-error-event-in-usbmon.patch b/usb/usb-implement-error-event-in-usbmon.patch
new file mode 100644
index 00000000000000..9aa989c7b0c3ac
--- /dev/null
+++ b/usb/usb-implement-error-event-in-usbmon.patch
@@ -0,0 +1,112 @@
+From zaitcev@redhat.com Fri Jun 9 22:03:42 2006
+Date: Fri, 9 Jun 2006 22:03:32 -0700
+From: Pete Zaitcev <zaitcev@redhat.com>
+To: greg@kroah.com
+Cc: zaitcev@redhat.com
+Subject: USB: implement error event in usbmon
+Message-Id: <20060609220332.45961b69.zaitcev@redhat.com>
+
+Implement the "error" event in usbmon.
+
+Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/mon/mon_main.c | 20 ++++++++++++++++----
+ drivers/usb/mon/mon_text.c | 27 +++++++++++++++++++++++++++
+ drivers/usb/mon/usb_mon.h | 1 +
+ 3 files changed, 44 insertions(+), 4 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/mon/mon_main.c
++++ gregkh-2.6/drivers/usb/mon/mon_main.c
+@@ -114,20 +114,32 @@ out_unlocked:
+
+ /*
+ */
+-static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int err)
++static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int error)
+ {
+ struct mon_bus *mbus;
++ unsigned long flags;
++ struct list_head *pos;
++ struct mon_reader *r;
+
+ mbus = ubus->mon_bus;
+ if (mbus == NULL)
+ goto out_unlocked;
+
+- /*
+- * XXX Capture the error code and the 'E' event.
+- */
++ spin_lock_irqsave(&mbus->lock, flags);
++ if (mbus->nreaders == 0)
++ goto out_locked;
+
++ mbus->cnt_events++;
++ list_for_each (pos, &mbus->r_list) {
++ r = list_entry(pos, struct mon_reader, r_link);
++ r->rnf_error(r->r_data, urb, error);
++ }
++
++ spin_unlock_irqrestore(&mbus->lock, flags);
+ return;
+
++out_locked:
++ spin_unlock_irqrestore(&mbus->lock, flags);
+ out_unlocked:
+ return;
+ }
+--- gregkh-2.6.orig/drivers/usb/mon/mon_text.c
++++ gregkh-2.6/drivers/usb/mon/mon_text.c
+@@ -182,6 +182,32 @@ static void mon_text_complete(void *data
+ mon_text_event(rp, urb, 'C');
+ }
+
++static void mon_text_error(void *data, struct urb *urb, int error)
++{
++ struct mon_reader_text *rp = data;
++ struct mon_event_text *ep;
++
++ if (rp->nevents >= EVENT_MAX ||
++ (ep = kmem_cache_alloc(rp->e_slab, SLAB_ATOMIC)) == NULL) {
++ rp->r.m_bus->cnt_text_lost++;
++ return;
++ }
++
++ ep->type = 'E';
++ ep->pipe = urb->pipe;
++ ep->id = (unsigned long) urb;
++ ep->tstamp = 0;
++ ep->length = 0;
++ ep->status = error;
++
++ ep->setup_flag = '-';
++ ep->data_flag = 'E';
++
++ rp->nevents++;
++ list_add_tail(&ep->e_link, &rp->e_list);
++ wake_up(&rp->wait);
++}
++
+ /*
+ * Fetch next event from the circular buffer.
+ */
+@@ -235,6 +261,7 @@ static int mon_text_open(struct inode *i
+ rp->r.m_bus = mbus;
+ rp->r.r_data = rp;
+ rp->r.rnf_submit = mon_text_submit;
++ rp->r.rnf_error = mon_text_error;
+ rp->r.rnf_complete = mon_text_complete;
+
+ snprintf(rp->slab_name, SLAB_NAME_SZ, "mon%dt_%lx", ubus->busnum,
+--- gregkh-2.6.orig/drivers/usb/mon/usb_mon.h
++++ gregkh-2.6/drivers/usb/mon/usb_mon.h
+@@ -40,6 +40,7 @@ struct mon_reader {
+ void *r_data; /* Use container_of instead? */
+
+ void (*rnf_submit)(void *data, struct urb *urb);
++ void (*rnf_error)(void *data, struct urb *urb, int error);
+ void (*rnf_complete)(void *data, struct urb *urb);
+ };
+
diff --git a/usb/usb-io_edgeport-touch-up.patch b/usb/usb-io_edgeport-touch-up.patch
new file mode 100644
index 00000000000000..e6d7d615f5be89
--- /dev/null
+++ b/usb/usb-io_edgeport-touch-up.patch
@@ -0,0 +1,39 @@
+From zaitcev@redhat.com Tue Jun 6 18:18:46 2006
+Date: Tue, 6 Jun 2006 18:18:33 -0700
+From: Pete Zaitcev <zaitcev@redhat.com>
+To: greg@kroah.com
+Subject: USB: io_edgeport touch-up
+Message-Id: <20060606181833.b2ce6c13.zaitcev@redhat.com>
+
+Al Borchers suggested to do this in his review of my previous patch.
+I guess that I skipped this initially because of my visceral dislike
+of sizeof(data). But in this case it seems well localized.
+
+Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/io_edgeport.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/serial/io_edgeport.c
++++ gregkh-2.6/drivers/usb/serial/io_edgeport.c
+@@ -2607,15 +2607,15 @@ static void get_manufacturing_desc (stru
+ dbg(" BoardRev: %d", edge_serial->manuf_descriptor.BoardRev);
+ dbg(" NumPorts: %d", edge_serial->manuf_descriptor.NumPorts);
+ dbg(" DescDate: %d/%d/%d", edge_serial->manuf_descriptor.DescDate[0], edge_serial->manuf_descriptor.DescDate[1], edge_serial->manuf_descriptor.DescDate[2]+1900);
+- unicode_to_ascii(string, 30,
++ unicode_to_ascii(string, sizeof(string),
+ edge_serial->manuf_descriptor.SerialNumber,
+ edge_serial->manuf_descriptor.SerNumLength/2);
+ dbg(" SerialNumber: %s", string);
+- unicode_to_ascii(string, 30,
++ unicode_to_ascii(string, sizeof(string),
+ edge_serial->manuf_descriptor.AssemblyNumber,
+ edge_serial->manuf_descriptor.AssemblyNumLength/2);
+ dbg(" AssemblyNumber: %s", string);
+- unicode_to_ascii(string, 30,
++ unicode_to_ascii(string, sizeof(string),
+ edge_serial->manuf_descriptor.OemAssyNumber,
+ edge_serial->manuf_descriptor.OemAssyNumLength/2);
+ dbg(" OemAssyNumber: %s", string);
diff --git a/usb/usb-new-driver-for-cypress-cy7c63xxx-mirco-controllers.patch b/usb/usb-new-driver-for-cypress-cy7c63xxx-mirco-controllers.patch
new file mode 100644
index 00000000000000..9efde01a3991d3
--- /dev/null
+++ b/usb/usb-new-driver-for-cypress-cy7c63xxx-mirco-controllers.patch
@@ -0,0 +1,318 @@
+From linux-kernel-owner@vger.kernel.org Fri Jun 9 15:44:46 2006
+From: Oliver Bock <o.bock@fh-wolfenbuettel.de>
+Subject: USB: new driver for Cypress CY7C63xxx mirco controllers
+Date: Sat, 10 Jun 2006 00:42:19 +0200
+Cc: pavel@ucw.cz, akpm@osdl.org
+Content-Disposition: inline
+Message-Id: <200606100042.19441.o.bock@fh-wolfenbuettel.de>
+
+From: Oliver Bock <o.bock@fh-wolfenbuettel.de>
+
+This is a new driver for the Cypress CY7C63xxx mirco controller series.
+It currently supports the pre-programmed CYC63001A-PC by AK Modul-Bus
+GmbH. It's based on a kernel 2.4 driver (cyport) by Marcus Maul which I
+ported to kernel 2.6 using sysfs. I intend to support more controllers
+of this family (and more features) as soon as I get hold of the required
+IDs etc. Please see the source code's header for more information.
+
+Signed-off-by: Oliver Bock <o.bock@fh-wolfenbuettel.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/Makefile | 1
+ drivers/usb/misc/Kconfig | 14 ++
+ drivers/usb/misc/Makefile | 1
+ drivers/usb/misc/cy7c63.c | 244 ++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 260 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/Makefile
++++ gregkh-2.6/drivers/usb/Makefile
+@@ -48,6 +48,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/
+ obj-$(CONFIG_USB_SERIAL) += serial/
+
+ obj-$(CONFIG_USB_AUERSWALD) += misc/
++obj-$(CONFIG_USB_CY7C63) += misc/
+ obj-$(CONFIG_USB_CYTHERM) += misc/
+ obj-$(CONFIG_USB_EMI26) += misc/
+ obj-$(CONFIG_USB_EMI62) += misc/
+--- gregkh-2.6.orig/drivers/usb/misc/Kconfig
++++ gregkh-2.6/drivers/usb/misc/Kconfig
+@@ -88,6 +88,20 @@ config USB_LED
+ To compile this driver as a module, choose M here: the
+ module will be called usbled.
+
++config USB_CY7C63
++ tristate "Cypress CY7C63xxx USB driver support"
++ depends on USB
++ help
++ Say Y here if you want to connect a Cypress CY7C63xxx
++ micro controller to your computer's USB port. This driver
++ supports the pre-programmed devices (incl. firmware) by
++ AK Modul-Bus Computer GmbH.
++
++ Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html
++
++ To compile this driver as a module, choose M here: the
++ module will be called cy7c63.
++
+ config USB_CYTHERM
+ tristate "Cypress USB thermometer driver support"
+ depends on USB
+--- gregkh-2.6.orig/drivers/usb/misc/Makefile
++++ gregkh-2.6/drivers/usb/misc/Makefile
+@@ -4,6 +4,7 @@
+ #
+
+ obj-$(CONFIG_USB_AUERSWALD) += auerswald.o
++obj-$(CONFIG_USB_CY7C63) += cy7c63.o
+ obj-$(CONFIG_USB_CYTHERM) += cytherm.o
+ obj-$(CONFIG_USB_EMI26) += emi26.o
+ obj-$(CONFIG_USB_EMI62) += emi62.o
+--- /dev/null
++++ gregkh-2.6/drivers/usb/misc/cy7c63.c
+@@ -0,0 +1,244 @@
++/*
++* cy7c63.c
++*
++* Copyright (c) 2006 Oliver Bock (bock@fh-wolfenbuettel.de)
++*
++* This driver is based on the Cypress Thermometer USB Driver by
++* Marcus Maul and the 2.0 version of Greg Kroah-Hartman's
++* USB Skeleton driver.
++*
++* Is is a generic driver for the Cypress CY7C63000 family.
++* For the time being it enables you to toggle the single I/O ports
++* of the device.
++*
++* Supported vendors: AK Modul-Bus Computer GmbH
++* Supported devices: CY7C63001A-PC (to be continued...)
++* Supported functions: Read/Write Ports (to be continued...)
++*
++* Chipsets families: CY7C63000, CY7C63001, CY7C63100, CY7C63101
++*
++*
++* This program is free software; you can redistribute it and/or
++* modify it under the terms of the GNU General Public License as
++* published by the Free Software Foundation, version 2.
++*/
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/usb.h>
++
++#define DRIVER_AUTHOR "Oliver Bock (bock@fh-wolfenbuettel.de)"
++#define DRIVER_DESC "Cypress CY7C63xxx USB driver"
++
++#define CY7C63_VENDOR_ID 0xa2c
++#define CY7C63_PRODUCT_ID 0x8
++
++#define CY7C63_READ_PORT 0x4
++#define CY7C63_WRITE_PORT 0x5
++#define CY7C63_READ_RAM 0x2
++#define CY7C63_WRITE_RAM 0x3
++#define CY7C63_READ_ROM 0x1
++
++#define CY7C63_READ_PORT_ID0 0
++#define CY7C63_WRITE_PORT_ID0 0
++#define CY7C63_READ_PORT_ID1 0x2
++#define CY7C63_WRITE_PORT_ID1 1
++
++#define CY7C63_MAX_REQSIZE 8
++
++
++/* table of devices that work with this driver */
++static struct usb_device_id cy7c63_table [] = {
++ { USB_DEVICE(CY7C63_VENDOR_ID, CY7C63_PRODUCT_ID) },
++ { }
++};
++MODULE_DEVICE_TABLE(usb, cy7c63_table);
++
++/* structure to hold all of our device specific stuff */
++struct cy7c63 {
++ struct usb_device * udev;
++ char port0;
++ char port1;
++};
++
++/* used to send usb control messages to device */
++int vendor_command(struct cy7c63 *dev, unsigned char request,
++ unsigned char address, unsigned char data) {
++
++ int retval = 0;
++ unsigned int pipe;
++ unsigned char *iobuf;
++
++ /* allocate some memory for the i/o buffer*/
++ iobuf = kzalloc(CY7C63_MAX_REQSIZE, GFP_KERNEL);
++ if (!iobuf) {
++ dev_err(&dev->udev->dev, "Out of memory!\n");
++ retval = -ENOMEM;
++ goto error;
++ }
++
++ dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", data);
++
++ /* prepare usb control message and send it upstream */
++ pipe = usb_rcvctrlpipe(dev->udev, 0);
++ retval = usb_control_msg(dev->udev, pipe, request,
++ USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ address, data, iobuf, CY7C63_MAX_REQSIZE,
++ USB_CTRL_GET_TIMEOUT);
++
++ /* store returned data (more READs to be added!) */
++ switch (request) {
++ case CY7C63_READ_PORT:
++ if (address == CY7C63_READ_PORT_ID0) {
++ dev->port0 = iobuf[1];
++ dev_dbg(&dev->udev->dev,
++ "READ_PORT0 returned: %d\n",dev->port0);
++ }
++ else if (address == CY7C63_READ_PORT_ID1) {
++ dev->port1 = iobuf[1];
++ dev_dbg(&dev->udev->dev,
++ "READ_PORT1 returned: %d\n",dev->port1);
++ }
++ break;
++ }
++
++ kfree(iobuf);
++error:
++ return retval;
++}
++
++#define get_set_port(num,read_id,write_id) \
++static ssize_t set_port##num(struct device *dev, struct device_attribute *attr, \
++ const char *buf, size_t count) { \
++ \
++ int value; \
++ int result = 0; \
++ \
++ struct usb_interface *intf = to_usb_interface(dev); \
++ struct cy7c63 *cyp = usb_get_intfdata(intf); \
++ \
++ dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", num); \
++ \
++ /* validate input data */ \
++ if (sscanf(buf, "%d", &value) < 1) { \
++ result = -EINVAL; \
++ goto error; \
++ } \
++ if (value>255 || value<0) { \
++ result = -EINVAL; \
++ goto error; \
++ } \
++ \
++ result = vendor_command(cyp, CY7C63_WRITE_PORT, write_id, \
++ (unsigned char)value); \
++ \
++ dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n",result); \
++error: \
++ return result < 0 ? result : count; \
++} \
++ \
++static ssize_t get_port##num(struct device *dev, \
++ struct device_attribute *attr, char *buf) { \
++ \
++ int result = 0; \
++ \
++ struct usb_interface *intf = to_usb_interface(dev); \
++ struct cy7c63 *cyp = usb_get_intfdata(intf); \
++ \
++ dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", num); \
++ \
++ result = vendor_command(cyp, CY7C63_READ_PORT, read_id, 0); \
++ \
++ dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); \
++ \
++ return sprintf(buf, "%d", cyp->port##num); \
++} \
++static DEVICE_ATTR(port##num, S_IWUGO | S_IRUGO, get_port##num, set_port##num);
++
++get_set_port(0, CY7C63_READ_PORT_ID0, CY7C63_WRITE_PORT_ID0);
++get_set_port(1, CY7C63_READ_PORT_ID1, CY7C63_WRITE_PORT_ID1);
++
++static int cy7c63_probe(struct usb_interface *interface,
++ const struct usb_device_id *id) {
++
++ struct cy7c63 *dev = NULL;
++ int retval = -ENOMEM;
++
++ /* allocate memory for our device state and initialize it */
++ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
++ if (dev == NULL) {
++ dev_err(&dev->udev->dev, "Out of memory!\n");
++ goto error;
++ }
++
++ dev->udev = usb_get_dev(interface_to_usbdev(interface));
++
++ /* save our data pointer in this interface device */
++ usb_set_intfdata(interface, dev);
++
++ /* create device attribute files */
++ device_create_file(&interface->dev, &dev_attr_port0);
++ device_create_file(&interface->dev, &dev_attr_port1);
++
++ /* let the user know what node this device is now attached to */
++ dev_info(&interface->dev,
++ "Cypress CY7C63xxx device now attached\n");
++
++ retval = 0;
++error:
++ return retval;
++}
++
++static void cy7c63_disconnect(struct usb_interface *interface) {
++
++ struct cy7c63 *dev;
++
++ dev = usb_get_intfdata(interface);
++ usb_set_intfdata(interface, NULL);
++
++ /* remove device attribute files */
++ device_remove_file(&interface->dev, &dev_attr_port0);
++ device_remove_file(&interface->dev, &dev_attr_port1);
++
++ usb_put_dev(dev->udev);
++
++ dev_info(&interface->dev,
++ "Cypress CY7C63xxx device now disconnected\n");
++
++ kfree(dev);
++}
++
++static struct usb_driver cy7c63_driver = {
++ .name = "cy7c63",
++ .probe = cy7c63_probe,
++ .disconnect = cy7c63_disconnect,
++ .id_table = cy7c63_table,
++};
++
++static int __init cy7c63_init(void) {
++
++ int result;
++
++ /* register this driver with the USB subsystem */
++ result = usb_register(&cy7c63_driver);
++ if (result) {
++ err("Function usb_register failed! Error number: %d\n", result);
++ }
++
++ return result;
++}
++
++static void __exit cy7c63_exit(void) {
++
++ /* deregister this driver with the USB subsystem */
++ usb_deregister(&cy7c63_driver);
++}
++
++module_init(cy7c63_init);
++module_exit(cy7c63_exit);
++
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_DESCRIPTION(DRIVER_DESC);
++
++MODULE_LICENSE("GPL");
diff --git a/usb/usb-serial-clean-tty-fields-on-failed-device-open.patch b/usb/usb-serial-clean-tty-fields-on-failed-device-open.patch
new file mode 100644
index 00000000000000..d844cbf87bfcc6
--- /dev/null
+++ b/usb/usb-serial-clean-tty-fields-on-failed-device-open.patch
@@ -0,0 +1,33 @@
+From fg@fks.be Wed Jun 14 06:52:27 2006
+Date: Wed, 14 Jun 2006 15:52:05 +0200
+From: Frank Gevaerts <frank.gevaerts@fks.be>
+To: "Luiz Fernando N. Capitulino" <lcapitulino@mandriva.com.br>
+Cc: Frank Gevaerts <frank.gevaerts@fks.be>, Mark Lord <lkml@rtr.ca>, Greg KH <gregkh@suse.de>, Andrew Morton <akpm@osdl.org>
+Subject: USB Serial: clean tty fields on failed device open
+Message-ID: <20060614135205.GA5814@fks.be>
+Content-Disposition: inline
+
+If either the driver's open() method or try_module_get() fails, we need to
+set 'tty->driver_data' and 'port->tty' to NULL in serial_open(), otherwise
+we'll get an OOPS in usb_device_disconnect() when the device is disconnected.
+
+Signed-off-by: Frank Gevaerts <frank.gevaerts@fks.be>
+Acked-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/serial/usb-serial.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/usb-serial.c
++++ gregkh-2.6/drivers/usb/serial/usb-serial.c
+@@ -237,6 +237,8 @@ bailout_module_put:
+ module_put(serial->type->driver.owner);
+ bailout_mutex_unlock:
+ port->open_count = 0;
++ tty->driver_data = NULL;
++ port->tty = NULL;
+ mutex_unlock(&port->mutex);
+ bailout_kref_put:
+ usb_serial_put(serial);
diff --git a/usb/usb-serial-dynamic-id.patch b/usb/usb-serial-dynamic-id.patch
index fa7a146342bf37..9f2746ed4560ea 100644
--- a/usb/usb-serial-dynamic-id.patch
+++ b/usb/usb-serial-dynamic-id.patch
@@ -201,7 +201,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
.name = "usbserial",
.probe = usb_serial_probe,
.disconnect = usb_serial_disconnect,
-@@ -599,6 +599,39 @@ static struct usb_serial * create_serial
+@@ -601,6 +601,39 @@ static struct usb_serial * create_serial
return serial;
}
@@ -241,7 +241,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
static struct usb_serial_driver *search_serial_device(struct usb_interface *iface)
{
struct list_head *p;
-@@ -608,11 +641,9 @@ static struct usb_serial_driver *search_
+@@ -610,11 +643,9 @@ static struct usb_serial_driver *search_
/* Check if the usb id matches a known device */
list_for_each(p, &usb_serial_driver_list) {
t = list_entry(p, struct usb_serial_driver, driver_list);
@@ -255,7 +255,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
}
return NULL;
-@@ -664,7 +695,7 @@ int usb_serial_probe(struct usb_interfac
+@@ -666,7 +697,7 @@ int usb_serial_probe(struct usb_interfac
return -EIO;
}
diff --git a/usb/usb-trivial-debug-message-correction-in-gadget-ether-driver.patch b/usb/usb-trivial-debug-message-correction-in-gadget-ether-driver.patch
new file mode 100644
index 00000000000000..a53b6761b78f79
--- /dev/null
+++ b/usb/usb-trivial-debug-message-correction-in-gadget-ether-driver.patch
@@ -0,0 +1,30 @@
+From linux-usb-devel-bounces@lists.sourceforge.net Wed Jun 7 13:40:46 2006
+Message-ID: <f383264b0606071146s6520c81ay7b22310f01a71e43@mail.gmail.com>
+Date: Wed, 7 Jun 2006 11:46:13 -0700
+From: "Matt Reimer" <mattjreimer@gmail.com>
+To: linux-usb-devel@lists.sourceforge.net
+Content-Disposition: inline
+Subject: USB: trivial DEBUG message correction in gadget ether driver
+
+From: Matt Reimer <mattjreimer@gmail.com>
+
+
+Acked-by: David Brownell <david-b@pacbell.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/gadget/ether.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- gregkh-2.6.orig/drivers/usb/gadget/ether.c
++++ gregkh-2.6/drivers/usb/gadget/ether.c
+@@ -1010,7 +1010,7 @@ set_ether_config (struct eth_dev *dev, g
+ result = usb_ep_enable (dev->out_ep, dev->out);
+ if (result != 0) {
+ DEBUG (dev, "enable %s --> %d\n",
+- dev->in_ep->name, result);
++ dev->out_ep->name, result);
+ goto done;
+ }
+ }
diff --git a/usb/usb-update-usbmon-fix-glued-lines.patch b/usb/usb-update-usbmon-fix-glued-lines.patch
new file mode 100644
index 00000000000000..d0c5dbf1d1426b
--- /dev/null
+++ b/usb/usb-update-usbmon-fix-glued-lines.patch
@@ -0,0 +1,122 @@
+From zaitcev@redhat.com Fri Jun 9 20:10:27 2006
+Date: Fri, 9 Jun 2006 20:10:10 -0700
+From: Pete Zaitcev <zaitcev@redhat.com>
+To: greg@kroah.com
+Cc: zaitcev@redhat.com, linux-usb-devel@lists.sourceforge.net
+Subject: USB: update usbmon, fix glued lines
+Message-Id: <20060609201010.2ae8d733.zaitcev@redhat.com>
+
+This update contains one bug fix: some lines can come out truncated,
+because of the safety cutoff. This happened because I forgot to update
+the size when status packets began to be printed.
+
+The rest is:
+ - Comments updates
+ - Allow snooping with pkmap on x86_64, which is cache-coherent
+ - Enlarge event buffers (certainly we can have a couple of pages)
+ - Add event counter
+
+First touch upon usbmon for 2.6.18.
+
+Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/mon/mon_dma.c | 5 ++++-
+ drivers/usb/mon/mon_main.c | 3 ++-
+ drivers/usb/mon/mon_stat.c | 4 ++--
+ drivers/usb/mon/mon_text.c | 9 ++++++---
+ drivers/usb/mon/usb_mon.h | 1 +
+ 5 files changed, 15 insertions(+), 7 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/mon/mon_dma.c
++++ gregkh-2.6/drivers/usb/mon/mon_dma.c
+@@ -13,7 +13,10 @@
+ #include <linux/usb.h> /* Only needed for declarations in usb_mon.h */
+ #include "usb_mon.h"
+
+-#ifdef __i386__ /* CONFIG_ARCH_I386 does not exit */
++/*
++ * PC-compatibles, are, fortunately, sufficiently cache-coherent for this.
++ */
++#if defined(__i386__) || defined(__x86_64__) /* CONFIG_ARCH_I386 doesn't exit */
+ #define MON_HAS_UNMAP 1
+
+ #define phys_to_page(phys) pfn_to_page((phys) >> PAGE_SHIFT)
+--- gregkh-2.6.orig/drivers/usb/mon/mon_main.c
++++ gregkh-2.6/drivers/usb/mon/mon_main.c
+@@ -97,6 +97,7 @@ static void mon_submit(struct usb_bus *u
+ if (mbus->nreaders == 0)
+ goto out_locked;
+
++ mbus->cnt_events++;
+ list_for_each (pos, &mbus->r_list) {
+ r = list_entry(pos, struct mon_reader, r_link);
+ r->rnf_submit(r->r_data, urb);
+@@ -152,6 +153,7 @@ static void mon_complete(struct usb_bus
+ }
+
+ spin_lock_irqsave(&mbus->lock, flags);
++ mbus->cnt_events++;
+ list_for_each (pos, &mbus->r_list) {
+ r = list_entry(pos, struct mon_reader, r_link);
+ r->rnf_complete(r->r_data, urb);
+@@ -163,7 +165,6 @@ static void mon_complete(struct usb_bus
+
+ /*
+ * Stop monitoring.
+- * Obviously this must be well locked, so no need to play with mb's.
+ */
+ static void mon_stop(struct mon_bus *mbus)
+ {
+--- gregkh-2.6.orig/drivers/usb/mon/mon_stat.c
++++ gregkh-2.6/drivers/usb/mon/mon_stat.c
+@@ -31,8 +31,8 @@ static int mon_stat_open(struct inode *i
+ mbus = inode->u.generic_ip;
+
+ sp->slen = snprintf(sp->str, STAT_BUF_SIZE,
+- "nreaders %d text_lost %u\n",
+- mbus->nreaders, mbus->cnt_text_lost);
++ "nreaders %d events %u text_lost %u\n",
++ mbus->nreaders, mbus->cnt_events, mbus->cnt_text_lost);
+
+ file->private_data = sp;
+ return 0;
+--- gregkh-2.6.orig/drivers/usb/mon/mon_text.c
++++ gregkh-2.6/drivers/usb/mon/mon_text.c
+@@ -26,10 +26,13 @@
+
+ /*
+ * This limit exists to prevent OOMs when the user process stops reading.
++ * If usbmon were available to unprivileged processes, it might be open
++ * to a local DoS. But we have to keep to root in order to prevent
++ * password sniffing from HID devices.
+ */
+-#define EVENT_MAX 25
++#define EVENT_MAX (2*PAGE_SIZE / sizeof(struct mon_event_text))
+
+-#define PRINTF_DFL 130
++#define PRINTF_DFL 160
+
+ struct mon_event_text {
+ struct list_head e_link;
+@@ -111,7 +114,7 @@ static inline char mon_text_get_data(str
+ * number of corner cases, but it seems that the following is
+ * more or less safe.
+ *
+- * We do not even try to look transfer_buffer, because it can
++ * We do not even try to look at transfer_buffer, because it can
+ * contain non-NULL garbage in case the upper level promised to
+ * set DMA for the HCD.
+ */
+--- gregkh-2.6.orig/drivers/usb/mon/usb_mon.h
++++ gregkh-2.6/drivers/usb/mon/usb_mon.h
+@@ -27,6 +27,7 @@ struct mon_bus {
+ struct kref ref; /* Under mon_lock */
+
+ /* Stats */
++ unsigned int cnt_events;
+ unsigned int cnt_text_lost;
+ };
+
diff --git a/usb/usb-update-usbmon.txt.patch b/usb/usb-update-usbmon.txt.patch
new file mode 100644
index 00000000000000..3fb8b615be27d1
--- /dev/null
+++ b/usb/usb-update-usbmon.txt.patch
@@ -0,0 +1,82 @@
+From zaitcev@redhat.com Mon Jun 12 20:09:59 2006
+Date: Mon, 12 Jun 2006 20:09:39 -0700
+From: Pete Zaitcev <zaitcev@redhat.com>
+To: greg@kroah.com
+Cc: zaitcev@redhat.com
+Subject: USB: update usbmon.txt
+Message-Id: <20060612200939.35374616.zaitcev@redhat.com>
+
+Fix up the documentation. Apparently, I left unedited copy-paste results
+in examples. Also, Alan helped me to improve the most confusing parts.
+
+Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ Documentation/usb/usbmon.txt | 32 ++++++++++++++++++--------------
+ 1 file changed, 18 insertions(+), 14 deletions(-)
+
+--- gregkh-2.6.orig/Documentation/usb/usbmon.txt
++++ gregkh-2.6/Documentation/usb/usbmon.txt
+@@ -29,14 +29,13 @@ if usbmon is built into the kernel.
+
+ # mount -t debugfs none_debugs /sys/kernel/debug
+ # modprobe usbmon
++#
+
+ Verify that bus sockets are present.
+
+-[root@lembas zaitcev]# ls /sys/kernel/debug/usbmon
++# ls /sys/kernel/debug/usbmon
+ 1s 1t 2s 2t 3s 3t 4s 4t
+-[root@lembas zaitcev]#
+-
+-# ls /sys/kernel
++#
+
+ 2. Find which bus connects to the desired device
+
+@@ -76,7 +75,7 @@ that the file size is not excessive for
+
+ * Raw text data format
+
+-The '0t' type data consists of a stream of events, such as URB submission,
++The '1t' type data consists of a stream of events, such as URB submission,
+ URB callback, submission error. Every event is a text line, which consists
+ of whitespace separated words. The number of position of words may depend
+ on the event type, but there is a set of words, common for all types.
+@@ -97,20 +96,25 @@ Here is the list of words, from left to
+ Zi Zo Isochronous input and output
+ Ii Io Interrupt input and output
+ Bi Bo Bulk input and output
+- Device address and Endpoint number are decimal numbers with leading zeroes
+- or 3 and 2 positions, correspondingly.
+-- URB Status. This field makes no sense for submissions, but is present
+- to help scripts with parsing. In error case, it contains the error code.
+- In case of a setup packet, it contains a Setup Tag. If scripts read a number
+- in this field, they proceed to read Data Length. Otherwise, they read
+- the setup packet before reading the Data Length.
++ Device address and Endpoint number are 3-digit and 2-digit (respectively)
++ decimal numbers, with leading zeroes.
++- URB Status. In most cases, this field contains a number, sometimes negative,
++ which represents a "status" field of the URB. This field makes no sense for
++ submissions, but is present anyway to help scripts with parsing. When an
++ error occurs, the field contains the error code. In case of a submission of
++ a Control packet, this field contains a Setup Tag instead of an error code.
++ It is easy to tell whether the Setup Tag is present because it is never a
++ number. Thus if scripts find a number in this field, they proceed to read
++ Data Length. If they find something else, like a letter, they read the setup
++ packet before reading the Data Length.
+ - Setup packet, if present, consists of 5 words: one of each for bmRequestType,
+ bRequest, wValue, wIndex, wLength, as specified by the USB Specification 2.0.
+ These words are safe to decode if Setup Tag was 's'. Otherwise, the setup
+ packet was present, but not captured, and the fields contain filler.
+-- Data Length. This is the actual length in the URB.
++- Data Length. For submissions, this is the requested length. For callbacks,
++ this is the actual length.
+ - Data tag. The usbmon may not always capture data, even if length is nonzero.
+- Only if tag is '=', the data words are present.
++ The data words are present only if this tag is '='.
+ - Data words follow, in big endian hexadecimal format. Notice that they are
+ not machine words, but really just a byte stream split into words to make
+ it easier to read. Thus, the last word may contain from one to four bytes.