Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=46386b587086c8d2698222a031bf749688464032
Commit:     46386b587086c8d2698222a031bf749688464032
Parent:     a21bd69e1509b43823c317c3bf3f7ffa99884356
Author:     Simon Budig <[EMAIL PROTECTED]>
AuthorDate: Mon Mar 12 13:52:04 2007 +0100
Committer:  Jiri Kosina <[EMAIL PROTECTED]>
CommitDate: Wed Apr 11 10:36:36 2007 +0200

    HID: introduce proper zeroing of unused bits in output reports
    
    Some HID devices are looking on the unused bits in the HID reports they
    receive. This is violating the specification, but we want to make those
    devices work. Well-behaving devices are unaffected, as they don't care
    about the unused bits.
    
    If bitsused % 8 is 0 all bits in data[] get used and we don't need to
    clear anything. Otherwise (bitsused % 8) bits of the last byte get used.
    By shifting 1 for (bitsused % 8) bits and subtracting 1 we create a mask
    consisting of (bitsused % 8) ones and remaining zeroes. By ANDing we
    clear the upper unused bits.
    
    Signed-off-by: Simon Budig <[EMAIL PROTECTED]>
    Signed-off-by: Jiri Kosina <[EMAIL PROTECTED]>
---
 drivers/hid/hid-core.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 67f3347..c16c949 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -872,8 +872,13 @@ static void hid_output_field(struct hid_field *field, __u8 
*data)
        unsigned count = field->report_count;
        unsigned offset = field->report_offset;
        unsigned size = field->report_size;
+       unsigned bitsused = offset + count * size;
        unsigned n;
 
+       /* make sure the unused bits in the last byte are zeros */
+       if (count > 0 && size > 0 && (bitsused % 8) != 0)
+               data[(bitsused-1)/8] &= (1 << (bitsused % 8)) - 1;
+
        for (n = 0; n < count; n++) {
                if (field->logical_minimum < 0) /* signed values */
                        implement(data, offset + n * size, size, 
s32ton(field->value[n], size));
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to