]> Pileus Git - ~andy/linux/blobdiff - drivers/hid/hid-core.c
USB: ratelimit debounce error messages
[~andy/linux] / drivers / hid / hid-core.c
index 8c7d48eff7b7a6339db159b901987e5ca12c3815..f4ee1afe488f0493748ba224ada537b04de44171 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/list.h>
 #include <linux/mm.h>
 #include <linux/smp_lock.h>
@@ -668,7 +667,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
 
                if (item.format != HID_ITEM_FORMAT_SHORT) {
                        dbg("unexpected long global item");
-                       kfree(device->collection);
                        hid_free_device(device);
                        kfree(parser);
                        return NULL;
@@ -677,7 +675,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
                if (dispatch_type[item.type](parser, &item)) {
                        dbg("item %u %u %u %u parsing failed\n",
                                item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag);
-                       kfree(device->collection);
                        hid_free_device(device);
                        kfree(parser);
                        return NULL;
@@ -686,14 +683,12 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
                if (start == end) {
                        if (parser->collection_stack_ptr) {
                                dbg("unbalanced collection at end of report description");
-                               kfree(device->collection);
                                hid_free_device(device);
                                kfree(parser);
                                return NULL;
                        }
                        if (parser->local.delimiter_depth) {
                                dbg("unbalanced delimiter at end of report description");
-                               kfree(device->collection);
                                hid_free_device(device);
                                kfree(parser);
                                return NULL;
@@ -704,7 +699,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
        }
 
        dbg("item fetching failed at offset %d\n", (int)(end - start));
-       kfree(device->collection);
        hid_free_device(device);
        kfree(parser);
        return NULL;
@@ -881,7 +875,7 @@ static void hid_output_field(struct hid_field *field, __u8 *data)
 
        /* make sure the unused bits in the last byte are zeros */
        if (count > 0 && size > 0)
-               data[(count*size-1)/8] = 0;
+               data[(offset+count*size-1)/8] = 0;
 
        for (n = 0; n < count; n++) {
                if (field->logical_minimum < 0) /* signed values */