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.