aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-core.c66
-rw-r--r--drivers/ata/libata-scsi.c23
-rw-r--r--drivers/ata/libata.h19
-rw-r--r--include/linux/libata.h1
4 files changed, 65 insertions, 44 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 622350d9b2e3..0cd3ad497136 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -1712,6 +1712,8 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
1712 else 1712 else
1713 tag = 0; 1713 tag = 0;
1714 1714
1715 if (test_and_set_bit(tag, &ap->qc_allocated))
1716 BUG();
1715 qc = __ata_qc_from_tag(ap, tag); 1717 qc = __ata_qc_from_tag(ap, tag);
1716 1718
1717 qc->tag = tag; 1719 qc->tag = tag;
@@ -4563,6 +4565,37 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
4563} 4565}
4564 4566
4565/** 4567/**
4568 * ata_qc_new - Request an available ATA command, for queueing
4569 * @ap: Port associated with device @dev
4570 * @dev: Device from whom we request an available command structure
4571 *
4572 * LOCKING:
4573 * None.
4574 */
4575
4576static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
4577{
4578 struct ata_queued_cmd *qc = NULL;
4579 unsigned int i;
4580
4581 /* no command while frozen */
4582 if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
4583 return NULL;
4584
4585 /* the last tag is reserved for internal command. */
4586 for (i = 0; i < ATA_MAX_QUEUE - 1; i++)
4587 if (!test_and_set_bit(i, &ap->qc_allocated)) {
4588 qc = __ata_qc_from_tag(ap, i);
4589 break;
4590 }
4591
4592 if (qc)
4593 qc->tag = i;
4594
4595 return qc;
4596}
4597
4598/**
4566 * ata_qc_new_init - Request an available ATA command, and initialize it 4599 * ata_qc_new_init - Request an available ATA command, and initialize it
4567 * @dev: Device from whom we request an available command structure 4600 * @dev: Device from whom we request an available command structure
4568 * @tag: command tag 4601 * @tag: command tag
@@ -4571,20 +4604,16 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
4571 * None. 4604 * None.
4572 */ 4605 */
4573 4606
4574struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag) 4607struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev)
4575{ 4608{
4576 struct ata_port *ap = dev->link->ap; 4609 struct ata_port *ap = dev->link->ap;
4577 struct ata_queued_cmd *qc; 4610 struct ata_queued_cmd *qc;
4578 4611
4579 if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) 4612 qc = ata_qc_new(ap);
4580 return NULL;
4581
4582 qc = __ata_qc_from_tag(ap, tag);
4583 if (qc) { 4613 if (qc) {
4584 qc->scsicmd = NULL; 4614 qc->scsicmd = NULL;
4585 qc->ap = ap; 4615 qc->ap = ap;
4586 qc->dev = dev; 4616 qc->dev = dev;
4587 qc->tag = tag;
4588 4617
4589 ata_qc_reinit(qc); 4618 ata_qc_reinit(qc);
4590 } 4619 }
@@ -4592,6 +4621,31 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag)
4592 return qc; 4621 return qc;
4593} 4622}
4594 4623
4624/**
4625 * ata_qc_free - free unused ata_queued_cmd
4626 * @qc: Command to complete
4627 *
4628 * Designed to free unused ata_queued_cmd object
4629 * in case something prevents using it.
4630 *
4631 * LOCKING:
4632 * spin_lock_irqsave(host lock)
4633 */
4634void ata_qc_free(struct ata_queued_cmd *qc)
4635{
4636 struct ata_port *ap = qc->ap;
4637 unsigned int tag;
4638
4639 WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */
4640
4641 qc->flags = 0;
4642 tag = qc->tag;
4643 if (likely(ata_tag_valid(tag))) {
4644 qc->tag = ATA_TAG_POISON;
4645 clear_bit(tag, &ap->qc_allocated);
4646 }
4647}
4648
4595void __ata_qc_complete(struct ata_queued_cmd *qc) 4649void __ata_qc_complete(struct ata_queued_cmd *qc)
4596{ 4650{
4597 struct ata_port *ap = qc->ap; 4651 struct ata_port *ap = qc->ap;
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 3fa75eac135d..47c7afcb36f2 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -709,11 +709,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
709{ 709{
710 struct ata_queued_cmd *qc; 710 struct ata_queued_cmd *qc;
711 711
712 if (cmd->request->tag != -1) 712 qc = ata_qc_new_init(dev);
713 qc = ata_qc_new_init(dev, cmd->request->tag);
714 else
715 qc = ata_qc_new_init(dev, 0);
716
717 if (qc) { 713 if (qc) {
718 qc->scsicmd = cmd; 714 qc->scsicmd = cmd;
719 qc->scsidone = done; 715 qc->scsidone = done;
@@ -1108,17 +1104,7 @@ static int ata_scsi_dev_config(struct scsi_device *sdev,
1108 1104
1109 depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); 1105 depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id));
1110 depth = min(ATA_MAX_QUEUE - 1, depth); 1106 depth = min(ATA_MAX_QUEUE - 1, depth);
1111 1107 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth);
1112 /*
1113 * If this device is behind a port multiplier, we have
1114 * to share the tag map between all devices on that PMP.
1115 * Set up the shared tag map here and we get automatic.
1116 */
1117 if (dev->link->ap->pmp_link)
1118 scsi_init_shared_tag_map(sdev->host, ATA_MAX_QUEUE - 1);
1119
1120 scsi_set_tag_type(sdev, MSG_SIMPLE_TAG);
1121 scsi_activate_tcq(sdev, depth);
1122 } 1108 }
1123 1109
1124 return 0; 1110 return 0;
@@ -1958,11 +1944,6 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
1958 hdr[1] |= (1 << 7); 1944 hdr[1] |= (1 << 7);
1959 1945
1960 memcpy(rbuf, hdr, sizeof(hdr)); 1946 memcpy(rbuf, hdr, sizeof(hdr));
1961
1962 /* if ncq, set tags supported */
1963 if (ata_id_has_ncq(args->id))
1964 rbuf[7] |= (1 << 1);
1965
1966 memcpy(&rbuf[8], "ATA ", 8); 1947 memcpy(&rbuf[8], "ATA ", 8);
1967 ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16); 1948 ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16);
1968 ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4); 1949 ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4);
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
index d3831d39bdaa..fe2839e58774 100644
--- a/drivers/ata/libata.h
+++ b/drivers/ata/libata.h
@@ -74,7 +74,7 @@ extern struct ata_link *ata_dev_phys_link(struct ata_device *dev);
74extern void ata_force_cbl(struct ata_port *ap); 74extern void ata_force_cbl(struct ata_port *ap);
75extern u64 ata_tf_to_lba(const struct ata_taskfile *tf); 75extern u64 ata_tf_to_lba(const struct ata_taskfile *tf);
76extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf); 76extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf);
77extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag); 77extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev);
78extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, 78extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
79 u64 block, u32 n_block, unsigned int tf_flags, 79 u64 block, u32 n_block, unsigned int tf_flags,
80 unsigned int tag); 80 unsigned int tag);
@@ -103,6 +103,7 @@ extern int ata_dev_configure(struct ata_device *dev);
103extern int sata_down_spd_limit(struct ata_link *link); 103extern int sata_down_spd_limit(struct ata_link *link);
104extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel); 104extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel);
105extern void ata_sg_clean(struct ata_queued_cmd *qc); 105extern void ata_sg_clean(struct ata_queued_cmd *qc);
106extern void ata_qc_free(struct ata_queued_cmd *qc);
106extern void ata_qc_issue(struct ata_queued_cmd *qc); 107extern void ata_qc_issue(struct ata_queued_cmd *qc);
107extern void __ata_qc_complete(struct ata_queued_cmd *qc); 108extern void __ata_qc_complete(struct ata_queued_cmd *qc);
108extern int atapi_check_dma(struct ata_queued_cmd *qc); 109extern int atapi_check_dma(struct ata_queued_cmd *qc);
@@ -118,22 +119,6 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host);
118extern void ata_dev_enable_pm(struct ata_device *dev, enum link_pm policy); 119extern void ata_dev_enable_pm(struct ata_device *dev, enum link_pm policy);
119extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm); 120extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm);
120 121
121/**
122 * ata_qc_free - free unused ata_queued_cmd
123 * @qc: Command to complete
124 *
125 * Designed to free unused ata_queued_cmd object
126 * in case something prevents using it.
127 *
128 * LOCKING:
129 * spin_lock_irqsave(host lock)
130 */
131static inline void ata_qc_free(struct ata_queued_cmd *qc)
132{
133 qc->flags = 0;
134 qc->tag = ATA_TAG_POISON;
135}
136
137/* libata-acpi.c */ 122/* libata-acpi.c */
138#ifdef CONFIG_ATA_ACPI 123#ifdef CONFIG_ATA_ACPI
139extern void ata_acpi_associate_sata_port(struct ata_port *ap); 124extern void ata_acpi_associate_sata_port(struct ata_port *ap);
diff --git a/include/linux/libata.h b/include/linux/libata.h
index c7665a4134c5..59b0f1c807b5 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -698,6 +698,7 @@ struct ata_port {
698 unsigned int cbl; /* cable type; ATA_CBL_xxx */ 698 unsigned int cbl; /* cable type; ATA_CBL_xxx */
699 699
700 struct ata_queued_cmd qcmd[ATA_MAX_QUEUE]; 700 struct ata_queued_cmd qcmd[ATA_MAX_QUEUE];
701 unsigned long qc_allocated;
701 unsigned int qc_active; 702 unsigned int qc_active;
702 int nr_active_links; /* #links with active qcs */ 703 int nr_active_links; /* #links with active qcs */
703 704