Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 216ced02 authored by Raghava Aditya Renukunta's avatar Raghava Aditya Renukunta Committed by Martin K. Petersen
Browse files

scsi: aacraid: Move code to wait for IO completion to shutdown func



Ideally driver needs to wait for IO to be submitted or responded to before
shutdown.

Move code to wait for IO completion into shutdown path

Signed-off-by: default avatarRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 97a4e8ac
Loading
Loading
Loading
Loading
+36 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,8 @@
#include <linux/completion.h>
#include <linux/completion.h>
#include <linux/mm.h>
#include <linux/mm.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_cmnd.h>


#include "aacraid.h"
#include "aacraid.h"


@@ -284,6 +286,38 @@ static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem,
	q->entries = qsize;
	q->entries = qsize;
}
}


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);
	}
}

/**
/**
 *	aac_send_shutdown		-	shutdown an adapter
 *	aac_send_shutdown		-	shutdown an adapter
 *	@dev: Adapter to shutdown
 *	@dev: Adapter to shutdown
@@ -306,6 +340,8 @@ int aac_send_shutdown(struct aac_dev * dev)
		mutex_unlock(&dev->ioctl_mutex);
		mutex_unlock(&dev->ioctl_mutex);
	}
	}


	aac_wait_for_io_completion(dev);

	fibctx = aac_fib_alloc(dev);
	fibctx = aac_fib_alloc(dev);
	if (!fibctx)
	if (!fibctx)
		return -ENOMEM;
		return -ENOMEM;
+0 −25
Original line number Original line Diff line number Diff line
@@ -1701,31 +1701,6 @@ int aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
	 */
	 */
	host = aac->scsi_host_ptr;
	host = aac->scsi_host_ptr;
	scsi_block_requests(host);
	scsi_block_requests(host);
	if (forced < 2) for (retval = 60; retval; --retval) {
		struct scsi_device * dev;
		struct scsi_cmnd * command;
		int active = 0;

		__shost_for_each_device(dev, host) {
			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);
	}


	/* Quiesce build, flush cache, write through mode */
	/* Quiesce build, flush cache, write through mode */
	if (forced < 2)
	if (forced < 2)