USB: Fix strict aliasing in ohci-hcd
commit 5f6aa03fda
USB: Fix complaints about strict aliasing in OHCI-HCD
tried to fix this, but gcc4.4 still complains. So, this
patch basically reverts the above and does a simpler fix.
also, the above commit incorrectly changed
/* corresponds to data_buf[4-7] */
datab [1] = 0;
to
/* corresponds to databuf.u8[4-7] */
databuf.u8[1] = 0;
This patch also fixes that.
Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
This commit is contained in:
parent
b7006958ea
commit
f1273f1143
|
@ -1261,19 +1261,11 @@ static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
|
||||||
int leni = transfer_len;
|
int leni = transfer_len;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int stat = 0;
|
int stat = 0;
|
||||||
__u32 datab[4];
|
|
||||||
union {
|
|
||||||
void *ptr;
|
|
||||||
__u8 *u8;
|
|
||||||
__u16 *u16;
|
|
||||||
__u32 *u32;
|
|
||||||
} databuf;
|
|
||||||
__u16 bmRType_bReq;
|
__u16 bmRType_bReq;
|
||||||
__u16 wValue;
|
__u16 wValue;
|
||||||
__u16 wIndex;
|
__u16 wIndex;
|
||||||
__u16 wLength;
|
__u16 wLength;
|
||||||
|
ALLOC_ALIGN_BUFFER(__u8, databuf, 16, sizeof(u32));
|
||||||
databuf.u32 = (__u32 *)datab;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
||||||
|
@ -1304,20 +1296,20 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
case RH_GET_STATUS:
|
case RH_GET_STATUS:
|
||||||
databuf.u16[0] = cpu_to_le16(1);
|
*(u16 *)databuf = cpu_to_le16(1);
|
||||||
OK(2);
|
OK(2);
|
||||||
case RH_GET_STATUS | RH_INTERFACE:
|
case RH_GET_STATUS | RH_INTERFACE:
|
||||||
databuf.u16[0] = cpu_to_le16(0);
|
*(u16 *)databuf = cpu_to_le16(0);
|
||||||
OK(2);
|
OK(2);
|
||||||
case RH_GET_STATUS | RH_ENDPOINT:
|
case RH_GET_STATUS | RH_ENDPOINT:
|
||||||
databuf.u16[0] = cpu_to_le16(0);
|
*(u16 *)databuf = cpu_to_le16(0);
|
||||||
OK(2);
|
OK(2);
|
||||||
case RH_GET_STATUS | RH_CLASS:
|
case RH_GET_STATUS | RH_CLASS:
|
||||||
databuf.u32[0] = cpu_to_le32(
|
*(u32 *)databuf = cpu_to_le32(
|
||||||
RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE));
|
RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE));
|
||||||
OK(4);
|
OK(4);
|
||||||
case RH_GET_STATUS | RH_OTHER | RH_CLASS:
|
case RH_GET_STATUS | RH_OTHER | RH_CLASS:
|
||||||
databuf.u32[0] = cpu_to_le32(RD_RH_PORTSTAT);
|
*(u32 *)databuf = cpu_to_le32(RD_RH_PORTSTAT);
|
||||||
OK(4);
|
OK(4);
|
||||||
|
|
||||||
case RH_CLEAR_FEATURE | RH_ENDPOINT:
|
case RH_CLEAR_FEATURE | RH_ENDPOINT:
|
||||||
|
@ -1381,14 +1373,14 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
||||||
min_t(unsigned int,
|
min_t(unsigned int,
|
||||||
sizeof(root_hub_dev_des),
|
sizeof(root_hub_dev_des),
|
||||||
wLength));
|
wLength));
|
||||||
databuf.ptr = root_hub_dev_des; OK(len);
|
databuf = root_hub_dev_des; OK(len);
|
||||||
case (0x02): /* configuration descriptor */
|
case (0x02): /* configuration descriptor */
|
||||||
len = min_t(unsigned int,
|
len = min_t(unsigned int,
|
||||||
leni,
|
leni,
|
||||||
min_t(unsigned int,
|
min_t(unsigned int,
|
||||||
sizeof(root_hub_config_des),
|
sizeof(root_hub_config_des),
|
||||||
wLength));
|
wLength));
|
||||||
databuf.ptr = root_hub_config_des; OK(len);
|
databuf = root_hub_config_des; OK(len);
|
||||||
case (0x03): /* string descriptors */
|
case (0x03): /* string descriptors */
|
||||||
if (wValue == 0x0300) {
|
if (wValue == 0x0300) {
|
||||||
len = min_t(unsigned int,
|
len = min_t(unsigned int,
|
||||||
|
@ -1396,7 +1388,7 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
||||||
min_t(unsigned int,
|
min_t(unsigned int,
|
||||||
sizeof(root_hub_str_index0),
|
sizeof(root_hub_str_index0),
|
||||||
wLength));
|
wLength));
|
||||||
databuf.ptr = root_hub_str_index0;
|
databuf = root_hub_str_index0;
|
||||||
OK(len);
|
OK(len);
|
||||||
}
|
}
|
||||||
if (wValue == 0x0301) {
|
if (wValue == 0x0301) {
|
||||||
|
@ -1405,7 +1397,7 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
||||||
min_t(unsigned int,
|
min_t(unsigned int,
|
||||||
sizeof(root_hub_str_index1),
|
sizeof(root_hub_str_index1),
|
||||||
wLength));
|
wLength));
|
||||||
databuf.ptr = root_hub_str_index1;
|
databuf = root_hub_str_index1;
|
||||||
OK(len);
|
OK(len);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -1417,40 +1409,40 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
||||||
{
|
{
|
||||||
__u32 temp = roothub_a(&gohci);
|
__u32 temp = roothub_a(&gohci);
|
||||||
|
|
||||||
databuf.u8[0] = 9; /* min length; */
|
databuf[0] = 9; /* min length; */
|
||||||
databuf.u8[1] = 0x29;
|
databuf[1] = 0x29;
|
||||||
databuf.u8[2] = temp & RH_A_NDP;
|
databuf[2] = temp & RH_A_NDP;
|
||||||
#ifdef CONFIG_AT91C_PQFP_UHPBUG
|
#ifdef CONFIG_AT91C_PQFP_UHPBUG
|
||||||
databuf.u8[2] = (databuf.u8[2] == 2) ? 1 : 0;
|
databuf[2] = (databuf[2] == 2) ? 1 : 0;
|
||||||
#endif
|
#endif
|
||||||
databuf.u8[3] = 0;
|
databuf[3] = 0;
|
||||||
if (temp & RH_A_PSM) /* per-port power switching? */
|
if (temp & RH_A_PSM) /* per-port power switching? */
|
||||||
databuf.u8[3] |= 0x1;
|
databuf[3] |= 0x1;
|
||||||
if (temp & RH_A_NOCP) /* no overcurrent reporting? */
|
if (temp & RH_A_NOCP) /* no overcurrent reporting? */
|
||||||
databuf.u8[3] |= 0x10;
|
databuf[3] |= 0x10;
|
||||||
else if (temp & RH_A_OCPM)/* per-port overcurrent reporting? */
|
else if (temp & RH_A_OCPM)/* per-port overcurrent reporting? */
|
||||||
databuf.u8[3] |= 0x8;
|
databuf[3] |= 0x8;
|
||||||
|
|
||||||
/* corresponds to databuf.u8[4-7] */
|
databuf[4] = 0;
|
||||||
databuf.u8[1] = 0;
|
databuf[5] = (temp & RH_A_POTPGT) >> 24;
|
||||||
databuf.u8[5] = (temp & RH_A_POTPGT) >> 24;
|
databuf[6] = 0;
|
||||||
temp = roothub_b(&gohci);
|
temp = roothub_b(&gohci);
|
||||||
databuf.u8[7] = temp & RH_B_DR;
|
databuf[7] = temp & RH_B_DR;
|
||||||
if (databuf.u8[2] < 7) {
|
if (databuf[2] < 7) {
|
||||||
databuf.u8[8] = 0xff;
|
databuf[8] = 0xff;
|
||||||
} else {
|
} else {
|
||||||
databuf.u8[0] += 2;
|
databuf[0] += 2;
|
||||||
databuf.u8[8] = (temp & RH_B_DR) >> 8;
|
databuf[8] = (temp & RH_B_DR) >> 8;
|
||||||
databuf.u8[10] = databuf.u8[9] = 0xff;
|
databuf[10] = databuf[9] = 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = min_t(unsigned int, leni,
|
len = min_t(unsigned int, leni,
|
||||||
min_t(unsigned int, databuf.u8[0], wLength));
|
min_t(unsigned int, databuf[0], wLength));
|
||||||
OK(len);
|
OK(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
case RH_GET_CONFIGURATION:
|
case RH_GET_CONFIGURATION:
|
||||||
databuf.u8[0] = 0x01;
|
databuf[0] = 0x01;
|
||||||
OK(1);
|
OK(1);
|
||||||
|
|
||||||
case RH_SET_CONFIGURATION:
|
case RH_SET_CONFIGURATION:
|
||||||
|
@ -1469,8 +1461,8 @@ pkt_print(NULL, dev, pipe, buffer, transfer_len,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
len = min_t(int, len, leni);
|
len = min_t(int, len, leni);
|
||||||
if (data != databuf.ptr)
|
if (data != databuf)
|
||||||
memcpy(data, databuf.ptr, len);
|
memcpy(data, databuf, len);
|
||||||
dev->act_len = len;
|
dev->act_len = len;
|
||||||
dev->status = stat;
|
dev->status = stat;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue