Эх сурвалжийг харах

libata: set queue SSD flag for SSD devices

SSD devices should give an RPM setting of 1 in word 217 of the ID
page. If we see such a device, tell the block layer about it.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Jens Axboe 16 жил өмнө
parent
commit
8bff7c6b0f

+ 4 - 0
drivers/ata/libata-scsi.c

@@ -977,6 +977,10 @@ static int ata_scsi_dev_config(struct scsi_device *sdev,
 
 
 		blk_queue_dma_drain(q, atapi_drain_needed, buf, ATAPI_MAX_DRAIN);
 		blk_queue_dma_drain(q, atapi_drain_needed, buf, ATAPI_MAX_DRAIN);
 	} else {
 	} else {
+		if (ata_id_is_ssd(dev->id))
+			queue_flag_set_unlocked(QUEUE_FLAG_NONROT,
+						sdev->request_queue);
+
 		/* ATA devices must be sector aligned */
 		/* ATA devices must be sector aligned */
 		blk_queue_update_dma_alignment(sdev->request_queue,
 		blk_queue_update_dma_alignment(sdev->request_queue,
 					       ATA_SECT_SIZE - 1);
 					       ATA_SECT_SIZE - 1);

+ 6 - 0
include/linux/ata.h

@@ -88,6 +88,7 @@ enum {
 	ATA_ID_DLF		= 128,
 	ATA_ID_DLF		= 128,
 	ATA_ID_CSFO		= 129,
 	ATA_ID_CSFO		= 129,
 	ATA_ID_CFA_POWER	= 160,
 	ATA_ID_CFA_POWER	= 160,
+	ATA_ID_ROT_SPEED	= 217,
 	ATA_ID_PIO4		= (1 << 1),
 	ATA_ID_PIO4		= (1 << 1),
 
 
 	ATA_ID_SERNO_LEN	= 20,
 	ATA_ID_SERNO_LEN	= 20,
@@ -691,6 +692,11 @@ static inline int ata_id_is_cfa(const u16 *id)
 	return 0;
 	return 0;
 }
 }
 
 
+static inline int ata_id_is_ssd(const u16 *id)
+{
+	return id[ATA_ID_ROT_SPEED] == 0x01;
+}
+
 static inline int ata_drive_40wire(const u16 *dev_id)
 static inline int ata_drive_40wire(const u16 *dev_id)
 {
 {
 	if (ata_id_is_sata(dev_id))
 	if (ata_id_is_sata(dev_id))