diff --git a/drivers/usbdev/cdcacm.c b/drivers/usbdev/cdcacm.c index a373cc5a05f..f30d8663f90 100644 --- a/drivers/usbdev/cdcacm.c +++ b/drivers/usbdev/cdcacm.c @@ -593,10 +593,10 @@ static int cdcacm_recvpacket(FAR struct cdcacm_dev_s *priv, * control when there are no watermarks. */ - if (nexthead == recv->tail) - { - cdcuart_rxflowcontrol(&priv->serdev, recv->size - 1, true); - } + if (nexthead == recv->tail) + { + cdcuart_rxflowcontrol(&priv->serdev, recv->size - 1, true); + } #endif /* If data was added to the incoming serial buffer, then wake up any @@ -918,6 +918,7 @@ static int cdcacm_serialstate(FAR struct cdcacm_dev_s *priv) } errout_with_flags: + /* Reset all of the "irregular" notification */ priv->serialstate &= CDC_UART_CONSISTENT; @@ -1177,7 +1178,7 @@ static void cdcacm_rdcomplete(FAR struct usbdev_ep_s *ep, { usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract references to private data */ @@ -1253,7 +1254,7 @@ static void cdcacm_wrcomplete(FAR struct usbdev_ep_s *ep, { usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract references to our private data */ @@ -1502,7 +1503,7 @@ static void cdcacm_unbind(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -1631,7 +1632,7 @@ static int cdcacm_setup(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); return -EINVAL; - } + } #endif /* Extract reference to private data */ @@ -1715,7 +1716,7 @@ static int cdcacm_setup(FAR struct usbdevclass_driver_s *driver, { #ifdef CONFIG_USBDEV_DUALSPEED ret = cdcacm_mkcfgdesc(ctrlreq->buf, &priv->devinfo, - dev->speed, ctrl->req); + dev->speed, ctrl->value[1]); #else ret = cdcacm_mkcfgdesc(ctrlreq->buf, &priv->devinfo); #endif @@ -2030,7 +2031,7 @@ static void cdcacm_disconnect(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -2094,7 +2095,7 @@ static void cdcacm_suspend(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -2128,7 +2129,7 @@ static void cdcacm_resume(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -2304,7 +2305,7 @@ static int cdcuart_ioctl(FAR struct file *filep, int cmd, unsigned long arg) * called to get the data associated CDCACM_EVENT_CTRLLINE event. */ - case CAIOC_GETCTRLLINE: + case CAIOC_GETCTRLLINE: { FAR int *ptr = (FAR int *)((uintptr_t)arg); if (ptr != NULL) @@ -2356,6 +2357,7 @@ static int cdcuart_ioctl(FAR struct file *filep, int cmd, unsigned long arg) #ifdef CONFIG_CDCACM_OFLOWCONTROL /* Report state of output flow control */ + # warning Missing logic #endif #ifdef CONFIG_CDCACM_IFLOWCONTROL @@ -2387,6 +2389,7 @@ static int cdcuart_ioctl(FAR struct file *filep, int cmd, unsigned long arg) #ifdef CONFIG_CDCACM_OFLOWCONTROL /* Handle changes to output flow control */ + # warning Missing logic #endif @@ -2422,7 +2425,6 @@ static int cdcuart_ioctl(FAR struct file *filep, int cmd, unsigned long arg) */ cdcacm_release_rxpending(priv); - } /* Flow control has been enabled. */ @@ -2671,8 +2673,8 @@ static bool cdcuart_rxflowcontrol(FAR struct uart_dev_s *dev, #ifdef CONFIG_DEBUG_FEATURES if (dev == NULL || dev->priv == NULL) { - usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); - return false; + usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0); + return false; } #endif @@ -2990,7 +2992,7 @@ int cdcacm_classobject(int minor, FAR struct usbdev_devinfo_s *devinfo, /* Register the CDC/ACM TTY device */ - sprintf(devname, CDCACM_DEVNAME_FORMAT, minor); + snprintf(devname, CDCACM_DEVNAME_SIZE, CDCACM_DEVNAME_FORMAT, minor); ret = uart_register(devname, &priv->serdev); if (ret < 0) { @@ -3145,7 +3147,7 @@ void cdcacm_uninitialize(FAR void *handle) /* Un-register the CDC/ACM TTY device */ - sprintf(devname, CDCACM_DEVNAME_FORMAT, priv->minor); + snprintf(devname, CDCACM_DEVNAME_SIZE, CDCACM_DEVNAME_FORMAT, priv->minor); ret = unregister_driver(devname); if (ret < 0) { diff --git a/drivers/usbdev/cdcacm.h b/drivers/usbdev/cdcacm.h index 2b151b401d5..aecfd3bb05e 100644 --- a/drivers/usbdev/cdcacm.h +++ b/drivers/usbdev/cdcacm.h @@ -51,7 +51,9 @@ /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ + /* Configuration ************************************************************/ + /* If the serial device is configured as part of a composite device than both * CONFIG_USBDEV_COMPOSITE and CONFIG_CDCACM_COMPOSITE must be defined. */ @@ -61,7 +63,7 @@ #endif #if defined(CONFIG_CDCACM_COMPOSITE) && !defined(CONFIG_CDCACM_STRBASE) -# define CONFIG_CDCACM_STRBASE (4) +# define CONFIG_CDCACM_STRBASE (0) #endif #if defined(CONFIG_CDCACM_COMPOSITE) && !defined(CONFIG_COMPOSITE_IAD) @@ -90,6 +92,7 @@ #endif /* Descriptors **************************************************************/ + /* These settings are not modifiable via the NuttX configuration */ #define CDC_VERSIONNO 0x0110 /* CDC version number 1.10 (BCD) */ @@ -169,6 +172,7 @@ #define CDCACM_EPINBULK_ATTR (USB_EP_ATTR_XFER_BULK) /* Device driver definitions ************************************************/ + /* A CDC/ACM device is specific by a minor number in the range of 0-255. * This maps to a character device at /dev/ttyACMx, x=0..255. */ @@ -177,6 +181,7 @@ #define CDCACM_DEVNAME_SIZE 16 /* Misc Macros **************************************************************/ + /* MIN/MAX macros */ #ifndef MIN diff --git a/drivers/usbdev/cdcacm_desc.c b/drivers/usbdev/cdcacm_desc.c index 6e97a1dca2d..ed8c7545581 100644 --- a/drivers/usbdev/cdcacm_desc.c +++ b/drivers/usbdev/cdcacm_desc.c @@ -58,6 +58,7 @@ ****************************************************************************/ /* USB descriptor templates these will be copied and modified **************/ + /* Device Descriptor. If the USB serial device is configured as part of * composite device, then the device descriptor will be provided by the * composite device logic. @@ -182,27 +183,27 @@ int cdcacm_mkstrdesc(uint8_t id, struct usb_strdesc_s *strdesc) return -EINVAL; } - /* The string is utf16-le. The poor man's utf-8 to utf16-le - * conversion below will only handle 7-bit en-us ascii - */ + /* The string is utf16-le. The poor man's utf-8 to utf16-le + * conversion below will only handle 7-bit en-us ascii + */ - len = strlen(str); - if (len > (CDCACM_MAXSTRLEN / 2)) - { - len = (CDCACM_MAXSTRLEN / 2); - } + len = strlen(str); + if (len > (CDCACM_MAXSTRLEN / 2)) + { + len = (CDCACM_MAXSTRLEN / 2); + } - for (i = 0, ndata = 0; i < len; i++, ndata += 2) - { - strdesc->data[ndata] = str[i]; - strdesc->data[ndata+1] = 0; - } + for (i = 0, ndata = 0; i < len; i++, ndata += 2) + { + strdesc->data[ndata] = str[i]; + strdesc->data[ndata + 1] = 0; + } - strdesc->len = ndata+2; - strdesc->type = USB_DESC_TYPE_STRING; - return strdesc->len; + strdesc->len = ndata + 2; + strdesc->type = USB_DESC_TYPE_STRING; + return strdesc->len; #else - return -EINVAL; + return -EINVAL; #endif } @@ -388,7 +389,11 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, #endif dest->len = USB_SIZEOF_CFGDESC; /* Descriptor length */ +#ifdef CONFIG_USBDEV_DUALSPEED + dest->type = type; /* Descriptor type */ +#else dest->type = USB_DESC_TYPE_CONFIG; /* Descriptor type */ +#endif dest->totallen[0] = LSBYTE(size); /* LS Total length */ dest->totallen[1] = MSBYTE(size); /* MS Total length */ dest->ninterfaces = CDCACM_NINTERFACES; /* Number of interfaces */ @@ -515,7 +520,8 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, if (buf != NULL) { - FAR struct cdc_callmgmt_funcdesc_s *dest = (FAR struct cdc_callmgmt_funcdesc_s *)buf; + FAR struct cdc_callmgmt_funcdesc_s *dest = + (FAR struct cdc_callmgmt_funcdesc_s *)buf; dest->size = SIZEOF_CALLMGMT_FUNCDESC; /* Descriptor length */ dest->type = USB_DESC_TYPE_CSINTERFACE; /* Descriptor type */ @@ -532,7 +538,9 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, if (buf != NULL) { - cdcacm_copy_epdesc(CDCACM_EPINTIN, (struct usb_epdesc_s *)buf, devinfo, hispeed); + cdcacm_copy_epdesc(CDCACM_EPINTIN, (struct usb_epdesc_s *)buf, + devinfo, + hispeed); buf += USB_SIZEOF_EPDESC; } @@ -568,7 +576,9 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, if (buf != NULL) { - cdcacm_copy_epdesc(CDCACM_EPBULKOUT, (struct usb_epdesc_s *)buf, devinfo, hispeed); + cdcacm_copy_epdesc(CDCACM_EPBULKOUT, (struct usb_epdesc_s *)buf, + devinfo, + hispeed); buf += USB_SIZEOF_EPDESC; } @@ -578,7 +588,9 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, if (buf != NULL) { - cdcacm_copy_epdesc(CDCACM_EPBULKIN, (struct usb_epdesc_s *)buf, devinfo, hispeed); + cdcacm_copy_epdesc(CDCACM_EPBULKIN, (struct usb_epdesc_s *)buf, + devinfo, + hispeed); buf += USB_SIZEOF_EPDESC; } diff --git a/drivers/usbdev/composite.c b/drivers/usbdev/composite.c index 915700a983f..945cbe7906a 100644 --- a/drivers/usbdev/composite.c +++ b/drivers/usbdev/composite.c @@ -243,10 +243,10 @@ static int composite_msftdescriptor(FAR struct composite_dev_s *priv, size_t total_len = sizeof(struct usb_msft_os_feature_desc_s) + (response->count - 1) * sizeof(struct usb_msft_os_function_desc_s); - response->len[0] = (total_len >> 0) & 0xFF; - response->len[1] = (total_len >> 8) & 0xFF; - response->len[2] = (total_len >> 16) & 0xFF; - response->len[3] = (total_len >> 24) & 0xFF; + response->len[0] = (total_len >> 0) & 0xff; + response->len[1] = (total_len >> 8) & 0xff; + response->len[2] = (total_len >> 16) & 0xff; + response->len[3] = (total_len >> 24) & 0xff; response->version[1] = 0x01; response->index[0] = MSFTOSDESC_INDEX_FUNCTION; @@ -265,7 +265,7 @@ static int composite_msftdescriptor(FAR struct composite_dev_s *priv, * a bit incorrect here, the interface is in ctrl->value low byte. * Also WinUSB driver has limitation that index[0] will not be correct if * trying to read descriptors using e.g. libusb xusb.exe. - */ + */ uint8_t interface = ctrl->value[0]; int ret = -ENOTSUP; @@ -281,7 +281,7 @@ static int composite_msftdescriptor(FAR struct composite_dev_s *priv, *dispatched = true; break; } - } + } return ret; } @@ -437,7 +437,7 @@ static void composite_unbind(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -507,7 +507,7 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_SETUPINVALIDARGS), 0); return -EIO; - } + } #endif /* Extract a reference to private data */ @@ -588,7 +588,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, /* value == string index. Zero is the language ID. */ uint8_t strid = ctrl->value[0]; - FAR struct usb_strdesc_s *buf = (FAR struct usb_strdesc_s *)ctrlreq->buf; + FAR struct usb_strdesc_s *buf = + (FAR struct usb_strdesc_s *)ctrlreq->buf; if (strid < COMPOSITE_NSTRIDS) { @@ -604,7 +605,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, static const uint8_t msft_response[16] = { - 'M', 0, 'S', 0, 'F', 0, 'T', 0, '1', 0, '0', 0, '0', 0, 0xEE, 0 + 'M', 0, 'S', 0, 'F', 0, 'T', 0, '1', 0, '0', 0, '0', 0, + 0xff, 0 }; buf->len = 18; @@ -619,8 +621,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, for (i = 0; i < priv->ndevices; i++) { - if (strid >= priv->device[i].compdesc.devinfo.strbase && - strid < priv->device[i].compdesc.devinfo.strbase + + if (strid > priv->device[i].compdesc.devinfo.strbase && + strid <= priv->device[i].compdesc.devinfo.strbase + priv->device[i].compdesc.devinfo.nstrings) { ret = priv->device[i].compdesc.mkstrdesc(strid - @@ -634,7 +636,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, default: { - usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_GETUNKNOWNDESC), value); + usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_GETUNKNOWNDESC), + value); } break; } @@ -651,7 +654,11 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, for (i = 0; i < priv->ndevices; i++) { - ret = CLASS_SETUP(priv->device[i].dev, dev, ctrl, dataout, outlen); + ret = CLASS_SETUP(priv->device[i].dev, + dev, + ctrl, + dataout, + outlen); } dispatched = true; @@ -693,7 +700,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, break; default: - usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_UNSUPPORTEDSTDREQ), ctrl->req); + usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_UNSUPPORTEDSTDREQ), + ctrl->req); break; } } @@ -770,7 +778,7 @@ static void composite_disconnect(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -828,7 +836,7 @@ static void composite_suspend(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -875,7 +883,7 @@ static void composite_resume(FAR struct usbdevclass_driver_s *driver, { usbtrace(TRACE_CLSERROR(USBCOMPOSITE_TRACEERR_INVALIDARG), 0); return; - } + } #endif /* Extract reference to private data */ @@ -905,6 +913,7 @@ static void composite_resume(FAR struct usbdevclass_driver_s *driver, /**************************************************************************** * Public Functions ****************************************************************************/ + /**************************************************************************** * Name: composite_initialize * @@ -1050,6 +1059,7 @@ void composite_uninitialize(FAR void *handle) usbdev_unregister(&alloc->drvr.drvr); /* Free any resources used by the composite driver */ + /* None */ /* Second phase uninitialization: Clean up all memory resources */ @@ -1084,7 +1094,7 @@ int composite_ep0submit(FAR struct usbdevclass_driver_s *driver, * it becomes necessary to manage the completion callbacks. */ - return EP_SUBMIT(dev->ep0, ctrlreq); + return EP_SUBMIT(dev->ep0, ctrlreq); } #endif /* CONFIG_USBDEV_COMPOSITE */ diff --git a/drivers/usbdev/composite_desc.c b/drivers/usbdev/composite_desc.c index 7ab23f13a42..a94a37d836d 100644 --- a/drivers/usbdev/composite_desc.c +++ b/drivers/usbdev/composite_desc.c @@ -169,20 +169,20 @@ int composite_mkstrdesc(uint8_t id, struct usb_strdesc_s *strdesc) return -EINVAL; } - /* The string is utf16-le. The poor man's utf-8 to utf16-le - * conversion below will only handle 7-bit en-us ascii - */ + /* The string is utf16-le. The poor man's utf-8 to utf16-le + * conversion below will only handle 7-bit en-us ascii + */ - len = strlen(str); - for (i = 0, ndata = 0; i < len; i++, ndata += 2) - { - strdesc->data[ndata] = str[i]; - strdesc->data[ndata+1] = 0; - } + len = strlen(str); + for (i = 0, ndata = 0; i < len; i++, ndata += 2) + { + strdesc->data[ndata] = str[i]; + strdesc->data[ndata + 1] = 0; + } - strdesc->len = ndata+2; - strdesc->type = USB_DESC_TYPE_STRING; - return strdesc->len; + strdesc->len = ndata + 2; + strdesc->type = USB_DESC_TYPE_STRING; + return strdesc->len; } /**************************************************************************** @@ -219,10 +219,15 @@ int16_t composite_mkcfgdesc(FAR struct composite_dev_s *priv, FAR uint8_t *buf) int i; /* Configuration descriptor for the composite device */ + /* Fill in the values directly into the buf */ cfgdesc->len = USB_SIZEOF_CFGDESC; /* Descriptor length */ +#ifdef CONFIG_USBDEV_DUALSPEED + cfgdesc->type = type; /* Descriptor type */ +#else cfgdesc->type = USB_DESC_TYPE_CONFIG; /* Descriptor type */ +#endif cfgdesc->totallen[0] = LSBYTE(priv->cfgdescsize); /* Lower Byte of Total length */ cfgdesc->totallen[1] = MSBYTE(priv->cfgdescsize); /* High Byte of Total length */ cfgdesc->ninterfaces = priv->ninterfaces; /* Number of interfaces */ diff --git a/drivers/usbdev/usbmsc.h b/drivers/usbdev/usbmsc.h index 97149e9581b..b907699a561 100644 --- a/drivers/usbdev/usbmsc.h +++ b/drivers/usbdev/usbmsc.h @@ -59,6 +59,7 @@ ****************************************************************************/ /* Configuration ************************************************************/ + /* If the USB mass storage device is configured as part of a composite device * then both CONFIG_USBDEV_COMPOSITE and CONFIG_USBMSC_COMPOSITE must be * defined. @@ -69,7 +70,7 @@ #endif #if defined(CONFIG_USBMSC_COMPOSITE) && !defined(CONFIG_USBMSC_STRBASE) -# define CONFIG_USBMSC_STRBASE (4) +# define CONFIG_USBMSC_STRBASE (0) #endif /* Interface IDs. If the mass storage driver is built as a component of a @@ -360,6 +361,7 @@ /**************************************************************************** * Public Types ****************************************************************************/ + /* Endpoint descriptors */ enum usbmsc_epdesc_e diff --git a/drivers/usbdev/usbmsc_desc.c b/drivers/usbdev/usbmsc_desc.c index be2e10e0ead..6fff1031554 100644 --- a/drivers/usbdev/usbmsc_desc.c +++ b/drivers/usbdev/usbmsc_desc.c @@ -55,6 +55,7 @@ ****************************************************************************/ /* Descriptors **************************************************************/ + /* Device descriptor. If the USB mass storage device is configured as part * of a composite device, then the device descriptor will be provided by the * composite device logic. @@ -88,7 +89,6 @@ static const struct usb_devdesc_s g_devdesc = }; #endif - #ifdef CONFIG_USBDEV_DUALSPEED #ifndef CONFIG_USBMSC_COMPOSITE static const struct usb_qualdesc_s g_qualdesc = @@ -112,6 +112,7 @@ static const struct usb_qualdesc_s g_qualdesc = /**************************************************************************** * Public Data ****************************************************************************/ + /* Strings ******************************************************************/ #ifndef CONFIG_USBMSC_COMPOSITE @@ -170,7 +171,8 @@ int usbmsc_mkstrdesc(uint8_t id, struct usb_strdesc_s *strdesc) break; #endif - /* case USBMSC_CONFIGSTRID: */ + /* case USBMSC_CONFIGSTRID: */ + case USBMSC_INTERFACESTRID: str = CONFIG_USBMSC_CONFIGSTR; break; @@ -179,25 +181,25 @@ int usbmsc_mkstrdesc(uint8_t id, struct usb_strdesc_s *strdesc) return -EINVAL; } - /* The string is utf16-le. The poor man's utf-8 to utf16-le - * conversion below will only handle 7-bit en-us ascii - */ + /* The string is utf16-le. The poor man's utf-8 to utf16-le + * conversion below will only handle 7-bit en-us ascii + */ - len = strlen(str); - if (len > (USBMSC_MAXSTRLEN / 2)) - { - len = (USBMSC_MAXSTRLEN / 2); - } + len = strlen(str); + if (len > (USBMSC_MAXSTRLEN / 2)) + { + len = (USBMSC_MAXSTRLEN / 2); + } - for (i = 0, ndata = 0; i < len; i++, ndata += 2) - { - strdesc->data[ndata] = str[i]; - strdesc->data[ndata+1] = 0; - } + for (i = 0, ndata = 0; i < len; i++, ndata += 2) + { + strdesc->data[ndata] = str[i]; + strdesc->data[ndata + 1] = 0; + } - strdesc->len = ndata+2; - strdesc->type = USB_DESC_TYPE_STRING; - return strdesc->len; + strdesc->len = ndata + 2; + strdesc->type = USB_DESC_TYPE_STRING; + return strdesc->len; } /**************************************************************************** @@ -339,14 +341,18 @@ int16_t usbmsc_mkcfgdesc(uint8_t *buf, #ifndef CONFIG_USBMSC_COMPOSITE { /* Configuration descriptor If the USB mass storage device is configured as part - * of a composite device, then the configuration descriptor will be provided by the - * composite device logic. + * of a composite device, then the configuration descriptor will be provided + * by the composite device logic. */ FAR struct usb_cfgdesc_s *dest = (FAR struct usb_cfgdesc_s *)buf; dest->len = USB_SIZEOF_CFGDESC; /* Descriptor length */ +#ifdef CONFIG_USBDEV_DUALSPEED + dest->type = type; /* Descriptor type */ +#else dest->type = USB_DESC_TYPE_CONFIG; /* Descriptor type */ +#endif dest->totallen[0] = LSBYTE(SIZEOF_USBMSC_CFGDESC); /* LS Total length */ dest->totallen[1] = MSBYTE(SIZEOF_USBMSC_CFGDESC); /* MS Total length */ dest->ninterfaces = USBMSC_NINTERFACES; /* Number of interfaces */ diff --git a/drivers/usbdev/usbmsc_scsi.c b/drivers/usbdev/usbmsc_scsi.c index 267e56c3e18..8e999191ff4 100644 --- a/drivers/usbdev/usbmsc_scsi.c +++ b/drivers/usbdev/usbmsc_scsi.c @@ -430,8 +430,10 @@ static inline int usbmsc_cmdtestunitready(FAR struct usbmsc_dev_s *priv) static inline int usbmsc_cmdrequestsense(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf) { - FAR struct scsicmd_requestsense_s *request = (FAR struct scsicmd_requestsense_s *)priv->cdb; - FAR struct scsiresp_fixedsensedata_s *response = (FAR struct scsiresp_fixedsensedata_s *)buf; + FAR struct scsicmd_requestsense_s *request = + (FAR struct scsicmd_requestsense_s *)priv->cdb; + FAR struct scsiresp_fixedsensedata_s *response = + (FAR struct scsiresp_fixedsensedata_s *)buf; FAR struct usbmsc_lun_s *lun; uint32_t sd; uint32_t sdinfo; @@ -482,7 +484,8 @@ static inline int usbmsc_cmdrequestsense(FAR struct usbmsc_dev_s *priv, memset(response, 0, SCSIRESP_FIXEDSENSEDATA_SIZEOF); - response->code = SCSIRESP_SENSEDATA_RESPVALID | SCSIRESP_SENSEDATA_CURRENTFIXED; + response->code = SCSIRESP_SENSEDATA_RESPVALID | + SCSIRESP_SENSEDATA_CURRENTFIXED; response->flags = (uint8_t)(sd >> 16); usbmsc_putbe32(response->info, sdinfo); response->len = SCSIRESP_FIXEDSENSEDATA_SIZEOF - 7; @@ -586,7 +589,8 @@ static inline int usbmsc_cmdwrite6(FAR struct usbmsc_dev_s *priv) /* Get the Logical Block Address (LBA) from cdb[] as the starting sector */ - priv->sector = (uint32_t)(write6->mslba & SCSICMD_WRITE6_MSLBAMASK) << 16 | (uint32_t)usbmsc_getbe16(write6->lslba); + priv->sector = (uint32_t)(write6->mslba & SCSICMD_WRITE6_MSLBAMASK) << 16 | + (uint32_t)usbmsc_getbe16(write6->lslba); /* Verify that a block driver has been bound to the LUN */ @@ -619,7 +623,8 @@ static inline int usbmsc_cmdwrite6(FAR struct usbmsc_dev_s *priv) else { - usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDWRITE6), priv->cdb[0]); + usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDWRITE6), + priv->cdb[0]); priv->thstate = USBMSC_STATE_CMDWRITE; } } @@ -651,8 +656,9 @@ static inline int usbmsc_cmdinquiry(FAR struct usbmsc_dev_s *priv, { if (!priv->lun) { - response->qualtype = SCSIRESP_INQUIRYPQ_NOTCAPABLE | SCSIRESP_INQUIRYPD_UNKNOWN; - } + response->qualtype = SCSIRESP_INQUIRYPQ_NOTCAPABLE | + SCSIRESP_INQUIRYPD_UNKNOWN; + } else if ((inquiry->flags != 0) || (inquiry->pagecode != 0)) { usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_INQUIRYFLAGS), 0); @@ -673,7 +679,7 @@ static inline int usbmsc_cmdinquiry(FAR struct usbmsc_dev_s *priv, /* Strings */ - memset(response->vendorid, ' ', 8+16+4); + memset(response->vendorid, ' ', 8 + 16 + 4); len = strlen(g_mscvendorstr); if (len > 8) @@ -714,7 +720,8 @@ static inline int usbmsc_cmdinquiry(FAR struct usbmsc_dev_s *priv, static inline int usbmsc_cmdmodeselect6(FAR struct usbmsc_dev_s *priv) { - FAR struct scsicmd_modeselect6_s *modeselect = (FAR struct scsicmd_modeselect6_s *)priv->cdb; + FAR struct scsicmd_modeselect6_s *modeselect = + (FAR struct scsicmd_modeselect6_s *)priv->cdb; priv->u.alloclen = modeselect->plen; usbmsc_setupcmd(priv, SCSICMD_MODESELECT6_SIZEOF, @@ -737,7 +744,8 @@ static inline int usbmsc_cmdmodeselect6(FAR struct usbmsc_dev_s *priv) static int usbmsc_modepage(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf, uint8_t pcpgcode, int *mdlen) { - FAR struct scsiresp_cachingmodepage_s *cmp = (FAR struct scsiresp_cachingmodepage_s *)buf; + FAR struct scsiresp_cachingmodepage_s *cmp = + (FAR struct scsiresp_cachingmodepage_s *)buf; /* Saving parms not supported */ @@ -750,8 +758,10 @@ static int usbmsc_modepage(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf, /* Only the caching mode page is supported: */ - if ((pcpgcode & SCSICMD_MODESENSE_PGCODEMASK) == SCSIRESP_MODESENSE_PGCCODE_CACHING || - (pcpgcode & SCSICMD_MODESENSE_PGCODEMASK) == SCSIRESP_MODESENSE_PGCCODE_RETURNALL) + if ((pcpgcode & SCSICMD_MODESENSE_PGCODEMASK) == + SCSIRESP_MODESENSE_PGCCODE_CACHING || + (pcpgcode & SCSICMD_MODESENSE_PGCODEMASK) == + SCSIRESP_MODESENSE_PGCCODE_RETURNALL) { memset(cmp, 0, 12); cmp->pgcode = SCSIRESP_MODESENSE_PGCCODE_CACHING; @@ -770,7 +780,7 @@ static int usbmsc_modepage(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf, cmp->maxpfc[1] = 0xff; } - /* Return the mode data length */ + /* Return the mode data length */ *mdlen = 12; /* Only the first 12-bytes of caching mode page sent */ return OK; @@ -794,8 +804,10 @@ static int usbmsc_modepage(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf, static int inline usbmsc_cmdmodesense6(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf) { - FAR struct scsicmd_modesense6_s *modesense = (FAR struct scsicmd_modesense6_s *)priv->cdb; - FAR struct scsiresp_modeparameterhdr6_s *mph = (FAR struct scsiresp_modeparameterhdr6_s *)buf; + FAR struct scsicmd_modesense6_s *modesense = + (FAR struct scsicmd_modesense6_s *)priv->cdb; + FAR struct scsiresp_modeparameterhdr6_s *mph = + (FAR struct scsiresp_modeparameterhdr6_s *)buf; int mdlen; int ret; @@ -804,7 +816,8 @@ static int inline usbmsc_cmdmodesense6(FAR struct usbmsc_dev_s *priv, USBMSC_FLAGS_DIRDEVICE2HOST); if (ret == OK) { - if ((modesense->flags & ~SCSICMD_MODESENSE6_DBD) != 0 || modesense->subpgcode != 0) + if ((modesense->flags & ~SCSICMD_MODESENSE6_DBD) != 0 || + modesense->subpgcode != 0) { usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_MODESENSE6FLAGS), 0); priv->lun->sd = SCSI_KCQIR_INVALIDFIELDINCBA; @@ -825,13 +838,14 @@ static int inline usbmsc_cmdmodesense6(FAR struct usbmsc_dev_s *priv, /* There are no block descriptors, only the following mode page: */ - ret = usbmsc_modepage(priv, &buf[SCSIRESP_MODEPARAMETERHDR6_SIZEOF], modesense->pcpgcode, &mdlen); + ret = usbmsc_modepage(priv, &buf[SCSIRESP_MODEPARAMETERHDR6_SIZEOF], + modesense->pcpgcode, &mdlen); if (ret == OK) { - /* Store the mode data length and return the total message size */ + /* Store the mode data length and return the total message size */ - mph->mdlen = mdlen + SCSIRESP_MODEPARAMETERHDR6_SIZEOF - 1; - priv->nreqbytes = mdlen + SCSIRESP_MODEPARAMETERHDR6_SIZEOF; + mph->mdlen = mdlen + SCSIRESP_MODEPARAMETERHDR6_SIZEOF - 1; + priv->nreqbytes = mdlen + SCSIRESP_MODEPARAMETERHDR6_SIZEOF; } } } @@ -881,7 +895,8 @@ static inline int usbmsc_cmdstartstopunit(FAR struct usbmsc_dev_s *priv) static inline int usbmsc_cmdpreventmediumremoval(FAR struct usbmsc_dev_s *priv) { #ifdef CONFIG_USBMSC_REMOVABLE - FAR struct scsicmd_preventmediumremoval_s *pmr = (FAR struct scsicmd_preventmediumremoval_s *)priv->cdb; + FAR struct scsicmd_preventmediumremoval_s *pmr = + (FAR struct scsicmd_preventmediumremoval_s *)priv->cdb; #endif FAR struct usbmsc_lun_s *lun; int ret; @@ -922,7 +937,8 @@ static inline int usbmsc_cmdpreventmediumremoval(FAR struct usbmsc_dev_s *priv) static inline int usbmsc_cmdreadformatcapacity(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf) { - FAR struct scsicmd_readformatcapcacities_s *rfc = (FAR struct scsicmd_readformatcapcacities_s *)priv->cdb; + FAR struct scsicmd_readformatcapcacities_s *rfc = + (FAR struct scsicmd_readformatcapcacities_s *)priv->cdb; FAR struct scsiresp_readformatcapacities_s *hdr; FAR struct usbmsc_lun_s *lun; int ret; @@ -960,8 +976,10 @@ static inline int usbmsc_cmdreadformatcapacity(FAR struct usbmsc_dev_s *priv, static int inline usbmsc_cmdreadcapacity10(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf) { - FAR struct scsicmd_readcapacity10_s *rcc = (FAR struct scsicmd_readcapacity10_s *)priv->cdb; - FAR struct scsiresp_readcapacity10_s *rcr = (FAR struct scsiresp_readcapacity10_s *)buf; + FAR struct scsicmd_readcapacity10_s *rcc = + (FAR struct scsicmd_readcapacity10_s *)priv->cdb; + FAR struct scsiresp_readcapacity10_s *rcr = + (FAR struct scsiresp_readcapacity10_s *)buf; FAR struct usbmsc_lun_s *lun; uint32_t lba; int ret; @@ -1044,13 +1062,14 @@ static inline int usbmsc_cmdread10(FAR struct usbmsc_dev_s *priv) usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_READ10LBARANGE), 0); lun->sd = SCSI_KCQIR_LBAOUTOFRANGE; ret = -EINVAL; - } + } /* Looks like we are good to go */ else { - usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDREAD10), priv->cdb[0]); + usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDREAD10), + priv->cdb[0]); priv->thstate = USBMSC_STATE_CMDREAD; } } @@ -1085,7 +1104,8 @@ static inline int usbmsc_cmdwrite10(FAR struct usbmsc_dev_s *priv) /* Verify that we can support this write command */ - if ((write10->flags & ~(SCSICMD_WRITE10FLAGS_DPO | SCSICMD_WRITE10FLAGS_FUA)) != 0) + if ((write10->flags & ~(SCSICMD_WRITE10FLAGS_DPO | + SCSICMD_WRITE10FLAGS_FUA)) != 0) { usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_WRITE10FLAGS), 0); lun->sd = SCSI_KCQIR_INVALIDFIELDINCBA; @@ -1110,20 +1130,21 @@ static inline int usbmsc_cmdwrite10(FAR struct usbmsc_dev_s *priv) ret = -EINVAL; } - /* Verify that LBA lies in the range supported by the block driver */ + /* Verify that LBA lies in the range supported by the block driver */ - else if (priv->sector >= lun->nsectors) + else if (priv->sector >= lun->nsectors) { usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_WRITE10LBARANGE), 0); lun->sd = SCSI_KCQIR_LBAOUTOFRANGE; ret = -EINVAL; - } + } /* Looks like we are good to go */ else { - usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDWRITE10), priv->cdb[0]); + usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDWRITE10), + priv->cdb[0]); priv->thstate = USBMSC_STATE_CMDWRITE; } } @@ -1253,7 +1274,8 @@ static inline int usbmsc_cmdsynchronizecache10(FAR struct usbmsc_dev_s *priv) static inline int usbmsc_cmdmodeselect10(FAR struct usbmsc_dev_s *priv) { - FAR struct scsicmd_modeselect10_s *modeselect = (FAR struct scsicmd_modeselect10_s *)priv->cdb; + FAR struct scsicmd_modeselect10_s *modeselect = + (FAR struct scsicmd_modeselect10_s *)priv->cdb; priv->u.alloclen = usbmsc_getbe16(modeselect->parmlen); usbmsc_setupcmd(priv, SCSICMD_MODESELECT10_SIZEOF, @@ -1276,8 +1298,10 @@ static inline int usbmsc_cmdmodeselect10(FAR struct usbmsc_dev_s *priv) static int inline usbmsc_cmdmodesense10(FAR struct usbmsc_dev_s *priv, FAR uint8_t *buf) { - FAR struct scsicmd_modesense10_s *modesense = (FAR struct scsicmd_modesense10_s *)priv->cdb; - FAR struct scsiresp_modeparameterhdr10_s *mph = (FAR struct scsiresp_modeparameterhdr10_s *)buf; + FAR struct scsicmd_modesense10_s *modesense = + (FAR struct scsicmd_modesense10_s *)priv->cdb; + FAR struct scsiresp_modeparameterhdr10_s *mph = + (FAR struct scsiresp_modeparameterhdr10_s *)buf; int mdlen; int ret; @@ -1307,10 +1331,11 @@ static int inline usbmsc_cmdmodesense10(FAR struct usbmsc_dev_s *priv, /* There are no block descriptors, only the following mode page: */ - ret = usbmsc_modepage(priv, &buf[SCSIRESP_MODEPARAMETERHDR10_SIZEOF], modesense->pcpgcode, &mdlen); + ret = usbmsc_modepage(priv, &buf[SCSIRESP_MODEPARAMETERHDR10_SIZEOF], + modesense->pcpgcode, &mdlen); if (ret == OK) { - /* Store the mode data length and return the total message size */ + /* Store the mode data length and return the total message size */ usbmsc_putbe16(mph->mdlen, mdlen - 2); priv->nreqbytes = mdlen + SCSIRESP_MODEPARAMETERHDR10_SIZEOF; @@ -1377,7 +1402,8 @@ static inline int usbmsc_cmdread12(FAR struct usbmsc_dev_s *priv) else { - usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDREAD12), priv->cdb[0]); + usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDREAD12), + priv->cdb[0]); priv->thstate = USBMSC_STATE_CMDREAD; } } @@ -1412,7 +1438,8 @@ static inline int usbmsc_cmdwrite12(FAR struct usbmsc_dev_s *priv) /* Verify that we can support this write command */ - if ((write12->flags & ~(SCSICMD_WRITE12FLAGS_DPO | SCSICMD_WRITE12FLAGS_FUA)) != 0) + if ((write12->flags & ~(SCSICMD_WRITE12FLAGS_DPO | + SCSICMD_WRITE12FLAGS_FUA)) != 0) { usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_WRITE12FLAGS), 0); lun->sd = SCSI_KCQIR_INVALIDFIELDINCBA; @@ -1447,7 +1474,8 @@ static inline int usbmsc_cmdwrite12(FAR struct usbmsc_dev_s *priv) else { - usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDWRITE12), priv->cdb[0]); + usbtrace(TRACE_CLASSSTATE(USBMSC_CLASSSTATE_CMDPARSECMDWRITE12), + priv->cdb[0]); priv->thstate = USBMSC_STATE_CMDWRITE; return OK; } @@ -1544,7 +1572,7 @@ static int inline usbmsc_setupcmd(FAR struct usbmsc_dev_s *priv, /* Clip to the length in the CBW and declare a phase error */ usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_PHASEERROR1), priv->cdb[0]); - if ((flags & USBMSC_FLAGS_BLOCKXFR) != 0) + if ((flags & USBMSC_FLAGS_BLOCKXFR) == 0) { priv->u.alloclen = priv->cbwlen; } @@ -1613,7 +1641,7 @@ static int inline usbmsc_setupcmd(FAR struct usbmsc_dev_s *priv, * must be zero */ - if (priv->cdb[cdblen-1] != 0) + if (priv->cdb[cdblen - 1] != 0) { usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_SCSICMDCONTROL), 0); if (lun) @@ -1672,7 +1700,8 @@ static int usbmsc_idlestate(FAR struct usbmsc_dev_s *priv) /* Handle the CBW */ - usbmsc_dumpdata("SCSCI CBW", (FAR uint8_t *)cbw, USBMSC_CBW_SIZEOF - USBMSC_MAXCDBLEN); + usbmsc_dumpdata("SCSCI CBW", (FAR uint8_t *)cbw, USBMSC_CBW_SIZEOF - + USBMSC_MAXCDBLEN); usbmsc_dumpdata(" CDB", cbw->cdb, MIN(cbw->cdblen, USBMSC_MAXCDBLEN)); /* Check for properly formatted CBW? */ @@ -1750,7 +1779,7 @@ static int usbmsc_idlestate(FAR struct usbmsc_dev_s *priv) /* Return the read request to the bulk out endpoint for re-filling */ req = privreq->req; - req->len = CONFIG_USBMSC_BULKOUTREQLEN; + req->len = priv->epbulkout->maxpacket; req->priv = privreq; req->callback = usbmsc_rdcomplete; @@ -1832,158 +1861,171 @@ static int usbmsc_cmdparsestate(FAR struct usbmsc_dev_s *priv) usbmsc_scsi_lock(priv); switch (priv->cdb[0]) { - case SCSI_CMD_TESTUNITREADY: /* 0x00 Mandatory */ + case SCSI_CMD_TESTUNITREADY: /* 0x00 Mandatory */ ret = usbmsc_cmdtestunitready(priv); break; - /* case SCSI_CMD_REZEROUNIT: * 0x01 Obsolete - * * 0x02 Vendor-specific */ + /* case SCSI_CMD_REZEROUNIT: * 0x01 Obsolete + * * 0x02 Vendor-specific + */ - case SCSI_CMD_REQUESTSENSE: /* 0x03 Mandatory */ + case SCSI_CMD_REQUESTSENSE: /* 0x03 Mandatory */ ret = usbmsc_cmdrequestsense(priv, buf); break; - /* case SCSI_CMD_FORMAT_UNIT: * 0x04 Mandatory, but not implemented - * * 0x05 Vendor specific - * * 0x06 Vendor specific - * case SCSI_CMD_REASSIGNBLOCKS: * 0x07 Optional */ + /* case SCSI_CMD_FORMAT_UNIT: * 0x04 Mandatory, but not impl. + * * 0x05 Vendor specific + * * 0x06 Vendor specific + * case SCSI_CMD_REASSIGNBLOCKS: * 0x07 Optional + */ - case SCSI_CMD_READ6: /* 0x08 Mandatory */ + case SCSI_CMD_READ6: /* 0x08 Mandatory */ ret = usbmsc_cmdread6(priv); break; - /* * 0x09 Vendor specific */ + /* * 0x09 Vendor specific */ - case SCSI_CMD_WRITE6: /* 0x0a Optional */ + case SCSI_CMD_WRITE6: /* 0x0a Optional */ ret = usbmsc_cmdwrite6(priv); break; - /* case SCSI_CMD_SEEK6: * 0x0b Obsolete - * * 0x0c-0x10 Vendor specific - * case SCSI_CMD_SPACE6: * 0x11 Vendor specific */ + /* case SCSI_CMD_SEEK6: * 0x0b Obsolete + * * 0x0c-0x10 Vendor specific + * case SCSI_CMD_SPACE6: * 0x11 Vendor specific + */ - case SCSI_CMD_INQUIRY: /* 0x12 Mandatory */ + case SCSI_CMD_INQUIRY: /* 0x12 Mandatory */ ret = usbmsc_cmdinquiry(priv, buf); break; - /* * 0x13-0x14 Vendor specific */ + /* * 0x13-0x14 Vendor specific */ - case SCSI_CMD_MODESELECT6: /* 0x15 Optional */ + case SCSI_CMD_MODESELECT6: /* 0x15 Optional */ ret = usbmsc_cmdmodeselect6(priv); break; - /* case SCSI_CMD_RESERVE6: * 0x16 Obsolete - * case SCSI_CMD_RELEASE6: * 0x17 Obsolete - * case SCSI_CMD_COPY: * 0x18 Obsolete - * * 0x19 Vendor specific */ + /* case SCSI_CMD_RESERVE6: * 0x16 Obsolete + * case SCSI_CMD_RELEASE6: * 0x17 Obsolete + * case SCSI_CMD_COPY: * 0x18 Obsolete + * * 0x19 Vendor specific + */ - case SCSI_CMD_MODESENSE6: /* 0x1a Optional */ + case SCSI_CMD_MODESENSE6: /* 0x1a Optional */ ret = usbmsc_cmdmodesense6(priv, buf); break; - case SCSI_CMD_STARTSTOPUNIT: /* 0x1b Optional */ + case SCSI_CMD_STARTSTOPUNIT: /* 0x1b Optional */ ret = usbmsc_cmdstartstopunit(priv); break; - /* case SCSI_CMD_RECEIVEDIAGNOSTICRESULTS: * 0x1c Optional - * case SCSI_CMD_SENDDIAGNOSTIC: * 0x1d Mandatory, but not implemented */ + /* case SCSI_CMD_RECEIVEDIAGNOSTICRESULTS: * 0x1c Optional + * case SCSI_CMD_SENDDIAGNOSTIC: * 0x1d Mandatory, but not impl. + */ - case SCSI_CMD_PREVENTMEDIAREMOVAL: /* 0x1e Optional */ + case SCSI_CMD_PREVENTMEDIAREMOVAL: /* 0x1e Optional */ ret = usbmsc_cmdpreventmediumremoval(priv); break; - /* * 0x20-22 Vendor specific */ - case SCSI_CMD_READFORMATCAPACITIES: /* 0x23 Vendor-specific (defined in MMC spec) */ + /* * 0x20-22 Vendor specific */ + + case SCSI_CMD_READFORMATCAPACITIES: /* 0x23 Vend-spec (def. MMC spec) */ ret = usbmsc_cmdreadformatcapacity(priv, buf); break; - /* * 0x24 Vendor specific */ - case SCSI_CMD_READCAPACITY10: /* 0x25 Mandatory */ + /* * 0x24 Vendor specific */ + + case SCSI_CMD_READCAPACITY10: /* 0x25 Mandatory */ ret = usbmsc_cmdreadcapacity10(priv, buf); break; - /* * 0x26-27 Vendor specific */ - case SCSI_CMD_READ10: /* 0x28 Mandatory */ + /* * 0x26-27 Vendor specific */ + + case SCSI_CMD_READ10: /* 0x28 Mandatory */ ret = usbmsc_cmdread10(priv); break; - /* * 0x29 Vendor specific */ + /* * 0x29 Vendor specific */ - case SCSI_CMD_WRITE10: /* 0x2a Optional */ + case SCSI_CMD_WRITE10: /* 0x2a Optional */ ret = usbmsc_cmdwrite10(priv); break; - /* case SCSI_CMD_SEEK10: * 0x2b Obsolete - * * 0x2c-2d Vendor specific - * case SCSI_CMD_WRITEANDVERIFY: * 0x2e Optional */ + /* case SCSI_CMD_SEEK10: * 0x2b Obsolete + * * 0x2c-2d Vendor specific + * case SCSI_CMD_WRITEANDVERIFY: * 0x2e Optional + */ - case SCSI_CMD_VERIFY10: /* 0x2f Optional, but needed my MS Windows */ + case SCSI_CMD_VERIFY10: /* 0x2f Opt, excpt Windows */ ret = usbmsc_cmdverify10(priv); break; - /* case SCSI_CMD_SEARCHDATAHIGH: * 0x30 Obsolete - * case SCSI_CMD_SEARCHDATAEQUAL: * 0x31 Obsolete - * case SCSI_CMD_SEARCHDATALOW: * 0x32 Obsolete - * case SCSI_CMD_SETLIMITS10: * 0x33 Obsolete - * case SCSI_CMD_PREFETCH10: * 0x34 Optional */ + /* case SCSI_CMD_SEARCHDATAHIGH: * 0x30 Obsolete + * case SCSI_CMD_SEARCHDATAEQUAL: * 0x31 Obsolete + * case SCSI_CMD_SEARCHDATALOW: * 0x32 Obsolete + * case SCSI_CMD_SETLIMITS10: * 0x33 Obsolete + * case SCSI_CMD_PREFETCH10: * 0x34 Optional + */ - case SCSI_CMD_SYNCHCACHE10: /* 0x35 Optional */ + case SCSI_CMD_SYNCHCACHE10: /* 0x35 Optional */ ret = usbmsc_cmdsynchronizecache10(priv); break; - /* case SCSI_CMD_LOCKCACHE: * 0x36 Obsolete - * case SCSI_CMD_READDEFECTDATA10: * 0x37 Optional - * case SCSI_CMD_COMPARE: * 0x39 Obsolete - * case SCSI_CMD_COPYANDVERIFY: * 0x3a Obsolete - * case SCSI_CMD_WRITEBUFFER: * 0x3b Optional - * case SCSI_CMD_READBUFFER: * 0x3c Optional - * case SCSI_CMD_READLONG10: * 0x3e Optional - * case SCSI_CMD_WRITELONG10: * 0x3f Optional - * case SCSI_CMD_CHANGEDEFINITION: * 0x40 Obsolete - * case SCSI_CMD_WRITESAME10: * 0x41 Optional - * case SCSI_CMD_LOGSELECT: * 0x4c Optional - * case SCSI_CMD_LOGSENSE: * 0x4d Optional - * case SCSI_CMD_XDWRITE10: * 0x50 Optional - * case SCSI_CMD_XPWRITE10: * 0x51 Optional - * case SCSI_CMD_XDREAD10: * 0x52 Optional */ + /* case SCSI_CMD_LOCKCACHE: * 0x36 Obsolete + * case SCSI_CMD_READDEFECTDATA10: * 0x37 Optional + * case SCSI_CMD_COMPARE: * 0x39 Obsolete + * case SCSI_CMD_COPYANDVERIFY: * 0x3a Obsolete + * case SCSI_CMD_WRITEBUFFER: * 0x3b Optional + * case SCSI_CMD_READBUFFER: * 0x3c Optional + * case SCSI_CMD_READLONG10: * 0x3e Optional + * case SCSI_CMD_WRITELONG10: * 0x3f Optional + * case SCSI_CMD_CHANGEDEFINITION: * 0x40 Obsolete + * case SCSI_CMD_WRITESAME10: * 0x41 Optional + * case SCSI_CMD_LOGSELECT: * 0x4c Optional + * case SCSI_CMD_LOGSENSE: * 0x4d Optional + * case SCSI_CMD_XDWRITE10: * 0x50 Optional + * case SCSI_CMD_XPWRITE10: * 0x51 Optional + * case SCSI_CMD_XDREAD10: * 0x52 Optional + */ - case SCSI_CMD_MODESELECT10: /* 0x55 Optional */ + case SCSI_CMD_MODESELECT10: /* 0x55 Optional */ ret = usbmsc_cmdmodeselect10(priv); break; - /* case SCSI_CMD_RESERVE10: * 0x56 Obsolete - * case SCSI_CMD_RELEASE10: * 0x57 Obsolete */ + /* case SCSI_CMD_RESERVE10: * 0x56 Obsolete + * case SCSI_CMD_RELEASE10: * 0x57 Obsolete + */ case SCSI_CMD_MODESENSE10: /* 0x5a Optional */ ret = usbmsc_cmdmodesense10(priv, buf); break; - /* case SCSI_CMD_PERSISTENTRESERVEIN: * 0x5e Optional - * case SCSI_CMD_PERSISTENTRESERVEOUT: * 0x5f Optional - * case SCSI_CMD_32: * 0x7f Optional - * case SCSI_CMD_XDWRITEEXTENDED: * 0x80 Obsolete - * case SCSI_CMD_REBUILD: * 0x81 Obsolete - * case SCSI_CMD_REGENERATE: * 0x82 Obsolete - * case SCSI_CMD_EXTENDEDCOPY: * 0x83 Optional - * case SCSI_CMD_COPYRESULTS: * 0x84 Optional - * case SCSI_CMD_ACCESSCONTROLIN: * 0x86 Optional - * case SCSI_CMD_ACCESSCONTROLOUT: * 0x87 Optional - * case SCSI_CMD_READ16: * 0x88 Optional - * case SCSI_CMD_WRITE16: * 0x8a Optional - * case SCSI_CMD_READATTRIBUTE: * 0x8c Optional - * case SCSI_CMD_WRITEATTRIBUTE: * 0x8d Optional - * case SCSI_CMD_WRITEANDVERIFY16: * 0x8e Optional - * case SCSI_CMD_SYNCHCACHE16: * 0x91 Optional - * case SCSI_CMD_LOCKUNLOCKACACHE: * 0x92 Optional - * case SCSI_CMD_WRITESAME16: * 0x93 Optional - * case SCSI_CMD_READCAPACITY16: * 0x9e Optional - * case SCSI_CMD_READLONG16: * 0x9e Optional - * case SCSI_CMD_WRITELONG16 * 0x9f Optional - * case SCSI_CMD_REPORTLUNS: * 0xa0 Mandatory, but not implemented - * case SCSI_CMD_MAINTENANCEIN: * 0xa3 Optional (SCCS==0) - * case SCSI_CMD_MAINTENANCEOUT: * 0xa4 Optional (SCCS==0) - * case SCSI_CMD_MOVEMEDIUM: * 0xa5 ? - * case SCSI_CMD_MOVEMEDIUMATTACHED: * 0xa7 Optional (MCHNGR==0) */ + /* case SCSI_CMD_PERSISTENTRESERVEIN: * 0x5e Optional + * case SCSI_CMD_PERSISTENTRESERVEOUT: * 0x5f Optional + * case SCSI_CMD_32: * 0x7f Optional + * case SCSI_CMD_XDWRITEEXTENDED: * 0x80 Obsolete + * case SCSI_CMD_REBUILD: * 0x81 Obsolete + * case SCSI_CMD_REGENERATE: * 0x82 Obsolete + * case SCSI_CMD_EXTENDEDCOPY: * 0x83 Optional + * case SCSI_CMD_COPYRESULTS: * 0x84 Optional + * case SCSI_CMD_ACCESSCONTROLIN: * 0x86 Optional + * case SCSI_CMD_ACCESSCONTROLOUT: * 0x87 Optional + * case SCSI_CMD_READ16: * 0x88 Optional + * case SCSI_CMD_WRITE16: * 0x8a Optional + * case SCSI_CMD_READATTRIBUTE: * 0x8c Optional + * case SCSI_CMD_WRITEATTRIBUTE: * 0x8d Optional + * case SCSI_CMD_WRITEANDVERIFY16: * 0x8e Optional + * case SCSI_CMD_SYNCHCACHE16: * 0x91 Optional + * case SCSI_CMD_LOCKUNLOCKACACHE: * 0x92 Optional + * case SCSI_CMD_WRITESAME16: * 0x93 Optional + * case SCSI_CMD_READCAPACITY16: * 0x9e Optional + * case SCSI_CMD_READLONG16: * 0x9e Optional + * case SCSI_CMD_WRITELONG16 * 0x9f Optional + * case SCSI_CMD_REPORTLUNS: * 0xa0 Mandatory, but no-impl + * case SCSI_CMD_MAINTENANCEIN: * 0xa3 Optional (SCCS==0) + * case SCSI_CMD_MAINTENANCEOUT: * 0xa4 Optional (SCCS==0) + * case SCSI_CMD_MOVEMEDIUM: * 0xa5 ? + * case SCSI_CMD_MOVEMEDIUMATTACHED: * 0xa7 Optional (MCHNGR==0) + */ case SCSI_CMD_READ12: /* 0xa8 Optional */ ret = usbmsc_cmdread12(priv); @@ -1993,27 +2035,26 @@ static int usbmsc_cmdparsestate(FAR struct usbmsc_dev_s *priv) ret = usbmsc_cmdwrite12(priv); break; - /* case SCSI_CMD_READMEDIASERIALNUMBER: * 0xab Optional - * case SCSI_CMD_WRITEANDVERIFY12: * 0xae Optional - * case SCSI_CMD_VERIFY12: * 0xaf Optional - * case SCSI_CMD_SETLIMITS12 * 0xb3 Obsolete - * case SCSI_CMD_READELEMENTSTATUS: * 0xb4 Optional (MCHNGR==0) - * case SCSI_CMD_READDEFECTDATA12: * 0xb7 Optional - * case SCSI_CMD_REDUNDANCYGROUPIN: * 0xba Optional - * case SCSI_CMD_REDUNDANCYGROUPOUT: * 0xbb Optional - * case SCSI_CMD_SPAREIN: * 0xbc Optional (SCCS==0) - * case SCSI_CMD_SPAREOUT: * 0xbd Optional (SCCS==0) - * case SCSI_CMD_VOLUMESETIN: * 0xbe Optional (SCCS==0) - * case SCSI_CMD_VOLUMESETOUT: * 0xbe Optional (SCCS==0) - * * 0xc0-0xff Vendor specific */ + /* case SCSI_CMD_READMEDIASERIALNUMBER: * 0xab Optional + * case SCSI_CMD_WRITEANDVERIFY12: * 0xae Optional + * case SCSI_CMD_VERIFY12: * 0xaf Optional + * case SCSI_CMD_SETLIMITS12 * 0xb3 Obsolete + * case SCSI_CMD_READELEMENTSTATUS: * 0xb4 Optional (MCHNGR==0) + * case SCSI_CMD_READDEFECTDATA12: * 0xb7 Optional + * case SCSI_CMD_REDUNDANCYGROUPIN: * 0xba Optional + * case SCSI_CMD_REDUNDANCYGROUPOUT: * 0xbb Optional + * case SCSI_CMD_SPAREIN: * 0xbc Optional (SCCS==0) + * case SCSI_CMD_SPAREOUT: * 0xbd Optional (SCCS==0) + * case SCSI_CMD_VOLUMESETIN: * 0xbe Optional (SCCS==0) + * case SCSI_CMD_VOLUMESETOUT: * 0xbe Optional (SCCS==0) + * * 0xc0-0xff Vendor specific + */ default: priv->u.alloclen = 0; - if (ret == OK) - { - priv->lun->sd = SCSI_KCQIR_INVALIDCOMMAND; - ret = -EINVAL; - } + priv->residue = priv->cbwlen; + priv->lun->sd = SCSI_KCQIR_INVALIDCOMMAND; + ret = -EINVAL; break; } @@ -2179,7 +2220,7 @@ static int usbmsc_cmdreadstate(FAR struct usbmsc_dev_s *priv) src = &priv->iobuffer[lun->sectorsize - priv->nsectbytes]; dest = &req->buf[priv->nreqbytes]; - nbytes = MIN(CONFIG_USBMSC_BULKINREQLEN - priv->nreqbytes, priv->nsectbytes); + nbytes = MIN(priv->epbulkin->maxpacket - priv->nreqbytes, priv->nsectbytes); /* Copy the data from the sector buffer to the USB request and update counts */ @@ -2187,15 +2228,16 @@ static int usbmsc_cmdreadstate(FAR struct usbmsc_dev_s *priv) priv->nreqbytes += nbytes; priv->nsectbytes -= nbytes; - /* If (1) the request buffer is full OR (2) this is the final request full of data, + /* If (1) the request buffer is full OR (2) this is the final request + * full of data, * then submit the request */ - if (priv->nreqbytes >= CONFIG_USBMSC_BULKINREQLEN || + if (priv->nreqbytes >= priv->epbulkin->maxpacket || (priv->u.xfrlen <= 0 && priv->nsectbytes <= 0)) { - /* Remove the request that we just filled from wrreqlist (we've already checked - * that is it not NULL + /* Remove the request that we just filled from wrreqlist (we've + * already checked that is it not NULL */ flags = enter_critical_section(); @@ -2331,7 +2373,8 @@ static int usbmsc_cmdwritestate(FAR struct usbmsc_dev_s *priv) nwritten = USBMSC_DRVR_WRITE(lun, priv->iobuffer, priv->sector, 1); if (nwritten < 0) { - usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDWRITEWRITEFAIL), -nwritten); + usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDWRITEWRITEFAIL), + -nwritten); lun->sd = SCSI_KCQME_WRITEFAULTAUTOREALLOCFAILED; lun->sdinfo = priv->sector; goto errout; @@ -2349,7 +2392,7 @@ static int usbmsc_cmdwritestate(FAR struct usbmsc_dev_s *priv) * to get the next read request. */ - req->len = CONFIG_USBMSC_BULKOUTREQLEN; + req->len = priv->epbulkout->maxpacket; req->priv = privreq; req->callback = usbmsc_rdcomplete; @@ -2361,7 +2404,7 @@ static int usbmsc_cmdwritestate(FAR struct usbmsc_dev_s *priv) /* Did the host decide to stop early? */ - if (xfrd != CONFIG_USBMSC_BULKOUTREQLEN) + if (xfrd != priv->epbulkout->maxpacket) { priv->shortpacket = 1; goto errout; @@ -2450,7 +2493,8 @@ static int usbmsc_cmdfinishstate(FAR struct usbmsc_dev_s *priv) ret = EP_SUBMIT(priv->epbulkin, privreq->req); if (ret < 0) { - usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINISHSUBMIT), (uint16_t)-ret); + usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINISHSUBMIT), + (uint16_t)-ret); } } @@ -2458,7 +2502,8 @@ static int usbmsc_cmdfinishstate(FAR struct usbmsc_dev_s *priv) if (priv->residue > 0) { - usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINISHRESIDUE), (uint16_t)priv->residue); + usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINISHRESIDUE), + (uint16_t)priv->residue); #ifdef USBMSC_STALL_RACEWAR /* (See description of the workaround at the top of the file). @@ -2488,16 +2533,18 @@ static int usbmsc_cmdfinishstate(FAR struct usbmsc_dev_s *priv) flags = enter_critical_section(); if (priv->shortpacket) { - usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINISHSHORTPKT), (uint16_t)priv->residue); + usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINISHSHORTPKT), + (uint16_t)priv->residue); } /* Unprocessed incoming data: STALL and cancel requests. */ else { - usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINSHSUBMIT), (uint16_t)priv->residue); + usbtrace(TRACE_CLSERROR(USBMSC_TRACEERR_CMDFINSHSUBMIT), + (uint16_t)priv->residue); EP_STALL(priv->epbulkout); - } + } priv->theventset |= USBMSC_EVENT_ABORTBULKOUT; leave_critical_section(flags); @@ -2723,16 +2770,10 @@ int usbmsc_scsi_main(int argc, char *argv[]) * drive the state machine. */ - if ((eventset & (USBMSC_EVENT_DISCONNECT | USBMSC_EVENT_RESET | USBMSC_EVENT_CFGCHANGE | - USBMSC_EVENT_IFCHANGE | USBMSC_EVENT_ABORTBULKOUT)) != 0) + if ((eventset & (USBMSC_EVENT_DISCONNECT | USBMSC_EVENT_RESET | + USBMSC_EVENT_CFGCHANGE | USBMSC_EVENT_IFCHANGE | + USBMSC_EVENT_ABORTBULKOUT)) != 0) { - /* These events require that the current configuration be reset */ - - if ((eventset & USBMSC_EVENT_IFCHANGE) != 0) - { - usbmsc_resetconfig(priv); - } - /* These events require that a new configuration be established */ if ((eventset & (USBMSC_EVENT_CFGCHANGE)) != 0) @@ -2742,7 +2783,8 @@ int usbmsc_scsi_main(int argc, char *argv[]) /* These events required that we send a deferred EP0 setup response */ - if ((eventset & (USBMSC_EVENT_RESET | USBMSC_EVENT_CFGCHANGE | USBMSC_EVENT_IFCHANGE)) != 0) + if ((eventset & (USBMSC_EVENT_RESET | USBMSC_EVENT_CFGCHANGE | + USBMSC_EVENT_IFCHANGE)) != 0) { usbmsc_deferredresponse(priv, false); }