Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 29301
b: refs/heads/master
c: 2ab7db1
h: refs/heads/master
i:
  29299: a018ccb
v: v3
  • Loading branch information
Tejun Heo committed May 15, 2006
1 parent 41f860b commit 764c62f
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: dc2b3515868a254b3d653d77844bff93c5d4c095
refs/heads/master: 2ab7db1ff1d64a2ba389d0692d532f42a15f1f72
32 changes: 29 additions & 3 deletions trunk/drivers/scsi/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -980,15 +980,39 @@ unsigned ata_exec_internal(struct ata_device *dev,
struct ata_port *ap = dev->ap;
u8 command = tf->command;
struct ata_queued_cmd *qc;
unsigned int tag, preempted_tag;
DECLARE_COMPLETION(wait);
unsigned long flags;
unsigned int err_mask;

spin_lock_irqsave(&ap->host_set->lock, flags);

qc = ata_qc_new_init(dev);
BUG_ON(qc == NULL);
/* initialize internal qc */

/* XXX: Tag 0 is used for drivers with legacy EH as some
* drivers choke if any other tag is given. This breaks
* ata_tag_internal() test for those drivers. Don't use new
* EH stuff without converting to it.
*/
if (ap->ops->error_handler)
tag = ATA_TAG_INTERNAL;
else
tag = 0;

if (test_and_set_bit(tag, &ap->qactive))
BUG();
qc = ata_qc_from_tag(ap, tag);

qc->tag = tag;
qc->scsicmd = NULL;
qc->ap = ap;
qc->dev = dev;
ata_qc_reinit(qc);

preempted_tag = ap->active_tag;
ap->active_tag = ATA_TAG_POISON;

/* prepare & issue qc */
qc->tf = *tf;
if (cdb)
memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
Expand Down Expand Up @@ -1035,6 +1059,7 @@ unsigned ata_exec_internal(struct ata_device *dev,
err_mask = qc->err_mask;

ata_qc_free(qc);
ap->active_tag = preempted_tag;

/* XXX - Some LLDDs (sata_mv) disable port on command failure.
* Until those drivers are fixed, we detect the condition
Expand Down Expand Up @@ -4014,7 +4039,8 @@ static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
struct ata_queued_cmd *qc = NULL;
unsigned int i;

for (i = 0; i < ATA_MAX_QUEUE; i++)
/* the last tag is reserved for internal command. */
for (i = 0; i < ATA_MAX_QUEUE - 1; i++)
if (!test_and_set_bit(i, &ap->qactive)) {
qc = ata_qc_from_tag(ap, i);
break;
Expand Down
9 changes: 8 additions & 1 deletion trunk/include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,9 @@ enum {
LIBATA_MAX_PRD = ATA_MAX_PRD / 2,
ATA_MAX_PORTS = 8,
ATA_DEF_QUEUE = 1,
ATA_MAX_QUEUE = 1,
/* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */
ATA_MAX_QUEUE = 2,
ATA_TAG_INTERNAL = ATA_MAX_QUEUE - 1,
ATA_MAX_SECTORS = 200, /* FIXME */
ATA_MAX_BUS = 2,
ATA_DEF_BUSY_WAIT = 10000,
Expand Down Expand Up @@ -717,6 +719,11 @@ static inline unsigned int ata_tag_valid(unsigned int tag)
return (tag < ATA_MAX_QUEUE) ? 1 : 0;
}

static inline unsigned int ata_tag_internal(unsigned int tag)
{
return tag == ATA_MAX_QUEUE - 1;
}

static inline unsigned int ata_class_enabled(unsigned int class)
{
return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI;
Expand Down

0 comments on commit 764c62f

Please sign in to comment.