• Grant Grundler's avatar
    USB: input: extract() and implement() are bit field manipulation routines · 4550718f
    Grant Grundler authored
    extract() and implement() have brain damaged attempts to handle 32-bit wide
    "fields".
    
    The problem is the index math in the original code didn't clear all the
    relevant bits.  (offset >> 5) only compensated for 32-bit index.  We need
    (offset >> 6) if we want to use 64-bit loads.
    
    But it was also wrong in that it tried to use quasi-aligned loads.  Ie
    "report" was only incremented in multiples of 4 bytes and then the offset
    was masked off for values greater than 4 bytes.  The right way is to
    pretend "report" points at a byte array.  And offset is then only minor
    adjustment for < 8 bits of offset.  "n" (field width) can then be as big as
    24 (assuming 32-bit loads) since "offset" will never be bigger than 7.
    
    If someone needs either function to handle more than 24-bits, please
    document why - point at a specification or specific USB hid device - in
    comments in the code.
    
    extract/implement() are also an eyesore to read.  Please banish whoever
    wrote it to read CodingStyle 3 times in a row to a classroom full of 1st
    graders armed with rubberbands.  Or just flame them.  Whatever.  Globbing
    all the code together on two lines does NOT make it faster and is Just
    Wrong.
    
    I've tested this patch on j6000 (dual 750Mhz PA-RISC, 32-bit 2.6.12-rc5). 
    Kyle McMartin tested on c3000 (up 400Mhz PA-RISC, same kernel).  "p2-mate"
    (Peter De Schrijver?) tested on sb1250 (dual core Mips, broadcom "swarm"
    eval board).
    Signed-off-by: default avatarGrant Grundler <grundler@parisc-linux.org>
    Signed-off-by: default avatarMatthew Wilcox <matthew@wil.cx>
    Cc: Vojtech Pavlik <vojtech@suse.cz>
    Cc: Dmitry Torokhov <dtor@mail.ru>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    4550718f
hid-core.c 62.5 KB