diff options
| author | Puneet Saxena <puneets@nvidia.com> | 2012-04-03 14:56:06 +0530 | 
|---|---|---|
| committer | Marek Vasut <marex@denx.de> | 2012-05-20 08:32:32 +0200 | 
| commit | f57661394a8b00029e37a5567a869e92bd13f3b8 (patch) | |
| tree | d00363f82c23324c8e69353c7bfb38ae183c803c /common | |
| parent | 66cf64107b891d1cc8112ff76b5687195af2f5b0 (diff) | |
| download | olio-uboot-2014.01-f57661394a8b00029e37a5567a869e92bd13f3b8.tar.xz olio-uboot-2014.01-f57661394a8b00029e37a5567a869e92bd13f3b8.zip | |
USB: Align buffers at cacheline
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>
Signed-off-by: Marek Vasut <marex@denx.de>
Diffstat (limited to 'common')
| -rw-r--r-- | common/cmd_usb.c | 3 | ||||
| -rw-r--r-- | common/usb.c | 22 | ||||
| -rw-r--r-- | common/usb_hub.c | 27 | ||||
| -rw-r--r-- | common/usb_storage.c | 59 | 
4 files changed, 55 insertions, 56 deletions
| diff --git a/common/cmd_usb.c b/common/cmd_usb.c index 9eba2713e..a8e3ae5b6 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 71b4b2b2c..c80155ce7 100644 --- a/common/usb.c +++ b/common/usb.c @@ -170,7 +170,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 */ @@ -178,17 +178,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; @@ -682,7 +682,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; @@ -782,7 +782,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; @@ -909,8 +909,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 e0edaad56..f35ad9532 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 12083337b..faad23706 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; |