This patch needs rework and we will be posting the patch with fix soon, Below is the issue. After issuing any ATA Pass-through command to Firmware, driver will block the device, it will unblock the device only if that IO completes through ISR path. But, If in-between any host reset occurs then driver won't unblock the device and device will be in blocked state. Thanks, Suganath Prabu S On Thu, Nov 17, 2016 at 6:45 AM, Andrey Grodzovsky <andrey2805@xxxxxxxxx> wrote: > Problem: > This is a work around for a bug with LSI Fusion MPT SAS2 when > pefroming secure erase. Due to the very long time the operation > takes commands issued during the erase will time out and will trigger > execution of abort hook. Even though the abort hook is called for > the specific command which timed out this leads to entire device halt > (scsi_state terminated) and premature termination of the secured erase. > > Fix: > Set device state to busy while erase in progress to reject any incoming > commands until the erase is done. The device is blocked any way during > this time and cannot execute any other command. > More data and logs can be found here - > https://drive.google.com/file/d/0B9ocOHYHbbS1Q3VMdkkzeWFkTjg/view > > P.S > This is a backport from the same fix for mpt3sas driver intended > for pre-4.4 stable trees. > > Signed-off-by: Andrey Grodzovsky <andrey2805@xxxxxxxxx> > Cc: Sreekanth Reddy <Sreekanth.Reddy@xxxxxxxxxxxx> > Cc: Hannes Reinecke <hare@xxxxxxx> > Cc: PDL-MPT-FUSIONLINUX <MPT-FusionLinux.pdl@xxxxxxxxxxxx> > Cc: Martin K. Petersen <martin.petersen@xxxxxxxxxx> > --- > drivers/scsi/mpt2sas/mpt2sas_scsih.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c > index 3f26147..988c1da 100644 > --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c > +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c > @@ -3884,6 +3884,11 @@ _scsih_setup_direct_io(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd, > _scsih_scsi_direct_io_set(ioc, smid, 1); > } > > +static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd) > +{ > + return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16); > +} > + > /** > * _scsih_qcmd - main scsi request entry point > * @scmd: pointer to scsi command object > @@ -3906,6 +3911,13 @@ _scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) > u32 mpi_control; > u16 smid; > > + /** > + * Lock the device for any subsequent command until > + * command is done. > + */ > + if (ata_12_16_cmd(scmd)) > + scsi_internal_device_block(scmd->device); > + > sas_device_priv_data = scmd->device->hostdata; > if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { > scmd->result = DID_NO_CONNECT << 16; > @@ -4447,6 +4459,9 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) > if (scmd == NULL) > return 1; > > + if (ata_12_16_cmd(scmd)) > + scsi_internal_device_unblock(scmd->device, SDEV_RUNNING); > + > mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); > > if (mpi_reply == NULL) { > -- > 2.1.4 > -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html