ChangeSet 1.1608.84.18, 2004/03/10 12:21:20-08:00, [EMAIL PROTECTED]

[PATCH] USB: fixes for aiptek driver

- don't pass buffers allocated on stack to the sync helpers
- check errors in probe
- fix count in open
- proper macros


 drivers/usb/input/aiptek.c |   57 +++++++++++++++++++++++++++++++--------------
 1 files changed, 40 insertions(+), 17 deletions(-)


diff -Nru a/drivers/usb/input/aiptek.c b/drivers/usb/input/aiptek.c
--- a/drivers/usb/input/aiptek.c        Tue Mar 16 15:02:44 2004
+++ b/drivers/usb/input/aiptek.c        Tue Mar 16 15:02:44 2004
@@ -43,7 +43,8 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/usb.h>
-
+#include <asm/unaligned.h>
+#include <asm/byteorder.h>
 /*
  * Version Information
  */
@@ -160,9 +161,9 @@
        proximity = data[5] & 0x01;
        input_report_key(dev, BTN_TOOL_PEN, proximity);
 
-       x = ((__u32) data[1]) | ((__u32) data[2] << 8);
-       y = ((__u32) data[3]) | ((__u32) data[4] << 8);
-       pressure = ((__u32) data[6]) | ((__u32) data[7] << 8);
+       x = le16_to_cpu(get_unaligned((u16 *) &data[1]));
+       y = le16_to_cpu(get_unaligned((u16 *) &data[3]));
+       pressure = le16_to_cpu(*(u16 *) &data[6]);
        pressure -= aiptek->features->pressure_min;
 
        if (pressure < 0) {
@@ -209,8 +210,10 @@
                return 0;
 
        aiptek->irq->dev = aiptek->usbdev;
-       if (usb_submit_urb(aiptek->irq, GFP_KERNEL))
+       if (usb_submit_urb(aiptek->irq, GFP_KERNEL)) {
+               aiptek->open--;
                return -EIO;
+       }
 
        return 0;
 }
@@ -234,19 +237,27 @@
                (type << 8) + id, inter->desc.bInterfaceNumber, buf, size, HZ);
 }
 
-static void
+static int
 aiptek_command(struct usb_device *dev, struct usb_host_interface *inter,
               unsigned char command, unsigned char data)
 {
-       __u8 buf[3];
+       u8 *buf;
+       int err;
+       
+       buf = kmalloc(3, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
 
        buf[0] = 4;
        buf[1] = command;
        buf[2] = data;
 
-       if (usb_set_report(dev, inter, 3, 2, buf, 3) != 3) {
+       if ((err = usb_set_report(dev, inter, 3, 2, buf, 3)) != 3) {
                dbg("aiptek_command: 0x%x 0x%x\n", command, data);
        }
+       
+       kfree(buf);
+       return err < 0 ? err : 0;
 }
 
 static int 
@@ -257,30 +268,32 @@
        struct usb_host_interface *interface = intf->altsetting + 0;
        struct usb_endpoint_descriptor *endpoint;
        struct aiptek *aiptek;
+       int err = -ENOMEM;
 
        if (!(aiptek = kmalloc(sizeof (struct aiptek), GFP_KERNEL)))
-               return -ENOMEM;
+               goto error_out_noalloc;
 
        memset(aiptek, 0, sizeof (struct aiptek));
 
-       aiptek->data = usb_buffer_alloc(dev, 10, SLAB_ATOMIC, &aiptek->data_dma);
+       aiptek->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &aiptek->data_dma);
        if (!aiptek->data) {
-               kfree(aiptek);
-               return -ENOMEM;
+               goto error_out_nobuf;
        }
 
        aiptek->irq = usb_alloc_urb(0, GFP_KERNEL);
        if (!aiptek->irq) {
-               usb_buffer_free(dev, 10, aiptek->data, aiptek->data_dma);
-               kfree(aiptek);
-               return -ENOMEM;
+               goto error_out_nourb;
        }
 
        /* Resolution500LPI */
-       aiptek_command(dev, interface, 0x18, 0x04);
+       err = aiptek_command(dev, interface, 0x18, 0x04);
+       if (err)
+               goto error_out;
 
        /* SwitchToTablet */
-       aiptek_command(dev, interface, 0x10, 0x01);
+       err = aiptek_command(dev, interface, 0x10, 0x01);
+       if (err)
+               goto error_out;
 
        aiptek->features = aiptek_features + id->driver_info;
 
@@ -340,6 +353,16 @@
 
        usb_set_intfdata(intf, aiptek);
        return 0;
+
+error_out:
+       usb_free_urb(aiptek->irq);
+error_out_nourb:
+       usb_buffer_free(dev, 10, aiptek->data, aiptek->data_dma);
+error_out_nobuf:
+       kfree(aiptek);
+error_out_noalloc:
+       return err;
+       
 }
 
 static void



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id70&alloc_id638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to