diff mbox

[U-Boot,v9] usb: align buffers at cacheline

Message ID 1333445166-14184-1-git-send-email-puneets@nvidia.com
State Accepted
Delegated to: Marek Vasut
Headers show

Commit Message

Puneet Saxena April 3, 2012, 9:26 a.m. UTC
This avoids cache-alignment warnings shown in console
when a usb command is entered.

Whenever X bytes of unaligned buffer is invalidated, arm core
invalidates X + Y bytes as per the cache line size and throws
these warnings.

Signed-off-by: Puneet Saxena <puneets@nvidia.com>
---

This patch is tested on "denx-uboot-arm/master". 
Stop address alignment warnings still seen which should not 
be suppressed. See further discussion on this @
http://lists.denx.de/pipermail/u-boot/2012-March/120031.html  

Changes for V7:
    - Trivial change, missed removing memcpy. Removed now.
Changes for V8:
    - Corrected "setup_packet" allocation using "ALLOC_CACHE_ALIGN_BUFFER".


 common/cmd_usb.c     |    3 +-
 common/usb.c         |   22 +++++++++---------
 common/usb_hub.c     |   27 +++++++++++-----------
 common/usb_storage.c |   59 +++++++++++++++++++++++--------------------------
 disk/part_dos.c      |    2 +-
 include/scsi.h       |    4 ++-
 include/usb.h        |    4 ++-
 7 files changed, 62 insertions(+), 59 deletions(-)

Comments

Marek Vasut April 4, 2012, 8:01 a.m. UTC | #1
Dear Puneet Saxena,

> This avoids cache-alignment warnings shown in console
> when a usb command is entered.
> 
> Whenever X bytes of unaligned buffer is invalidated, arm core
> invalidates X + Y bytes as per the cache line size and throws
> these warnings.
> 
> Signed-off-by: Puneet Saxena <puneets@nvidia.com>
> ---

I think we're almost there, hurray! :-)

Though on m28evk this still has issues:

=> usb reset
(Re)start USB...
USB:   Register 10011 NbrPorts 1
USB EHCI 1.00
scanning bus for devices... EHCI timed out on TD - token=0x80008c80
EHCI timed out on TD - token=0x80008d80
EHCI timed out on TD - token=0x80008c80
EHCI timed out on TD - token=0x80008c80
EHCI timed out on TD - token=0x80008c80
 ERROR: NOT USB_CONFIG_DESC 1
EHCI timed out on TD - token=0x80008d80
2 USB Device(s) found
       scanning bus for storage devices... 0 Storage Device(s) found

I have a single USB pendrive connected to the board.

Also note, that if I disable the caches, it all works even with your patch 
applied. So I suspect there's something even more to this (maybe broken 
ehci_invalidate_dcache() ? ). Where did you test these patches?

Thanks!

Best regards,
Marek Vasut
Puneet Saxena April 6, 2012, 10:54 a.m. UTC | #2
Hi Marek,
I tested on tegra2, Seaboard and didn't see these messages though see 
lots of messages
"ERROR: v7_dcache_inval_range - stop address is not aligned - 
0x3fb7c608" which are expected.
PFA the logs if you can make out anything useful.

Try to increase the delay in handshake();

Thanks,
Puneet

On Wednesday 04 April 2012 01:31 PM, Marek Vasut wrote:
> Dear Puneet Saxena,
>
>> This avoids cache-alignment warnings shown in console
>> when a usb command is entered.
>>
>> Whenever X bytes of unaligned buffer is invalidated, arm core
>> invalidates X + Y bytes as per the cache line size and throws
>> these warnings.
>>
>> Signed-off-by: Puneet Saxena<puneets@nvidia.com>
>> ---
> I think we're almost there, hurray! :-)
>
> Though on m28evk this still has issues:
>
> =>  usb reset
> (Re)start USB...
> USB:   Register 10011 NbrPorts 1
> USB EHCI 1.00
> scanning bus for devices... EHCI timed out on TD - token=0x80008c80
> EHCI timed out on TD - token=0x80008d80
> EHCI timed out on TD - token=0x80008c80
> EHCI timed out on TD - token=0x80008c80
> EHCI timed out on TD - token=0x80008c80
>   ERROR: NOT USB_CONFIG_DESC 1
> EHCI timed out on TD - token=0x80008d80
> 2 USB Device(s) found
>         scanning bus for storage devices... 0 Storage Device(s) found
>
> I have a single USB pendrive connected to the board.
>
> Also note, that if I disable the caches, it all works even with your patch
> applied. So I suspect there's something even more to this (maybe broken
> ehci_invalidate_dcache() ? ). Where did you test these patches?
>
> Thanks!
>
> Best regards,
> Marek Vasut


