[libata] add DMA setup FIS auto-activate feature
Hopefully results in fewer on-the-wire FIS's and no breakage. We'll see! Signed-off-by: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
@@ -2299,29 +2299,49 @@ static inline u8 ata_dev_knobble(struct ata_device *dev)
|
||||
return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id)));
|
||||
}
|
||||
|
||||
static void ata_dev_config_ncq(struct ata_device *dev,
|
||||
static int ata_dev_config_ncq(struct ata_device *dev,
|
||||
char *desc, size_t desc_sz)
|
||||
{
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
int hdepth = 0, ddepth = ata_id_queue_depth(dev->id);
|
||||
unsigned int err_mask;
|
||||
char *aa_desc = "";
|
||||
|
||||
if (!ata_id_has_ncq(dev->id)) {
|
||||
desc[0] = '\0';
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
if (dev->horkage & ATA_HORKAGE_NONCQ) {
|
||||
snprintf(desc, desc_sz, "NCQ (not used)");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
if (ap->flags & ATA_FLAG_NCQ) {
|
||||
hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE - 1);
|
||||
dev->flags |= ATA_DFLAG_NCQ;
|
||||
}
|
||||
|
||||
if (!(dev->horkage & ATA_HORKAGE_BROKEN_FPDMA_AA) &&
|
||||
(ap->flags & ATA_FLAG_FPDMA_AA) &&
|
||||
ata_id_has_fpdma_aa(dev->id)) {
|
||||
err_mask = ata_dev_set_feature(dev, SETFEATURES_SATA_ENABLE,
|
||||
SATA_FPDMA_AA);
|
||||
if (err_mask) {
|
||||
ata_dev_printk(dev, KERN_ERR, "failed to enable AA"
|
||||
"(error_mask=0x%x)\n", err_mask);
|
||||
if (err_mask != AC_ERR_DEV) {
|
||||
dev->horkage |= ATA_HORKAGE_BROKEN_FPDMA_AA;
|
||||
return -EIO;
|
||||
}
|
||||
} else
|
||||
aa_desc = ", AA";
|
||||
}
|
||||
|
||||
if (hdepth >= ddepth)
|
||||
snprintf(desc, desc_sz, "NCQ (depth %d)", ddepth);
|
||||
snprintf(desc, desc_sz, "NCQ (depth %d)%s", ddepth, aa_desc);
|
||||
else
|
||||
snprintf(desc, desc_sz, "NCQ (depth %d/%d)", hdepth, ddepth);
|
||||
snprintf(desc, desc_sz, "NCQ (depth %d/%d)%s", hdepth,
|
||||
ddepth, aa_desc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2461,7 +2481,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
|
||||
if (ata_id_has_lba(id)) {
|
||||
const char *lba_desc;
|
||||
char ncq_desc[20];
|
||||
char ncq_desc[24];
|
||||
|
||||
lba_desc = "LBA";
|
||||
dev->flags |= ATA_DFLAG_LBA;
|
||||
@@ -2475,7 +2495,9 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
}
|
||||
|
||||
/* config NCQ */
|
||||
ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
|
||||
rc = ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* print device info to dmesg */
|
||||
if (ata_msg_drv(ap) && print_info) {
|
||||
|
Reference in New Issue
Block a user