|
@@ -4794,21 +4794,26 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
|
|
static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
|
|
static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
|
|
{
|
|
{
|
|
struct ata_queued_cmd *qc = NULL;
|
|
struct ata_queued_cmd *qc = NULL;
|
|
- unsigned int i;
|
|
|
|
|
|
+ unsigned int i, tag;
|
|
|
|
|
|
/* no command while frozen */
|
|
/* no command while frozen */
|
|
if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
|
|
if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
- /* the last tag is reserved for internal command. */
|
|
|
|
- for (i = 0; i < ATA_MAX_QUEUE - 1; i++)
|
|
|
|
- if (!test_and_set_bit(i, &ap->qc_allocated)) {
|
|
|
|
- qc = __ata_qc_from_tag(ap, i);
|
|
|
|
|
|
+ for (i = 0; i < ATA_MAX_QUEUE; i++) {
|
|
|
|
+ tag = (i + ap->last_tag + 1) % ATA_MAX_QUEUE;
|
|
|
|
+
|
|
|
|
+ /* the last tag is reserved for internal command. */
|
|
|
|
+ if (tag == ATA_TAG_INTERNAL)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (!test_and_set_bit(tag, &ap->qc_allocated)) {
|
|
|
|
+ qc = __ata_qc_from_tag(ap, tag);
|
|
|
|
+ qc->tag = tag;
|
|
|
|
+ ap->last_tag = tag;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (qc)
|
|
|
|
- qc->tag = i;
|
|
|
|
|
|
+ }
|
|
|
|
|
|
return qc;
|
|
return qc;
|
|
}
|
|
}
|