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>
master
Marek Vasut 13 years ago committed by Wolfgang Denk
parent 857c283e9b
commit b18eabfa5f
  1. 51
      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) static void ide_ident (block_dev_desc_t *dev_desc)
{ {
ulong iobuf[ATA_SECTORWORDS];
unsigned char c; unsigned char c;
hd_driveid_t *iop = (hd_driveid_t *)iobuf; hd_driveid_t iop;
#ifdef CONFIG_ATAPI #ifdef CONFIG_ATAPI
int retries = 0; int retries = 0;
@ -1073,11 +1072,11 @@ static void ide_ident (block_dev_desc_t *dev_desc)
return; return;
#endif #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->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->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->product, iop.serial_no, sizeof(dev_desc->product));
#ifdef __LITTLE_ENDIAN #ifdef __LITTLE_ENDIAN
/* /*
* firmware revision, model, and serial number have Big Endian Byte * 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); strswab (dev_desc->product);
#endif /* __LITTLE_ENDIAN */ #endif /* __LITTLE_ENDIAN */
if ((iop->config & 0x0080)==0x0080) if ((iop.config & 0x0080) == 0x0080)
dev_desc->removable = 1; dev_desc->removable = 1;
else else
dev_desc->removable = 0; dev_desc->removable = 0;
#ifdef CONFIG_TUNE_PIO #ifdef CONFIG_TUNE_PIO
/* Mode 0 - 2 only, are directly determined by word 51. */ /* Mode 0 - 2 only, are directly determined by word 51. */
pio_mode = iop->tPIO; pio_mode = iop.tPIO;
if (pio_mode > 2) { if (pio_mode > 2) {
printf("WARNING: Invalid PIO (word 51 = %d).\n", pio_mode); printf("WARNING: Invalid PIO (word 51 = %d).\n", pio_mode);
pio_mode = 0; /* Force it to dead slow, and hope for the best... */ 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 * shall set bit 1 of word 53 to one and support the fields contained
* in words 64 through 70. * 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 /* Mode 3 and above are possible. Check in order from slow
* to fast, so we wind up with the highest mode allowed. * 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; pio_mode = 3;
if (iop->eide_pio_modes & 0x02) if (iop.eide_pio_modes & 0x02)
pio_mode = 4; pio_mode = 4;
if (ata_id_is_cfa((u16 *)iop)) { if (ata_id_is_cfa((u16 *)&iop)) {
if ((iop->cf_advanced_caps & 0x07) == 0x01) if ((iop.cf_advanced_caps & 0x07) == 0x01)
pio_mode = 5; pio_mode = 5;
if ((iop->cf_advanced_caps & 0x07) == 0x02) if ((iop.cf_advanced_caps & 0x07) == 0x02)
pio_mode = 6; pio_mode = 6;
} }
} }
@ -1133,19 +1132,19 @@ static void ide_ident (block_dev_desc_t *dev_desc)
/* /*
* Drive PIO mode autoselection * Drive PIO mode autoselection
*/ */
mode = iop->tPIO; mode = iop.tPIO;
printf ("tPIO = 0x%02x = %d\n",mode, mode); printf ("tPIO = 0x%02x = %d\n",mode, mode);
if (mode > 2) { /* 2 is maximum allowed tPIO value */ if (mode > 2) { /* 2 is maximum allowed tPIO value */
mode = 2; mode = 2;
debug ("Override tPIO -> 2\n"); 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"); debug ("Drive implements ATA2\n");
if (iop->capability & 8) { /* drive supports use_iordy? */ if (iop.capability & 8) { /* drive supports use_iordy? */
cycle_time = iop->eide_pio_iordy; cycle_time = iop.eide_pio_iordy;
} else { } else {
cycle_time = iop->eide_pio; cycle_time = iop.eide_pio;
} }
debug ("cycle time = %d\n", cycle_time); debug ("cycle time = %d\n", cycle_time);
mode = 4; mode = 4;
@ -1166,7 +1165,7 @@ static void ide_ident (block_dev_desc_t *dev_desc)
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
/* swap shorts */ /* 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 */ #else /* ! __BIG_ENDIAN */
/* /*
* do not swap shorts on little 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: * See CF+ and CompactFlash Specification Revision 2.0:
* 6.2.1.6: Identfy Drive, Table 39, Word Address 57-58 for details. * 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 */ #endif /* __BIG_ENDIAN */
#ifdef CONFIG_LBA48 #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->lba48 = 1;
dev_desc->lba = (unsigned long long)iop->lba48_capacity[0] | dev_desc->lba = (unsigned long long)iop.lba48_capacity[0] |
((unsigned long long)iop->lba48_capacity[1] << 16) | ((unsigned long long)iop.lba48_capacity[1] << 16) |
((unsigned long long)iop->lba48_capacity[2] << 32) | ((unsigned long long)iop.lba48_capacity[2] << 32) |
((unsigned long long)iop->lba48_capacity[3] << 48); ((unsigned long long)iop.lba48_capacity[3] << 48);
} else { } else {
dev_desc->lba48 = 0; dev_desc->lba48 = 0;
} }

Loading…
Cancel
Save