Skip to content
  • H Hartley Sweeten's avatar
    staging: comedi: usbdux: bug fix for accessing 'ao_chanlist' in private data · 2704f807
    H Hartley Sweeten authored
    In usbdux_ao_cmd(), the channels for the command are transfered from the
    cmd->chanlist and stored in the private data 'ao_chanlist'. The channel
    numbers are bit-shifted when stored so that they become the "command"
    that is transfered to the device. The channel to command conversion
    results in the 'ao_chanlist' having these values for the channels:
    
      channel 0 -> ao_chanlist = 0x00
      channel 1 -> ao_chanlist = 0x40
      channel 2 -> ao_chanlist = 0x80
      channel 3 -> ao_chanlist = 0xc0
    
    The problem is, the usbduxsub_ao_isoc_irq() function uses the 'chan' value
    from 'ao_chanlist' to access the 'ao_readback' array in the private data.
    So instead of accessing the array as 0, 1, 2, 3, it accesses it as 0x00,
    0x40, 0x80, 0xc0.
    
    Fix this by storing the raw channel number in 'ao_chanlist' and doing the
    bit-shift when creating the command.
    
    Fixes: a998a3db
    
     "staging: comedi: usbdux: cleanup the private data 'outBuffer'"
    Cc: stable <stable@vger.kernel.org> # 3.12
    Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
    Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
    Acked-by: default avatarBernd Porr <mail@berndporr.me.uk>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2704f807