Commit e42d0151 authored by Finn Thain's avatar Finn Thain Committed by Martin K. Petersen

atari_NCR5380: Fix queue_size limit

When a target reports a QUEUE_FULL condition it causes the driver to
update the 'queue_size' limit with the number of currently allocated tags.
At least, that's what's supposed to happen, according to the comments.
Unfortunately the terms in the assignment are swapped. Fix this and
cleanup some obsolete comments.
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent aa2e2cb1
...@@ -229,9 +229,7 @@ static void do_reset(struct Scsi_Host *); ...@@ -229,9 +229,7 @@ static void do_reset(struct Scsi_Host *);
* cannot know it in advance :-( We just see a QUEUE_FULL status being * cannot know it in advance :-( We just see a QUEUE_FULL status being
* returned. So, in this case, the driver internal queue size assumption is * returned. So, in this case, the driver internal queue size assumption is
* reduced to the number of active tags if QUEUE_FULL is returned by the * reduced to the number of active tags if QUEUE_FULL is returned by the
* target. The command is returned to the mid-level, but with status changed * target.
* to BUSY, since --as I've seen-- the mid-level can't handle QUEUE_FULL
* correctly.
* *
* We're also not allowed running tagged commands as long as an untagged * We're also not allowed running tagged commands as long as an untagged
* command is active. And REQUEST SENSE commands after a contingent allegiance * command is active. And REQUEST SENSE commands after a contingent allegiance
...@@ -2152,21 +2150,13 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) ...@@ -2152,21 +2150,13 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
#ifdef SUPPORT_TAGS #ifdef SUPPORT_TAGS
cmd_free_tag(cmd); cmd_free_tag(cmd);
if (status_byte(cmd->SCp.Status) == QUEUE_FULL) { if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
/* Turn a QUEUE FULL status into BUSY, I think the
* mid level cannot handle QUEUE FULL :-( (The
* command is retried after BUSY). Also update our
* queue size to the number of currently issued
* commands now.
*/
/* ++Andreas: the mid level code knows about
QUEUE_FULL now. */
struct tag_alloc *ta = &hostdata->TagAlloc[scmd_id(cmd)][cmd->device->lun]; struct tag_alloc *ta = &hostdata->TagAlloc[scmd_id(cmd)][cmd->device->lun];
dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %llu returned " dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %llu returned "
"QUEUE_FULL after %d commands\n", "QUEUE_FULL after %d commands\n",
HOSTNO, cmd->device->id, cmd->device->lun, HOSTNO, cmd->device->id, cmd->device->lun,
ta->nr_allocated); ta->nr_allocated);
if (ta->queue_size > ta->nr_allocated) if (ta->queue_size > ta->nr_allocated)
ta->nr_allocated = ta->queue_size; ta->queue_size = ta->nr_allocated;
} }
#else #else
hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun); hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment