lkml.org 
[lkml]   [2021]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 228/306] staging: comedi: addi_apci_1032: Fix endian problem for COS sample
    Date
    From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    From: Ian Abbott <abbotti@mev.co.uk>

    commit 25317f428a78fde71b2bf3f24d05850f08a73a52 upstream.

    The Change-Of-State (COS) subdevice supports Comedi asynchronous
    commands to read 16-bit change-of-state values. However, the interrupt
    handler is calling `comedi_buf_write_samples()` with the address of a
    32-bit integer `&s->state`. On bigendian architectures, it will copy 2
    bytes from the wrong end of the 32-bit integer. Fix it by transferring
    the value via a 16-bit integer.

    Fixes: 6bb45f2b0c86 ("staging: comedi: addi_apci_1032: use comedi_buf_write_samples()")
    Cc: <stable@vger.kernel.org> # 3.19+
    Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
    Link: https://lore.kernel.org/r/20210223143055.257402-2-abbotti@mev.co.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/staging/comedi/drivers/addi_apci_1032.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    --- a/drivers/staging/comedi/drivers/addi_apci_1032.c
    +++ b/drivers/staging/comedi/drivers/addi_apci_1032.c
    @@ -260,6 +260,7 @@ static irqreturn_t apci1032_interrupt(in
    struct apci1032_private *devpriv = dev->private;
    struct comedi_subdevice *s = dev->read_subdev;
    unsigned int ctrl;
    + unsigned short val;

    /* check interrupt is from this device */
    if ((inl(devpriv->amcc_iobase + AMCC_OP_REG_INTCSR) &
    @@ -275,7 +276,8 @@ static irqreturn_t apci1032_interrupt(in
    outl(ctrl & ~APCI1032_CTRL_INT_ENA, dev->iobase + APCI1032_CTRL_REG);

    s->state = inl(dev->iobase + APCI1032_STATUS_REG) & 0xffff;
    - comedi_buf_write_samples(s, &s->state, 1);
    + val = s->state;
    + comedi_buf_write_samples(s, &val, 1);
    comedi_handle_events(dev, s);

    /* enable the interrupt */

    \
     
     \ /
      Last update: 2021-03-15 15:42    [W:3.206 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site