On 2021/08/12 4:07, Niklas Cassel wrote: > On Tue, Aug 10, 2021 at 02:49:39PM +0900, Damien Le Moal wrote: >> Currently, the only way a user can determine if a SATA device supports >> NCQ priority is to try to enable the use of this feature using the >> ncq_prio_enable sysfs device attribute. If enabling the feature fails, >> it is because the device does not support NCQ priority. Otherwise, the >> feature is enabled and indicates that the device supports NCQ priority. >> >> Improve this odd interface by introducing the read-only >> ncq_prio_supported sysfs device attribute to indicate if a SATA device >> supports NCQ priority. The value of this attribute reflects if the >> device flag ATA_DFLAG_NCQ_PRIO is set or cleared. >> >> Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxx> >> Reviewed-by: Hannes Reinecke <hare@xxxxxxx> >> --- >> drivers/ata/libahci.c | 1 + >> drivers/ata/libata-sata.c | 24 ++++++++++++++++++++++++ >> include/linux/libata.h | 1 + >> 3 files changed, 26 insertions(+) >> >> diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c >> index fec2e9754aed..5b3fa2cbe722 100644 >> --- a/drivers/ata/libahci.c >> +++ b/drivers/ata/libahci.c >> @@ -125,6 +125,7 @@ EXPORT_SYMBOL_GPL(ahci_shost_attrs); >> struct device_attribute *ahci_sdev_attrs[] = { >> &dev_attr_sw_activity, >> &dev_attr_unload_heads, >> + &dev_attr_ncq_prio_supported, > > Hello Damien, > > I do not fully understand if NCQ is only supported for AHCI controllers, > or if vanilla SATA controllers (without AHCI) can support it as well > (since NCQ is part of the ATA Command Set - 5). > > However, I do think that you might have missed adding the > dev_attr_ncq_prio_supported > attribute for the ata_ncq_sdev_attrs struct in libata-sata.c > > (The ata_ncq_sdev_attrs struct already has the dev_attr_ncq_prio_enable > attribute, so it makes sense that it should have the new supported > attribute as well.) Good catch. I indeed forgot that one. Will add it. > > > Kind regards, > Niklas > >> &dev_attr_ncq_prio_enable, >> NULL >> }; >> diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c >> index dc397ebda089..5566fd4bb38f 100644 >> --- a/drivers/ata/libata-sata.c >> +++ b/drivers/ata/libata-sata.c >> @@ -834,6 +834,30 @@ DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR, >> ata_scsi_lpm_show, ata_scsi_lpm_store); >> EXPORT_SYMBOL_GPL(dev_attr_link_power_management_policy); >> >> +static ssize_t ata_ncq_prio_supported_show(struct device *device, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct scsi_device *sdev = to_scsi_device(device); >> + struct ata_port *ap = ata_shost_to_port(sdev->host); >> + struct ata_device *dev; >> + bool ncq_prio_supported; >> + int rc = 0; >> + >> + spin_lock_irq(ap->lock); >> + dev = ata_scsi_find_dev(ap, sdev); >> + if (!dev) >> + rc = -ENODEV; >> + else >> + ncq_prio_supported = dev->flags & ATA_DFLAG_NCQ_PRIO; >> + spin_unlock_irq(ap->lock); >> + >> + return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_supported); >> +} >> + >> +DEVICE_ATTR(ncq_prio_supported, S_IRUGO, ata_ncq_prio_supported_show, NULL); >> +EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_supported); >> + >> static ssize_t ata_ncq_prio_enable_show(struct device *device, >> struct device_attribute *attr, >> char *buf) >> diff --git a/include/linux/libata.h b/include/linux/libata.h >> index b23f28cfc8e0..a2d1bae7900b 100644 >> --- a/include/linux/libata.h >> +++ b/include/linux/libata.h >> @@ -539,6 +539,7 @@ typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes) >> extern struct device_attribute dev_attr_unload_heads; >> #ifdef CONFIG_SATA_HOST >> extern struct device_attribute dev_attr_link_power_management_policy; >> +extern struct device_attribute dev_attr_ncq_prio_supported; >> extern struct device_attribute dev_attr_ncq_prio_enable; >> extern struct device_attribute dev_attr_em_message_type; >> extern struct device_attribute dev_attr_em_message; -- Damien Le Moal Western Digital Research