diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-05-11 12:59:32 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-05-11 12:59:37 +0200 | 
| commit | 7961386fe9596e6bf03d09948a73c5df9653325b (patch) | |
| tree | 60fa2586a0d340ef8f7473956eef17430d8250c7 /drivers/ata/libata-core.c | |
| parent | aa47b7e0f89b9998dad4d1667447e8cb7703ff4e (diff) | |
| parent | 091bf7624d1c90cec9e578a18529f615213ff847 (diff) | |
| download | olio-linux-3.10-7961386fe9596e6bf03d09948a73c5df9653325b.tar.xz olio-linux-3.10-7961386fe9596e6bf03d09948a73c5df9653325b.zip  | |
Merge commit 'v2.6.30-rc5' into sched/core
Merge reason: sched/core was on .30-rc1 before, update to latest fixes
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'drivers/ata/libata-core.c')
| -rw-r--r-- | drivers/ata/libata-core.c | 29 | 
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index e7ea77cf606..17c5d48a75d 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -1231,6 +1231,9 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf)  	 *  	 * We follow the current spec and consider that 0x69/0x96  	 * identifies a port multiplier and 0x3c/0xc3 a SEMB device. +	 * Unfortunately, WDC WD1600JS-62MHB5 (a hard drive) reports +	 * SEMB signature.  This is worked around in +	 * ata_dev_read_id().  	 */  	if ((tf->lbam == 0) && (tf->lbah == 0)) {  		DPRINTK("found ATA device by sig\n"); @@ -1248,8 +1251,8 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf)  	}  	if ((tf->lbam == 0x3c) && (tf->lbah == 0xc3)) { -		printk(KERN_INFO "ata: SEMB device ignored\n"); -		return ATA_DEV_SEMB_UNSUP; /* not yet */ +		DPRINTK("found SEMB device by sig (could be ATA device)\n"); +		return ATA_DEV_SEMB;  	}  	DPRINTK("unknown device\n"); @@ -1653,8 +1656,8 @@ unsigned long ata_id_xfermask(const u16 *id)  		/*  		 *	Process compact flash extended modes  		 */ -		int pio = id[163] & 0x7; -		int dma = (id[163] >> 3) & 7; +		int pio = (id[ATA_ID_CFA_MODES] >> 0) & 0x7; +		int dma = (id[ATA_ID_CFA_MODES] >> 3) & 0x7;  		if (pio)  			pio_mask |= (1 << 5); @@ -2080,6 +2083,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,  	struct ata_taskfile tf;  	unsigned int err_mask = 0;  	const char *reason; +	bool is_semb = class == ATA_DEV_SEMB;  	int may_fallback = 1, tried_spinup = 0;  	int rc; @@ -2090,6 +2094,8 @@ retry:  	ata_tf_init(dev, &tf);  	switch (class) { +	case ATA_DEV_SEMB: +		class = ATA_DEV_ATA;	/* some hard drives report SEMB sig */  	case ATA_DEV_ATA:  		tf.command = ATA_CMD_ID_ATA;  		break; @@ -2126,6 +2132,14 @@ retry:  			return -ENOENT;  		} +		if (is_semb) { +			ata_dev_printk(dev, KERN_INFO, "IDENTIFY failed on " +				       "device w/ SEMB sig, disabled\n"); +			/* SEMB is not supported yet */ +			*p_class = ATA_DEV_SEMB_UNSUP; +			return 0; +		} +  		if ((err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) {  			/* Device or controller might have reported  			 * the wrong device class.  Give a shot at the @@ -2412,7 +2426,8 @@ int ata_dev_configure(struct ata_device *dev)  	/* ATA-specific feature tests */  	if (dev->class == ATA_DEV_ATA) {  		if (ata_id_is_cfa(id)) { -			if (id[162] & 1) /* CPRM may make this media unusable */ +			/* CPRM may make this media unusable */ +			if (id[ATA_ID_CFA_KEY_MGMT] & 1)  				ata_dev_printk(dev, KERN_WARNING,  					       "supports DRM functions and may "  					       "not be fully accessable.\n"); @@ -6110,13 +6125,11 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)  			ata_port_printk(ap, KERN_INFO, "DUMMY\n");  	} -	/* perform each probe synchronously */ -	DPRINTK("probe begin\n"); +	/* perform each probe asynchronously */  	for (i = 0; i < host->n_ports; i++) {  		struct ata_port *ap = host->ports[i];  		async_schedule(async_port_probe, ap);  	} -	DPRINTK("probe end\n");  	return 0;  }  |