diff options
Diffstat (limited to 'common/cmd_ide.c')
| -rw-r--r-- | common/cmd_ide.c | 51 | 
1 files changed, 25 insertions, 26 deletions
| diff --git a/common/cmd_ide.c b/common/cmd_ide.c index 2e8c6e044..da5189c37 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -985,9 +985,8 @@ input_data(int dev, ulong *sect_buf, int words)   */  static void ide_ident (block_dev_desc_t *dev_desc)  { -	ulong iobuf[ATA_SECTORWORDS];  	unsigned char c; -	hd_driveid_t *iop = (hd_driveid_t *)iobuf; +	hd_driveid_t iop;  #ifdef CONFIG_ATAPI  	int retries = 0; @@ -1073,11 +1072,11 @@ static void ide_ident (block_dev_desc_t *dev_desc)  		return;  #endif -	input_swap_data (device, iobuf, ATA_SECTORWORDS); +	input_swap_data (device, (ulong *)&iop, ATA_SECTORWORDS); -	ident_cpy ((unsigned char*)dev_desc->revision, iop->fw_rev, sizeof(dev_desc->revision)); -	ident_cpy ((unsigned char*)dev_desc->vendor, iop->model, sizeof(dev_desc->vendor)); -	ident_cpy ((unsigned char*)dev_desc->product, iop->serial_no, sizeof(dev_desc->product)); +	ident_cpy ((unsigned char*)dev_desc->revision, iop.fw_rev, sizeof(dev_desc->revision)); +	ident_cpy ((unsigned char*)dev_desc->vendor, iop.model, sizeof(dev_desc->vendor)); +	ident_cpy ((unsigned char*)dev_desc->product, iop.serial_no, sizeof(dev_desc->product));  #ifdef __LITTLE_ENDIAN  	/*  	 * firmware revision, model, and serial number have Big Endian Byte @@ -1092,14 +1091,14 @@ static void ide_ident (block_dev_desc_t *dev_desc)  	strswab (dev_desc->product);  #endif /* __LITTLE_ENDIAN */ -	if ((iop->config & 0x0080)==0x0080) +	if ((iop.config & 0x0080) == 0x0080)  		dev_desc->removable = 1;  	else  		dev_desc->removable = 0;  #ifdef CONFIG_TUNE_PIO  	/* Mode 0 - 2 only, are directly determined by word 51. */ -	pio_mode = iop->tPIO; +	pio_mode = iop.tPIO;  	if (pio_mode > 2) {  		printf("WARNING: Invalid PIO (word 51 = %d).\n", pio_mode);  		pio_mode = 0; /* Force it to dead slow, and hope for the best... */ @@ -1109,18 +1108,18 @@ static void ide_ident (block_dev_desc_t *dev_desc)  	 * shall set bit 1 of word 53 to one and support the fields contained  	 * in words 64 through 70.  	 */ -	if (iop->field_valid & 0x02) { +	if (iop.field_valid & 0x02) {  		/* Mode 3 and above are possible.  Check in order from slow  		 * to fast, so we wind up with the highest mode allowed.  		 */ -		if (iop->eide_pio_modes & 0x01) +		if (iop.eide_pio_modes & 0x01)  			pio_mode = 3; -		if (iop->eide_pio_modes & 0x02) +		if (iop.eide_pio_modes & 0x02)  			pio_mode = 4; -		if (ata_id_is_cfa((u16 *)iop)) { -			if ((iop->cf_advanced_caps & 0x07) == 0x01) +		if (ata_id_is_cfa((u16 *)&iop)) { +			if ((iop.cf_advanced_caps & 0x07) == 0x01)  				pio_mode = 5; -			if ((iop->cf_advanced_caps & 0x07) == 0x02) +			if ((iop.cf_advanced_caps & 0x07) == 0x02)  				pio_mode = 6;  		}  	} @@ -1133,19 +1132,19 @@ static void ide_ident (block_dev_desc_t *dev_desc)  	/*  	 * Drive PIO mode autoselection  	 */ -	mode = iop->tPIO; +	mode = iop.tPIO;  	printf ("tPIO = 0x%02x = %d\n",mode, mode);  	if (mode > 2) {		/* 2 is maximum allowed tPIO value */  		mode = 2;  		debug ("Override tPIO -> 2\n");  	} -	if (iop->field_valid & 2) {	/* drive implements ATA2? */ +	if (iop.field_valid & 2) {	/* drive implements ATA2? */  		debug ("Drive implements ATA2\n"); -		if (iop->capability & 8) {	/* drive supports use_iordy? */ -			cycle_time = iop->eide_pio_iordy; +		if (iop.capability & 8) {	/* drive supports use_iordy? */ +			cycle_time = iop.eide_pio_iordy;  		} else { -			cycle_time = iop->eide_pio; +			cycle_time = iop.eide_pio;  		}  		debug ("cycle time = %d\n", cycle_time);  		mode = 4; @@ -1166,7 +1165,7 @@ static void ide_ident (block_dev_desc_t *dev_desc)  #ifdef __BIG_ENDIAN  	/* swap shorts */ -	dev_desc->lba = (iop->lba_capacity << 16) | (iop->lba_capacity >> 16); +	dev_desc->lba = (iop.lba_capacity << 16) | (iop.lba_capacity >> 16);  #else	/* ! __BIG_ENDIAN */  	/*  	 * do not swap shorts on little endian @@ -1174,16 +1173,16 @@ static void ide_ident (block_dev_desc_t *dev_desc)  	 * See CF+ and CompactFlash Specification Revision 2.0:  	 * 6.2.1.6: Identfy Drive, Table 39, Word Address 57-58 for details.  	 */ -	dev_desc->lba = iop->lba_capacity; +	dev_desc->lba = iop.lba_capacity;  #endif	/* __BIG_ENDIAN */  #ifdef CONFIG_LBA48 -	if (iop->command_set_2 & 0x0400) { /* LBA 48 support */ +	if (iop.command_set_2 & 0x0400) { /* LBA 48 support */  		dev_desc->lba48 = 1; -		dev_desc->lba = (unsigned long long)iop->lba48_capacity[0] | -						  ((unsigned long long)iop->lba48_capacity[1] << 16) | -						  ((unsigned long long)iop->lba48_capacity[2] << 32) | -						  ((unsigned long long)iop->lba48_capacity[3] << 48); +		dev_desc->lba = (unsigned long long)iop.lba48_capacity[0] | +						  ((unsigned long long)iop.lba48_capacity[1] << 16) | +						  ((unsigned long long)iop.lba48_capacity[2] << 32) | +						  ((unsigned long long)iop.lba48_capacity[3] << 48);  	} else {  		dev_desc->lba48 = 0;  	} |