diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-16 15:31:08 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-16 15:31:08 -0700 |
commit | 5b88ea4d35a4788dcfbc3047149276898e194a4b (patch) | |
tree | 3873bcbf682aeb9ef089f69f4c88d8d2d5bc0073 /usb | |
parent | 3ab23ec21bc7eb5f1cc934b7c8ab126d01dd3f51 (diff) | |
download | patches-5b88ea4d35a4788dcfbc3047149276898e194a4b.tar.gz |
lots of new patches
Diffstat (limited to 'usb')
-rw-r--r-- | usb/airprime.c-add-kyocera-wireless-kpc650-passport-support.patch | 29 | ||||
-rw-r--r-- | usb/airprime_major_update.patch | 6 | ||||
-rw-r--r-- | usb/usb-allow-multiple-types-of-ehci-controllers-to-be-built-as-modules.patch | 2 | ||||
-rw-r--r-- | usb/usb-ehci-works-again-on-nvidia-controllers-with-2gb-ram.patch | 86 | ||||
-rw-r--r-- | usb/usb-gadget-serial-do-not-save-restore-irq-flags-in-gs_close.patch | 80 | ||||
-rw-r--r-- | usb/usb-gadget-serial-fix-a-deadlock-when-closing-the-serial-device.patch | 143 | ||||
-rw-r--r-- | usb/usb-gotemp.patch | 6 | ||||
-rw-r--r-- | usb/usb-implement-error-event-in-usbmon.patch | 112 | ||||
-rw-r--r-- | usb/usb-io_edgeport-touch-up.patch | 39 | ||||
-rw-r--r-- | usb/usb-new-driver-for-cypress-cy7c63xxx-mirco-controllers.patch | 318 | ||||
-rw-r--r-- | usb/usb-serial-clean-tty-fields-on-failed-device-open.patch | 33 | ||||
-rw-r--r-- | usb/usb-serial-dynamic-id.patch | 6 | ||||
-rw-r--r-- | usb/usb-trivial-debug-message-correction-in-gadget-ether-driver.patch | 30 | ||||
-rw-r--r-- | usb/usb-update-usbmon-fix-glued-lines.patch | 122 | ||||
-rw-r--r-- | usb/usb-update-usbmon.txt.patch | 82 |
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. |