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

Commit ac9399d0 authored by Finn Thain's avatar Finn Thain Committed by Martin K. Petersen
Browse files

ncr5380: Always escalate bad target time-out in NCR5380_select()



Remove the restart_select and targets_present variables introduced in
Linux v1.1.38. The former was used only for a questionable debug printk
and the latter "so we can call a select failure a retryable condition".
Well, retrying select failure in general is a different problem to a
target that doesn't assert BSY. We need to handle these two cases
differently; the latter case can be left to the SCSI ML.

Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Tested-by: default avatarOndrej Zary <linux@rainbow-software.org>
Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 6323876f
Loading
Loading
Loading
Loading
+0 −13
Original line number Original line Diff line number Diff line
@@ -790,7 +790,6 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
#ifdef REAL_DMA
#ifdef REAL_DMA
	hostdata->dmalen = 0;
	hostdata->dmalen = 0;
#endif
#endif
	hostdata->targets_present = 0;
	hostdata->connected = NULL;
	hostdata->connected = NULL;
	hostdata->issue_queue = NULL;
	hostdata->issue_queue = NULL;
	hostdata->disconnected_queue = NULL;
	hostdata->disconnected_queue = NULL;
@@ -1186,8 +1185,6 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
	if (hostdata->selecting)
	if (hostdata->selecting)
		goto part2;
		goto part2;


	hostdata->restart_select = 0;

	NCR5380_dprint(NDEBUG_ARBITRATION, instance);
	NCR5380_dprint(NDEBUG_ARBITRATION, instance);
	dprintk(NDEBUG_ARBITRATION, "scsi%d : starting arbitration, id = %d\n", instance->host_no, instance->this_id);
	dprintk(NDEBUG_ARBITRATION, "scsi%d : starting arbitration, id = %d\n", instance->host_no, instance->this_id);


@@ -1363,21 +1360,12 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)


	if (!(NCR5380_read(STATUS_REG) & SR_BSY)) {
	if (!(NCR5380_read(STATUS_REG) & SR_BSY)) {
		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
		if (hostdata->targets_present & (1 << scmd_id(cmd))) {
			printk(KERN_DEBUG "scsi%d : weirdness\n", instance->host_no);
			if (hostdata->restart_select)
				printk(KERN_DEBUG "\trestart select\n");
			NCR5380_dprint(NDEBUG_SELECTION, instance);
			NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
			return -1;
		}
		cmd->result = DID_BAD_TARGET << 16;
		cmd->result = DID_BAD_TARGET << 16;
		cmd->scsi_done(cmd);
		cmd->scsi_done(cmd);
		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
		NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
		dprintk(NDEBUG_SELECTION, "scsi%d : target did not respond within 250ms\n", instance->host_no);
		dprintk(NDEBUG_SELECTION, "scsi%d : target did not respond within 250ms\n", instance->host_no);
		return 0;
		return 0;
	}
	}
	hostdata->targets_present |= (1 << scmd_id(cmd));


	/*
	/*
	 * Since we followed the SCSI spec, and raised ATN while SEL 
	 * Since we followed the SCSI spec, and raised ATN while SEL 
@@ -2382,7 +2370,6 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
	 */
	 */


	NCR5380_write(MODE_REG, MR_BASE);
	NCR5380_write(MODE_REG, MR_BASE);
	hostdata->restart_select = 1;


	target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask);
	target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask);
	dprintk(NDEBUG_SELECTION, "scsi%d : reselect\n", instance->host_no);
	dprintk(NDEBUG_SELECTION, "scsi%d : reselect\n", instance->host_no);
