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 >