On Thu, 2017-12-21 at 09:33 -0800, Raghava Aditya Renukunta wrote: > +static void aac_wait_for_io_completion(struct aac_dev *aac) > +{ > + unsigned long flagv = 0; > + int i = 0; > + > + for (i = 60; i; --i) { > + struct scsi_device *dev; > + struct scsi_cmnd *command; > + int active = 0; > + > + __shost_for_each_device(dev, aac->scsi_host_ptr) { > + spin_lock_irqsave(&dev->list_lock, flagv); > + list_for_each_entry(command, &dev->cmd_list, list) { > + if (command->SCp.phase == AAC_OWNER_FIRMWARE) { > + active++; > + break; > + } > + } > + spin_unlock_irqrestore(&dev->list_lock, flagv); > + if (active) > + break; > + > + } > + /* > + * We can exit If all the commands are complete > + */ > + if (active == 0) > + break; > + ssleep(1); > + } > +} Have you considered to call scsi_target_block() and scsi_target_unblock() instead of implementing functionality like the above in a SCSI LLD? Thanks, Bart.