aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/xhci-hcd.c
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2009-05-14 14:44:18 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-06-16 00:44:51 -0400
commit98441973105b80e133fcaa47ebf17be1e024ea30 (patch)
tree87a083ad72dff9b398c9276f5eabf51b6fe17612 /drivers/usb/host/xhci-hcd.c
parent6071d8363b7b284038069f1795a98372fbc1a48e (diff)
USB: xhci: Remove packed attribute from structures.
The packed attribute allows gcc to muck with the alignment of data structures, which may lead to byte-wise writes that break atomicity of writes. Packed should only be used when the compile may add undesired padding to the structure. Each element of the structure will be aligned by C based on its size and the size of the elements around it. E.g. a u64 would be aligned on an 8 byte boundary, the next u32 would be aligned on a four byte boundary, etc. Since most of the xHCI structures contain only u32 bit values, removing the packed attribute for them should be harmless. (A future patch will change some of the twin 32-bit address fields to one 64-bit field, but all those places have an even number of 32-bit fields before them, so the alignment should be correct.) Add BUILD_BUG_ON statements to check that the compiler doesn't add padding to the data structures that have a hardware-defined layout. While we're modifying the registers, change the name of intr_reg to xhci_intr_reg to avoid global conflicts. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/xhci-hcd.c')
-rw-r--r--drivers/usb/host/xhci-hcd.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c
index c6b921994b28..59ee61d2a198 100644
--- a/drivers/usb/host/xhci-hcd.c
+++ b/drivers/usb/host/xhci-hcd.c
@@ -1243,6 +1243,25 @@ static int __init xhci_hcd_init(void)
1243 return retval; 1243 return retval;
1244 } 1244 }
1245#endif 1245#endif
1246 /*
1247 * Check the compiler generated sizes of structures that must be laid
1248 * out in specific ways for hardware access.
1249 */
1250 BUILD_BUG_ON(sizeof(struct xhci_doorbell_array) != 256*32/8);
1251 BUILD_BUG_ON(sizeof(struct xhci_slot_ctx) != 8*32/8);
1252 BUILD_BUG_ON(sizeof(struct xhci_ep_ctx) != 8*32/8);
1253 /* xhci_device_control has eight fields, and also
1254 * embeds one xhci_slot_ctx and 31 xhci_ep_ctx
1255 */
1256 BUILD_BUG_ON(sizeof(struct xhci_device_control) != (8+8+8*31)*32/8);
1257 BUILD_BUG_ON(sizeof(struct xhci_stream_ctx) != 4*32/8);
1258 BUILD_BUG_ON(sizeof(union xhci_trb) != 4*32/8);
1259 BUILD_BUG_ON(sizeof(struct xhci_erst_entry) != 4*32/8);
1260 BUILD_BUG_ON(sizeof(struct xhci_cap_regs) != 7*32/8);
1261 BUILD_BUG_ON(sizeof(struct xhci_intr_reg) != 8*32/8);
1262 /* xhci_run_regs has eight fields and embeds 128 xhci_intr_regs */
1263 BUILD_BUG_ON(sizeof(struct xhci_run_regs) != (8+8*128)*32/8);
1264 BUILD_BUG_ON(sizeof(struct xhci_doorbell_array) != 256*32/8);
1246 return 0; 1265 return 0;
1247} 1266}
1248module_init(xhci_hcd_init); 1267module_init(xhci_hcd_init);