diff options
Diffstat (limited to 'drivers/scsi/esp_scsi.c')
| -rw-r--r-- | drivers/scsi/esp_scsi.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index e2bc779f86c..55548dc5cec 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c @@ -530,7 +530,7 @@ static int esp_need_to_nego_sync(struct esp_target_data *tp)  static int esp_alloc_lun_tag(struct esp_cmd_entry *ent,  			     struct esp_lun_data *lp)  { -	if (!ent->tag[0]) { +	if (!ent->orig_tag[0]) {  		/* Non-tagged, slot already taken?  */  		if (lp->non_tagged_cmd)  			return -EBUSY; @@ -564,9 +564,9 @@ static int esp_alloc_lun_tag(struct esp_cmd_entry *ent,  			return -EBUSY;  	} -	BUG_ON(lp->tagged_cmds[ent->tag[1]]); +	BUG_ON(lp->tagged_cmds[ent->orig_tag[1]]); -	lp->tagged_cmds[ent->tag[1]] = ent; +	lp->tagged_cmds[ent->orig_tag[1]] = ent;  	lp->num_tagged++;  	return 0; @@ -575,9 +575,9 @@ static int esp_alloc_lun_tag(struct esp_cmd_entry *ent,  static void esp_free_lun_tag(struct esp_cmd_entry *ent,  			     struct esp_lun_data *lp)  { -	if (ent->tag[0]) { -		BUG_ON(lp->tagged_cmds[ent->tag[1]] != ent); -		lp->tagged_cmds[ent->tag[1]] = NULL; +	if (ent->orig_tag[0]) { +		BUG_ON(lp->tagged_cmds[ent->orig_tag[1]] != ent); +		lp->tagged_cmds[ent->orig_tag[1]] = NULL;  		lp->num_tagged--;  	} else {  		BUG_ON(lp->non_tagged_cmd != ent); @@ -667,6 +667,8 @@ static struct esp_cmd_entry *find_and_prep_issuable_command(struct esp *esp)  			ent->tag[0] = 0;  			ent->tag[1] = 0;  		} +		ent->orig_tag[0] = ent->tag[0]; +		ent->orig_tag[1] = ent->tag[1];  		if (esp_alloc_lun_tag(ent, lp) < 0)  			continue; @@ -708,8 +710,7 @@ static void esp_maybe_execute_command(struct esp *esp)  	tp = &esp->target[tgt];  	lp = dev->hostdata; -	list_del(&ent->list); -	list_add(&ent->list, &esp->active_cmds); +	list_move(&ent->list, &esp->active_cmds);  	esp->active_cmd = ent; @@ -916,7 +917,7 @@ static void esp_event_queue_full(struct esp *esp, struct esp_cmd_entry *ent)  	scsi_track_queue_full(dev, lp->num_tagged - 1);  } -static int esp_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) +static int esp_queuecommand_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))  {  	struct scsi_device *dev = cmd->device;  	struct esp *esp = shost_priv(dev->host); @@ -941,6 +942,8 @@ static int esp_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd  	return 0;  } +static DEF_SCSI_QCMD(esp_queuecommand) +  static int esp_check_gross_error(struct esp *esp)  {  	if (esp->sreg & ESP_STAT_SPAM) { @@ -999,7 +1002,7 @@ static int esp_check_spur_intr(struct esp *esp)  static void esp_schedule_reset(struct esp *esp)  { -	esp_log_reset("ESP: esp_schedule_reset() from %p\n", +	esp_log_reset("ESP: esp_schedule_reset() from %pf\n",  		      __builtin_return_address(0));  	esp->flags |= ESP_FLAG_RESETTING;  	esp_event(esp, ESP_EVENT_RESET); @@ -1057,7 +1060,7 @@ static struct esp_cmd_entry *esp_reconnect_with_tag(struct esp *esp,  	esp->ops->send_dma_cmd(esp, esp->command_block_dma,  			       2, 2, 1, ESP_CMD_DMA | ESP_CMD_TI); -	/* ACK the msssage.  */ +	/* ACK the message.  */  	scsi_esp_cmd(esp, ESP_CMD_MOK);  	for (i = 0; i < ESP_RESELECT_TAG_LIMIT; i++) { @@ -1242,8 +1245,7 @@ static int esp_finish_select(struct esp *esp)  		/* Now that the state is unwound properly, put back onto  		 * the issue queue.  This command is no longer active.  		 */ -		list_del(&ent->list); -		list_add(&ent->list, &esp->queued_cmds); +		list_move(&ent->list, &esp->queued_cmds);  		esp->active_cmd = NULL;  		/* Return value ignored by caller, it directly invokes  | 