+0 −6
Original line number Original line Diff line number Diff line
@@ -257,9 +257,6 @@ struct NCR5380_hostdata {
	NCR5380_implementation_fields;		/* implementation specific */
	NCR5380_implementation_fields;		/* implementation specific */
	struct Scsi_Host *host;			/* Host backpointer */
	struct Scsi_Host *host;			/* Host backpointer */
	unsigned char id_mask, id_higher_mask;	/* 1 << id, all bits greater */
	unsigned char id_mask, id_higher_mask;	/* 1 << id, all bits greater */
	unsigned char targets_present;		/* targets we have connected
						   to, so we can call a select
						   failure a retryable condition */
	volatile unsigned char busy[8];		/* index = target, bit = lun */
	volatile unsigned char busy[8];		/* index = target, bit = lun */
#if defined(REAL_DMA) || defined(REAL_DMA_POLL)
#if defined(REAL_DMA) || defined(REAL_DMA_POLL)
	volatile int dma_len;			/* requested length of DMA */
	volatile int dma_len;			/* requested length of DMA */
@@ -268,9 +265,6 @@ struct NCR5380_hostdata {
	volatile struct scsi_cmnd *connected;	/* currently connected command */
	volatile struct scsi_cmnd *connected;	/* currently connected command */
	volatile struct scsi_cmnd *issue_queue;	/* waiting to be issued */
	volatile struct scsi_cmnd *issue_queue;	/* waiting to be issued */
	volatile struct scsi_cmnd *disconnected_queue;	/* waiting for reconnect */
	volatile struct scsi_cmnd *disconnected_queue;	/* waiting for reconnect */
	volatile int restart_select;		/* we have disconnected,
						   used to restart 
						   NCR5380_select() */
	int flags;
	int flags;
	unsigned long time_expires;		/* in jiffies, set prior to sleeping */
	unsigned long time_expires;		/* in jiffies, set prior to sleeping */
	int select_time;			/* timer in select for target response */
	int select_time;			/* timer in select for target response */
+0 −13
Original line number Original line Diff line number Diff line
@@ -826,7 +826,6 @@ static int __init NCR5380_init(struct Scsi_Host *instance, int flags)
#if defined (REAL_DMA)
#if defined (REAL_DMA)
	hostdata->dma_len = 0;
	hostdata->dma_len = 0;
#endif
#endif
	hostdata->targets_present = 0;
	hostdata->connected = NULL;
	hostdata->connected = NULL;
	hostdata->issue_queue = NULL;
	hostdata->issue_queue = NULL;
	hostdata->disconnected_queue = NULL;
	hostdata->disconnected_queue = NULL;
@@ -1409,7 +1408,6 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
	unsigned long timeout;
	unsigned long timeout;
	unsigned long flags;
	unsigned long flags;


	hostdata->restart_select = 0;
	NCR5380_dprint(NDEBUG_ARBITRATION, instance);
	NCR5380_dprint(NDEBUG_ARBITRATION, instance);
	dprintk(NDEBUG_ARBITRATION, "scsi%d: starting arbitration, id = %d\n", HOSTNO,
	dprintk(NDEBUG_ARBITRATION, "scsi%d: starting arbitration, id = %d\n", HOSTNO,
		   instance->this_id);
		   instance->this_id);
@@ -1625,14 +1623,6 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)


	if (!(NCR5380_read(STATUS_REG) & SR_BSY)) {
	if (!(NCR5380_read(STATUS_REG) & SR_BSY)) {
		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
		if (hostdata->targets_present & (1 << cmd->device->id)) {
			printk(KERN_ERR "scsi%d: weirdness\n", HOSTNO);
			if (hostdata->restart_select)
				printk(KERN_NOTICE "\trestart select\n");
			NCR5380_dprint(NDEBUG_ANY, instance);
			NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
			return -1;
		}
		cmd->result = DID_BAD_TARGET << 16;
		cmd->result = DID_BAD_TARGET << 16;
#ifdef SUPPORT_TAGS
#ifdef SUPPORT_TAGS
		cmd_free_tag(cmd);
		cmd_free_tag(cmd);
@@ -1643,8 +1633,6 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
		return 0;
		return 0;
	}
	}


	hostdata->targets_present |= (1 << cmd->device->id);

	/*
	/*
	 * Since we followed the SCSI spec, and raised ATN while SEL
	 * Since we followed the SCSI spec, and raised ATN while SEL
	 * was true but before BSY was false during selection, the information
	 * was true but before BSY was false during selection, the information
@@ -2605,7 +2593,6 @@ static void NCR5380_reselect(struct Scsi_Host *instance)
	 */
	 */


	NCR5380_write(MODE_REG, MR_BASE);
	NCR5380_write(MODE_REG, MR_BASE);
	hostdata->restart_select = 1;


	target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask);
	target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask);