From patchwork Wed Apr 1 14:18:46 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Temerkhanov X-Patchwork-Id: 457266 X-Patchwork-Delegate: marek.vasut@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 7C1E21400A0 for ; Thu, 2 Apr 2015 01:17:58 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="verification failed; unprotected key" header.d=gmail.com header.i=@gmail.com header.b=XO6TWd4b; dkim-adsp=none (unprotected policy); dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 9A86CA743F; Wed, 1 Apr 2015 16:17:49 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id EVryVlChjdPH; Wed, 1 Apr 2015 16:17:49 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 7948EA7435; Wed, 1 Apr 2015 16:17:42 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 19576A7435 for ; Wed, 1 Apr 2015 16:17:36 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id rEg-tWfcB7zj for ; Wed, 1 Apr 2015 16:17:36 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-la0-f49.google.com (mail-la0-f49.google.com [209.85.215.49]) by theia.denx.de (Postfix) with ESMTPS id 4A9BAA7433 for ; Wed, 1 Apr 2015 16:17:31 +0200 (CEST) Received: by lahf3 with SMTP id f3so37228912lah.2 for ; Wed, 01 Apr 2015 07:17:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=b5adR0dUutiUtKw30CMxI1z/66q7LfYYyDBtDF6Xco8=; b=XO6TWd4bQ0jaHPov+B+MU26TSZ8mIf7DJuSxDW3HmZrFnBZhKq67W9Q3LG1mVYoWFS oI2ylLuu0qH+11eUrdYXzzJwOkauUOepMgPw721XotiJRyStXM3jJrR0n2b5NPeWUwPK dkU8vJf3QI12+dQ+X9ryvVhyUjEEpMFJHTKTG4SSwRoYW/zjKGa5EStbK85T7t3GAjeE UVPR8sYLM8UxV0zf0mBtgidiaTUceVAIYrfHdl13EUFrv8nIMzmXroUDrMGg/NhiR7BV nTjqkoJUsMY1NeJOjlZ8+0fwyD314NlSrQoDPW7NbN++Tr7L7T+03Wxtcc98p+9FkcpE +dzw== X-Received: by 10.112.29.36 with SMTP id g4mr28107579lbh.56.1427897851496; Wed, 01 Apr 2015 07:17:31 -0700 (PDT) Received: from snickers.office.auriga.msk ([81.19.133.99]) by mx.google.com with ESMTPSA id zo8sm441709lbc.37.2015.04.01.07.17.30 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 01 Apr 2015 07:17:30 -0700 (PDT) From: Sergey Temerkhanov To: u-boot@lists.denx.de, marex@denx.de Date: Wed, 1 Apr 2015 17:18:46 +0300 Message-Id: <1427897926-2739-4-git-send-email-s.temerkhanov@gmail.com> X-Mailer: git-send-email 2.2.0 In-Reply-To: <1427897926-2739-1-git-send-email-s.temerkhanov@gmail.com> References: <1427897926-2739-1-git-send-email-s.temerkhanov@gmail.com> Cc: Radha Mohan Chintakuntla Subject: [U-Boot] [PATCH 3/3] usb_storage:Fix USB storage capacity detection on 64 bit architectures X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This patch fixes USB storage capacity detection breakage on 64-bit systems which arises due to 'unsigned long' length difference. Old code assumes that to be 32 bit and breaks because of inappropriate response buffer layout. Also this fixes a number of build warnings and changes big-endian values treatment style to be architecture-independent Signed-off-by: Sergey Temerkhanov Signed-off-by: Radha Mohan Chintakuntla --- common/usb_storage.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/common/usb_storage.c b/common/usb_storage.c index 1411737..a1dfc58 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -336,8 +336,8 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length) /* set up the transfer loop */ do { /* transfer the data */ - debug("Bulk xfer 0x%x(%d) try #%d\n", - (unsigned int)buf, this_xfer, 11 - maxtry); + debug("Bulk xfer %p(%d) try #%d\n", + buf, this_xfer, 11 - maxtry); result = usb_bulk_msg(us->pusb_dev, pipe, buf, this_xfer, &partial, USB_CNTL_TIMEOUT * 5); @@ -514,6 +514,7 @@ static int usb_stor_BBB_comdat(ccb *srb, struct us_data *us) 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, &actlen, USB_CNTL_TIMEOUT * 5); @@ -603,7 +604,7 @@ static int usb_stor_CBI_get_status(ccb *srb, struct us_data *us) (void *) &us->ip_data, us->irqmaxp, us->irqinterval); timeout = 1000; while (timeout--) { - if ((volatile int *) us->ip_wanted == NULL) + if (us->ip_wanted == 0) break; mdelay(10); } @@ -689,6 +690,7 @@ static int usb_stor_BBB_transport(ccb *srb, struct us_data *us) pipe = pipein; else pipe = pipeout; + result = usb_bulk_msg(us->pusb_dev, pipe, srb->pdata, srb->datalen, &data_actlen, USB_CNTL_TIMEOUT * 5); /* special handling of STALL in DATA phase */ @@ -1067,7 +1069,7 @@ unsigned long usb_stor_read(int device, lbaint_t blknr, usb_disable_asynch(1); /* asynch transfer not allowed */ srb->lun = usb_dev_desc[device].lun; - buf_addr = (unsigned long)buffer; + buf_addr = (uintptr_t)buffer; start = blknr; blks = blkcnt; @@ -1141,7 +1143,7 @@ unsigned long usb_stor_write(int device, lbaint_t blknr, usb_disable_asynch(1); /* asynch transfer not allowed */ srb->lun = usb_dev_desc[device].lun; - buf_addr = (unsigned long)buffer; + buf_addr = (uintptr_t)buffer; start = blknr; blks = blkcnt; @@ -1334,9 +1336,9 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss, block_dev_desc_t *dev_desc) { unsigned char perq, modi; - ALLOC_CACHE_ALIGN_BUFFER(unsigned long, cap, 2); - ALLOC_CACHE_ALIGN_BUFFER(unsigned char, usb_stor_buf, 36); - unsigned long *capacity, *blksz; + ALLOC_CACHE_ALIGN_BUFFER(u32, cap, 2); + ALLOC_CACHE_ALIGN_BUFFER(u8, usb_stor_buf, 36); + u32 capacity, blksz; ccb *pccb = &usb_ccb; pccb->pdata = usb_stor_buf; @@ -1362,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], (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); + memcpy(dev_desc->vendor, (const void *)&usb_stor_buf[8], 8); + memcpy(dev_desc->product, (const void *)&usb_stor_buf[16], 16); + memcpy(dev_desc->revision, (const void *)&usb_stor_buf[32], 4); dev_desc->vendor[8] = 0; dev_desc->product[16] = 0; dev_desc->revision[4] = 0; @@ -1385,7 +1387,7 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss, } return 0; } - pccb->pdata = (unsigned char *)&cap[0]; + pccb->pdata = (unsigned char *)cap; memset(pccb->pdata, 0, 8); if (usb_read_capacity(pccb, ss) != 0) { printf("READ_CAP ERROR\n"); @@ -1393,21 +1395,21 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss, cap[1] = 0x200; } ss->flags &= ~USB_READY; - debug("Read Capacity returns: 0x%lx, 0x%lx\n", cap[0], cap[1]); + debug("Read Capacity returns: 0x%08x, 0x%08x\n", cap[0], cap[1]); #if 0 if (cap[0] > (0x200000 * 10)) /* greater than 10 GByte */ cap[0] >>= 16; -#endif + cap[0] = cpu_to_be32(cap[0]); cap[1] = cpu_to_be32(cap[1]); +#endif + + capacity = be32_to_cpu(cap[0]) + 1; + blksz = be32_to_cpu(cap[1]); - /* this assumes bigendian! */ - cap[0] += 1; - capacity = &cap[0]; - blksz = &cap[1]; - debug("Capacity = 0x%lx, blocksz = 0x%lx\n", *capacity, *blksz); - dev_desc->lba = *capacity; - dev_desc->blksz = *blksz; + debug("Capacity = 0x%08x, blocksz = 0x%08x\n", capacity, blksz); + dev_desc->lba = capacity; + dev_desc->blksz = blksz; dev_desc->log2blksz = LOG2(dev_desc->blksz); dev_desc->type = perq; debug(" address %d\n", dev_desc->target);