|
@@ -560,6 +560,27 @@ show_ata_dev_gscr(struct device *dev,
|
|
|
|
|
|
static DEVICE_ATTR(gscr, S_IRUGO, show_ata_dev_gscr, NULL);
|
|
|
|
|
|
+static ssize_t
|
|
|
+show_ata_dev_trim(struct device *dev,
|
|
|
+ struct device_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct ata_device *ata_dev = transport_class_to_dev(dev);
|
|
|
+ unsigned char *mode;
|
|
|
+
|
|
|
+ if (!ata_id_has_trim(ata_dev->id))
|
|
|
+ mode = "unsupported";
|
|
|
+ else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM)
|
|
|
+ mode = "forced_unqueued";
|
|
|
+ else if (ata_fpdma_dsm_supported(ata_dev))
|
|
|
+ mode = "queued";
|
|
|
+ else
|
|
|
+ mode = "unqueued";
|
|
|
+
|
|
|
+ return snprintf(buf, 20, "%s\n", mode);
|
|
|
+}
|
|
|
+
|
|
|
+static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL);
|
|
|
+
|
|
|
static DECLARE_TRANSPORT_CLASS(ata_dev_class,
|
|
|
"ata_device", NULL, NULL, NULL);
|
|
|
|
|
@@ -733,6 +754,7 @@ struct scsi_transport_template *ata_attach_transport(void)
|
|
|
SETUP_DEV_ATTRIBUTE(ering);
|
|
|
SETUP_DEV_ATTRIBUTE(id);
|
|
|
SETUP_DEV_ATTRIBUTE(gscr);
|
|
|
+ SETUP_DEV_ATTRIBUTE(trim);
|
|
|
BUG_ON(count > ATA_DEV_ATTRS);
|
|
|
i->dev_attrs[count] = NULL;
|
|
|
|