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

Commit b2a7a4ba authored by Matthew Wilcox's avatar Matthew Wilcox Committed by James Bottomley
Browse files

[SCSI] advansys: Enable interrupts earlier in queuecommand



Move as much as possible outside the critical section in queuecommand, eg:
 - Set the scsi_done field before acquiring the lock
 - Call asc_scsi_done after dropping the lock

Also remove a comment suggesting we should enable interrupts (now we do)
and do some minor reformatting for readability.

Signed-off-by: default avatarMatthew Wilcox <matthew@wil.cx>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 349d2c44
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -3178,21 +3178,22 @@ static void asc_scsi_done(struct scsi_cmnd *scp)
static int
advansys_queuecommand(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *))
{
	struct Scsi_Host *shost;
	asc_board_t *boardp;
	ulong flags;
	struct Scsi_Host *shost = scp->device->host;
	asc_board_t *boardp = ASC_BOARDP(shost);
	unsigned long flags;
	int asc_res, result = 0;
	shost = scp->device->host;
	boardp = ASC_BOARDP(shost);
	ASC_STATS(shost, queuecommand);
	scp->scsi_done = done;
	/* host_lock taken by mid-level prior to call but need to protect */
	/* against own ISR */
	/*
	 * host_lock taken by mid-level prior to call, but need
	 * to protect against own ISR
	 */
	spin_lock_irqsave(&boardp->lock, flags);
	scp->scsi_done = done;
	asc_res = asc_execute_scsi_cmnd(scp);
	spin_unlock_irqrestore(&boardp->lock, flags);
	switch (asc_res) {
	case ASC_NOERROR:
		break;
@@ -3201,11 +3202,9 @@ advansys_queuecommand(struct scsi_cmnd *scp, void (*done) (struct scsi_cmnd *))
		break;
	case ASC_ERROR:
	default:
		/* Interrupts could be enabled here. */
		asc_scsi_done(scp);
		break;
	}
	spin_unlock_irqrestore(&boardp->lock, flags);
	return result;
}