lkml.org 
[lkml]   [2020]   [Aug]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 029/393] m68k: mac: Dont send IOP message until channel is idle
    Date
    From: Finn Thain <fthain@telegraphics.com.au>

    [ Upstream commit aeb445bf2194d83e12e85bf5c65baaf1f093bd8f ]

    In the following sequence of calls, iop_do_send() gets called when the
    "send" channel is not in the IOP_MSG_IDLE state:

    iop_ism_irq()
    iop_handle_send()
    (msg->handler)()
    iop_send_message()
    iop_do_send()

    Avoid this by testing the channel state before calling iop_do_send().

    When sending, and iop_send_queue is empty, call iop_do_send() because
    the channel is idle. If iop_send_queue is not empty, iop_do_send() will
    get called later by iop_handle_send().

    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
    Tested-by: Stan Johnson <userm57@yahoo.com>
    Cc: Joshua Thompson <funaho@jurai.org>
    Link: https://lore.kernel.org/r/6d667c39e53865661fa5a48f16829d18ed8abe54.1590880333.git.fthain@telegraphics.com.au
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/m68k/mac/iop.c | 9 +++------
    1 file changed, 3 insertions(+), 6 deletions(-)

    diff --git a/arch/m68k/mac/iop.c b/arch/m68k/mac/iop.c
    index 9bfa170157688..d8f2282978f9c 100644
    --- a/arch/m68k/mac/iop.c
    +++ b/arch/m68k/mac/iop.c
    @@ -416,7 +416,8 @@ static void iop_handle_send(uint iop_num, uint chan)
    msg->status = IOP_MSGSTATUS_UNUSED;
    msg = msg->next;
    iop_send_queue[iop_num][chan] = msg;
    - if (msg) iop_do_send(msg);
    + if (msg && iop_readb(iop, IOP_ADDR_SEND_STATE + chan) == IOP_MSG_IDLE)
    + iop_do_send(msg);
    }

    /*
    @@ -490,16 +491,12 @@ int iop_send_message(uint iop_num, uint chan, void *privdata,

    if (!(q = iop_send_queue[iop_num][chan])) {
    iop_send_queue[iop_num][chan] = msg;
    + iop_do_send(msg);
    } else {
    while (q->next) q = q->next;
    q->next = msg;
    }

    - if (iop_readb(iop_base[iop_num],
    - IOP_ADDR_SEND_STATE + chan) == IOP_MSG_IDLE) {
    - iop_do_send(msg);
    - }
    -
    return 0;
    }

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-08-17 21:08    [W:4.045 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site