IDE: Fix complaints about strict aliasing in cmd_ide.c
Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Acked-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
857c283e9b
commit
b18eabfa5f
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user