mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-07-04 02:56:52 +00:00
DM USB: refine the polling thread for libusb events
The thread function usb_dev_sys_thread is the source of libusb events, which is also the basis of USB/xHCI emulation. During S3 process, function libusb_handle_events_timeout may fail and return -1, which could result of exit of the thread (BTW, this failure is resulted from USB native reseting behavior during S3). Under this situation, the emulation of USB/xHCI could never continue. This patch fix this issue by continuing to call libusb_handle_events_timeout even it reture -1. The return value will be finally ok after S3 process is completed. This patch will continue poll after failure and hence fix this issue. Tracked-On: #1893 Signed-off-by: Xiaoguang Wu <xiaoguang.wu@intel.com> Reviewed-by: Liang Yang <liang3.yang@intel.com> Acked-by: Yu Wang <yu1.wang@intel.com>
This commit is contained in:
parent
966c587260
commit
b159d66fb3
@ -10,6 +10,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "usbdi.h"
|
#include "usbdi.h"
|
||||||
#include "usb_pmapper.h"
|
#include "usb_pmapper.h"
|
||||||
@ -1112,10 +1113,16 @@ static void *
|
|||||||
usb_dev_sys_thread(void *arg)
|
usb_dev_sys_thread(void *arg)
|
||||||
{
|
{
|
||||||
struct timeval t = {1, 0};
|
struct timeval t = {1, 0};
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
while (g_ctx.thread_exit == 0 &&
|
while (g_ctx.thread_exit == 0) {
|
||||||
libusb_handle_events_timeout(g_ctx.libusb_ctx, &t) >= 0)
|
rc = libusb_handle_events_timeout(g_ctx.libusb_ctx, &t);
|
||||||
; /* nothing */
|
if (rc < 0)
|
||||||
|
/* TODO: maybe one second as interval is too long which
|
||||||
|
* may result of slower USB enumeration process.
|
||||||
|
*/
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
UPRINTF(LINF, "poll thread exit\n\r");
|
UPRINTF(LINF, "poll thread exit\n\r");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user