diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-07-01 13:46:34 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-07-01 13:46:34 +0000 |
commit | 6e09d7aab47a47e36f56d9b33bd6e87e96e2af2c (patch) | |
tree | d441b9c13a08c4cf3e8ddb63b3f0898d6c7516d1 /nuttx | |
parent | 1e3a9d906b5b4b8578bba4e4cf3a7b84de85ce46 (diff) | |
download | px4-nuttx-6e09d7aab47a47e36f56d9b33bd6e87e96e2af2c.tar.gz px4-nuttx-6e09d7aab47a47e36f56d9b33bd6e87e96e2af2c.tar.bz2 px4-nuttx-6e09d7aab47a47e36f56d9b33bd6e87e96e2af2c.zip |
Add bugfixes recommended by Sheref Younan
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3737 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/ChangeLog | 8 | ||||
-rw-r--r-- | nuttx/drivers/usbhost/usbhost_storage.c | 15 |
2 files changed, 20 insertions, 3 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 31d8d81d8..51b317e0a 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -1833,5 +1833,11 @@ * drivers/mtd/ramtron.c, net/net_checksd.c, fs/fs_fdopen.c, and include/nuttx/mii.h: Several structural changes made to get a clean compile under the ez80 ZDS-II - toolchain (no design changes). + toolchain (no design changes). + * drivers/usbhost/usbhost_storage.c: Incorpated bugfixes reported by Sheref H. + Younan: (1) Read capacity logic read largest block, not the number of blocks + and was, therefore, off by one, and (2) Some devices stall of get Max LUN request + if they support only a single LUN. Logic now assumes a single LUN if the get + Max LUN request fails. + diff --git a/nuttx/drivers/usbhost/usbhost_storage.c b/nuttx/drivers/usbhost/usbhost_storage.c index b2a6d8543..8f5864b6d 100644 --- a/nuttx/drivers/usbhost/usbhost_storage.c +++ b/nuttx/drivers/usbhost/usbhost_storage.c @@ -669,6 +669,7 @@ static inline int usbhost_maxlunreq(FAR struct usbhost_state_s *priv) { FAR struct usb_ctrlreq_s *req = (FAR struct usb_ctrlreq_s *)priv->tbuffer; DEBUGASSERT(priv && priv->tbuffer); + int ret; /* Request maximum logical unit number. NOTE: On an IN transaction, The * req and buffer pointers passed to DRVR_CTRLIN may refer to the same @@ -680,7 +681,17 @@ static inline int usbhost_maxlunreq(FAR struct usbhost_state_s *priv) req->type = USB_DIR_IN|USB_REQ_TYPE_CLASS|USB_REQ_RECIPIENT_INTERFACE; req->req = USBSTRG_REQ_GETMAXLUN; usbhost_putle16(req->len, 1); - return DRVR_CTRLIN(priv->drvr, req, priv->tbuffer); + + ret = DRVR_CTRLIN(priv->drvr, req, priv->tbuffer); + if (ret != OK) + { + /* Devices that do not support multiple LUNs may stall this command. + * On a failure, a single LUN is assumed. + */ + + *(priv->tbuffer) = 0; + } + return OK; } static inline int usbhost_testunitready(FAR struct usbhost_state_s *priv) @@ -788,7 +799,7 @@ static inline int usbhost_readcapacity(FAR struct usbhost_state_s *priv) /* Save the capacity information */ resp = (FAR struct scsiresp_readcapacity10_s *)priv->tbuffer; - priv->nblocks = usbhost_getbe32(resp->lba); + priv->nblocks = usbhost_getbe32(resp->lba) + 1; priv->blocksize = usbhost_getbe32(resp->blklen); /* Receive the CSW */ |