diff options
Diffstat (limited to 'drivers/ata/libata-core.c')
| -rw-r--r-- | drivers/ata/libata-core.c | 327 | 
1 files changed, 167 insertions, 160 deletions
| diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index ca64837641be..40e816419f48 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -96,7 +96,8 @@ struct ata_force_param {  	unsigned long	xfer_mask;  	unsigned int	horkage_on;  	unsigned int	horkage_off; -	u16		lflags; +	u16		lflags_on; +	u16		lflags_off;  };  struct ata_force_ent { @@ -386,11 +387,17 @@ static void ata_force_link_limits(struct ata_link *link)  		}  		/* let lflags stack */ -		if (fe->param.lflags) { -			link->flags |= fe->param.lflags; +		if (fe->param.lflags_on) { +			link->flags |= fe->param.lflags_on;  			ata_link_notice(link,  					"FORCE: link flag 0x%x forced -> 0x%x\n", -					fe->param.lflags, link->flags); +					fe->param.lflags_on, link->flags); +		} +		if (fe->param.lflags_off) { +			link->flags &= ~fe->param.lflags_off; +			ata_link_notice(link, +				"FORCE: link flag 0x%x cleared -> 0x%x\n", +				fe->param.lflags_off, link->flags);  		}  	}  } @@ -898,7 +905,7 @@ EXPORT_SYMBOL_GPL(ata_xfer_mode2mask);   *	RETURNS:   *	Matching xfer_shift, -1 if no match found.   */ -int ata_xfer_mode2shift(unsigned long xfer_mode) +int ata_xfer_mode2shift(u8 xfer_mode)  {  	const struct ata_xfer_ent *ent; @@ -1398,7 +1405,7 @@ unsigned long ata_id_xfermask(const u16 *id)  		/* But wait.. there's more. Design your standards by  		 * committee and you too can get a free iordy field to -		 * process. However its the speeds not the modes that +		 * process. However it is the speeds not the modes that  		 * are supported... Note drivers using the timing API  		 * will get this right anyway  		 */ @@ -3898,7 +3905,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {  	/* Devices where NCQ should be avoided */  	/* NCQ is slow */  	{ "WDC WD740ADFD-00",	NULL,		ATA_HORKAGE_NONCQ }, -	{ "WDC WD740ADFD-00NLR1", NULL,		ATA_HORKAGE_NONCQ, }, +	{ "WDC WD740ADFD-00NLR1", NULL,		ATA_HORKAGE_NONCQ },  	/* http://thread.gmane.org/gmane.linux.ide/14907 */  	{ "FUJITSU MHT2060BH",	NULL,		ATA_HORKAGE_NONCQ },  	/* NCQ is broken */ @@ -3924,23 +3931,23 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {  	/* drives which fail FPDMA_AA activation (some may freeze afterwards)  	   the ST disks also have LPM issues */  	{ "ST1000LM024 HN-M101MBB", NULL,	ATA_HORKAGE_BROKEN_FPDMA_AA | -						ATA_HORKAGE_NOLPM, }, +						ATA_HORKAGE_NOLPM },  	{ "VB0250EAVER",	"HPG7",		ATA_HORKAGE_BROKEN_FPDMA_AA },  	/* Blacklist entries taken from Silicon Image 3124/3132  	   Windows driver .inf file - also several Linux problem reports */ -	{ "HTS541060G9SA00",    "MB3OC60D",     ATA_HORKAGE_NONCQ, }, -	{ "HTS541080G9SA00",    "MB4OC60D",     ATA_HORKAGE_NONCQ, }, -	{ "HTS541010G9SA00",    "MBZOC60D",     ATA_HORKAGE_NONCQ, }, +	{ "HTS541060G9SA00",    "MB3OC60D",     ATA_HORKAGE_NONCQ }, +	{ "HTS541080G9SA00",    "MB4OC60D",     ATA_HORKAGE_NONCQ }, +	{ "HTS541010G9SA00",    "MBZOC60D",     ATA_HORKAGE_NONCQ },  	/* https://bugzilla.kernel.org/show_bug.cgi?id=15573 */ -	{ "C300-CTFDDAC128MAG",	"0001",		ATA_HORKAGE_NONCQ, }, +	{ "C300-CTFDDAC128MAG",	"0001",		ATA_HORKAGE_NONCQ },  	/* Sandisk SD7/8/9s lock up hard on large trims */ -	{ "SanDisk SD[789]*",	NULL,		ATA_HORKAGE_MAX_TRIM_128M, }, +	{ "SanDisk SD[789]*",	NULL,		ATA_HORKAGE_MAX_TRIM_128M },  	/* devices which puke on READ_NATIVE_MAX */ -	{ "HDS724040KLSA80",	"KFAOA20N",	ATA_HORKAGE_BROKEN_HPA, }, +	{ "HDS724040KLSA80",	"KFAOA20N",	ATA_HORKAGE_BROKEN_HPA },  	{ "WDC WD3200JD-00KLB0", "WD-WCAMR1130137", ATA_HORKAGE_BROKEN_HPA },  	{ "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA },  	{ "MAXTOR 6L080L4",	"A93.0500",	ATA_HORKAGE_BROKEN_HPA }, @@ -3949,22 +3956,22 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {  	{ "OCZ-VERTEX",		    "1.30",	ATA_HORKAGE_BROKEN_HPA },  	/* Devices which report 1 sector over size HPA */ -	{ "ST340823A",		NULL,		ATA_HORKAGE_HPA_SIZE, }, -	{ "ST320413A",		NULL,		ATA_HORKAGE_HPA_SIZE, }, -	{ "ST310211A",		NULL,		ATA_HORKAGE_HPA_SIZE, }, +	{ "ST340823A",		NULL,		ATA_HORKAGE_HPA_SIZE }, +	{ "ST320413A",		NULL,		ATA_HORKAGE_HPA_SIZE }, +	{ "ST310211A",		NULL,		ATA_HORKAGE_HPA_SIZE },  	/* Devices which get the IVB wrong */ -	{ "QUANTUM FIREBALLlct10 05", "A03.0900", ATA_HORKAGE_IVB, }, +	{ "QUANTUM FIREBALLlct10 05", "A03.0900", ATA_HORKAGE_IVB },  	/* Maybe we should just blacklist TSSTcorp... */ -	{ "TSSTcorp CDDVDW SH-S202[HJN]", "SB0[01]",  ATA_HORKAGE_IVB, }, +	{ "TSSTcorp CDDVDW SH-S202[HJN]", "SB0[01]",  ATA_HORKAGE_IVB },  	/* Devices that do not need bridging limits applied */ -	{ "MTRON MSP-SATA*",		NULL,	ATA_HORKAGE_BRIDGE_OK, }, -	{ "BUFFALO HD-QSU2/R5",		NULL,	ATA_HORKAGE_BRIDGE_OK, }, +	{ "MTRON MSP-SATA*",		NULL,	ATA_HORKAGE_BRIDGE_OK }, +	{ "BUFFALO HD-QSU2/R5",		NULL,	ATA_HORKAGE_BRIDGE_OK },  	/* Devices which aren't very happy with higher link speeds */ -	{ "WD My Book",			NULL,	ATA_HORKAGE_1_5_GBPS, }, -	{ "Seagate FreeAgent GoFlex",	NULL,	ATA_HORKAGE_1_5_GBPS, }, +	{ "WD My Book",			NULL,	ATA_HORKAGE_1_5_GBPS }, +	{ "Seagate FreeAgent GoFlex",	NULL,	ATA_HORKAGE_1_5_GBPS },  	/*  	 * Devices which choke on SETXFER.  Applies only if both the @@ -3982,57 +3989,57 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {  	/* 512GB MX100 with MU01 firmware has both queued TRIM and LPM issues */  	{ "Crucial_CT512MX100*",	"MU01",	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_ZERO_AFTER_TRIM | -						ATA_HORKAGE_NOLPM, }, +						ATA_HORKAGE_NOLPM },  	/* 512GB MX100 with newer firmware has only LPM issues */  	{ "Crucial_CT512MX100*",	NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM | -						ATA_HORKAGE_NOLPM, }, +						ATA_HORKAGE_NOLPM },  	/* 480GB+ M500 SSDs have both queued TRIM and LPM issues */  	{ "Crucial_CT480M500*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_ZERO_AFTER_TRIM | -						ATA_HORKAGE_NOLPM, }, +						ATA_HORKAGE_NOLPM },  	{ "Crucial_CT960M500*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_ZERO_AFTER_TRIM | -						ATA_HORKAGE_NOLPM, }, +						ATA_HORKAGE_NOLPM },  	/* These specific Samsung models/firmware-revs do not handle LPM well */ -	{ "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM, }, -	{ "SAMSUNG SSD PM830 mSATA *",  "CXM13D1Q", ATA_HORKAGE_NOLPM, }, -	{ "SAMSUNG MZ7TD256HAFV-000L9", NULL,       ATA_HORKAGE_NOLPM, }, -	{ "SAMSUNG MZ7TE512HMHP-000L1", "EXT06L0Q", ATA_HORKAGE_NOLPM, }, +	{ "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM }, +	{ "SAMSUNG SSD PM830 mSATA *",  "CXM13D1Q", ATA_HORKAGE_NOLPM }, +	{ "SAMSUNG MZ7TD256HAFV-000L9", NULL,       ATA_HORKAGE_NOLPM }, +	{ "SAMSUNG MZ7TE512HMHP-000L1", "EXT06L0Q", ATA_HORKAGE_NOLPM },  	/* devices that don't properly handle queued TRIM commands */  	{ "Micron_M500IT_*",		"MU01",	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Micron_M500_*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Crucial_CT*M500*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Micron_M5[15]0_*",		"MU01",	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Crucial_CT*M550*",		"MU01",	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Crucial_CT*MX100*",		"MU01",	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Samsung SSD 840 EVO*",	NULL,	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_NO_DMA_LOG | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Samsung SSD 840*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Samsung SSD 850*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	{ "Samsung SSD 860*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_ZERO_AFTER_TRIM | -						ATA_HORKAGE_NO_NCQ_ON_ATI, }, +						ATA_HORKAGE_NO_NCQ_ON_ATI },  	{ "Samsung SSD 870*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_ZERO_AFTER_TRIM | -						ATA_HORKAGE_NO_NCQ_ON_ATI, }, +						ATA_HORKAGE_NO_NCQ_ON_ATI },  	{ "FCCT*M500*",			NULL,	ATA_HORKAGE_NO_NCQ_TRIM | -						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +						ATA_HORKAGE_ZERO_AFTER_TRIM },  	/* devices that don't properly handle TRIM commands */ -	{ "SuperSSpeed S238*",		NULL,	ATA_HORKAGE_NOTRIM, }, -	{ "M88V29*",			NULL,	ATA_HORKAGE_NOTRIM, }, +	{ "SuperSSpeed S238*",		NULL,	ATA_HORKAGE_NOTRIM }, +	{ "M88V29*",			NULL,	ATA_HORKAGE_NOTRIM },  	/*  	 * As defined, the DRAT (Deterministic Read After Trim) and RZAT @@ -4050,16 +4057,16 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {  	 * The intel 510 drive has buggy DRAT/RZAT. Explicitly exclude  	 * that model before whitelisting all other intel SSDs.  	 */ -	{ "INTEL*SSDSC2MH*",		NULL,	0, }, +	{ "INTEL*SSDSC2MH*",		NULL,	0 }, -	{ "Micron*",			NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, -	{ "Crucial*",			NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, -	{ "INTEL*SSD*", 		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, -	{ "SSD*INTEL*",			NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, -	{ "Samsung*SSD*",		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, -	{ "SAMSUNG*SSD*",		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, -	{ "SAMSUNG*MZ7KM*",		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, -	{ "ST[1248][0248]0[FH]*",	NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM, }, +	{ "Micron*",			NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM }, +	{ "Crucial*",			NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM }, +	{ "INTEL*SSD*", 		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM }, +	{ "SSD*INTEL*",			NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM }, +	{ "Samsung*SSD*",		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM }, +	{ "SAMSUNG*SSD*",		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM }, +	{ "SAMSUNG*MZ7KM*",		NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM }, +	{ "ST[1248][0248]0[FH]*",	NULL,	ATA_HORKAGE_ZERO_AFTER_TRIM },  	/*  	 * Some WD SATA-I drives spin up and down erratically when the link @@ -4567,42 +4574,6 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)  }  /** - *	ata_qc_new_init - Request an available ATA command, and initialize it - *	@dev: Device from whom we request an available command structure - *	@tag: tag - * - *	LOCKING: - *	None. - */ - -struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag) -{ -	struct ata_port *ap = dev->link->ap; -	struct ata_queued_cmd *qc; - -	/* no command while frozen */ -	if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) -		return NULL; - -	/* libsas case */ -	if (ap->flags & ATA_FLAG_SAS_HOST) { -		tag = ata_sas_allocate_tag(ap); -		if (tag < 0) -			return NULL; -	} - -	qc = __ata_qc_from_tag(ap, tag); -	qc->tag = qc->hw_tag = tag; -	qc->scsicmd = NULL; -	qc->ap = ap; -	qc->dev = dev; - -	ata_qc_reinit(qc); - -	return qc; -} - -/**   *	ata_qc_free - free unused ata_queued_cmd   *	@qc: Command to complete   * @@ -4614,19 +4585,9 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag)   */  void ata_qc_free(struct ata_queued_cmd *qc)  { -	struct ata_port *ap; -	unsigned int tag; - -	WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ -	ap = qc->ap; -  	qc->flags = 0; -	tag = qc->tag; -	if (ata_tag_valid(tag)) { +	if (ata_tag_valid(qc->tag))  		qc->tag = ATA_TAG_POISON; -		if (ap->flags & ATA_FLAG_SAS_HOST) -			ata_sas_free_tag(tag, ap); -	}  }  void __ata_qc_complete(struct ata_queued_cmd *qc) @@ -5605,7 +5566,7 @@ static void ata_finalize_port_ops(struct ata_port_operations *ops)   *	Start and then freeze ports of @host.  Started status is   *	recorded in host->flags, so this function can be called   *	multiple times.  Ports are guaranteed to get started only - *	once.  If host->ops isn't initialized yet, its set to the + *	once.  If host->ops is not initialized yet, it is set to the   *	first non-dummy port ops.   *   *	LOCKING: @@ -6146,67 +6107,113 @@ int ata_platform_remove_one(struct platform_device *pdev)  EXPORT_SYMBOL_GPL(ata_platform_remove_one);  #ifdef CONFIG_ATA_FORCE + +#define force_cbl(name, flag)				\ +	{ #name,	.cbl		= (flag) } + +#define force_spd_limit(spd, val)			\ +	{ #spd,	.spd_limit		= (val) } + +#define force_xfer(mode, shift)				\ +	{ #mode,	.xfer_mask	= (1UL << (shift)) } + +#define force_lflag_on(name, flags)			\ +	{ #name,	.lflags_on	= (flags) } + +#define force_lflag_onoff(name, flags)			\ +	{ "no" #name,	.lflags_on	= (flags) },	\ +	{ #name,	.lflags_off	= (flags) } + +#define force_horkage_on(name, flag)			\ +	{ #name,	.horkage_on	= (flag) } + +#define force_horkage_onoff(name, flag)			\ +	{ "no" #name,	.horkage_on	= (flag) },	\ +	{ #name,	.horkage_off	= (flag) } + +static const struct ata_force_param force_tbl[] __initconst = { +	force_cbl(40c,			ATA_CBL_PATA40), +	force_cbl(80c,			ATA_CBL_PATA80), +	force_cbl(short40c,		ATA_CBL_PATA40_SHORT), +	force_cbl(unk,			ATA_CBL_PATA_UNK), +	force_cbl(ign,			ATA_CBL_PATA_IGN), +	force_cbl(sata,			ATA_CBL_SATA), + +	force_spd_limit(1.5Gbps,	1), +	force_spd_limit(3.0Gbps,	2), + +	force_xfer(pio0,		ATA_SHIFT_PIO + 0), +	force_xfer(pio1,		ATA_SHIFT_PIO + 1), +	force_xfer(pio2,		ATA_SHIFT_PIO + 2), +	force_xfer(pio3,		ATA_SHIFT_PIO + 3), +	force_xfer(pio4,		ATA_SHIFT_PIO + 4), +	force_xfer(pio5,		ATA_SHIFT_PIO + 5), +	force_xfer(pio6,		ATA_SHIFT_PIO + 6), +	force_xfer(mwdma0,		ATA_SHIFT_MWDMA + 0), +	force_xfer(mwdma1,		ATA_SHIFT_MWDMA + 1), +	force_xfer(mwdma2,		ATA_SHIFT_MWDMA + 2), +	force_xfer(mwdma3,		ATA_SHIFT_MWDMA + 3), +	force_xfer(mwdma4,		ATA_SHIFT_MWDMA + 4), +	force_xfer(udma0,		ATA_SHIFT_UDMA + 0), +	force_xfer(udma16,		ATA_SHIFT_UDMA + 0), +	force_xfer(udma/16,		ATA_SHIFT_UDMA + 0), +	force_xfer(udma1,		ATA_SHIFT_UDMA + 1), +	force_xfer(udma25,		ATA_SHIFT_UDMA + 1), +	force_xfer(udma/25,		ATA_SHIFT_UDMA + 1), +	force_xfer(udma2,		ATA_SHIFT_UDMA + 2), +	force_xfer(udma33,		ATA_SHIFT_UDMA + 2), +	force_xfer(udma/33,		ATA_SHIFT_UDMA + 2), +	force_xfer(udma3,		ATA_SHIFT_UDMA + 3), +	force_xfer(udma44,		ATA_SHIFT_UDMA + 3), +	force_xfer(udma/44,		ATA_SHIFT_UDMA + 3), +	force_xfer(udma4,		ATA_SHIFT_UDMA + 4), +	force_xfer(udma66,		ATA_SHIFT_UDMA + 4), +	force_xfer(udma/66,		ATA_SHIFT_UDMA + 4), +	force_xfer(udma5,		ATA_SHIFT_UDMA + 5), +	force_xfer(udma100,		ATA_SHIFT_UDMA + 5), +	force_xfer(udma/100,		ATA_SHIFT_UDMA + 5), +	force_xfer(udma6,		ATA_SHIFT_UDMA + 6), +	force_xfer(udma133,		ATA_SHIFT_UDMA + 6), +	force_xfer(udma/133,		ATA_SHIFT_UDMA + 6), +	force_xfer(udma7,		ATA_SHIFT_UDMA + 7), + +	force_lflag_on(nohrst,		ATA_LFLAG_NO_HRST), +	force_lflag_on(nosrst,		ATA_LFLAG_NO_SRST), +	force_lflag_on(norst,		ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST), +	force_lflag_on(rstonce,		ATA_LFLAG_RST_ONCE), +	force_lflag_onoff(dbdelay,	ATA_LFLAG_NO_DEBOUNCE_DELAY), + +	force_horkage_onoff(ncq,	ATA_HORKAGE_NONCQ), +	force_horkage_onoff(ncqtrim,	ATA_HORKAGE_NO_NCQ_TRIM), +	force_horkage_onoff(ncqati,	ATA_HORKAGE_NO_NCQ_ON_ATI), + +	force_horkage_onoff(trim,	ATA_HORKAGE_NOTRIM), +	force_horkage_on(trim_zero,	ATA_HORKAGE_ZERO_AFTER_TRIM), +	force_horkage_on(max_trim_128m, ATA_HORKAGE_MAX_TRIM_128M), + +	force_horkage_onoff(dma,	ATA_HORKAGE_NODMA), +	force_horkage_on(atapi_dmadir,	ATA_HORKAGE_ATAPI_DMADIR), +	force_horkage_on(atapi_mod16_dma, ATA_HORKAGE_ATAPI_MOD16_DMA), + +	force_horkage_onoff(dmalog,	ATA_HORKAGE_NO_DMA_LOG), +	force_horkage_onoff(iddevlog,	ATA_HORKAGE_NO_ID_DEV_LOG), +	force_horkage_onoff(logdir,	ATA_HORKAGE_NO_LOG_DIR), + +	force_horkage_on(max_sec_128,	ATA_HORKAGE_MAX_SEC_128), +	force_horkage_on(max_sec_1024,	ATA_HORKAGE_MAX_SEC_1024), +	force_horkage_on(max_sec_lba48,	ATA_HORKAGE_MAX_SEC_LBA48), + +	force_horkage_onoff(lpm,	ATA_HORKAGE_NOLPM), +	force_horkage_onoff(setxfer,	ATA_HORKAGE_NOSETXFER), +	force_horkage_on(dump_id,	ATA_HORKAGE_DUMP_ID), + +	force_horkage_on(disable,	ATA_HORKAGE_DISABLE), +}; +  static int __init ata_parse_force_one(char **cur,  				      struct ata_force_ent *force_ent,  				      const char **reason)  { -	static const struct ata_force_param force_tbl[] __initconst = { -		{ "40c",	.cbl		= ATA_CBL_PATA40 }, -		{ "80c",	.cbl		= ATA_CBL_PATA80 }, -		{ "short40c",	.cbl		= ATA_CBL_PATA40_SHORT }, -		{ "unk",	.cbl		= ATA_CBL_PATA_UNK }, -		{ "ign",	.cbl		= ATA_CBL_PATA_IGN }, -		{ "sata",	.cbl		= ATA_CBL_SATA }, -		{ "1.5Gbps",	.spd_limit	= 1 }, -		{ "3.0Gbps",	.spd_limit	= 2 }, -		{ "noncq",	.horkage_on	= ATA_HORKAGE_NONCQ }, -		{ "ncq",	.horkage_off	= ATA_HORKAGE_NONCQ }, -		{ "noncqtrim",	.horkage_on	= ATA_HORKAGE_NO_NCQ_TRIM }, -		{ "ncqtrim",	.horkage_off	= ATA_HORKAGE_NO_NCQ_TRIM }, -		{ "noncqati",	.horkage_on	= ATA_HORKAGE_NO_NCQ_ON_ATI }, -		{ "ncqati",	.horkage_off	= ATA_HORKAGE_NO_NCQ_ON_ATI }, -		{ "dump_id",	.horkage_on	= ATA_HORKAGE_DUMP_ID }, -		{ "pio0",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 0) }, -		{ "pio1",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 1) }, -		{ "pio2",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 2) }, -		{ "pio3",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 3) }, -		{ "pio4",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 4) }, -		{ "pio5",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 5) }, -		{ "pio6",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 6) }, -		{ "mwdma0",	.xfer_mask	= 1 << (ATA_SHIFT_MWDMA + 0) }, -		{ "mwdma1",	.xfer_mask	= 1 << (ATA_SHIFT_MWDMA + 1) }, -		{ "mwdma2",	.xfer_mask	= 1 << (ATA_SHIFT_MWDMA + 2) }, -		{ "mwdma3",	.xfer_mask	= 1 << (ATA_SHIFT_MWDMA + 3) }, -		{ "mwdma4",	.xfer_mask	= 1 << (ATA_SHIFT_MWDMA + 4) }, -		{ "udma0",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 0) }, -		{ "udma16",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 0) }, -		{ "udma/16",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 0) }, -		{ "udma1",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 1) }, -		{ "udma25",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 1) }, -		{ "udma/25",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 1) }, -		{ "udma2",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 2) }, -		{ "udma33",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 2) }, -		{ "udma/33",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 2) }, -		{ "udma3",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 3) }, -		{ "udma44",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 3) }, -		{ "udma/44",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 3) }, -		{ "udma4",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 4) }, -		{ "udma66",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 4) }, -		{ "udma/66",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 4) }, -		{ "udma5",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 5) }, -		{ "udma100",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 5) }, -		{ "udma/100",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 5) }, -		{ "udma6",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 6) }, -		{ "udma133",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 6) }, -		{ "udma/133",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 6) }, -		{ "udma7",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 7) }, -		{ "nohrst",	.lflags		= ATA_LFLAG_NO_HRST }, -		{ "nosrst",	.lflags		= ATA_LFLAG_NO_SRST }, -		{ "norst",	.lflags		= ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, -		{ "rstonce",	.lflags		= ATA_LFLAG_RST_ONCE }, -		{ "atapi_dmadir", .horkage_on	= ATA_HORKAGE_ATAPI_DMADIR }, -		{ "disable",	.horkage_on	= ATA_HORKAGE_DISABLE }, -	};  	char *start = *cur, *p = *cur;  	char *id, *val, *endp;  	const struct ata_force_param *match_fp = NULL; @@ -6288,7 +6295,7 @@ static void __init ata_parse_force_param(void)  	int last_port = -1, last_device = -1;  	char *p, *cur, *next; -	/* calculate maximum number of params and allocate force_tbl */ +	/* Calculate maximum number of params and allocate ata_force_tbl */  	for (p = ata_force_param_buf; *p; p++)  		if (*p == ',')  			size++; | 