-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------
Tegra2 (SeaBoard) # 
usb reset
(Re)start USB...
USB:   Register 10011 NbrPorts 1

USB EHCI 1.00
scanning bus for devices... 
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3
fb7c608

ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3
fb7c628
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c608
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3ffb34b2
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c5e8
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c6a9
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c5e8
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c628
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c388
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c53f
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c388
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c53f
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c388
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c53f
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c388
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c53f
2 USB Device(s) found
       scanning bus for storage devices... ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cd88
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ER
ROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligne
d - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ce01
EHCI timed out on TD - token=0x80008c80
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cc7f
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cd44
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cccd
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cc5f
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ccad
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cc3f
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3ffbddf2
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ccad

ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cc5f

ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ccad
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cc7f
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cd88
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7cccd
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c9ff
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ca4d
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c9ff

ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3
fb7ca4d
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c9df
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ca4d
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7c9ff
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x3fb7ca4d
1 Storage Device(s) found
Tegra2 (SeaBoard) # 
usb tree

Device Tree:
  1  Hub (480 Mb/s, 0mA)
  |  u-boot 
EHCI Host Controller 
  |
  |\0x08+-2  Mass Storage (480 Mb/s, 100mA)
       JetFlash Mass Storage Device WO04JKWM
     
Tegra2 (SeaBoard) #
diff mbox

Patch

