Commit bef18d30 authored by Sagar Biradar's avatar Sagar Biradar Committed by Martin K. Petersen
Browse files

scsi: aacraid: Disabling TM path and only processing IOP reset

Fixes the occasional adapter panic when sg_reset is issued with -d, -t, -b
and -H flags.  Removal of command type HBA_IU_TYPE_SCSI_TM_REQ in
aac_hba_send since iu_type, request_id and fib_flags are not populated.
Device and target reset handlers are made to send TMF commands only when
reset_state is 0.

Link: https://lore.kernel.org/r/1581553771-25796-1-git-send-email-Sagar.Biradar@microchip.com


Reviewed-by: default avatarSagar Biradar <Sagar.Biradar@microchip.com>
Signed-off-by: default avatarSagar Biradar <Sagar.Biradar@microchip.com>
Signed-off-by: default avatarBalsundar P <balsundar.p@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent ed830385
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -729,7 +729,7 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback,
		hbacmd->request_id =
			cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1);
		fibptr->flags |= FIB_CONTEXT_FLAG_SCSI_CMD;
	} else if (command != HBA_IU_TYPE_SCSI_TM_REQ)
	} else
		return -EINVAL;


+25 −9
Original line number Diff line number Diff line
@@ -733,7 +733,11 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
		status = aac_hba_send(HBA_IU_TYPE_SCSI_TM_REQ, fib,
				  (fib_callback) aac_hba_callback,
				  (void *) cmd);

		if (status != -EINPROGRESS) {
			aac_fib_complete(fib);
			aac_fib_free(fib);
			return ret;
		}
		/* Wait up to 15 secs for completion */
		for (count = 0; count < 15; ++count) {
			if (cmd->SCp.sent_command) {
@@ -912,11 +916,11 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)

	info = &aac->hba_map[bus][cid];

	if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
	    info->reset_state > 0)
	if (!(info->devtype == AAC_DEVTYPE_NATIVE_RAW &&
	 !(info->reset_state > 0)))
		return FAILED;

	pr_err("%s: Host adapter reset request. SCSI hang ?\n",
	pr_err("%s: Host device reset request. SCSI hang ?\n",
	       AAC_DRIVERNAME);

	fib = aac_fib_alloc(aac);
@@ -931,7 +935,12 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)
	status = aac_hba_send(command, fib,
			      (fib_callback) aac_tmf_callback,
			      (void *) info);

	if (status != -EINPROGRESS) {
		info->reset_state = 0;
		aac_fib_complete(fib);
		aac_fib_free(fib);
		return ret;
	}
	/* Wait up to 15 seconds for completion */
	for (count = 0; count < 15; ++count) {
		if (info->reset_state == 0) {
@@ -970,11 +979,11 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)

	info = &aac->hba_map[bus][cid];

	if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
	    info->reset_state > 0)
	if (!(info->devtype == AAC_DEVTYPE_NATIVE_RAW &&
	 !(info->reset_state > 0)))
		return FAILED;

	pr_err("%s: Host adapter reset request. SCSI hang ?\n",
	pr_err("%s: Host target reset request. SCSI hang ?\n",
	       AAC_DRIVERNAME);

	fib = aac_fib_alloc(aac);
@@ -991,6 +1000,13 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
			      (fib_callback) aac_tmf_callback,
			      (void *) info);

	if (status != -EINPROGRESS) {
		info->reset_state = 0;
		aac_fib_complete(fib);
		aac_fib_free(fib);
		return ret;
	}

	/* Wait up to 15 seconds for completion */
	for (count = 0; count < 15; ++count) {
		if (info->reset_state <= 0) {
@@ -1043,7 +1059,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd)
		}
	}

	pr_err("%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME);
	pr_err("%s: Host bus reset request. SCSI hang ?\n", AAC_DRIVERNAME);

	/*
	 * Check the health of the controller