mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-09 03:58:34 +00:00
DM USB: xHCI: fix issue of discarding zero sized BULK transfer
Should not disacard zero-size bulk transfer. Tracked-On: #2800 Signed-off-by: Xiaoguang Wu <xiaoguang.wu@intel.com> Acked-by: Yu Wang <yu1.wang@intel.com>
This commit is contained in:
parent
2ada1d4dbf
commit
c6efc67c20
@ -263,7 +263,7 @@ usb_dev_comp_req(struct libusb_transfer *libusb_xfer)
|
|||||||
block = &xfer->data[idx % USB_MAX_XFER_BLOCKS];
|
block = &xfer->data[idx % USB_MAX_XFER_BLOCKS];
|
||||||
|
|
||||||
/* Link TRB need to be skipped */
|
/* Link TRB need to be skipped */
|
||||||
if (!block->buf || !block->blen) {
|
if (!block->buf) {
|
||||||
/* FIXME: should change hard coded USB_MAX_XFER_BLOCKS
|
/* FIXME: should change hard coded USB_MAX_XFER_BLOCKS
|
||||||
* to dynamically mechanism to avoid dead loop.
|
* to dynamically mechanism to avoid dead loop.
|
||||||
*/
|
*/
|
||||||
@ -353,9 +353,16 @@ usb_dev_alloc_req(struct usb_dev *udev, struct usb_data_xfer *xfer, int in,
|
|||||||
if (!req->libusb_xfer)
|
if (!req->libusb_xfer)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
if (size)
|
|
||||||
req->buffer = malloc(size);
|
|
||||||
|
|
||||||
|
/* According to C99: 'If size is 0, then malloc() returns either NULL,
|
||||||
|
* or a unique pointer value that can later be successfully passed to
|
||||||
|
* free().' So at this place, the size is set to 1 to avoid potential
|
||||||
|
* risk.
|
||||||
|
*/
|
||||||
|
if (size == 0)
|
||||||
|
size = 1;
|
||||||
|
|
||||||
|
req->buffer = malloc(size);
|
||||||
if (!req->buffer)
|
if (!req->buffer)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
@ -393,7 +400,8 @@ usb_dev_prepare_xfer(struct usb_data_xfer *xfer, int *count, int *size)
|
|||||||
idx = (idx + 1) % USB_MAX_XFER_BLOCKS;
|
idx = (idx + 1) % USB_MAX_XFER_BLOCKS;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (block->buf && block->blen > 0) {
|
|
||||||
|
if (block->buf) {
|
||||||
if (!found) {
|
if (!found) {
|
||||||
found = 1;
|
found = 1;
|
||||||
first = idx;
|
first = idx;
|
||||||
@ -765,6 +773,9 @@ usb_dev_data(void *pdata, struct usb_data_xfer *xfer, int dir, int epctx)
|
|||||||
xfer->status = USB_ERR_NORMAL_COMPLETION;
|
xfer->status = USB_ERR_NORMAL_COMPLETION;
|
||||||
|
|
||||||
blk_start = usb_dev_prepare_xfer(xfer, &blk_count, &data_size);
|
blk_start = usb_dev_prepare_xfer(xfer, &blk_count, &data_size);
|
||||||
|
if (blk_count <= 0)
|
||||||
|
goto done;
|
||||||
|
|
||||||
if (blk_start < 0)
|
if (blk_start < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
@ -777,9 +788,6 @@ usb_dev_data(void *pdata, struct usb_data_xfer *xfer, int dir, int epctx)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_size <= 0)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
/* TODO:
|
/* TODO:
|
||||||
* need to check performance effect of 'type == USB_ENDPOINT_ISOC'.
|
* need to check performance effect of 'type == USB_ENDPOINT_ISOC'.
|
||||||
* With this implementation, there should be some performance loss.
|
* With this implementation, there should be some performance loss.
|
||||||
|
Loading…
Reference in New Issue
Block a user