diff --git a/common/cmd_usb.c b/common/cmd_usb.c
index 9eba271..a8e3ae5 100644
--- a/common/cmd_usb.c
+++ b/common/cmd_usb.c
@@ -150,7 +150,8 @@  void usb_display_class_sub(unsigned char dclass, unsigned char subclass,
 
 void usb_display_string(struct usb_device *dev, int index)
 {
-	char buffer[256];
+	ALLOC_CACHE_ALIGN_BUFFER(char, buffer, 256);
+
 	if (index != 0) {
 		if (usb_string(dev, index, &buffer[0], 256) > 0)
 			printf("String: \"%s\"", buffer);
diff --git a/common/usb.c b/common/usb.c
index 1ec30bc..87ffb79 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -169,7 +169,7 @@  int usb_control_msg(struct usb_device *dev, unsigned int pipe,
 			unsigned short value, unsigned short index,
 			void *data, unsigned short size, int timeout)
 {
-	struct devrequest setup_packet;
+	ALLOC_CACHE_ALIGN_BUFFER(struct devrequest, setup_packet, 1);
 
 	if ((timeout == 0) && (!asynch_allowed)) {
 		/* request for a asynch control pipe is not allowed */
@@ -177,17 +177,17 @@  int usb_control_msg(struct usb_device *dev, unsigned int pipe,
 	}
 
 	/* set setup command */
-	setup_packet.requesttype = requesttype;
-	setup_packet.request = request;
-	setup_packet.value = cpu_to_le16(value);
-	setup_packet.index = cpu_to_le16(index);
-	setup_packet.length = cpu_to_le16(size);
+	setup_packet->requesttype = requesttype;
+	setup_packet->request = request;
+	setup_packet->value = cpu_to_le16(value);
+	setup_packet->index = cpu_to_le16(index);
+	setup_packet->length = cpu_to_le16(size);
 	USB_PRINTF("usb_control_msg: request: 0x%X, requesttype: 0x%X, " \
 		   "value 0x%X index 0x%X length 0x%X\n",
 		   request, requesttype, value, index, size);
 	dev->status = USB_ST_NOT_PROC; /*not yet processed */
 
-	submit_control_msg(dev, pipe, data, size, &setup_packet);
+	submit_control_msg(dev, pipe, data, size, setup_packet);
 	if (timeout == 0)
 		return (int)size;
 
@@ -681,7 +681,7 @@  static int usb_string_sub(struct usb_device *dev, unsigned int langid,
  */
 int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
 {
-	unsigned char mybuf[USB_BUFSIZ];
+	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, mybuf, USB_BUFSIZ);
 	unsigned char *tbuf;
 	int err;
 	unsigned int u, idx;
@@ -781,7 +781,7 @@  int usb_new_device(struct usb_device *dev)
 {
 	int addr, err;
 	int tmp;
-	unsigned char tmpbuf[USB_BUFSIZ];
+	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
 
 	/* We still haven't set the Address yet */
 	addr = dev->devnum;
@@ -908,8 +908,8 @@  int usb_new_device(struct usb_device *dev)
 	le16_to_cpus(&dev->descriptor.idProduct);
 	le16_to_cpus(&dev->descriptor.bcdDevice);
 	/* only support for one config for now */
-	usb_get_configuration_no(dev, &tmpbuf[0], 0);
-	usb_parse_config(dev, &tmpbuf[0], 0);
+	usb_get_configuration_no(dev, tmpbuf, 0);
+	usb_parse_config(dev, tmpbuf, 0);
 	usb_set_maxpacket(dev);
 	/* we set the default configuration here */
 	if (usb_set_configuration(dev, dev->config.desc.bConfigurationValue)) {
diff --git a/common/usb_hub.c b/common/usb_hub.c
index e0edaad..f35ad95 100644
--- a/common/usb_hub.c
+++ b/common/usb_hub.c
@@ -153,7 +153,7 @@  int hub_port_reset(struct usb_device *dev, int port,
 			unsigned short *portstat)
 {
 	int tries;
-	struct usb_port_status portsts;
+	ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
 	unsigned short portstatus, portchange;
 
 	USB_HUB_PRINTF("hub_port_reset: resetting port %d...\n", port);
@@ -162,13 +162,13 @@  int hub_port_reset(struct usb_device *dev, int port,
 		usb_set_port_feature(dev, port + 1, USB_PORT_FEAT_RESET);
 		mdelay(200);
 
-		if (usb_get_port_status(dev, port + 1, &portsts) < 0) {
+		if (usb_get_port_status(dev, port + 1, portsts) < 0) {
 			USB_HUB_PRINTF("get_port_status failed status %lX\n",
 					dev->status);
 			return -1;
 		}
-		portstatus = le16_to_cpu(portsts.wPortStatus);
-		portchange = le16_to_cpu(portsts.wPortChange);
+		portstatus = le16_to_cpu(portsts->wPortStatus);
+		portchange = le16_to_cpu(portsts->wPortChange);
 
 		USB_HUB_PRINTF("portstatus %x, change %x, %s\n",
 				portstatus, portchange,
@@ -206,19 +206,19 @@  int hub_port_reset(struct usb_device *dev, int port,
 void usb_hub_port_connect_change(struct usb_device *dev, int port)
 {
 	struct usb_device *usb;
-	struct usb_port_status portsts;
+	ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
 	unsigned short portstatus;
 
 	/* Check status */
-	if (usb_get_port_status(dev, port + 1, &portsts) < 0) {
+	if (usb_get_port_status(dev, port + 1, portsts) < 0) {
 		USB_HUB_PRINTF("get_port_status failed\n");
 		return;
 	}
 
-	portstatus = le16_to_cpu(portsts.wPortStatus);
+	portstatus = le16_to_cpu(portsts->wPortStatus);
 	USB_HUB_PRINTF("portstatus %x, change %x, %s\n",
 			portstatus,
-			le16_to_cpu(portsts.wPortChange),
+			le16_to_cpu(portsts->wPortChange),
 			portspeed(portstatus));
 
 	/* Clear the connection change status */
@@ -267,7 +267,8 @@  void usb_hub_port_connect_change(struct usb_device *dev, int port)
 static int usb_hub_configure(struct usb_device *dev)
 {
 	int i;
-	unsigned char buffer[USB_BUFSIZ], *bitmap;
+	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, USB_BUFSIZ);
+	unsigned char *bitmap;
 	struct usb_hub_descriptor *descriptor;
 	struct usb_hub_device *hub;
 #ifdef USB_HUB_DEBUG
@@ -389,16 +390,16 @@  static int usb_hub_configure(struct usb_device *dev)
 	usb_hub_power_on(hub);
 
 	for (i = 0; i < dev->maxchild; i++) {
-		struct usb_port_status portsts;
+		ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
 		unsigned short portstatus, portchange;
 
-		if (usb_get_port_status(dev, i + 1, &portsts) < 0) {
+		if (usb_get_port_status(dev, i + 1, portsts) < 0) {
 			USB_HUB_PRINTF("get_port_status failed\n");
 			continue;
 		}
 
-		portstatus = le16_to_cpu(portsts.wPortStatus);
-		portchange = le16_to_cpu(portsts.wPortChange);
+		portstatus = le16_to_cpu(portsts->wPortStatus);
+		portchange = le16_to_cpu(portsts->wPortChange);
 		USB_HUB_PRINTF("Port %d Status %X Change %X\n",
 				i + 1, portstatus, portchange);
 
diff --git a/common/usb_storage.c b/common/usb_storage.c
index 1208333..faad237 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -79,8 +79,7 @@  static const unsigned char us_direction[256/8] = {
 };
 #define US_DIRECTION(x) ((us_direction[x>>3] >> (x & 7)) & 1)
 
-static unsigned char usb_stor_buf[512];
-static ccb usb_ccb;
+static ccb usb_ccb __attribute__((aligned(ARCH_DMA_MINALIGN)));
 
 /*
  * CBI style
@@ -210,17 +209,17 @@  int usb_stor_info(void)
 static unsigned int usb_get_max_lun(struct us_data *us)
 {
 	int len;
-	unsigned char result;
+	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, result, 1);
 	len = usb_control_msg(us->pusb_dev,
 			      usb_rcvctrlpipe(us->pusb_dev, 0),
 			      US_BBB_GET_MAX_LUN,
 			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
 			      0, us->ifnum,
-			      &result, sizeof(result),
+			      result, sizeof(char),
 			      USB_CNTL_TIMEOUT * 5);
 	USB_STOR_PRINTF("Get Max LUN -> len = %i, result = %i\n",
-			len, (int) result);
-	return (len > 0) ? result : 0;
+			len, (int) *result);
+	return (len > 0) ? *result : 0;
 }
 
 /*******************************************************************************
@@ -233,9 +232,6 @@  int usb_stor_scan(int mode)
 	unsigned char i;
 	struct usb_device *dev;
 
-	/* GJ */
-	memset(usb_stor_buf, 0, sizeof(usb_stor_buf));
-
 	if (mode == 1)
 		printf("       scanning bus for storage devices... ");
 
@@ -499,7 +495,7 @@  int usb_stor_BBB_comdat(ccb *srb, struct us_data *us)
 	int actlen;
 	int dir_in;
 	unsigned int pipe;
-	umass_bbb_cbw_t cbw;
+	ALLOC_CACHE_ALIGN_BUFFER(umass_bbb_cbw_t, cbw, 1);
 
 	dir_in = US_DIRECTION(srb->cmd[0]);
 
@@ -522,16 +518,16 @@  int usb_stor_BBB_comdat(ccb *srb, struct us_data *us)
 	/* always OUT to the ep */
 	pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
 
-	cbw.dCBWSignature = cpu_to_le32(CBWSIGNATURE);
-	cbw.dCBWTag = cpu_to_le32(CBWTag++);
-	cbw.dCBWDataTransferLength = cpu_to_le32(srb->datalen);
-	cbw.bCBWFlags = (dir_in ? CBWFLAGS_IN : CBWFLAGS_OUT);
-	cbw.bCBWLUN = srb->lun;
-	cbw.bCDBLength = srb->cmdlen;
+	cbw->dCBWSignature = cpu_to_le32(CBWSIGNATURE);
+	cbw->dCBWTag = cpu_to_le32(CBWTag++);
+	cbw->dCBWDataTransferLength = cpu_to_le32(srb->datalen);
+	cbw->bCBWFlags = (dir_in ? CBWFLAGS_IN : CBWFLAGS_OUT);
+	cbw->bCBWLUN = srb->lun;
+	cbw->bCDBLength = srb->cmdlen;
 	/* copy the command data into the CBW command data buffer */
 	/* DST SRC LEN!!! */
-	memcpy(cbw.CBWCDB, srb->cmd, srb->cmdlen);
-	result = usb_bulk_msg(us->pusb_dev, pipe, &cbw, UMASS_BBB_CBW_SIZE,
+	memcpy(cbw->CBWCDB, srb->cmd, srb->cmdlen);
+	result = usb_bulk_msg(us->pusb_dev, pipe, cbw, UMASS_BBB_CBW_SIZE,
 			      &actlen, USB_CNTL_TIMEOUT * 5);
 	if (result < 0)
 		USB_STOR_PRINTF("usb_stor_BBB_comdat:usb_bulk_msg error\n");
@@ -675,7 +671,7 @@  int usb_stor_BBB_transport(ccb *srb, struct us_data *us)
 	int dir_in;
 	int actlen, data_actlen;
 	unsigned int pipe, pipein, pipeout;
-	umass_bbb_csw_t csw;
+	ALLOC_CACHE_ALIGN_BUFFER(umass_bbb_csw_t, csw, 1);
 #ifdef BBB_XPORT_TRACE
 	unsigned char *ptr;
 	int index;
@@ -733,7 +729,7 @@  st:
 	retry = 0;
 again:
 	USB_STOR_PRINTF("STATUS phase\n");
-	result = usb_bulk_msg(us->pusb_dev, pipein, &csw, UMASS_BBB_CSW_SIZE,
+	result = usb_bulk_msg(us->pusb_dev, pipein, csw, UMASS_BBB_CSW_SIZE,
 				&actlen, USB_CNTL_TIMEOUT*5);
 
 	/* special handling of STALL in STATUS phase */
@@ -753,28 +749,28 @@  again:
 		return USB_STOR_TRANSPORT_FAILED;
 	}
 #ifdef BBB_XPORT_TRACE
-	ptr = (unsigned char *)&csw;
+	ptr = (unsigned char *)csw;
 	for (index = 0; index < UMASS_BBB_CSW_SIZE; index++)
 		printf("ptr[%d] %#x ", index, ptr[index]);
 	printf("\n");
 #endif
 	/* misuse pipe to get the residue */
-	pipe = le32_to_cpu(csw.dCSWDataResidue);
+	pipe = le32_to_cpu(csw->dCSWDataResidue);
 	if (pipe == 0 && srb->datalen != 0 && srb->datalen - data_actlen != 0)
 		pipe = srb->datalen - data_actlen;
-	if (CSWSIGNATURE != le32_to_cpu(csw.dCSWSignature)) {
+	if (CSWSIGNATURE != le32_to_cpu(csw->dCSWSignature)) {
 		USB_STOR_PRINTF("!CSWSIGNATURE\n");
 		usb_stor_BBB_reset(us);
 		return USB_STOR_TRANSPORT_FAILED;
-	} else if ((CBWTag - 1) != le32_to_cpu(csw.dCSWTag)) {
+	} else if ((CBWTag - 1) != le32_to_cpu(csw->dCSWTag)) {
 		USB_STOR_PRINTF("!Tag\n");
 		usb_stor_BBB_reset(us);
 		return USB_STOR_TRANSPORT_FAILED;
-	} else if (csw.bCSWStatus > CSWSTATUS_PHASE) {
+	} else if (csw->bCSWStatus > CSWSTATUS_PHASE) {
 		USB_STOR_PRINTF(">PHASE\n");
 		usb_stor_BBB_reset(us);
 		return USB_STOR_TRANSPORT_FAILED;
-	} else if (csw.bCSWStatus == CSWSTATUS_PHASE) {
+	} else if (csw->bCSWStatus == CSWSTATUS_PHASE) {
 		USB_STOR_PRINTF("=PHASE\n");
 		usb_stor_BBB_reset(us);
 		return USB_STOR_TRANSPORT_FAILED;
@@ -782,7 +778,7 @@  again:
 		USB_STOR_PRINTF("transferred %dB instead of %ldB\n",
 			data_actlen, srb->datalen);
 		return USB_STOR_TRANSPORT_FAILED;
-	} else if (csw.bCSWStatus == CSWSTATUS_FAILED) {
+	} else if (csw->bCSWStatus == CSWSTATUS_FAILED) {
 		USB_STOR_PRINTF("FAILED\n");
 		return USB_STOR_TRANSPORT_FAILED;
 	}
@@ -1343,7 +1339,8 @@  int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
 		      block_dev_desc_t *dev_desc)
 {
 	unsigned char perq, modi;
-	unsigned long cap[2];
+	ALLOC_CACHE_ALIGN_BUFFER(unsigned long, cap, 2);
+	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, usb_stor_buf, 36);
 	unsigned long *capacity, *blksz;
 	ccb *pccb = &usb_ccb;
 
@@ -1367,9 +1364,9 @@  int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
 		/* drive is removable */
 		dev_desc->removable = 1;
 	}
-	memcpy(&dev_desc->vendor[0], &usb_stor_buf[8], 8);
-	memcpy(&dev_desc->product[0], &usb_stor_buf[16], 16);
-	memcpy(&dev_desc->revision[0], &usb_stor_buf[32], 4);
+	memcpy(&dev_desc->vendor[0], (const void *) &usb_stor_buf[8], 8);
+	memcpy(&dev_desc->product[0], (const void *) &usb_stor_buf[16], 16);
+	memcpy(&dev_desc->revision[0], (const void *) &usb_stor_buf[32], 4);
 	dev_desc->vendor[8] = 0;
 	dev_desc->product[16] = 0;
 	dev_desc->revision[4] = 0;
diff --git a/disk/part_dos.c b/disk/part_dos.c
index b5bcb37..70211ee 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -87,7 +87,7 @@  static int test_block_type(unsigned char *buffer)
 
 int test_part_dos (block_dev_desc_t *dev_desc)
 {
-	unsigned char buffer[dev_desc->blksz];
+	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
 
 	if ((dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1) ||
 	    (buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) ||
diff --git a/include/scsi.h b/include/scsi.h
index c52759c..89ae45f 100644
--- a/include/scsi.h
+++ b/include/scsi.h
@@ -26,7 +26,9 @@ 
 
 typedef struct SCSI_cmd_block{
 	unsigned char		cmd[16];					/* command				   */
-	unsigned char		sense_buf[64];		/* for request sense */
+	/* for request sense */
+	unsigned char		sense_buf[64]
+		__attribute__((aligned(ARCH_DMA_MINALIGN)));
 	unsigned char		status;						/* SCSI Status			 */
 	unsigned char		target;						/* Target ID				 */
 	unsigned char		lun;							/* Target LUN        */
diff --git a/include/usb.h b/include/usb.h
index 48e4bcd..6da91e7 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -109,7 +109,9 @@  struct usb_device {
 	int epmaxpacketout[16];		/* OUTput endpoint specific maximums */
 
 	int configno;			/* selected config number */
-	struct usb_device_descriptor descriptor; /* Device Descriptor */
+	/* Device Descriptor */
+	struct usb_device_descriptor descriptor
+		__attribute__((aligned(ARCH_DMA_MINALIGN)));
 	struct usb_config config; /* config descriptor */
 
 	int have_langid;		/* whether string_langid is valid yet */