|
@@ -271,6 +271,73 @@ DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR,
|
|
|
ata_scsi_park_show, ata_scsi_park_store);
|
|
|
EXPORT_SYMBOL_GPL(dev_attr_unload_heads);
|
|
|
|
|
|
+static ssize_t ata_ncq_prio_enable_show(struct device *device,
|
|
|
+ struct device_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct scsi_device *sdev = to_scsi_device(device);
|
|
|
+ struct ata_port *ap;
|
|
|
+ struct ata_device *dev;
|
|
|
+ bool ncq_prio_enable;
|
|
|
+ int rc = 0;
|
|
|
+
|
|
|
+ ap = ata_shost_to_port(sdev->host);
|
|
|
+
|
|
|
+ spin_lock_irq(ap->lock);
|
|
|
+ dev = ata_scsi_find_dev(ap, sdev);
|
|
|
+ if (!dev) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto unlock;
|
|
|
+ }
|
|
|
+
|
|
|
+ ncq_prio_enable = dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLE;
|
|
|
+
|
|
|
+unlock:
|
|
|
+ spin_unlock_irq(ap->lock);
|
|
|
+
|
|
|
+ return rc ? rc : snprintf(buf, 20, "%u\n", ncq_prio_enable);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t ata_ncq_prio_enable_store(struct device *device,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ const char *buf, size_t len)
|
|
|
+{
|
|
|
+ struct scsi_device *sdev = to_scsi_device(device);
|
|
|
+ struct ata_port *ap;
|
|
|
+ struct ata_device *dev;
|
|
|
+ long int input;
|
|
|
+ unsigned long flags;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = kstrtol(buf, 10, &input);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+ if ((input < 0) || (input > 1))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ ap = ata_shost_to_port(sdev->host);
|
|
|
+
|
|
|
+ spin_lock_irqsave(ap->lock, flags);
|
|
|
+ dev = ata_scsi_find_dev(ap, sdev);
|
|
|
+ if (unlikely(!dev)) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto unlock;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (input)
|
|
|
+ dev->flags |= ATA_DFLAG_NCQ_PRIO_ENABLE;
|
|
|
+ else
|
|
|
+ dev->flags &= ~ATA_DFLAG_NCQ_PRIO_ENABLE;
|
|
|
+
|
|
|
+unlock:
|
|
|
+ spin_unlock_irqrestore(ap->lock, flags);
|
|
|
+
|
|
|
+ return rc ? rc : len;
|
|
|
+}
|
|
|
+
|
|
|
+DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR,
|
|
|
+ ata_ncq_prio_enable_show, ata_ncq_prio_enable_store);
|
|
|
+EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_enable);
|
|
|
+
|
|
|
void ata_scsi_set_sense(struct ata_device *dev, struct scsi_cmnd *cmd,
|
|
|
u8 sk, u8 asc, u8 ascq)
|
|
|
{
|
|
@@ -402,6 +469,7 @@ EXPORT_SYMBOL_GPL(dev_attr_sw_activity);
|
|
|
|
|
|
struct device_attribute *ata_common_sdev_attrs[] = {
|
|
|
&dev_attr_unload_heads,
|
|
|
+ &dev_attr_ncq_prio_enable,
|
|
|
NULL
|
|
|
};
|
|
|
EXPORT_SYMBOL_GPL(ata_common_sdev_attrs);
|