ChangeSet 1.1608.84.20, 2004/03/10 12:22:13-08:00, oliver@neukum.org [PATCH] USB: wacom driver fixes the same error code path as in the other drivers. In addition I added the endianness macros. They save cycles in interrupt. -use endian macros -use GFP_KERNEL where SLAB_ATOMIC is not needed -fix count bug in open() error path drivers/usb/input/wacom.c | 22 +++++++++++++--------- 1 files changed, 13 insertions(+), 9 deletions(-) diff -Nru a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c --- a/drivers/usb/input/wacom.c Tue Mar 16 15:02:36 2004 +++ b/drivers/usb/input/wacom.c Tue Mar 16 15:02:36 2004 @@ -63,6 +63,8 @@ #include #include #include +#include +#include /* * Version Information @@ -194,8 +196,8 @@ input_regs(dev, regs); input_report_key(dev, BTN_TOOL_PEN, 1); - input_report_abs(dev, ABS_X, data[2] << 8 | data[1]); - input_report_abs(dev, ABS_Y, data[4] << 8 | data[3]); + input_report_abs(dev, ABS_X, le16_to_cpu(get_unaligned((u16 *) &data[1]))); + input_report_abs(dev, ABS_Y, le16_to_cpu(get_unaligned((u16 *) &data[3]))); input_report_abs(dev, ABS_PRESSURE, (signed char)data[6] + 127); input_report_key(dev, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20)); input_report_key(dev, BTN_STYLUS, (data[5] & 0x40)); @@ -234,8 +236,8 @@ if (data[0] != 2) dbg("received unknown report #%d", data[0]); - x = data[2] | ((__u32)data[3] << 8); - y = data[4] | ((__u32)data[5] << 8); + x = le16_to_cpu(*(u16 *) &data[2]); + y = le16_to_cpu(*(u16 *) &data[4]); input_regs(dev, regs); @@ -269,7 +271,7 @@ input_report_abs(dev, ABS_Y, y); } - input_report_abs(dev, ABS_PRESSURE, data[6] | ((__u32)data[7] << 8)); + input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(u16 *) &data[6])); input_report_key(dev, BTN_TOUCH, data[1] & 0x01); input_report_key(dev, BTN_STYLUS, data[1] & 0x02); input_report_key(dev, BTN_STYLUS2, data[1] & 0x04); @@ -354,8 +356,8 @@ goto exit; } - input_report_abs(dev, ABS_X, ((__u32)data[2] << 8) | data[3]); - input_report_abs(dev, ABS_Y, ((__u32)data[4] << 8) | data[5]); + input_report_abs(dev, ABS_X, be16_to_cpu(*(u16 *) &data[2])); + input_report_abs(dev, ABS_Y, be16_to_cpu(*(u16 *) &data[4])); input_report_abs(dev, ABS_DISTANCE, data[9] >> 4); if ((data[1] & 0xb8) == 0xa0) { /* general pen packet */ @@ -483,8 +485,10 @@ return 0; wacom->irq->dev = wacom->usbdev; - if (usb_submit_urb(wacom->irq, GFP_KERNEL)) + if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { + wacom->open--; return -EIO; + } return 0; } @@ -509,7 +513,7 @@ return -ENOMEM; memset(wacom, 0, sizeof(struct wacom)); - wacom->data = usb_buffer_alloc(dev, 10, SLAB_ATOMIC, &wacom->data_dma); + wacom->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &wacom->data_dma); if (!wacom->data) { kfree(wacom); return -ENOMEM;