aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2005-12-13 11:48:08 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2005-12-13 11:48:08 -0800
commiteff9e116197faa36249e2d68a76342cd380288b1 (patch)
tree9a1485f50422a07df2767fb672b2dafed7456865 /usb
parent8293af088e41cf8106a2e747b4ed4479858699b5 (diff)
downloadpatches-eff9e116197faa36249e2d68a76342cd380288b1.tar.gz
usb and pci patches added
Diffstat (limited to 'usb')
-rw-r--r--usb/ftdi_sio-new-ids-for-teratronik-devices.patch55
-rw-r--r--usb/isp116x-hcd.c-removed-unused-variable.patch37
-rw-r--r--usb/usb-add-driver-for-ati-philips-usb-rf-remotes.patch534
-rw-r--r--usb/usb-remove-unneeded-kmalloc-return-value-casts.patch93
-rw-r--r--usb/usb-support-for-posiflex-pp-7000-retail-printer-in-linux.patch44
-rw-r--r--usb/usb-use-array_size-macro.patch265
-rw-r--r--usb/usbcore-fix-local-variable-clash.patch35
7 files changed, 1063 insertions, 0 deletions
diff --git a/usb/ftdi_sio-new-ids-for-teratronik-devices.patch b/usb/ftdi_sio-new-ids-for-teratronik-devices.patch
new file mode 100644
index 0000000000000..0dadf63712f79
--- /dev/null
+++ b/usb/ftdi_sio-new-ids-for-teratronik-devices.patch
@@ -0,0 +1,55 @@
+From ian.abbott@mev.co.uk Tue Dec 13 08:23:07 2005
+Message-ID: <439EF467.1090506@mev.co.uk>
+Date: Tue, 13 Dec 2005 16:18:47 +0000
+From: Ian Abbott <abbotti@mev.co.uk>
+Cc: Greg KH <greg@kroah.com>
+Subject: ftdi_sio: new IDs for Teratronik devices
+
+From: Ian Abbott <abbotti@mev.co.uk>
+
+This patch adds vendor and product IDs to the ftdi_sio driver's device
+ID table for two devices from teratronik.de. The device IDs were
+submitted by O. Wölfelschneider of Teratronik Elektronische Systeme
+GmbH.
+
+The charset of the patch is latin-1, same as the original files.
+
+Please apply, thanks! (I've tried to avoid a clash with Andrew Morton's
+patch to add support for Posiflex PP-7700 printer to the same driver.)
+
+Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/serial/ftdi_sio.c | 2 ++
+ drivers/usb/serial/ftdi_sio.h | 7 +++++++
+ 2 files changed, 9 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.c
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.c
+@@ -471,6 +471,8 @@ static struct usb_device_id id_table_com
+ { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
++ { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
++ { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
+ { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.h
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.h
+@@ -343,6 +343,13 @@
+ #define XSENS_CONVERTER_7_PID 0xD38F
+
+ /*
++ * Teratronik product ids.
++ * Submitted by O. Wölfelschneider.
++ */
++#define FTDI_TERATRONIK_VCP_PID 0xEC88 /* Teratronik device (preferring VCP driver on windows) */
++#define FTDI_TERATRONIK_D2XX_PID 0xEC89 /* Teratronik device (preferring D2XX driver on windows) */
++
++/*
+ * Evolution Robotics products (http://www.evolution.com/).
+ * Submitted by Shawn M. Lavelle.
+ */
diff --git a/usb/isp116x-hcd.c-removed-unused-variable.patch b/usb/isp116x-hcd.c-removed-unused-variable.patch
new file mode 100644
index 0000000000000..c990eaf3fa3bc
--- /dev/null
+++ b/usb/isp116x-hcd.c-removed-unused-variable.patch
@@ -0,0 +1,37 @@
+From ok@artecdesign.ee Tue Dec 13 05:34:03 2005
+Date: Tue, 13 Dec 2005 15:30:20 +0200 (EET)
+From: Olav Kongas <ok@artecdesign.ee>
+To: Greg KH <greg@kroah.com>
+cc: <daniel.marjamaki@comhem.se>
+Subject: isp116x-hcd.c: Removed unused variable
+Message-ID: <Pine.LNX.4.63.0512131524330.31176@pcy.artec.ee>
+
+From: Daniel Marjamäki <daniel.marjamaki@comhem.se>
+
+Removed unused variable
+
+Signed-off-by: Daniel Marjamäki <daniel.marjamaki@comhem.se>
+Signed-off-by: Olav Kongas <ok@artecdesign.ee>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/host/isp116x-hcd.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/host/isp116x-hcd.c
++++ gregkh-2.6/drivers/usb/host/isp116x-hcd.c
+@@ -154,13 +154,11 @@ static void pack_fifo(struct isp116x *is
+ struct ptd *ptd;
+ int buflen = isp116x->atl_last_dir == PTD_DIR_IN
+ ? isp116x->atl_bufshrt : isp116x->atl_buflen;
+- int ptd_count = 0;
+
+ isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
+ isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
+ isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET);
+ for (ep = isp116x->atl_active; ep; ep = ep->active) {
+- ++ptd_count;
+ ptd = &ep->ptd;
+ dump_ptd(ptd);
+ dump_ptd_out_data(ptd, ep->data);
diff --git a/usb/usb-add-driver-for-ati-philips-usb-rf-remotes.patch b/usb/usb-add-driver-for-ati-philips-usb-rf-remotes.patch
new file mode 100644
index 0000000000000..fc6dc7b2209ae
--- /dev/null
+++ b/usb/usb-add-driver-for-ati-philips-usb-rf-remotes.patch
@@ -0,0 +1,534 @@
+From syrjala@kotilo.saunalahti.fi Sat Dec 10 10:34:44 2005
+Date: Sat, 10 Dec 2005 20:30:54 +0200
+From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= <syrjala@sci.fi>
+Cc: greg@kroah.com
+Subject: USB: add driver for ATI/Philips USB RF remotes
+Message-ID: <20051210183054.GA19050@sci.fi>
+Content-Disposition: inline
+
+Summary: Driver for ATI/Philips USB RF remotes
+
+This is a new input driver for ATI/Philips USB RF remotes (eg. ATI
+Remote Wonder II).
+
+Signed-off-by: Ville Syrjälä <syrjala@sci.fi>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+ drivers/usb/input/Kconfig | 14 +
+ drivers/usb/input/Makefile | 1
+ drivers/usb/input/ati_remote2.c | 477 ++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 492 insertions(+)
+
+--- /dev/null
++++ gregkh-2.6/drivers/usb/input/ati_remote2.c
+@@ -0,0 +1,477 @@
++/*
++ * ati_remote2 - ATI/Philips USB RF remote driver
++ *
++ * Copyright (C) 2005 Ville Syrjala <syrjala@sci.fi>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2
++ * as published by the Free Software Foundation.
++ */
++
++#include <linux/usb_input.h>
++
++#define DRIVER_DESC "ATI/Philips USB RF remote driver"
++#define DRIVER_VERSION "0.1"
++
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_VERSION(DRIVER_VERSION);
++MODULE_AUTHOR("Ville Syrjala <syrjala@sci.fi>");
++MODULE_LICENSE("GPL");
++
++static unsigned int mode_mask = 0x1F;
++module_param(mode_mask, uint, 0644);
++MODULE_PARM_DESC(mode_mask, "Bitmask of modes to accept <4:PC><3:AUX4><2:AUX3><1:AUX2><0:AUX1>");
++
++static struct usb_device_id ati_remote2_id_table[] = {
++ { USB_DEVICE(0x0471, 0x0602) }, /* ATI Remote Wonder II */
++ { }
++};
++MODULE_DEVICE_TABLE(usb, ati_remote2_id_table);
++
++static struct {
++ int hw_code;
++ int key_code;
++} ati_remote2_key_table[] = {
++ { 0x00, KEY_0 },
++ { 0x01, KEY_1 },
++ { 0x02, KEY_2 },
++ { 0x03, KEY_3 },
++ { 0x04, KEY_4 },
++ { 0x05, KEY_5 },
++ { 0x06, KEY_6 },
++ { 0x07, KEY_7 },
++ { 0x08, KEY_8 },
++ { 0x09, KEY_9 },
++ { 0x0c, KEY_POWER },
++ { 0x0d, KEY_MUTE },
++ { 0x10, KEY_VOLUMEUP },
++ { 0x11, KEY_VOLUMEDOWN },
++ { 0x20, KEY_CHANNELUP },
++ { 0x21, KEY_CHANNELDOWN },
++ { 0x28, KEY_FORWARD },
++ { 0x29, KEY_REWIND },
++ { 0x2c, KEY_PLAY },
++ { 0x30, KEY_PAUSE },
++ { 0x31, KEY_STOP },
++ { 0x37, KEY_RECORD },
++ { 0x38, KEY_DVD },
++ { 0x39, KEY_TV },
++ { 0x54, KEY_MENU },
++ { 0x58, KEY_UP },
++ { 0x59, KEY_DOWN },
++ { 0x5a, KEY_LEFT },
++ { 0x5b, KEY_RIGHT },
++ { 0x5c, KEY_OK },
++ { 0x78, KEY_A },
++ { 0x79, KEY_B },
++ { 0x7a, KEY_C },
++ { 0x7b, KEY_D },
++ { 0x7c, KEY_E },
++ { 0x7d, KEY_F },
++ { 0x82, KEY_ENTER },
++ { 0x8e, KEY_VENDOR },
++ { 0x96, KEY_COFFEE },
++ { 0xa9, BTN_LEFT },
++ { 0xaa, BTN_RIGHT },
++ { 0xbe, KEY_QUESTION },
++ { 0xd5, KEY_FRONT },
++ { 0xd0, KEY_EDIT },
++ { 0xf9, KEY_INFO },
++ { (0x00 << 8) | 0x3f, KEY_PROG1 },
++ { (0x01 << 8) | 0x3f, KEY_PROG2 },
++ { (0x02 << 8) | 0x3f, KEY_PROG3 },
++ { (0x03 << 8) | 0x3f, KEY_PROG4 },
++ { (0x04 << 8) | 0x3f, KEY_PC },
++ { 0, KEY_RESERVED }
++};
++
++struct ati_remote2 {
++ struct input_dev *idev;
++ struct usb_device *udev;
++
++ struct usb_interface *intf[2];
++ struct usb_endpoint_descriptor *ep[2];
++ struct urb *urb[2];
++ void *buf[2];
++ dma_addr_t buf_dma[2];
++
++ unsigned long jiffies;
++ int mode;
++
++ char name[64];
++ char phys[64];
++};
++
++static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id);
++static void ati_remote2_disconnect(struct usb_interface *interface);
++
++static struct usb_driver ati_remote2_driver = {
++ .name = "ati_remote2",
++ .probe = ati_remote2_probe,
++ .disconnect = ati_remote2_disconnect,
++ .id_table = ati_remote2_id_table,
++};
++
++static int ati_remote2_open(struct input_dev *idev)
++{
++ struct ati_remote2 *ar2 = idev->private;
++ int r;
++
++ r = usb_submit_urb(ar2->urb[0], GFP_KERNEL);
++ if (r) {
++ dev_err(&ar2->intf[0]->dev,
++ "%s: usb_submit_urb() = %d\n", __FUNCTION__, r);
++ return r;
++ }
++ r = usb_submit_urb(ar2->urb[1], GFP_KERNEL);
++ if (r) {
++ usb_kill_urb(ar2->urb[0]);
++ dev_err(&ar2->intf[1]->dev,
++ "%s: usb_submit_urb() = %d\n", __FUNCTION__, r);
++ return r;
++ }
++
++ return 0;
++}
++
++static void ati_remote2_close(struct input_dev *idev)
++{
++ struct ati_remote2 *ar2 = idev->private;
++
++ usb_kill_urb(ar2->urb[0]);
++ usb_kill_urb(ar2->urb[1]);
++}
++
++static void ati_remote2_input_mouse(struct ati_remote2 *ar2, struct pt_regs *regs)
++{
++ struct input_dev *idev = ar2->idev;
++ u8 *data = ar2->buf[0];
++
++ if (data[0] > 4) {
++ dev_err(&ar2->intf[0]->dev,
++ "Unknown mode byte (%02x %02x %02x %02x)\n",
++ data[3], data[2], data[1], data[0]);
++ return;
++ }
++
++ if (!((1 << data[0]) & mode_mask))
++ return;
++
++ input_regs(idev, regs);
++ input_event(idev, EV_REL, REL_X, (s8) data[1]);
++ input_event(idev, EV_REL, REL_Y, (s8) data[2]);
++ input_sync(idev);
++}
++
++static int ati_remote2_lookup(unsigned int hw_code)
++{
++ int i;
++
++ for (i = 0; ati_remote2_key_table[i].key_code != KEY_RESERVED; i++)
++ if (ati_remote2_key_table[i].hw_code == hw_code)
++ return i;
++
++ return -1;
++}
++
++static void ati_remote2_input_key(struct ati_remote2 *ar2, struct pt_regs *regs)
++{
++ struct input_dev *idev = ar2->idev;
++ u8 *data = ar2->buf[1];
++ int hw_code, index;
++
++ if (data[0] > 4) {
++ dev_err(&ar2->intf[1]->dev,
++ "Unknown mode byte (%02x %02x %02x %02x)\n",
++ data[3], data[2], data[1], data[0]);
++ return;
++ }
++
++ hw_code = data[2];
++ /*
++ * Mode keys (AUX1-AUX4, PC) all generate the same code byte.
++ * Use the mode byte to figure out which one was pressed.
++ */
++ if (hw_code == 0x3f) {
++ /*
++ * For some incomprehensible reason the mouse pad generates
++ * events which look identical to the events from the last
++ * pressed mode key. Naturally we don't want to generate key
++ * events for the mouse pad so we filter out any subsequent
++ * events from the same mode key.
++ */
++ if (ar2->mode == data[0])
++ return;
++
++ if (data[1] == 0)
++ ar2->mode = data[0];
++
++ hw_code |= data[0] << 8;
++ }
++
++ if (!((1 << data[0]) & mode_mask))
++ return;
++
++ index = ati_remote2_lookup(hw_code);
++ if (index < 0) {
++ dev_err(&ar2->intf[1]->dev,
++ "Unknown code byte (%02x %02x %02x %02x)\n",
++ data[3], data[2], data[1], data[0]);
++ return;
++ }
++
++ switch (data[1]) {
++ case 0: /* release */
++ break;
++ case 1: /* press */
++ ar2->jiffies = jiffies + msecs_to_jiffies(idev->rep[REP_DELAY]);
++ break;
++ case 2: /* repeat */
++
++ /* No repeat for mouse buttons. */
++ if (ati_remote2_key_table[index].key_code == BTN_LEFT ||
++ ati_remote2_key_table[index].key_code == BTN_RIGHT)
++ return;
++
++ if (!time_after_eq(jiffies, ar2->jiffies))
++ return;
++
++ ar2->jiffies = jiffies + msecs_to_jiffies(idev->rep[REP_PERIOD]);
++ break;
++ default:
++ dev_err(&ar2->intf[1]->dev,
++ "Unknown state byte (%02x %02x %02x %02x)\n",
++ data[3], data[2], data[1], data[0]);
++ return;
++ }
++
++ input_regs(idev, regs);
++ input_event(idev, EV_KEY, ati_remote2_key_table[index].key_code, data[1]);
++ input_sync(idev);
++}
++
++static void ati_remote2_complete_mouse(struct urb *urb, struct pt_regs *regs)
++{
++ struct ati_remote2 *ar2 = urb->context;
++ int r;
++
++ switch (urb->status) {
++ case 0:
++ ati_remote2_input_mouse(ar2, regs);
++ break;
++ case -ENOENT:
++ case -EILSEQ:
++ case -ECONNRESET:
++ case -ESHUTDOWN:
++ dev_dbg(&ar2->intf[0]->dev,
++ "%s(): urb status = %d\n", __FUNCTION__, urb->status);
++ return;
++ default:
++ dev_err(&ar2->intf[0]->dev,
++ "%s(): urb status = %d\n", __FUNCTION__, urb->status);
++ }
++
++ r = usb_submit_urb(urb, GFP_ATOMIC);
++ if (r)
++ dev_err(&ar2->intf[0]->dev,
++ "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r);
++}
++
++static void ati_remote2_complete_key(struct urb *urb, struct pt_regs *regs)
++{
++ struct ati_remote2 *ar2 = urb->context;
++ int r;
++
++ switch (urb->status) {
++ case 0:
++ ati_remote2_input_key(ar2, regs);
++ break;
++ case -ENOENT:
++ case -EILSEQ:
++ case -ECONNRESET:
++ case -ESHUTDOWN:
++ dev_dbg(&ar2->intf[1]->dev,
++ "%s(): urb status = %d\n", __FUNCTION__, urb->status);
++ return;
++ default:
++ dev_err(&ar2->intf[1]->dev,
++ "%s(): urb status = %d\n", __FUNCTION__, urb->status);
++ }
++
++ r = usb_submit_urb(urb, GFP_ATOMIC);
++ if (r)
++ dev_err(&ar2->intf[1]->dev,
++ "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r);
++}
++
++static int ati_remote2_input_init(struct ati_remote2 *ar2)
++{
++ struct input_dev *idev;
++ int i;
++
++ idev = input_allocate_device();
++ if (!idev)
++ return -ENOMEM;
++
++ ar2->idev = idev;
++ idev->private = ar2;
++
++ idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_REL);
++ idev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT);
++ idev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
++ for (i = 0; ati_remote2_key_table[i].key_code != KEY_RESERVED; i++)
++ set_bit(ati_remote2_key_table[i].key_code, idev->keybit);
++
++ idev->rep[REP_DELAY] = 250;
++ idev->rep[REP_PERIOD] = 33;
++
++ idev->open = ati_remote2_open;
++ idev->close = ati_remote2_close;
++
++ idev->name = ar2->name;
++ idev->phys = ar2->phys;
++
++ usb_to_input_id(ar2->udev, &idev->id);
++ idev->cdev.dev = &ar2->udev->dev;
++
++ i = input_register_device(idev);
++ if (i)
++ input_free_device(idev);
++
++ return i;
++}
++
++static int ati_remote2_urb_init(struct ati_remote2 *ar2)
++{
++ struct usb_device *udev = ar2->udev;
++ int i, pipe, maxp;
++
++ for (i = 0; i < 2; i++) {
++ ar2->buf[i] = usb_buffer_alloc(udev, 4, GFP_KERNEL, &ar2->buf_dma[i]);
++ if (!ar2->buf[i])
++ return -ENOMEM;
++
++ ar2->urb[i] = usb_alloc_urb(0, GFP_KERNEL);
++ if (!ar2->urb[i])
++ return -ENOMEM;
++
++ pipe = usb_rcvintpipe(udev, ar2->ep[i]->bEndpointAddress);
++ maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
++ maxp = maxp > 4 ? 4 : maxp;
++
++ usb_fill_int_urb(ar2->urb[i], udev, pipe, ar2->buf[i], maxp,
++ i ? ati_remote2_complete_key : ati_remote2_complete_mouse,
++ ar2, ar2->ep[i]->bInterval);
++ ar2->urb[i]->transfer_dma = ar2->buf_dma[i];
++ ar2->urb[i]->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
++ }
++
++ return 0;
++}
++
++static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2)
++{
++ int i;
++
++ for (i = 0; i < 2; i++) {
++ if (ar2->urb[i])
++ usb_free_urb(ar2->urb[i]);
++
++ if (ar2->buf[i])
++ usb_buffer_free(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]);
++ }
++}
++
++static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id)
++{
++ struct usb_device *udev = interface_to_usbdev(interface);
++ struct usb_host_interface *alt = interface->cur_altsetting;
++ struct ati_remote2 *ar2;
++ int r;
++
++ if (alt->desc.bInterfaceNumber)
++ return -ENODEV;
++
++ ar2 = kzalloc(sizeof (struct ati_remote2), GFP_KERNEL);
++ if (!ar2)
++ return -ENOMEM;
++
++ ar2->udev = udev;
++
++ ar2->intf[0] = interface;
++ ar2->ep[0] = &alt->endpoint[0].desc;
++
++ ar2->intf[1] = usb_ifnum_to_if(udev, 1);
++ r = usb_driver_claim_interface(&ati_remote2_driver, ar2->intf[1], ar2);
++ if (r)
++ goto fail1;
++ alt = ar2->intf[1]->cur_altsetting;
++ ar2->ep[1] = &alt->endpoint[0].desc;
++
++ r = ati_remote2_urb_init(ar2);
++ if (r)
++ goto fail2;
++
++ usb_make_path(udev, ar2->phys, sizeof(ar2->phys));
++ strlcat(ar2->phys, "/input0", sizeof(ar2->phys));
++
++ strlcat(ar2->name, "ATI Remote Wonder II", sizeof(ar2->name));
++
++ r = ati_remote2_input_init(ar2);
++ if (r)
++ goto fail2;
++
++ usb_set_intfdata(interface, ar2);
++
++ return 0;
++
++ fail2:
++ ati_remote2_urb_cleanup(ar2);
++
++ usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]);
++ fail1:
++ kfree(ar2);
++
++ return r;
++}
++
++static void ati_remote2_disconnect(struct usb_interface *interface)
++{
++ struct ati_remote2 *ar2;
++ struct usb_host_interface *alt = interface->cur_altsetting;
++
++ if (alt->desc.bInterfaceNumber)
++ return;
++
++ ar2 = usb_get_intfdata(interface);
++ usb_set_intfdata(interface, NULL);
++
++ input_unregister_device(ar2->idev);
++
++ ati_remote2_urb_cleanup(ar2);
++
++ usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]);
++
++ kfree(ar2);
++}
++
++static int __init ati_remote2_init(void)
++{
++ int r;
++
++ r = usb_register(&ati_remote2_driver);
++ if (r)
++ printk(KERN_ERR "ati_remote2: usb_register() = %d\n", r);
++ else
++ printk(KERN_INFO "ati_remote2: " DRIVER_DESC " " DRIVER_VERSION "\n");
++
++ return r;
++}
++
++static void __exit ati_remote2_exit(void)
++{
++ usb_deregister(&ati_remote2_driver);
++}
++
++module_init(ati_remote2_init);
++module_exit(ati_remote2_exit);
+--- gregkh-2.6.orig/drivers/usb/input/Kconfig
++++ gregkh-2.6/drivers/usb/input/Kconfig
+@@ -273,6 +273,20 @@ config USB_ATI_REMOTE
+ To compile this driver as a module, choose M here: the module will be
+ called ati_remote.
+
++config USB_ATI_REMOTE2
++ tristate "ATI / Philips USB RF remote control"
++ depends on USB && INPUT
++ ---help---
++ Say Y here if you want to use an ATI or Philips USB RF remote control.
++ These are RF remotes with USB receivers.
++ ATI Remote Wonder II comes with some ATI's All-In-Wonder video cards
++ and is also available as a separate product.
++ This driver provides mouse pointer, left and right mouse buttons,
++ and maps all the other remote buttons to keypress events.
++
++ To compile this driver as a module, choose M here: the module will be
++ called ati_remote2.
++
+ config USB_KEYSPAN_REMOTE
+ tristate "Keyspan DMR USB remote control (EXPERIMENTAL)"
+ depends on USB && INPUT && EXPERIMENTAL
+--- gregkh-2.6.orig/drivers/usb/input/Makefile
++++ gregkh-2.6/drivers/usb/input/Makefile
+@@ -28,6 +28,7 @@ endif
+
+ obj-$(CONFIG_USB_AIPTEK) += aiptek.o
+ obj-$(CONFIG_USB_ATI_REMOTE) += ati_remote.o
++obj-$(CONFIG_USB_ATI_REMOTE2) += ati_remote2.o
+ obj-$(CONFIG_USB_HID) += usbhid.o
+ obj-$(CONFIG_USB_KBD) += usbkbd.o
+ obj-$(CONFIG_USB_KBTAB) += kbtab.o
diff --git a/usb/usb-remove-unneeded-kmalloc-return-value-casts.patch b/usb/usb-remove-unneeded-kmalloc-return-value-casts.patch
new file mode 100644
index 0000000000000..02e6da4fee94f
--- /dev/null
+++ b/usb/usb-remove-unneeded-kmalloc-return-value-casts.patch
@@ -0,0 +1,93 @@
+From jesper.juhl@gmail.com Sun Dec 11 11:35:33 2005
+From: Jesper Juhl <jesper.juhl@gmail.com>
+To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
+Subject: USB: Remove unneeded kmalloc() return value casts
+Date: Sun, 11 Dec 2005 20:34:02 +0100
+Cc: "Greg Kroah-Hartman" <gregkh@suse.de>, wolfgang@iksw-muees.de, Luca Risolia <luca.risolia@studio.unibo.it>, Cesar Miquel <miquel@df.uba.ar>, Andrew Morton <akpm@osdl.org>, Jesper Juhl <jesper.juhl@gmail.com>
+Content-Disposition: inline
+Message-Id: <200512112034.02734.jesper.juhl@gmail.com>
+
+
+Remove kmalloc() return value casts that we don't need from
+drivers/usb/*
+
+
+Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+ drivers/usb/media/usbvideo.c | 2 +-
+ drivers/usb/media/w9968cf.c | 4 ++--
+ drivers/usb/misc/auerswald.c | 4 ++--
+ drivers/usb/misc/rio500.c | 4 ++--
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/misc/auerswald.c
++++ gregkh-2.6/drivers/usb/misc/auerswald.c
+@@ -767,7 +767,7 @@ static int auerbuf_setup (pauerbufctl_t
+ memset (bep, 0, sizeof (auerbuf_t));
+ bep->list = bcp;
+ INIT_LIST_HEAD (&bep->buff_list);
+- bep->bufp = (char *) kmalloc (bufsize, GFP_KERNEL);
++ bep->bufp = kmalloc (bufsize, GFP_KERNEL);
+ if (!bep->bufp)
+ goto bl_fail;
+ bep->dr = (struct usb_ctrlrequest *) kmalloc (sizeof (struct usb_ctrlrequest), GFP_KERNEL);
+@@ -1123,7 +1123,7 @@ static int auerswald_int_open (pauerswal
+ }
+ }
+ if (!cp->intbufp) {
+- cp->intbufp = (char *) kmalloc (irqsize, GFP_KERNEL);
++ cp->intbufp = kmalloc (irqsize, GFP_KERNEL);
+ if (!cp->intbufp) {
+ ret = -ENOMEM;
+ goto intoend;
+--- gregkh-2.6.orig/drivers/usb/misc/rio500.c
++++ gregkh-2.6/drivers/usb/misc/rio500.c
+@@ -465,14 +465,14 @@ static int probe_rio(struct usb_interfac
+
+ rio->rio_dev = dev;
+
+- if (!(rio->obuf = (char *) kmalloc(OBUF_SIZE, GFP_KERNEL))) {
++ if (!(rio->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) {
+ err("probe_rio: Not enough memory for the output buffer");
+ usb_deregister_dev(intf, &usb_rio_class);
+ return -ENOMEM;
+ }
+ dbg("probe_rio: obuf address:%p", rio->obuf);
+
+- if (!(rio->ibuf = (char *) kmalloc(IBUF_SIZE, GFP_KERNEL))) {
++ if (!(rio->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) {
+ err("probe_rio: Not enough memory for the input buffer");
+ usb_deregister_dev(intf, &usb_rio_class);
+ kfree(rio->obuf);
+--- gregkh-2.6.orig/drivers/usb/media/usbvideo.c
++++ gregkh-2.6/drivers/usb/media/usbvideo.c
+@@ -725,7 +725,7 @@ int usbvideo_register(
+ /* Allocate user_data separately because of kmalloc's limits */
+ if (num_extra > 0) {
+ up->user_size = num_cams * num_extra;
+- up->user_data = (char *) kmalloc(up->user_size, GFP_KERNEL);
++ up->user_data = kmalloc(up->user_size, GFP_KERNEL);
+ if (up->user_data == NULL) {
+ err("%s: Failed to allocate user_data (%d. bytes)",
+ __FUNCTION__, up->user_size);
+--- gregkh-2.6.orig/drivers/usb/media/w9968cf.c
++++ gregkh-2.6/drivers/usb/media/w9968cf.c
+@@ -3554,7 +3554,7 @@ w9968cf_usb_probe(struct usb_interface*
+
+
+ /* Allocate 2 bytes of memory for camera control USB transfers */
+- if (!(cam->control_buffer = (u16*)kmalloc(2, GFP_KERNEL))) {
++ if (!(cam->control_buffer = kmalloc(2, GFP_KERNEL))) {
+ DBG(1,"Couldn't allocate memory for camera control transfers")
+ err = -ENOMEM;
+ goto fail;
+@@ -3562,7 +3562,7 @@ w9968cf_usb_probe(struct usb_interface*
+ memset(cam->control_buffer, 0, 2);
+
+ /* Allocate 8 bytes of memory for USB data transfers to the FSB */
+- if (!(cam->data_buffer = (u16*)kmalloc(8, GFP_KERNEL))) {
++ if (!(cam->data_buffer = kmalloc(8, GFP_KERNEL))) {
+ DBG(1, "Couldn't allocate memory for data "
+ "transfers to the FSB")
+ err = -ENOMEM;
diff --git a/usb/usb-support-for-posiflex-pp-7000-retail-printer-in-linux.patch b/usb/usb-support-for-posiflex-pp-7000-retail-printer-in-linux.patch
new file mode 100644
index 0000000000000..8942ce4f453e7
--- /dev/null
+++ b/usb/usb-support-for-posiflex-pp-7000-retail-printer-in-linux.patch
@@ -0,0 +1,44 @@
+From sonic_amiga@rambler.ru Fri Dec 9 01:27:44 2005
+Message-ID: <439924A3.9050800@rambler.ru>
+Date: Fri, 09 Dec 2005 09:30:59 +0300
+From: Pavel Fedin <sonic_amiga@rambler.ru>
+To: greg@kroah.com
+Subject: USB: Support for Posiflex PP-7000 retail printer in Linux
+
+This little patch adds recognition of Posiflex PP-7000 retail printer to
+ftdo_sio module. The printer uses FT232BM bridge programmed with custom
+VID/PID. The patch posted to lkml and sf.net was for 2.6.11.1 kernel,
+here is one reworked for 2.6.12.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 1 +
+ drivers/usb/serial/ftdi_sio.h | 6 ++++++
+ 2 files changed, 7 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.c
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.c
+@@ -477,6 +477,7 @@ static struct usb_device_id id_table_com
+ { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
+ { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
+ { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
++ { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
+ { }, /* Optional parameter entry */
+ { } /* Terminating entry */
+ };
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.h
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.h
+@@ -352,6 +352,12 @@
+ /* Pyramid Computer GmbH */
+ #define FTDI_PYRAMID_PID 0xE6C8 /* Pyramid Appliance Display */
+
++/*
++ * Posiflex inc retail equipment (http://www.posiflex.com.tw)
++ */
++#define POSIFLEX_VID 0x0d3a /* Vendor ID */
++#define POSIFLEX_PP7000_PID 0x0300 /* PP-7000II thermal printer */
++
+ /* Commands */
+ #define FTDI_SIO_RESET 0 /* Reset the port */
+ #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
diff --git a/usb/usb-use-array_size-macro.patch b/usb/usb-use-array_size-macro.patch
new file mode 100644
index 0000000000000..caa397ac948e8
--- /dev/null
+++ b/usb/usb-use-array_size-macro.patch
@@ -0,0 +1,265 @@
+From kernel-janitors-bounces@lists.osdl.org Sun Dec 11 07:24:02 2005
+Date: Sun, 11 Dec 2005 16:20:08 +0100
+From: Tobias Klauser <tklauser@nuerscht.ch>
+To: kernel-janitors@lists.osdl.org
+Message-ID: <20051211152007.GA1545@neon.tklauser.home>
+Cc: akpm@osdl.org, gregkh@suse.de
+Subject: USB: Use ARRAY_SIZE macro
+
+Use ARRAY_SIZE macro instead of sizeof(x)/sizeof(x[0]) and remove
+duplicates of ARRAY_SIZE. Some trailing whitespaces are also removed.
+
+Patch is compile-tested on i386.
+
+Signed-off-by: Tobias Klauser <tklauser@nuerscht.ch>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/dummy_hcd.c | 2 +-
+ drivers/usb/input/aiptek.c | 4 ++--
+ drivers/usb/media/ibmcam.c | 2 +-
+ drivers/usb/media/sn9c102_core.c | 23 ++++++++++-------------
+ drivers/usb/media/w9968cf.c | 2 +-
+ drivers/usb/net/zd1201.c | 8 ++++----
+ drivers/usb/serial/io_edgeport.c | 2 +-
+ drivers/usb/serial/io_edgeport.h | 3 ---
+ drivers/usb/serial/safe_serial.c | 2 +-
+ drivers/usb/serial/ti_usb_3410_5052.c | 7 ++-----
+ drivers/usb/storage/sddr09.c | 4 +---
+ 11 files changed, 24 insertions(+), 35 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/gadget/dummy_hcd.c
++++ gregkh-2.6/drivers/usb/gadget/dummy_hcd.c
+@@ -138,7 +138,7 @@ static const char *const ep_name [] = {
+ /* or like sa1100: two fixed function endpoints */
+ "ep1out-bulk", "ep2in-bulk",
+ };
+-#define DUMMY_ENDPOINTS (sizeof(ep_name)/sizeof(char *))
++#define DUMMY_ENDPOINTS ARRAY_SIZE(ep_name)
+
+ /*-------------------------------------------------------------------------*/
+
+--- gregkh-2.6.orig/drivers/usb/input/aiptek.c
++++ gregkh-2.6/drivers/usb/input/aiptek.c
+@@ -2093,7 +2093,7 @@ aiptek_probe(struct usb_interface *intf,
+ /* Programming the tablet macro keys needs to be done with a for loop
+ * as the keycodes are discontiguous.
+ */
+- for (i = 0; i < sizeof(macroKeyEvents) / sizeof(macroKeyEvents[0]); ++i)
++ for (i = 0; i < ARRAY_SIZE(macroKeyEvents); ++i)
+ set_bit(macroKeyEvents[i], inputdev->keybit);
+
+ /*
+@@ -2135,7 +2135,7 @@ aiptek_probe(struct usb_interface *intf,
+ * not an error :-)
+ */
+
+- for (i = 0; i < sizeof(speeds) / sizeof(speeds[0]); ++i) {
++ for (i = 0; i < ARRAY_SIZE(speeds); ++i) {
+ aiptek->curSetting.programmableDelay = speeds[i];
+ (void)aiptek_program_tablet(aiptek);
+ if (aiptek->inputdev->absmax[ABS_X] > 0) {
+--- gregkh-2.6.orig/drivers/usb/media/ibmcam.c
++++ gregkh-2.6/drivers/usb/media/ibmcam.c
+@@ -3457,7 +3457,7 @@ static void ibmcam_model3_setup_after_vi
+ if(init_model3_input) {
+ if (debug > 0)
+ info("Setting input to RCA.");
+- for (i=0; i < (sizeof(initData)/sizeof(initData[0])); i++) {
++ for (i=0; i < ARRAY_SIZE(initData); i++) {
+ ibmcam_veio(uvd, initData[i].req, initData[i].value, initData[i].index);
+ }
+ }
+--- gregkh-2.6.orig/drivers/usb/media/sn9c102_core.c
++++ gregkh-2.6/drivers/usb/media/sn9c102_core.c
+@@ -1316,7 +1316,7 @@ static int sn9c102_init(struct sn9c102_d
+ struct v4l2_control ctrl;
+ struct v4l2_queryctrl *qctrl;
+ struct v4l2_rect* rect;
+- u8 i = 0, n = 0;
++ u8 i = 0;
+ int err = 0;
+
+ if (!(cam->state & DEV_INITIALIZED)) {
+@@ -1352,7 +1352,7 @@ static int sn9c102_init(struct sn9c102_d
+ return err;
+
+ if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
+- DBG(3, "Compressed video format is active, quality %d",
++ DBG(3, "Compressed video format is active, quality %d",
+ cam->compression.quality)
+ else
+ DBG(3, "Uncompressed video format is active")
+@@ -1364,9 +1364,8 @@ static int sn9c102_init(struct sn9c102_d
+ }
+
+ if (s->set_ctrl) {
+- n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
+- for (i = 0; i < n; i++)
+- if (s->qctrl[i].id != 0 &&
++ for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
++ if (s->qctrl[i].id != 0 &&
+ !(s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)) {
+ ctrl.id = s->qctrl[i].id;
+ ctrl.value = qctrl[i].default_value;
+@@ -1388,7 +1387,7 @@ static int sn9c102_init(struct sn9c102_d
+ init_waitqueue_head(&cam->wait_stream);
+ cam->nreadbuffers = 2;
+ memcpy(s->_qctrl, s->qctrl, sizeof(s->qctrl));
+- memcpy(&(s->_rect), &(s->cropcap.defrect),
++ memcpy(&(s->_rect), &(s->cropcap.defrect),
+ sizeof(struct v4l2_rect));
+ cam->state |= DEV_INITIALIZED;
+ }
+@@ -1810,13 +1809,12 @@ static int sn9c102_ioctl_v4l2(struct ino
+ {
+ struct sn9c102_sensor* s = cam->sensor;
+ struct v4l2_queryctrl qc;
+- u8 i, n;
++ u8 i;
+
+ if (copy_from_user(&qc, arg, sizeof(qc)))
+ return -EFAULT;
+
+- n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
+- for (i = 0; i < n; i++)
++ for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
+ if (qc.id && qc.id == s->qctrl[i].id) {
+ memcpy(&qc, &(s->qctrl[i]), sizeof(qc));
+ if (copy_to_user(arg, &qc, sizeof(qc)))
+@@ -1852,7 +1850,7 @@ static int sn9c102_ioctl_v4l2(struct ino
+ {
+ struct sn9c102_sensor* s = cam->sensor;
+ struct v4l2_control ctrl;
+- u8 i, n;
++ u8 i;
+ int err = 0;
+
+ if (!s->set_ctrl)
+@@ -1861,8 +1859,7 @@ static int sn9c102_ioctl_v4l2(struct ino
+ if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
+ return -EFAULT;
+
+- n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
+- for (i = 0; i < n; i++)
++ for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
+ if (ctrl.id == s->qctrl[i].id) {
+ if (ctrl.value < s->qctrl[i].minimum ||
+ ctrl.value > s->qctrl[i].maximum)
+@@ -2544,7 +2541,7 @@ sn9c102_usb_probe(struct usb_interface*
+ unsigned int i, n;
+ int err = 0, r;
+
+- n = sizeof(sn9c102_id_table)/sizeof(sn9c102_id_table[0]);
++ n = ARRAY_SIZE(sn9c102_id_table);
+ for (i = 0; i < n-1; i++)
+ if (le16_to_cpu(udev->descriptor.idVendor) ==
+ sn9c102_id_table[i].idVendor &&
+--- gregkh-2.6.orig/drivers/usb/media/w9968cf.c
++++ gregkh-2.6/drivers/usb/media/w9968cf.c
+@@ -2958,7 +2958,7 @@ static int w9968cf_v4l_ioctl(struct inod
+ };
+
+ #define V4L1_IOCTL(cmd) \
+- ((_IOC_NR((cmd)) < sizeof(v4l1_ioctls)/sizeof(char*)) ? \
++ ((_IOC_NR((cmd)) < ARRAY_SIZE(v4l1_ioctls)) ? \
+ v4l1_ioctls[_IOC_NR((cmd))] : "?")
+
+ cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp));
+--- gregkh-2.6.orig/drivers/usb/net/zd1201.c
++++ gregkh-2.6/drivers/usb/net/zd1201.c
+@@ -1722,7 +1722,7 @@ static const struct iw_priv_args zd1201_
+ IW_PRIV_TYPE_NONE, "sethostauth" },
+ { ZD1201GIWHOSTAUTH, IW_PRIV_TYPE_NONE,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gethostauth" },
+- { ZD1201SIWAUTHSTA, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1,
++ { ZD1201SIWAUTHSTA, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1,
+ IW_PRIV_TYPE_NONE, "authstation" },
+ { ZD1201SIWMAXASSOC, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ IW_PRIV_TYPE_NONE, "setmaxassoc" },
+@@ -1731,9 +1731,9 @@ static const struct iw_priv_args zd1201_
+ };
+
+ static const struct iw_handler_def zd1201_iw_handlers = {
+- .num_standard = sizeof(zd1201_iw_handler)/sizeof(iw_handler),
+- .num_private = sizeof(zd1201_private_handler)/sizeof(iw_handler),
+- .num_private_args = sizeof(zd1201_private_args)/sizeof(struct iw_priv_args),
++ .num_standard = ARRAY_SIZE(zd1201_iw_handler),
++ .num_private = ARRAY_SIZE(zd1201_private_handler),
++ .num_private_args = ARRAY_SIZE(zd1201_private_args),
+ .standard = (iw_handler *)zd1201_iw_handler,
+ .private = (iw_handler *)zd1201_private_handler,
+ .private_args = (struct iw_priv_args *) zd1201_private_args,
+--- gregkh-2.6.orig/drivers/usb/serial/io_edgeport.c
++++ gregkh-2.6/drivers/usb/serial/io_edgeport.c
+@@ -2353,7 +2353,7 @@ static int calc_baud_rate_divisor (int b
+
+ dbg("%s - %d", __FUNCTION__, baudrate);
+
+- for (i = 0; i < NUM_ENTRIES(divisor_table); i++) {
++ for (i = 0; i < ARRAY_SIZE(divisor_table); i++) {
+ if ( divisor_table[i].BaudRate == baudrate ) {
+ *divisor = divisor_table[i].Divisor;
+ return 0;
+--- gregkh-2.6.orig/drivers/usb/serial/io_edgeport.h
++++ gregkh-2.6/drivers/usb/serial/io_edgeport.h
+@@ -31,9 +31,6 @@
+ #ifndef HIGH8
+ #define HIGH8(a) ((unsigned char)((a & 0xff00) >> 8))
+ #endif
+-#ifndef NUM_ENTRIES
+- #define NUM_ENTRIES(x) (sizeof(x)/sizeof((x)[0]))
+-#endif
+
+ #ifndef __KERNEL__
+ #define __KERNEL__
+--- gregkh-2.6.orig/drivers/usb/serial/safe_serial.c
++++ gregkh-2.6/drivers/usb/serial/safe_serial.c
+@@ -425,7 +425,7 @@ static int __init safe_init (void)
+ if (vendor || product) {
+ info ("vendor: %x product: %x\n", vendor, product);
+
+- for (i = 0; i < (sizeof (id_table) / sizeof (struct usb_device_id)); i++) {
++ for (i = 0; i < ARRAY_SIZE(id_table); i++) {
+ if (!id_table[i].idVendor && !id_table[i].idProduct) {
+ id_table[i].idVendor = vendor;
+ id_table[i].idProduct = product;
+--- gregkh-2.6.orig/drivers/usb/serial/ti_usb_3410_5052.c
++++ gregkh-2.6/drivers/usb/serial/ti_usb_3410_5052.c
+@@ -351,17 +351,14 @@ static int __init ti_init(void)
+ int i,j;
+ int ret;
+
+-
+ /* insert extra vendor and product ids */
+- j = sizeof(ti_id_table_3410)/sizeof(struct usb_device_id)
+- - TI_EXTRA_VID_PID_COUNT - 1;
++ j = ARRAY_SIZE(ti_id_table_3410) - TI_EXTRA_VID_PID_COUNT - 1;
+ for (i=0; i<min(vendor_3410_count,product_3410_count); i++,j++) {
+ ti_id_table_3410[j].idVendor = vendor_3410[i];
+ ti_id_table_3410[j].idProduct = product_3410[i];
+ ti_id_table_3410[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
+ }
+- j = sizeof(ti_id_table_5052)/sizeof(struct usb_device_id)
+- - TI_EXTRA_VID_PID_COUNT - 1;
++ j = ARRAY_SIZE(ti_id_table_5052) - TI_EXTRA_VID_PID_COUNT - 1;
+ for (i=0; i<min(vendor_5052_count,product_5052_count); i++,j++) {
+ ti_id_table_5052[j].idVendor = vendor_5052[i];
+ ti_id_table_5052[j].idProduct = product_5052[i];
+--- gregkh-2.6.orig/drivers/usb/storage/sddr09.c
++++ gregkh-2.6/drivers/usb/storage/sddr09.c
+@@ -133,13 +133,11 @@ static struct nand_flash_dev nand_flash_
+ { 0,}
+ };
+
+-#define SIZE(a) (sizeof(a)/sizeof((a)[0]))
+-
+ static struct nand_flash_dev *
+ nand_find_id(unsigned char id) {
+ int i;
+
+- for (i = 0; i < SIZE(nand_flash_ids); i++)
++ for (i = 0; i < ARRAY_SIZE(nand_flash_ids); i++)
+ if (nand_flash_ids[i].model_id == id)
+ return &(nand_flash_ids[i]);
+ return NULL;
diff --git a/usb/usbcore-fix-local-variable-clash.patch b/usb/usbcore-fix-local-variable-clash.patch
new file mode 100644
index 0000000000000..d4dbaa1c85819
--- /dev/null
+++ b/usb/usbcore-fix-local-variable-clash.patch
@@ -0,0 +1,35 @@
+From stern@rowland.harvard.edu Tue Dec 13 07:35:15 2005
+Date: Tue, 13 Dec 2005 10:32:13 -0500 (EST)
+From: Alan Stern <stern@rowland.harvard.edu>
+To: Greg KH <greg@kroah.com>
+cc: "J.A. Magallon" <jamagallon@able.es>
+Subject: usbcore: fix local variable clash
+Message-ID: <Pine.LNX.4.44L0.0512131029580.4831-100000@iolanthe.rowland.org>
+
+This patch (as621) fixes a local variable conflict I accidently
+introduced into usb_set_configuration.
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/core/message.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/core/message.c
++++ gregkh-2.6/drivers/usb/core/message.c
+@@ -1387,11 +1387,11 @@ free_interfaces:
+ if (dev->state != USB_STATE_ADDRESS)
+ usb_disable_device (dev, 1); // Skip ep0
+
+- n = dev->bus_mA - cp->desc.bMaxPower * 2;
+- if (n < 0)
++ i = dev->bus_mA - cp->desc.bMaxPower * 2;
++ if (i < 0)
+ dev_warn(&dev->dev, "new config #%d exceeds power "
+ "limit by %dmA\n",
+- configuration, -n);
++ configuration, -i);
+
+ if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
+ USB_REQ_SET_CONFIGURATION, 0, configuration, 0,