cxlflash: Verify problem state area is mapped before notifying shutdown
If an EEH or some other hard error occurs while the adapter instance was being initialized, on the subsequent shutdown of the device, the system could crash with: [c000000f1da03b60] c0000000005eccfc pci_device_shutdown+0x6c/0x100 [c000000f1da03ba0] c0000000006d67d4 device_shutdown+0x1b4/0x2c0 [c000000f1da03c40] c0000000000ea30c kernel_restart_prepare+0x5c/0x80 [c000000f1da03c70] c0000000000ea48c kernel_restart+0x2c/0xc0 [c000000f1da03ce0] c0000000000ea970 SyS_reboot+0x1c0/0x2d0 [c000000f1da03e30] c000000000009204 system_call+0x38/0xb4 This crash is due to the AFU not being mapped when the shutdown notification routine is called and is a regression that was inserted recently with Commit704c4b0ddc
("cxlflash: Shutdown notify support for CXL Flash cards"). As a fix, shutdown notification should only occur when the AFU is mapped. Fixes:704c4b0ddc
("cxlflash: Shutdown notify support for CXL Flash cards") Signed-off-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com> Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Acked-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
05a05872c8
commit
1bd2b2823e
|
@ -778,7 +778,7 @@ static void notify_shutdown(struct cxlflash_cfg *cfg, bool wait)
|
|||
{
|
||||
struct afu *afu = cfg->afu;
|
||||
struct device *dev = &cfg->dev->dev;
|
||||
struct sisl_global_map __iomem *global = &afu->afu_map->global;
|
||||
struct sisl_global_map __iomem *global;
|
||||
struct dev_dependent_vals *ddv;
|
||||
u64 reg, status;
|
||||
int i, retry_cnt = 0;
|
||||
|
@ -787,6 +787,14 @@ static void notify_shutdown(struct cxlflash_cfg *cfg, bool wait)
|
|||
if (!(ddv->flags & CXLFLASH_NOTIFY_SHUTDOWN))
|
||||
return;
|
||||
|
||||
if (!afu || !afu->afu_map) {
|
||||
dev_dbg(dev, "%s: The problem state area is not mapped\n",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
global = &afu->afu_map->global;
|
||||
|
||||
/* Notify AFU */
|
||||
for (i = 0; i < NUM_FC_PORTS; i++) {
|
||||
reg = readq_be(&global->fc_regs[i][FC_CONFIG2 / 8]);
|
||||
|
|
Loading…
Reference in New Issue