Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: pm80xx: Fixed kernel panic during error recovery for SATA drive

Disabling the SATA drive interface cause kernel panic. When the drive
Interface is disabled, device should be deregistered after aborting all
pending I/Os. Also changed the port recovery timeout to 10000 ms for
PM8006 controller.

Signed-off-by: Deepak Ukey <deepak.ukey@microchip.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Reviewed-by: Jack Wang <jinpu.wang@cloud.ionos.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Deepak Ukey and committed by
Martin K. Petersen
196ba662 9b79ee97

+8 -2
+5 -1
drivers/scsi/pm8001/pm8001_sas.c
··· 888 888 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 889 889 pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev , 890 890 dev, 1, 0); 891 + while (pm8001_dev->running_req) 892 + msleep(20); 891 893 spin_lock_irqsave(&pm8001_ha->lock, flags); 892 894 } 893 895 PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id); ··· 1258 1256 PM8001_MSG_DBG(pm8001_ha, 1259 1257 pm8001_printk("Waiting for Port reset\n")); 1260 1258 wait_for_completion(&completion_reset); 1261 - if (phy->port_reset_status) 1259 + if (phy->port_reset_status) { 1260 + pm8001_dev_gone_notify(dev); 1262 1261 goto out; 1262 + } 1263 1263 1264 1264 /* 1265 1265 * 4. SATA Abort ALL
+1 -1
drivers/scsi/pm8001/pm80xx_hwi.c
··· 604 604 pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &= 605 605 0x0000ffff; 606 606 pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |= 607 - 0x140000; 607 + CHIP_8006_PORT_RECOVERY_TIMEOUT; 608 608 } 609 609 pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER, 610 610 pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
+2
drivers/scsi/pm8001/pm80xx_hwi.h
··· 230 230 #define SAS_MAX_AIP 0x200000 231 231 #define IT_NEXUS_TIMEOUT 0x7D0 232 232 #define PORT_RECOVERY_TIMEOUT ((IT_NEXUS_TIMEOUT/100) + 30) 233 + /* Port recovery timeout, 10000 ms for PM8006 controller */ 234 + #define CHIP_8006_PORT_RECOVERY_TIMEOUT 0x640000 233 235 234 236 #ifdef __LITTLE_ENDIAN_BITFIELD 235 237 struct sas_identify_frame_local {