libata: clean up horkage handling
Horkage handling had the following problems. * dev->horkage was positioned after ATA_DEVICE_CLEAR_OFFSET, so it was cleared before the device is configured. This broke HORKAGE_DIAGNOSTIC. * Some used dev->horkage while others called ata_device_blacklisted() directly. This was at best confusing. This patch moves dev->horkage right after dev->flags and set the field according to the blacklist during device configuration. All users test against dev->horkage. ata_device_blacklisted() now has only one user, make it static. While at it, rename it to ata_dev_blacklisted() for consistency. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
39ce712806
commit
75683fe715
|
@ -71,6 +71,7 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
|
||||||
u16 heads, u16 sectors);
|
u16 heads, u16 sectors);
|
||||||
static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
|
static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
|
||||||
static void ata_dev_xfermask(struct ata_device *dev);
|
static void ata_dev_xfermask(struct ata_device *dev);
|
||||||
|
static unsigned long ata_dev_blacklisted(const struct ata_device *dev);
|
||||||
|
|
||||||
unsigned int ata_print_id = 1;
|
unsigned int ata_print_id = 1;
|
||||||
static struct workqueue_struct *ata_wq;
|
static struct workqueue_struct *ata_wq;
|
||||||
|
@ -1784,7 +1785,7 @@ static void ata_dev_config_ncq(struct ata_device *dev,
|
||||||
desc[0] = '\0';
|
desc[0] = '\0';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ata_device_blacklisted(dev) & ATA_HORKAGE_NONCQ) {
|
if (dev->horkage & ATA_HORKAGE_NONCQ) {
|
||||||
snprintf(desc, desc_sz, "NCQ (not used)");
|
snprintf(desc, desc_sz, "NCQ (not used)");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1833,6 +1834,9 @@ int ata_dev_configure(struct ata_device *dev)
|
||||||
if (ata_msg_probe(ap))
|
if (ata_msg_probe(ap))
|
||||||
ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __FUNCTION__);
|
ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __FUNCTION__);
|
||||||
|
|
||||||
|
/* set horkage */
|
||||||
|
dev->horkage |= ata_dev_blacklisted(dev);
|
||||||
|
|
||||||
/* let ACPI work its magic */
|
/* let ACPI work its magic */
|
||||||
rc = ata_acpi_on_devcfg(dev);
|
rc = ata_acpi_on_devcfg(dev);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -2008,7 +2012,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||||
dev->max_sectors = ATA_MAX_SECTORS;
|
dev->max_sectors = ATA_MAX_SECTORS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ata_device_blacklisted(dev) & ATA_HORKAGE_MAX_SEC_128)
|
if (dev->horkage & ATA_HORKAGE_MAX_SEC_128)
|
||||||
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128,
|
dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128,
|
||||||
dev->max_sectors);
|
dev->max_sectors);
|
||||||
|
|
||||||
|
@ -3775,7 +3779,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned long ata_device_blacklisted(const struct ata_device *dev)
|
static unsigned long ata_dev_blacklisted(const struct ata_device *dev)
|
||||||
{
|
{
|
||||||
unsigned char model_num[ATA_ID_PROD_LEN + 1];
|
unsigned char model_num[ATA_ID_PROD_LEN + 1];
|
||||||
unsigned char model_rev[ATA_ID_FW_REV_LEN + 1];
|
unsigned char model_rev[ATA_ID_FW_REV_LEN + 1];
|
||||||
|
@ -3805,7 +3809,7 @@ static int ata_dma_blacklisted(const struct ata_device *dev)
|
||||||
if ((dev->ap->flags & ATA_FLAG_PIO_POLLING) &&
|
if ((dev->ap->flags & ATA_FLAG_PIO_POLLING) &&
|
||||||
(dev->flags & ATA_DFLAG_CDB_INTR))
|
(dev->flags & ATA_DFLAG_CDB_INTR))
|
||||||
return 1;
|
return 1;
|
||||||
return (ata_device_blacklisted(dev) & ATA_HORKAGE_NODMA) ? 1 : 0;
|
return (dev->horkage & ATA_HORKAGE_NODMA) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -6918,7 +6922,6 @@ EXPORT_SYMBOL_GPL(ata_host_resume);
|
||||||
EXPORT_SYMBOL_GPL(ata_id_string);
|
EXPORT_SYMBOL_GPL(ata_id_string);
|
||||||
EXPORT_SYMBOL_GPL(ata_id_c_string);
|
EXPORT_SYMBOL_GPL(ata_id_c_string);
|
||||||
EXPORT_SYMBOL_GPL(ata_id_to_dma_mode);
|
EXPORT_SYMBOL_GPL(ata_id_to_dma_mode);
|
||||||
EXPORT_SYMBOL_GPL(ata_device_blacklisted);
|
|
||||||
EXPORT_SYMBOL_GPL(ata_scsi_simulate);
|
EXPORT_SYMBOL_GPL(ata_scsi_simulate);
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(ata_pio_need_iordy);
|
EXPORT_SYMBOL_GPL(ata_pio_need_iordy);
|
||||||
|
|
|
@ -434,6 +434,7 @@ struct ata_device {
|
||||||
struct ata_port *ap;
|
struct ata_port *ap;
|
||||||
unsigned int devno; /* 0 or 1 */
|
unsigned int devno; /* 0 or 1 */
|
||||||
unsigned long flags; /* ATA_DFLAG_xxx */
|
unsigned long flags; /* ATA_DFLAG_xxx */
|
||||||
|
unsigned int horkage; /* List of broken features */
|
||||||
struct scsi_device *sdev; /* attached SCSI device */
|
struct scsi_device *sdev; /* attached SCSI device */
|
||||||
#ifdef CONFIG_ATA_ACPI
|
#ifdef CONFIG_ATA_ACPI
|
||||||
acpi_handle acpi_handle;
|
acpi_handle acpi_handle;
|
||||||
|
@ -465,7 +466,6 @@ struct ata_device {
|
||||||
/* error history */
|
/* error history */
|
||||||
struct ata_ering ering;
|
struct ata_ering ering;
|
||||||
int spdn_cnt;
|
int spdn_cnt;
|
||||||
unsigned int horkage; /* List of broken features */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Offset into struct ata_device. Fields above it are maintained
|
/* Offset into struct ata_device. Fields above it are maintained
|
||||||
|
@ -793,7 +793,6 @@ extern void ata_id_string(const u16 *id, unsigned char *s,
|
||||||
extern void ata_id_c_string(const u16 *id, unsigned char *s,
|
extern void ata_id_c_string(const u16 *id, unsigned char *s,
|
||||||
unsigned int ofs, unsigned int len);
|
unsigned int ofs, unsigned int len);
|
||||||
extern void ata_id_to_dma_mode(struct ata_device *dev, u8 unknown);
|
extern void ata_id_to_dma_mode(struct ata_device *dev, u8 unknown);
|
||||||
extern unsigned long ata_device_blacklisted(const struct ata_device *dev);
|
|
||||||
extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
|
extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
|
||||||
extern void ata_bmdma_start (struct ata_queued_cmd *qc);
|
extern void ata_bmdma_start (struct ata_queued_cmd *qc);
|
||||||
extern void ata_bmdma_stop(struct ata_queued_cmd *qc);
|
extern void ata_bmdma_stop(struct ata_queued_cmd *qc);
|
||||||
|
|
Loading…
Reference in New Issue