Dear Puneet Saxena,

I replaced the old patch with this one. Thanks!

> As DMA expects the buffers to be equal and larger then
> cache lines, This aligns buffers at cacheline.
> 
> Signed-off-by: Puneet Saxena <pune...@nvidia.com>
> ---
> 
> 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                |   49 ++++++++++++++++++-----------------
>  common/usb_storage.c        |   59
> ++++++++++++++++++++---------------------- disk/part_dos.c             |  
>  2 +-
>  drivers/usb/host/ehci-hcd.c |    8 ++++++
>  include/scsi.h              |    4 ++-
>  include/usb.h               |    4 ++-
>  7 files changed, 70 insertions(+), 59 deletions(-)
> 
> diff --git a/common/cmd_usb.c b/common/cmd_usb.c
> index 320667f..bca9d94 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 6e21ae2..e3db7bc 100644
> --- a/common/usb.c
> +++ b/common/usb.c
> @@ -73,7 +73,6 @@ static struct usb_device usb_dev[USB_MAX_DEVICE];
>  static int dev_index;
>  static int running;
>  static int asynch_allowed;
> -static struct devrequest setup_packet;
> 
>  char usb_started; /* flag for the started/stopped USB status */
> 
> @@ -185,23 +184,24 @@ int usb_control_msg(struct usb_device *dev, unsigned
> int pipe, unsigned short value, unsigned short index,
>                       void *data, unsigned short size, int timeout)
>  {
> +     ALLOC_CACHE_ALIGN_BUFFER(struct devrequest, setup_packet, 1);
>       if ((timeout == 0) && (!asynch_allowed)) {
>               /* request for a asynch control pipe is not allowed */
>               return -1;
>       }
> 
>       /* 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;
> 
> @@ -698,7 +698,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;
> @@ -798,7 +798,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;
> @@ -925,8 +925,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)) {
> @@ -1080,7 +1080,7 @@ static 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);
> @@ -1089,13 +1089,13 @@ static int hub_port_reset(struct usb_device *dev,
> int port, usb_set_port_feature(dev, port + 1, USB_PORT_FEAT_RESET);
>               wait_ms(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,
> @@ -1133,19 +1133,19 @@ static 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 */
> @@ -1194,7 +1194,8 @@ void usb_hub_port_connect_change(struct usb_device
> *dev, int port) 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
> @@ -1316,16 +1317,16 @@ 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 de84c8d..88ca390 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/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index d893b2a..eb5220b 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -120,6 +120,14 @@ static struct descriptor {
>   */
>  static void flush_invalidate(u32 addr, int size, int flush)
>  {
> +     /*
> +      * Size is the bytes actually moved during transaction,
> +      * which may not equal to the cache line. This results
> +      * stop address passed for invalidating cache may not be aligned.
> +      * Therfore making size as multiple of cache line size.
> +      */
> +     size = ALIGN(size, ARCH_DMA_MINALIGN);
> +
>       if (flush)
>               flush_dcache_range(addr, addr + size);
>       else
> 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 06170cd..5f4f110 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 */
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to