Commit 7b882cb8 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata

Pull another libata patch from Tejun Heo:
 "One more patch from Adam added.

  It makes libata skip probing for NCQ prio unless the feature is
  explicitly requested by the user. This is necessary because some
  controllers lock up after the optional feature is probed"

* 'for-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata:
  ata: avoid probing NCQ Prio Support if not explicitly requested
parents b92e09bb 9f56eca3
...@@ -787,7 +787,7 @@ int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, ...@@ -787,7 +787,7 @@ int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
if (tf->flags & ATA_TFLAG_FUA) if (tf->flags & ATA_TFLAG_FUA)
tf->device |= 1 << 7; tf->device |= 1 << 7;
if (dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLE) { if (dev->flags & ATA_DFLAG_NCQ_PRIO) {
if (class == IOPRIO_CLASS_RT) if (class == IOPRIO_CLASS_RT)
tf->hob_nsect |= ATA_PRIO_HIGH << tf->hob_nsect |= ATA_PRIO_HIGH <<
ATA_SHIFT_PRIO; ATA_SHIFT_PRIO;
...@@ -2168,6 +2168,11 @@ static void ata_dev_config_ncq_prio(struct ata_device *dev) ...@@ -2168,6 +2168,11 @@ static void ata_dev_config_ncq_prio(struct ata_device *dev)
struct ata_port *ap = dev->link->ap; struct ata_port *ap = dev->link->ap;
unsigned int err_mask; unsigned int err_mask;
if (!(dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLE)) {
dev->flags &= ~ATA_DFLAG_NCQ_PRIO;
return;
}
err_mask = ata_read_log_page(dev, err_mask = ata_read_log_page(dev,
ATA_LOG_SATA_ID_DEV_DATA, ATA_LOG_SATA_ID_DEV_DATA,
ATA_LOG_SATA_SETTINGS, ATA_LOG_SATA_SETTINGS,
...@@ -2180,10 +2185,12 @@ static void ata_dev_config_ncq_prio(struct ata_device *dev) ...@@ -2180,10 +2185,12 @@ static void ata_dev_config_ncq_prio(struct ata_device *dev)
return; return;
} }
if (ap->sector_buf[ATA_LOG_NCQ_PRIO_OFFSET] & BIT(3)) if (ap->sector_buf[ATA_LOG_NCQ_PRIO_OFFSET] & BIT(3)) {
dev->flags |= ATA_DFLAG_NCQ_PRIO; dev->flags |= ATA_DFLAG_NCQ_PRIO;
else } else {
dev->flags &= ~ATA_DFLAG_NCQ_PRIO;
ata_dev_dbg(dev, "SATA page does not support priority\n"); ata_dev_dbg(dev, "SATA page does not support priority\n");
}
} }
......
...@@ -272,7 +272,8 @@ DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR, ...@@ -272,7 +272,8 @@ DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR,
EXPORT_SYMBOL_GPL(dev_attr_unload_heads); EXPORT_SYMBOL_GPL(dev_attr_unload_heads);
static ssize_t ata_ncq_prio_enable_show(struct device *device, static ssize_t ata_ncq_prio_enable_show(struct device *device,
struct device_attribute *attr, char *buf) struct device_attribute *attr,
char *buf)
{ {
struct scsi_device *sdev = to_scsi_device(device); struct scsi_device *sdev = to_scsi_device(device);
struct ata_port *ap; struct ata_port *ap;
...@@ -305,7 +306,6 @@ static ssize_t ata_ncq_prio_enable_store(struct device *device, ...@@ -305,7 +306,6 @@ static ssize_t ata_ncq_prio_enable_store(struct device *device,
struct ata_port *ap; struct ata_port *ap;
struct ata_device *dev; struct ata_device *dev;
long int input; long int input;
unsigned long flags;
int rc; int rc;
rc = kstrtol(buf, 10, &input); rc = kstrtol(buf, 10, &input);
...@@ -315,28 +315,32 @@ static ssize_t ata_ncq_prio_enable_store(struct device *device, ...@@ -315,28 +315,32 @@ static ssize_t ata_ncq_prio_enable_store(struct device *device,
return -EINVAL; return -EINVAL;
ap = ata_shost_to_port(sdev->host); ap = ata_shost_to_port(sdev->host);
spin_lock_irqsave(ap->lock, flags);
dev = ata_scsi_find_dev(ap, sdev); dev = ata_scsi_find_dev(ap, sdev);
if (unlikely(!dev)) { if (unlikely(!dev))
rc = -ENODEV; return -ENODEV;
goto unlock;
} spin_lock_irq(ap->lock);
if (input)
dev->flags |= ATA_DFLAG_NCQ_PRIO_ENABLE;
else
dev->flags &= ~ATA_DFLAG_NCQ_PRIO_ENABLE;
dev->link->eh_info.action |= ATA_EH_REVALIDATE;
dev->link->eh_info.flags |= ATA_EHI_QUIET;
ata_port_schedule_eh(ap);
spin_unlock_irq(ap->lock);
ata_port_wait_eh(ap);
if (input) { if (input) {
spin_lock_irq(ap->lock);
if (!(dev->flags & ATA_DFLAG_NCQ_PRIO)) { if (!(dev->flags & ATA_DFLAG_NCQ_PRIO)) {
rc = -EOPNOTSUPP; dev->flags &= ~ATA_DFLAG_NCQ_PRIO_ENABLE;
goto unlock; rc = -EIO;
} }
spin_unlock_irq(ap->lock);
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; return rc ? rc : len;
} }
......
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