From 4bde2ae1fc1f93afb815ceb7c5e92ddbc064c9be Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Wed, 4 Sep 2019 08:57:07 +0900 Subject: [PATCH] Fix USB drivers. Thanks to Jeremy Drake for the report. Signed-off-by: NIIBE Yutaka --- ChangeLog | 7 +++++++ mcu/usb-mkl27z.c | 2 +- mcu/usb-st-common.c | 6 +++--- mcu/usb-usbip.c | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 32b9247..9dad21b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2019-09-04 NIIBE Yutaka + + When it was exactly 64-byte, two ZLPs were sent wrongly. + * mcu/usb-st-common.c (usb_lld_ctrl_send): Fix for 64-byte. + * mcu/usb-usbip.c (usb_lld_ctrl_send): Likewise. + * mcu/usb-mkl27z.c (usb_lld_ctrl_send): Likewise. + 2019-05-22 NIIBE Yutaka * VERSION: 1.16. diff --git a/mcu/usb-mkl27z.c b/mcu/usb-mkl27z.c index 082b4fa..bf80343 100644 --- a/mcu/usb-mkl27z.c +++ b/mcu/usb-mkl27z.c @@ -956,7 +956,7 @@ usb_lld_ctrl_send (struct usb_dev *dev, const void *buf, size_t buflen) else if (data_p->len != 0 && (data_p->len % USB_MAX_PACKET_SIZE) == 0) data_p->require_zlp = 1; - if (data_p->len < USB_MAX_PACKET_SIZE) + if (data_p->len <= USB_MAX_PACKET_SIZE) { len = data_p->len; dev->state = LAST_IN_DATA; diff --git a/mcu/usb-st-common.c b/mcu/usb-st-common.c index 6423a18..b97df38 100644 --- a/mcu/usb-st-common.c +++ b/mcu/usb-st-common.c @@ -329,7 +329,7 @@ handle_datastage_out (struct usb_dev *dev) static void handle_datastage_in (struct usb_dev *dev) { - uint32_t len = USB_MAX_PACKET_SIZE;; + uint32_t len = USB_MAX_PACKET_SIZE; struct ctrl_data *data_p = &dev->ctrl_data; if ((data_p->len == 0) && (dev->state == LAST_IN_DATA)) @@ -887,14 +887,14 @@ usb_lld_ctrl_send (struct usb_dev *dev, const void *buf, size_t buflen) data_p->addr = (void *)buf; data_p->len = buflen; - /* Restrict the data length to be the one host asks for */ + /* Restrict the data length to be the one which host asks for. */ if (data_p->len >= len_asked) data_p->len = len_asked; /* ZLP is only required when host doesn't expect the end of packets. */ else if (data_p->len != 0 && (data_p->len % USB_MAX_PACKET_SIZE) == 0) data_p->require_zlp = 1; - if (data_p->len < USB_MAX_PACKET_SIZE) + if (data_p->len <= USB_MAX_PACKET_SIZE) { len = data_p->len; dev->state = LAST_IN_DATA; diff --git a/mcu/usb-usbip.c b/mcu/usb-usbip.c index ed84028..307b988 100644 --- a/mcu/usb-usbip.c +++ b/mcu/usb-usbip.c @@ -2175,7 +2175,7 @@ usb_lld_ctrl_send (struct usb_dev *dev, const void *buf, size_t buflen) else if (data_p->len != 0 && (data_p->len % USB_MAX_PACKET_SIZE) == 0) data_p->require_zlp = 1; - if (data_p->len < USB_MAX_PACKET_SIZE) + if (data_p->len <= USB_MAX_PACKET_SIZE) { len = data_p->len; dev->state = LAST_IN_DATA;