lkml.org 
[lkml]   [2020]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 161/388] scsi: aacraid: Disabling TM path and only processing IOP reset
    Date
    From: Sagar Biradar <Sagar.Biradar@microchip.com>

    [ Upstream commit bef18d308a2215eff8c3411a23d7f34604ce56c3 ]

    Fixes the occasional adapter panic when sg_reset is issued with -d, -t, -b
    and -H flags. Removal of command type HBA_IU_TYPE_SCSI_TM_REQ in
    aac_hba_send since iu_type, request_id and fib_flags are not populated.
    Device and target reset handlers are made to send TMF commands only when
    reset_state is 0.

    Link: https://lore.kernel.org/r/1581553771-25796-1-git-send-email-Sagar.Biradar@microchip.com
    Reviewed-by: Sagar Biradar <Sagar.Biradar@microchip.com>
    Signed-off-by: Sagar Biradar <Sagar.Biradar@microchip.com>
    Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/aacraid/commsup.c | 2 +-
    drivers/scsi/aacraid/linit.c | 34 +++++++++++++++++++++++++---------
    2 files changed, 26 insertions(+), 10 deletions(-)

    diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
    index 2142a649e865b..90fb17c5dd69c 100644
    --- a/drivers/scsi/aacraid/commsup.c
    +++ b/drivers/scsi/aacraid/commsup.c
    @@ -728,7 +728,7 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback,
    hbacmd->request_id =
    cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1);
    fibptr->flags |= FIB_CONTEXT_FLAG_SCSI_CMD;
    - } else if (command != HBA_IU_TYPE_SCSI_TM_REQ)
    + } else
    return -EINVAL;


    diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
    index 4a858789e6c5e..514aed38b5afe 100644
    --- a/drivers/scsi/aacraid/linit.c
    +++ b/drivers/scsi/aacraid/linit.c
    @@ -723,7 +723,11 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
    status = aac_hba_send(HBA_IU_TYPE_SCSI_TM_REQ, fib,
    (fib_callback) aac_hba_callback,
    (void *) cmd);
    -
    + if (status != -EINPROGRESS) {
    + aac_fib_complete(fib);
    + aac_fib_free(fib);
    + return ret;
    + }
    /* Wait up to 15 secs for completion */
    for (count = 0; count < 15; ++count) {
    if (cmd->SCp.sent_command) {
    @@ -902,11 +906,11 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)

    info = &aac->hba_map[bus][cid];

    - if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
    - info->reset_state > 0)
    + if (!(info->devtype == AAC_DEVTYPE_NATIVE_RAW &&
    + !(info->reset_state > 0)))
    return FAILED;

    - pr_err("%s: Host adapter reset request. SCSI hang ?\n",
    + pr_err("%s: Host device reset request. SCSI hang ?\n",
    AAC_DRIVERNAME);

    fib = aac_fib_alloc(aac);
    @@ -921,7 +925,12 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)
    status = aac_hba_send(command, fib,
    (fib_callback) aac_tmf_callback,
    (void *) info);
    -
    + if (status != -EINPROGRESS) {
    + info->reset_state = 0;
    + aac_fib_complete(fib);
    + aac_fib_free(fib);
    + return ret;
    + }
    /* Wait up to 15 seconds for completion */
    for (count = 0; count < 15; ++count) {
    if (info->reset_state == 0) {
    @@ -960,11 +969,11 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)

    info = &aac->hba_map[bus][cid];

    - if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
    - info->reset_state > 0)
    + if (!(info->devtype == AAC_DEVTYPE_NATIVE_RAW &&
    + !(info->reset_state > 0)))
    return FAILED;

    - pr_err("%s: Host adapter reset request. SCSI hang ?\n",
    + pr_err("%s: Host target reset request. SCSI hang ?\n",
    AAC_DRIVERNAME);

    fib = aac_fib_alloc(aac);
    @@ -981,6 +990,13 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
    (fib_callback) aac_tmf_callback,
    (void *) info);

    + if (status != -EINPROGRESS) {
    + info->reset_state = 0;
    + aac_fib_complete(fib);
    + aac_fib_free(fib);
    + return ret;
    + }
    +
    /* Wait up to 15 seconds for completion */
    for (count = 0; count < 15; ++count) {
    if (info->reset_state <= 0) {
    @@ -1033,7 +1049,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd)
    }
    }

    - pr_err("%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME);
    + pr_err("%s: Host bus reset request. SCSI hang ?\n", AAC_DRIVERNAME);

    /*
    * Check the health of the controller
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-09-29 14:04    [W:5.303 / U:0.768 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site