aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-04-05 14:09:10 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-04-05 14:09:10 -0700
commitf6ada193524c8fcce65c87bb8a2834294dcd2007 (patch)
tree92efcb4bba27b2fb0e62db84bb580f476dfca475 /usb
parent1f3175a66a04109fb39a5c9d3febcf4aeeec1e82 (diff)
downloadpatches-f6ada193524c8fcce65c87bb8a2834294dcd2007.tar.gz
w1 and usb patches added
Diffstat (limited to 'usb')
-rw-r--r--usb/hid-core.c-fix-input-irq-status-32-received-for-silvercrest-usb-keyboard.patch47
-rw-r--r--usb/usb-convert-the-semaphores-in-the-sisusb-driver-to-mutexes.patch795
-rw-r--r--usb/usb-keyspan-remote-bugfix.patch27
-rw-r--r--usb/usb-uhci-don-t-track-suspended-ports.patch102
4 files changed, 971 insertions, 0 deletions
diff --git a/usb/hid-core.c-fix-input-irq-status-32-received-for-silvercrest-usb-keyboard.patch b/usb/hid-core.c-fix-input-irq-status-32-received-for-silvercrest-usb-keyboard.patch
new file mode 100644
index 0000000000000..e2839212c47e5
--- /dev/null
+++ b/usb/hid-core.c-fix-input-irq-status-32-received-for-silvercrest-usb-keyboard.patch
@@ -0,0 +1,47 @@
+From akpm@osdl.org Tue Mar 28 15:22:02 2006
+Message-Id: <200603282321.k2SNLg5T000638@shell0.pdx.osdl.net>
+Subject: [patch 1/1] hid-core.c: fix "input irq status -32 received" for Silvercrest USB Keyboard
+To: greg@kroah.com
+Cc: akpm@osdl.org, jeffrey@wirehead.be, david-b@pacbell.net, stern@rowland.harvard.edu
+From: akpm@osdl.org
+Date: Tue, 28 Mar 2006 15:21:36 -0800
+
+
+From: Jeffrey Vandenbroucke sign <jeffrey@wirehead.be>
+
+When not using this patch, the kernel will continuously return "input irq
+status -32 received", while making the keyboard unusable. This can be
+easely resolved using HID_QUIRK_NOGET. Vendor-ID and Device-ID should be
+applied to hid-core.c, and making an entry to make use of it.
+
+Signed-off-by: Jeffrey Vandenbroucke <jeffrey@wirehead.be>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Greg KH <greg@kroah.com>
+Cc: David Brownell <david-b@pacbell.net>
+Signed-off-by: Andrew Morton <akpm@osdl.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/input/hid-core.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/input/hid-core.c
++++ gregkh-2.6/drivers/usb/input/hid-core.c
+@@ -1374,6 +1374,9 @@ void hid_close(struct hid_device *hid)
+
+ #define USB_VENDOR_ID_PANJIT 0x134c
+
++#define USB_VENDOR_ID_SILVERCREST 0x062a
++#define USB_DEVICE_ID_SILVERCREST_KB 0x0201
++
+ /*
+ * Initialize all reports
+ */
+@@ -1680,6 +1683,7 @@ static const struct hid_blacklist {
+ { USB_VENDOR_ID_HP, USB_DEVICE_ID_HP_USBHUB_KB, HID_QUIRK_NOGET },
+ { USB_VENDOR_ID_TANGTOP, USB_DEVICE_ID_TANGTOP_USBPS2, HID_QUIRK_NOGET },
+ { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
++ { USB_VENDOR_ID_SILVERCREST, USB_DEVICE_ID_SILVERCREST_KB, HID_QUIRK_NOGET },
+
+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_POWERMOUSE, HID_QUIRK_2WHEEL_POWERMOUSE },
+ { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
diff --git a/usb/usb-convert-the-semaphores-in-the-sisusb-driver-to-mutexes.patch b/usb/usb-convert-the-semaphores-in-the-sisusb-driver-to-mutexes.patch
new file mode 100644
index 0000000000000..d5d571a90fb7a
--- /dev/null
+++ b/usb/usb-convert-the-semaphores-in-the-sisusb-driver-to-mutexes.patch
@@ -0,0 +1,795 @@
+From akpm@osdl.org Tue Mar 28 01:00:43 2006
+Message-Id: <200603280900.k2S90OQh026084@shell0.pdx.osdl.net>
+Subject: USB: convert the semaphores in the sisusb driver to mutexes
+To: greg@kroah.com
+Cc: akpm@osdl.org, arjan@infradead.org
+From: akpm@osdl.org
+Date: Tue, 28 Mar 2006 01:00:21 -0800
+
+
+From: Arjan van de Ven <arjan@infradead.org>
+
+Convert the semaphores-used-as-mutex to mutexes in the sisusb video driver;
+this required manual checking due to the "return as locked" stuff in this
+driver, but the ->lock semaphore is still used as mutex in the end.
+
+Signed-off-by: Arjan van de Ven <arjan@infradead.org>
+Cc: Thomas Winischhofer <winischhofer.net>
+Signed-off-by: Andrew Morton <akpm@osdl.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/misc/sisusbvga/sisusb.c | 77 +++++++++----------
+ drivers/usb/misc/sisusbvga/sisusb.h | 4
+ drivers/usb/misc/sisusbvga/sisusb_con.c | 129 ++++++++++++++++----------------
+ 3 files changed, 107 insertions(+), 103 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/misc/sisusbvga/sisusb.c
++++ gregkh-2.6/drivers/usb/misc/sisusbvga/sisusb.c
+@@ -37,6 +37,7 @@
+ */
+
+ #include <linux/config.h>
++#include <linux/mutex.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+ #include <linux/signal.h>
+@@ -102,7 +103,7 @@ MODULE_PARM_DESC(last, "Number of last c
+
+ static struct usb_driver sisusb_driver;
+
+-DECLARE_MUTEX(disconnect_sem);
++DEFINE_MUTEX(disconnect_mutex);
+
+ static void
+ sisusb_free_buffers(struct sisusb_usb_data *sisusb)
+@@ -2552,39 +2553,39 @@ sisusb_open(struct inode *inode, struct
+ struct usb_interface *interface;
+ int subminor = iminor(inode);
+
+- down(&disconnect_sem);
++ mutex_lock(&disconnect_mutex);
+
+ if (!(interface = usb_find_interface(&sisusb_driver, subminor))) {
+ printk(KERN_ERR "sisusb[%d]: Failed to find interface\n",
+ subminor);
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+ return -ENODEV;
+ }
+
+ if (!(sisusb = usb_get_intfdata(interface))) {
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+ return -ENODEV;
+ }
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ if (!sisusb->present || !sisusb->ready) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ return -ENODEV;
+ }
+
+ if (sisusb->isopen) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ return -EBUSY;
+ }
+
+ if (!sisusb->devinit) {
+ if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) {
+ if (sisusb_init_gfxdevice(sisusb, 0)) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ printk(KERN_ERR
+ "sisusbvga[%d]: Failed to initialize "
+ "device\n",
+@@ -2592,8 +2593,8 @@ sisusb_open(struct inode *inode, struct
+ return -EIO;
+ }
+ } else {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ printk(KERN_ERR
+ "sisusbvga[%d]: Device not attached to "
+ "USB 2.0 hub\n",
+@@ -2609,9 +2610,9 @@ sisusb_open(struct inode *inode, struct
+
+ file->private_data = sisusb;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+
+ return 0;
+ }
+@@ -2642,14 +2643,14 @@ sisusb_release(struct inode *inode, stru
+ struct sisusb_usb_data *sisusb;
+ int myminor;
+
+- down(&disconnect_sem);
++ mutex_lock(&disconnect_mutex);
+
+ if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) {
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+ return -ENODEV;
+ }
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ if (sisusb->present) {
+ /* Wait for all URBs to finish if device still present */
+@@ -2662,12 +2663,12 @@ sisusb_release(struct inode *inode, stru
+ sisusb->isopen = 0;
+ file->private_data = NULL;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ /* decrement the usage count on our device */
+ kref_put(&sisusb->kref, sisusb_delete);
+
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+
+ return 0;
+ }
+@@ -2685,11 +2686,11 @@ sisusb_read(struct file *file, char __us
+ if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
+ return -ENODEV;
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ /* Sanity check */
+ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -ENODEV;
+ }
+
+@@ -2784,7 +2785,7 @@ sisusb_read(struct file *file, char __us
+ (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + 0x5c) {
+
+ if (count != 4) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -EINVAL;
+ }
+
+@@ -2808,7 +2809,7 @@ sisusb_read(struct file *file, char __us
+
+ (*ppos) += bytes_read;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return errno ? errno : bytes_read;
+ }
+@@ -2827,11 +2828,11 @@ sisusb_write(struct file *file, const ch
+ if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
+ return -ENODEV;
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ /* Sanity check */
+ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -ENODEV;
+ }
+
+@@ -2930,7 +2931,7 @@ sisusb_write(struct file *file, const ch
+ (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + SISUSB_PCI_PCONFSIZE) {
+
+ if (count != 4) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -EINVAL;
+ }
+
+@@ -2956,7 +2957,7 @@ sisusb_write(struct file *file, const ch
+
+ (*ppos) += bytes_written;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return errno ? errno : bytes_written;
+ }
+@@ -2970,11 +2971,11 @@ sisusb_lseek(struct file *file, loff_t o
+ if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
+ return -ENODEV;
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ /* Sanity check */
+ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -ENODEV;
+ }
+
+@@ -2994,7 +2995,7 @@ sisusb_lseek(struct file *file, loff_t o
+ ret = -EINVAL;
+ }
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return ret;
+ }
+
+@@ -3136,7 +3137,7 @@ sisusb_ioctl(struct inode *inode, struct
+ if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
+ return -ENODEV;
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ /* Sanity check */
+ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
+@@ -3193,7 +3194,7 @@ sisusb_ioctl(struct inode *inode, struct
+ }
+
+ err_out:
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return retval;
+ }
+
+@@ -3258,7 +3259,7 @@ static int sisusb_probe(struct usb_inter
+ }
+ kref_init(&sisusb->kref);
+
+- init_MUTEX(&(sisusb->lock));
++ mutex_init(&(sisusb->lock));
+
+ /* Register device */
+ if ((retval = usb_register_dev(intf, &usb_sisusb_class))) {
+@@ -3429,9 +3430,9 @@ static void sisusb_disconnect(struct usb
+ * protect all other routines from the disconnect
+ * case, not the other way round.
+ */
+- down(&disconnect_sem);
++ mutex_lock(&disconnect_mutex);
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ /* Wait for all URBs to complete and kill them in case (MUST do) */
+ if (!sisusb_wait_all_out_complete(sisusb))
+@@ -3462,12 +3463,12 @@ static void sisusb_disconnect(struct usb
+ sisusb->present = 0;
+ sisusb->ready = 0;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ /* decrement our usage count */
+ kref_put(&sisusb->kref, sisusb_delete);
+
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+
+ printk(KERN_INFO "sisusbvga[%d]: Disconnected\n", minor);
+ }
+--- gregkh-2.6.orig/drivers/usb/misc/sisusbvga/sisusb.h
++++ gregkh-2.6/drivers/usb/misc/sisusbvga/sisusb.h
+@@ -41,6 +41,8 @@
+ #define SISUSB_NEW_CONFIG_COMPAT
+ #endif
+
++#include <linux/mutex.h>
++
+ /* For older kernels, support for text consoles is by default
+ * off. To ensable text console support, change the following:
+ */
+@@ -116,7 +118,7 @@ struct sisusb_usb_data {
+ struct usb_interface *interface;
+ struct kref kref;
+ wait_queue_head_t wait_q; /* for syncind and timeouts */
+- struct semaphore lock; /* general race avoidance */
++ struct mutex lock; /* general race avoidance */
+ unsigned int ifnum; /* interface number of the USB device */
+ int minor; /* minor (for logging clarity) */
+ int isopen; /* !=0 if open */
+--- gregkh-2.6.orig/drivers/usb/misc/sisusbvga/sisusb_con.c
++++ gregkh-2.6/drivers/usb/misc/sisusbvga/sisusb_con.c
+@@ -48,6 +48,7 @@
+ */
+
+ #include <linux/config.h>
++#include <linux/mutex.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+ #include <linux/signal.h>
+@@ -102,7 +103,7 @@ static struct sisusb_usb_data *mysisusbs
+ /* Forward declaration */
+ static const struct consw sisusb_con;
+
+-extern struct semaphore disconnect_sem;
++extern struct mutex disconnect_mutex;
+
+ static inline void
+ sisusbcon_memsetw(u16 *s, u16 c, unsigned int count)
+@@ -194,11 +195,11 @@ sisusb_get_sisusb_lock_and_check(unsigne
+ if (!(sisusb = sisusb_get_sisusb(console)))
+ return NULL;
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ if (!sisusb_sisusb_valid(sisusb) ||
+ !sisusb->havethisconsole[console]) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return NULL;
+ }
+
+@@ -236,18 +237,18 @@ sisusbcon_init(struct vc_data *c, int in
+ * are set up/restored.
+ */
+
+- down(&disconnect_sem);
++ mutex_lock(&disconnect_mutex);
+
+ if (!(sisusb = sisusb_get_sisusb(c->vc_num))) {
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+ return;
+ }
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ if (!sisusb_sisusb_valid(sisusb)) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ return;
+ }
+
+@@ -284,9 +285,9 @@ sisusbcon_init(struct vc_data *c, int in
+ if (!*c->vc_uni_pagedir_loc)
+ con_set_default_unimap(c);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+
+ if (init) {
+ c->vc_cols = cols;
+@@ -306,14 +307,14 @@ sisusbcon_deinit(struct vc_data *c)
+ * and others, ie not under our control.
+ */
+
+- down(&disconnect_sem);
++ mutex_lock(&disconnect_mutex);
+
+ if (!(sisusb = sisusb_get_sisusb(c->vc_num))) {
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+ return;
+ }
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ /* Clear ourselves in mysisusbs */
+ mysisusbs[c->vc_num] = NULL;
+@@ -332,12 +333,12 @@ sisusbcon_deinit(struct vc_data *c)
+ }
+ }
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ /* decrement the usage count on our sisusb */
+ kref_put(&sisusb->kref, sisusb_delete);
+
+- up(&disconnect_sem);
++ mutex_unlock(&disconnect_mutex);
+ }
+
+ /* interface routine */
+@@ -417,7 +418,7 @@ sisusbcon_putc(struct vc_data *c, int ch
+ #endif
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return;
+ }
+
+@@ -425,7 +426,7 @@ sisusbcon_putc(struct vc_data *c, int ch
+ sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y),
+ (u32)SISUSB_HADDR(x, y), 2, &written);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ }
+
+ /* Interface routine */
+@@ -453,14 +454,14 @@ sisusbcon_putcs(struct vc_data *c, const
+ sisusbcon_writew(sisusbcon_readw(s++), dest++);
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return;
+ }
+
+ sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y),
+ (u32)SISUSB_HADDR(x, y), count * 2, &written);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ }
+
+ /* Interface routine */
+@@ -504,7 +505,7 @@ sisusbcon_clear(struct vc_data *c, int y
+ }
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return;
+ }
+
+@@ -514,7 +515,7 @@ sisusbcon_clear(struct vc_data *c, int y
+ sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(x, y),
+ (u32)SISUSB_HADDR(x, y), length, &written);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ }
+
+ /* Interface routine */
+@@ -576,7 +577,7 @@ sisusbcon_bmove(struct vc_data *c, int s
+ #endif
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return;
+ }
+
+@@ -586,7 +587,7 @@ sisusbcon_bmove(struct vc_data *c, int s
+ sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(dx, dy),
+ (u32)SISUSB_HADDR(dx, dy), length, &written);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ }
+
+ /* interface routine */
+@@ -609,7 +610,7 @@ sisusbcon_switch(struct vc_data *c)
+
+ /* Don't write to screen if in gfx mode */
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return 0;
+ }
+
+@@ -618,7 +619,7 @@ sisusbcon_switch(struct vc_data *c)
+ * as origin.
+ */
+ if (c->vc_origin == (unsigned long)c->vc_screenbuf) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ printk(KERN_DEBUG "sisusb: ASSERT ORIGIN != SCREENBUF!\n");
+ return 0;
+ }
+@@ -635,7 +636,7 @@ sisusbcon_switch(struct vc_data *c)
+ (u32)SISUSB_HADDR(0, 0),
+ length, &written);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return 0;
+ }
+@@ -657,7 +658,7 @@ sisusbcon_save_screen(struct vc_data *c)
+ /* sisusb->lock is down */
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return;
+ }
+
+@@ -669,7 +670,7 @@ sisusbcon_save_screen(struct vc_data *c)
+ sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin,
+ length);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ }
+
+ /* interface routine */
+@@ -690,7 +691,7 @@ sisusbcon_set_palette(struct vc_data *c,
+ /* sisusb->lock is down */
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -EINVAL;
+ }
+
+@@ -705,7 +706,7 @@ sisusbcon_set_palette(struct vc_data *c,
+ break;
+ }
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return 0;
+ }
+@@ -728,7 +729,7 @@ sisusbcon_blank(struct vc_data *c, int b
+ sisusb->is_gfx = blank ? 1 : 0;
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return 0;
+ }
+
+@@ -777,7 +778,7 @@ sisusbcon_blank(struct vc_data *c, int b
+ cr63 = 0x40;
+ break;
+ default:
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -EINVAL;
+ }
+
+@@ -788,7 +789,7 @@ sisusbcon_blank(struct vc_data *c, int b
+
+ }
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return ret;
+ }
+@@ -809,7 +810,7 @@ sisusbcon_scrolldelta(struct vc_data *c,
+ /* sisusb->lock is down */
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return 0;
+ }
+
+@@ -849,7 +850,7 @@ sisusbcon_scrolldelta(struct vc_data *c,
+
+ sisusbcon_set_start_address(sisusb, c);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return 1;
+ }
+@@ -867,7 +868,7 @@ sisusbcon_cursor(struct vc_data *c, int
+ /* sisusb->lock is down */
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return;
+ }
+
+@@ -879,7 +880,7 @@ sisusbcon_cursor(struct vc_data *c, int
+ if (mode == CM_ERASE) {
+ sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20);
+ sisusb->sisusb_cursor_size_to = -1;
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return;
+ }
+
+@@ -919,7 +920,7 @@ sisusbcon_cursor(struct vc_data *c, int
+ sisusb->sisusb_cursor_size_to = to;
+ }
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ }
+
+ static int
+@@ -961,7 +962,7 @@ sisusbcon_scroll_area(struct vc_data *c,
+ sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(0, t),
+ (u32)SISUSB_HADDR(0, t), length, &written);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return 1;
+ }
+@@ -994,7 +995,7 @@ sisusbcon_scroll(struct vc_data *c, int
+ /* sisusb->lock is down */
+
+ if (sisusb_is_inactive(c, sisusb)) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return 0;
+ }
+
+@@ -1084,7 +1085,7 @@ sisusbcon_scroll(struct vc_data *c, int
+
+ c->vc_pos = c->vc_pos - oldorigin + c->vc_origin;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return 1;
+ }
+@@ -1106,7 +1107,7 @@ sisusbcon_set_origin(struct vc_data *c)
+ /* sisusb->lock is down */
+
+ if (sisusb_is_inactive(c, sisusb) || sisusb->con_blanked) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return 0;
+ }
+
+@@ -1116,7 +1117,7 @@ sisusbcon_set_origin(struct vc_data *c)
+
+ sisusb->con_rolled_over = 0;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return 1;
+ }
+@@ -1133,7 +1134,7 @@ sisusbcon_resize(struct vc_data *c, unsi
+
+ fh = sisusb->current_font_height;
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ /* We are quite unflexible as regards resizing. The vt code
+ * handles sizes where the line length isn't equal the pitch
+@@ -1167,7 +1168,7 @@ sisusbcon_do_font_op(struct sisusb_usb_d
+
+ if ((slot != 0 && slot != 2) || !fh) {
+ if (uplock)
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -EINVAL;
+ }
+
+@@ -1327,7 +1328,7 @@ sisusbcon_do_font_op(struct sisusb_usb_d
+ }
+
+ if (uplock)
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ if (dorecalc && c) {
+ int i, rows = c->vc_scan_lines / fh;
+@@ -1351,7 +1352,7 @@ sisusbcon_do_font_op(struct sisusb_usb_d
+
+ font_op_error:
+ if (uplock)
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return -EIO;
+ }
+@@ -1417,19 +1418,19 @@ sisusbcon_font_get(struct vc_data *c, st
+ font->charcount = 256;
+
+ if (!font->data) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return 0;
+ }
+
+ if (!sisusb->font_backup) {
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+ return -ENODEV;
+ }
+
+ /* Copy 256 chars only, like vgacon */
+ memcpy(font->data, sisusb->font_backup, 256 * 32);
+
+- up(&sisusb->lock);
++ mutex_unlock(&sisusb->lock);
+
+ return 0;
+ }
+@@ -1512,14 +1513,14 @@ sisusb_console_init(struct sisusb_usb_da
+ {
+ int i, ret, minor = sisusb->minor;
+
+- down(&disconnect_sem);
++ mutex_lock(&disconnect_mutex);
+
+- down(&sisusb->lock);
++ mutex_lock(&sisusb->lock);
+
+ /* Erm.. that should not happen */
+ if (sisusb->haveconsole || !sisusb->SiS_Pr) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ return 1;
+ }
+
+@@ -1529,15 +1530,15 @@ sisusb_console_init(struct sisusb_usb_da
+ if (first > last ||
+ first > MAX_NR_CONSOLES ||
+ last > MAX_NR_CONSOLES) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ return 1;
+ }
+
+ /* If gfxcore not initialized or no consoles given, quit graciously */
+ if (!sisusb->gfxinit || first < 1 || last < 1) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ return 0;
+ }
+
+@@ -1547,8 +1548,8 @@ sisusb_console_init(struct sisusb_usb_da
+
+ /* Set up text mode (and upload default font) */
+ if (sisusb_reset_text_mode(sisusb, 1)) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ printk(KERN_ERR
+ "sisusbvga[%d]: Failed to set up text mode\n",
+ minor);
+@@ -1571,16 +1572,16 @@ sisusb_console_init(struct sisusb_usb_da
+
+ /* Allocate screen buffer */
+ if (!(sisusb->scrbuf = (unsigned long)vmalloc(sisusb->scrbuf_size))) {
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+ printk(KERN_ERR
+ "sisusbvga[%d]: Failed to allocate screen buffer\n",
+ minor);
+ return 1;
+ }
+
+- up(&sisusb->lock);
+- up(&disconnect_sem);
++ mutex_unlock(&sisusb->lock);
++ mutex_unlock(&disconnect_mutex);
+
+ /* Now grab the desired console(s) */
+ ret = take_over_console(&sisusb_con, first - 1, last - 1, 0);
diff --git a/usb/usb-keyspan-remote-bugfix.patch b/usb/usb-keyspan-remote-bugfix.patch
new file mode 100644
index 0000000000000..d1db90b2e5056
--- /dev/null
+++ b/usb/usb-keyspan-remote-bugfix.patch
@@ -0,0 +1,27 @@
+From downey@zymeta.com Mon Apr 3 07:58:14 2006
+Message-ID: <443137FF.4050803@zymeta.com>
+Date: Mon, 03 Apr 2006 08:58:07 -0600
+From: Michael Downey <downey@zymeta.com>
+To: Greg KH <greg@kroah.com>
+CC: Adrian Bunk <bunk@stusta.de>,
+Subject: USB: keyspan-remote bugfix
+
+
+Signed-off-by: Michael Downey <downey@zymeta.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/input/keyspan_remote.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/input/keyspan_remote.c
++++ gregkh-2.6/drivers/usb/input/keyspan_remote.c
+@@ -297,6 +297,8 @@ static void keyspan_check_data(struct us
+ remote->data.bits_left -= 6;
+ } else {
+ err("%s - Error in message, invalid toggle.\n", __FUNCTION__);
++ remote->stage = 0;
++ return;
+ }
+
+ keyspan_load_tester(remote, 5);
diff --git a/usb/usb-uhci-don-t-track-suspended-ports.patch b/usb/usb-uhci-don-t-track-suspended-ports.patch
new file mode 100644
index 0000000000000..4f36709d3f986
--- /dev/null
+++ b/usb/usb-uhci-don-t-track-suspended-ports.patch
@@ -0,0 +1,102 @@
+From stern@rowland.harvard.edu Tue Apr 4 11:47:48 2006
+Date: Tue, 4 Apr 2006 14:47:44 -0400 (EDT)
+From: Alan Stern <stern@rowland.harvard.edu>
+To: Greg KH <greg@kroah.com>
+cc: USB development list <linux-usb-devel@lists.sourceforge.net>
+Subject: USB: UHCI: don't track suspended ports
+Message-ID: <Pine.LNX.4.44L0.0604041441280.4587-100000@iolanthe.rowland.org>
+
+Someone recently posted a bug report where it turned out that uhci-hcd
+was disagreeing with the UHCI controller over whether or not a port was
+suspended: The driver thought it wasn't and the hardware thought it was.
+This patch (as665) fixes the problem and simplifies the driver by
+removing the internal state-tracking completely. Now the driver just
+asks the hardware whether a port is suspended.
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/uhci-hcd.c | 3 +--
+ drivers/usb/host/uhci-hcd.h | 1 -
+ drivers/usb/host/uhci-hub.c | 18 +++++++++---------
+ 3 files changed, 10 insertions(+), 12 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/host/uhci-hcd.c
++++ gregkh-2.6/drivers/usb/host/uhci-hcd.c
+@@ -115,8 +115,7 @@ static void finish_reset(struct uhci_hcd
+ for (port = 0; port < uhci->rh_numports; ++port)
+ outw(0, uhci->io_addr + USBPORTSC1 + (port * 2));
+
+- uhci->port_c_suspend = uhci->suspended_ports =
+- uhci->resuming_ports = 0;
++ uhci->port_c_suspend = uhci->resuming_ports = 0;
+ uhci->rh_state = UHCI_RH_RESET;
+ uhci->is_stopped = UHCI_IS_STOPPED;
+ uhci_to_hcd(uhci)->state = HC_STATE_HALT;
+--- gregkh-2.6.orig/drivers/usb/host/uhci-hcd.h
++++ gregkh-2.6/drivers/usb/host/uhci-hcd.h
+@@ -415,7 +415,6 @@ struct uhci_hcd {
+
+ /* Support for port suspend/resume/reset */
+ unsigned long port_c_suspend; /* Bit-arrays of ports */
+- unsigned long suspended_ports;
+ unsigned long resuming_ports;
+ unsigned long ports_timeout; /* Time to stop signalling */
+
+--- gregkh-2.6.orig/drivers/usb/host/uhci-hub.c
++++ gregkh-2.6/drivers/usb/host/uhci-hub.c
+@@ -85,11 +85,10 @@ static void uhci_finish_suspend(struct u
+ {
+ int status;
+
+- if (test_bit(port, &uhci->suspended_ports)) {
++ if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) {
+ CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD);
+- clear_bit(port, &uhci->suspended_ports);
+- clear_bit(port, &uhci->resuming_ports);
+- set_bit(port, &uhci->port_c_suspend);
++ if (test_bit(port, &uhci->resuming_ports))
++ set_bit(port, &uhci->port_c_suspend);
+
+ /* The controller won't actually turn off the RD bit until
+ * it has had a chance to send a low-speed EOP sequence,
+@@ -97,6 +96,7 @@ static void uhci_finish_suspend(struct u
+ * slightly longer for good luck. */
+ udelay(4);
+ }
++ clear_bit(port, &uhci->resuming_ports);
+ }
+
+ /* Wait for the UHCI controller in HP's iLO2 server management chip.
+@@ -265,8 +265,6 @@ static int uhci_hub_control(struct usb_h
+ wPortChange |= USB_PORT_STAT_C_SUSPEND;
+ lstatus |= 1;
+ }
+- if (test_bit(port, &uhci->suspended_ports))
+- lstatus |= 2;
+ if (test_bit(port, &uhci->resuming_ports))
+ lstatus |= 4;
+
+@@ -309,7 +307,6 @@ static int uhci_hub_control(struct usb_h
+
+ switch (wValue) {
+ case USB_PORT_FEAT_SUSPEND:
+- set_bit(port, &uhci->suspended_ports);
+ SET_RH_PORTSTAT(USBPORTSC_SUSP);
+ OK(0);
+ case USB_PORT_FEAT_RESET:
+@@ -343,8 +340,11 @@ static int uhci_hub_control(struct usb_h
+ CLR_RH_PORTSTAT(USBPORTSC_PEC);
+ OK(0);
+ case USB_PORT_FEAT_SUSPEND:
+- if (test_bit(port, &uhci->suspended_ports) &&
+- !test_and_set_bit(port,
++ if (!(inw(port_addr) & USBPORTSC_SUSP)) {
++
++ /* Make certain the port isn't suspended */
++ uhci_finish_suspend(uhci, port, port_addr);
++ } else if (!test_and_set_bit(port,
+ &uhci->resuming_ports)) {
+ SET_RH_PORTSTAT(USBPORTSC_RD);
+