ide: use try_to_identify() in ide_driveid_update()
* Pass pointer to buffer for IDENTIFY data to do_identify() and try_to_identify(). * Un-static try_to_identify() and use it in ide_driveid_update(). * Rename try_to_identify() to ide_dev_read_id(). There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
		
							parent
							
								
									ff18b89bef
								
							
						
					
					
						commit
						2ebe1d9efe
					
				| @ -289,66 +289,20 @@ no_80w: | ||||
| 
 | ||||
| int ide_driveid_update(ide_drive_t *drive) | ||||
| { | ||||
| 	ide_hwif_t *hwif = drive->hwif; | ||||
| 	const struct ide_tp_ops *tp_ops = hwif->tp_ops; | ||||
| 	u16 *id; | ||||
| 	unsigned long flags; | ||||
| 	int use_altstatus = 0, rc; | ||||
| 	u8 a, uninitialized_var(s); | ||||
| 	int rc; | ||||
| 
 | ||||
| 	id = kmalloc(SECTOR_SIZE, GFP_ATOMIC); | ||||
| 	if (id == NULL) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Re-read drive->id for possible DMA mode | ||||
| 	 * change (copied from ide-probe.c) | ||||
| 	 */ | ||||
| 
 | ||||
| 	SELECT_MASK(drive, 1); | ||||
| 	tp_ops->set_irq(hwif, 0); | ||||
| 	msleep(50); | ||||
| 
 | ||||
| 	if (hwif->io_ports.ctl_addr && | ||||
| 	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0) { | ||||
| 		a = tp_ops->read_altstatus(hwif); | ||||
| 		s = tp_ops->read_status(hwif); | ||||
| 		if ((a ^ s) & ~ATA_IDX) | ||||
| 			/* ancient Seagate drives, broken interfaces */ | ||||
| 			printk(KERN_INFO "%s: probing with STATUS(0x%02x) " | ||||
| 					 "instead of ALTSTATUS(0x%02x)\n", | ||||
| 					 drive->name, s, a); | ||||
| 		else | ||||
| 			/* use non-intrusive polling */ | ||||
| 			use_altstatus = 1; | ||||
| 	} | ||||
| 
 | ||||
| 	tp_ops->exec_command(hwif, ATA_CMD_ID_ATA); | ||||
| 
 | ||||
| 	if (ide_busy_sleep(hwif, WAIT_WORSTCASE / 2, use_altstatus)) { | ||||
| 		rc = 1; | ||||
| 		goto out_err; | ||||
| 	} | ||||
| 
 | ||||
| 	msleep(50);	/* wait for IRQ and ATA_DRQ */ | ||||
| 
 | ||||
| 	s = tp_ops->read_status(hwif); | ||||
| 
 | ||||
| 	if (!OK_STAT(s, ATA_DRQ, BAD_R_STAT)) { | ||||
| 		rc = 2; | ||||
| 		goto out_err; | ||||
| 	} | ||||
| 
 | ||||
| 	local_irq_save(flags); | ||||
| 	tp_ops->input_data(drive, NULL, id, SECTOR_SIZE); | ||||
| 	local_irq_restore(flags); | ||||
| 
 | ||||
| 	(void)tp_ops->read_status(hwif); /* clear drive IRQ */ | ||||
| 
 | ||||
| 	ide_fix_driveid(id); | ||||
| 
 | ||||
| 	rc = ide_dev_read_id(drive, ATA_CMD_ID_ATA, id); | ||||
| 	SELECT_MASK(drive, 0); | ||||
| 
 | ||||
| 	if (rc) | ||||
| 		goto out_err; | ||||
| 
 | ||||
| 	drive->id[ATA_ID_UDMA_MODES]  = id[ATA_ID_UDMA_MODES]; | ||||
| 	drive->id[ATA_ID_MWDMA_MODES] = id[ATA_ID_MWDMA_MODES]; | ||||
| 	drive->id[ATA_ID_SWDMA_MODES] = id[ATA_ID_SWDMA_MODES]; | ||||
|  | ||||
| @ -181,16 +181,16 @@ static void ide_classify_atapi_dev(ide_drive_t *drive) | ||||
|  *	do_identify	-	identify a drive | ||||
|  *	@drive: drive to identify  | ||||
|  *	@cmd: command used | ||||
|  *	@id: buffer for IDENTIFY data | ||||
|  * | ||||
|  *	Called when we have issued a drive identify command to | ||||
|  *	read and parse the results. This function is run with | ||||
|  *	interrupts disabled.  | ||||
|  */ | ||||
| 
 | ||||
| static void do_identify(ide_drive_t *drive, u8 cmd) | ||||
| static void do_identify(ide_drive_t *drive, u8 cmd, u16 *id) | ||||
| { | ||||
| 	ide_hwif_t *hwif = drive->hwif; | ||||
| 	u16 *id = drive->id; | ||||
| 	char *m = (char *)&id[ATA_ID_PROD]; | ||||
| 	unsigned long flags; | ||||
| 	int bswap = 1; | ||||
| @ -240,19 +240,19 @@ err_misc: | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  *	try_to_identify	-	send ATA/ATAPI identify | ||||
|  *	ide_dev_read_id	-	send ATA/ATAPI IDENTIFY command | ||||
|  *	@drive: drive to identify | ||||
|  *	@cmd: command to use | ||||
|  *	@id: buffer for IDENTIFY data | ||||
|  * | ||||
|  *	try_to_identify() sends an ATA(PI) IDENTIFY request to a drive | ||||
|  *	and waits for a response. | ||||
|  *	Sends an ATA(PI) IDENTIFY request to a drive and waits for a response. | ||||
|  * | ||||
|  *	Returns:	0  device was identified | ||||
|  *			1  device timed-out (no response to identify request) | ||||
|  *			2  device aborted the command (refused to identify itself) | ||||
|  */ | ||||
| 
 | ||||
| static int try_to_identify(ide_drive_t *drive, u8 cmd) | ||||
| int ide_dev_read_id(ide_drive_t *drive, u8 cmd, u16 *id) | ||||
| { | ||||
| 	ide_hwif_t *hwif = drive->hwif; | ||||
| 	struct ide_io_ports *io_ports = &hwif->io_ports; | ||||
| @ -312,7 +312,7 @@ static int try_to_identify(ide_drive_t *drive, u8 cmd) | ||||
| 
 | ||||
| 	if (OK_STAT(s, ATA_DRQ, BAD_R_STAT)) { | ||||
| 		/* drive returned ID */ | ||||
| 		do_identify(drive, cmd); | ||||
| 		do_identify(drive, cmd, id); | ||||
| 		/* drive responded with ID */ | ||||
| 		rc = 0; | ||||
| 		/* clear drive IRQ */ | ||||
| @ -378,6 +378,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd) | ||||
| { | ||||
| 	ide_hwif_t *hwif = drive->hwif; | ||||
| 	const struct ide_tp_ops *tp_ops = hwif->tp_ops; | ||||
| 	u16 *id = drive->id; | ||||
| 	int rc; | ||||
| 	u8 present = !!(drive->dev_flags & IDE_DFLAG_PRESENT), stat; | ||||
| 
 | ||||
| @ -413,11 +414,10 @@ static int do_probe (ide_drive_t *drive, u8 cmd) | ||||
| 
 | ||||
| 	if (OK_STAT(stat, ATA_DRDY, ATA_BUSY) || | ||||
| 	    present || cmd == ATA_CMD_ID_ATAPI) { | ||||
| 		/* send cmd and wait */ | ||||
| 		if ((rc = try_to_identify(drive, cmd))) { | ||||
| 		rc = ide_dev_read_id(drive, cmd, id); | ||||
| 		if (rc) | ||||
| 			/* failed: try again */ | ||||
| 			rc = try_to_identify(drive,cmd); | ||||
| 		} | ||||
| 			rc = ide_dev_read_id(drive, cmd, id); | ||||
| 
 | ||||
| 		stat = tp_ops->read_status(hwif); | ||||
| 
 | ||||
| @ -432,7 +432,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd) | ||||
| 			msleep(50); | ||||
| 			tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET); | ||||
| 			(void)ide_busy_sleep(hwif, WAIT_WORSTCASE, 0); | ||||
| 			rc = try_to_identify(drive, cmd); | ||||
| 			rc = ide_dev_read_id(drive, cmd, id); | ||||
| 		} | ||||
| 
 | ||||
| 		/* ensure drive IRQ is clear */ | ||||
|  | ||||
| @ -1235,6 +1235,8 @@ int ide_no_data_taskfile(ide_drive_t *, ide_task_t *); | ||||
| 
 | ||||
| int ide_taskfile_ioctl(ide_drive_t *, unsigned int, unsigned long); | ||||
| 
 | ||||
| int ide_dev_read_id(ide_drive_t *, u8, u16 *); | ||||
| 
 | ||||
| extern int ide_driveid_update(ide_drive_t *); | ||||
| extern int ide_config_drive_speed(ide_drive_t *, u8); | ||||
| extern u8 eighty_ninty_three (ide_drive_t *); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user