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>
This commit is contained in:
Родитель
9b79ee9773
Коммит
196ba6629c
|
@ -888,6 +888,8 @@ static void pm8001_dev_gone_notify(struct domain_device *dev)
|
|||
spin_unlock_irqrestore(&pm8001_ha->lock, flags);
|
||||
pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
|
||||
dev, 1, 0);
|
||||
while (pm8001_dev->running_req)
|
||||
msleep(20);
|
||||
spin_lock_irqsave(&pm8001_ha->lock, flags);
|
||||
}
|
||||
PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id);
|
||||
|
@ -1256,8 +1258,10 @@ int pm8001_abort_task(struct sas_task *task)
|
|||
PM8001_MSG_DBG(pm8001_ha,
|
||||
pm8001_printk("Waiting for Port reset\n"));
|
||||
wait_for_completion(&completion_reset);
|
||||
if (phy->port_reset_status)
|
||||
if (phy->port_reset_status) {
|
||||
pm8001_dev_gone_notify(dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* 4. SATA Abort ALL
|
||||
|
|
|
@ -604,7 +604,7 @@ static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
|
|||
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &=
|
||||
0x0000ffff;
|
||||
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
|
||||
0x140000;
|
||||
CHIP_8006_PORT_RECOVERY_TIMEOUT;
|
||||
}
|
||||
pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
|
||||
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
|
||||
|
|
|
@ -230,6 +230,8 @@
|
|||
#define SAS_MAX_AIP 0x200000
|
||||
#define IT_NEXUS_TIMEOUT 0x7D0
|
||||
#define PORT_RECOVERY_TIMEOUT ((IT_NEXUS_TIMEOUT/100) + 30)
|
||||
/* Port recovery timeout, 10000 ms for PM8006 controller */
|
||||
#define CHIP_8006_PORT_RECOVERY_TIMEOUT 0x640000
|
||||
|
||||
#ifdef __LITTLE_ENDIAN_BITFIELD
|
||||
struct sas_identify_frame_local {
|
||||
|
|
Загрузка…
Ссылка в новой задаче