Commit ec2e7e1a authored by Viswas G's avatar Viswas G Committed by Martin K. Petersen
Browse files

scsi: pm80xx: Fix driver fatal dump failure

The function pm80xx_get_fatal_dump() has two issues that result in the
fatal dump not being able to complete successfully.

 1. Trying to collect fatal_logs from the application fails because we are
    not shifting the MEMBASE-II register properly. Once we read 64K region
    of data we have to shift the MEMBASE-II register and read the next
    chunk. Only then would we be able to get complete data.

 2. If a timeout occurs, our application will get stuck.

Link: https://lore.kernel.org/r/20210109123849.17098-6-Viswas.G@microchip.com


Acked-by: default avatarJack Wang <jinpu.wang@cloud.ionos.com>
Signed-off-by: default avatarViswas G <Viswas.G@microchip.com>
Signed-off-by: default avatarRuksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: default avatarAshokkumar N <Ashokkumar.N@microchip.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5d280268
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -349,6 +349,11 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
				sprintf(
				pm8001_ha->forensic_info.data_buf.direct_data,
				"%08x ", 0xFFFFFFFF);
				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);
@@ -374,12 +379,11 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
				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