Re: [PATCH 5/8] pm80xx: fix driver fatal dump failure.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Dec 30, 2020 at 5:47 AM Viswas G <Viswas.G@xxxxxxxxxxxxxxxxx> wrote:
>
> From: Viswas G <Viswas.G@xxxxxxxxxxxxx>
>
> The fatal dump function pm80xx_get_fatal_dump() has two issues that
> result in the fatal dump not being completed successfully.
>
> 1. When trying collect fatal_logs from the application it is getting
> failed, because we are not shifting MEMBASE-II register properly.
> Once we read 64K region of data we have to shift the MEMBASE-II register
> and read the next chunk of data, then only we would be able to get
> complete data.
>
> 2. If timeout occurs our application will get stuck because we are not
> handling this case. In this patch it resolves all these issues.
>
> Signed-off-by: Viswas G <Viswas.G@xxxxxxxxxxxxx>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@xxxxxxxxxxxxx>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@xxxxxxxxxxxxx>
Acked-by: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx>
Thx
> ---
>  drivers/scsi/pm8001/pm80xx_hwi.c | 14 +++++++++-----
>  1 file changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 7d0eada11d3c..407c0cf6ab5f 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -349,10 +349,15 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
>                                 sprintf(
>                                 pm8001_ha->forensic_info.data_buf.direct_data,
>                                 "%08x ", 0xFFFFFFFF);
> -                               pm8001_cw32(pm8001_ha, 0,
> +                               return((char *)pm8001_ha->forensic_info.data_buf.direct_data -
> +                                               (char *)buf);
> +                       }
> +       /* reset fatal_forensic_shift_offset back to zero and reset MEMBASE 2 register to zero */
> +                       pm8001_ha->fatal_forensic_shift_offset = 0; /* location in 64k region */
> +                       pm8001_cw32(pm8001_ha, 0,
>                                         MEMBASE_II_SHIFT_REGISTER,
>                                         pm8001_ha->fatal_forensic_shift_offset);
> -                       }
> +               }
>                         /* Read the next block of the debug data.*/
>                         length_to_read = pm8001_mr32(fatal_table_address,
>                         MPI_FATAL_EDUMP_TABLE_ACCUM_LEN) -
> @@ -373,13 +378,12 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
>                                                                 = 0;
>                                 pm8001_ha->forensic_info.data_buf.read_len = 0;
>                         }
> -               }
>         }
>         offset = (int)((char *)pm8001_ha->forensic_info.data_buf.direct_data
>                         - (char *)buf);
>         pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv: return4 0x%x\n", offset);
> -       return (char *)pm8001_ha->forensic_info.data_buf.direct_data -
> -               (char *)buf;
> +       return ((char *)pm8001_ha->forensic_info.data_buf.direct_data -
> +               (char *)buf);
>  }
>
>  /* pm80xx_get_non_fatal_dump - dump the nonfatal data from the dma
> --
> 2.16.3
>



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux