mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-07-02 02:03:20 +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 <assert.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "usb.h"
|
||||
#include "usbdi.h"
|
||||
#include "usb_pmapper.h"
|
||||
@ -1112,10 +1113,16 @@ static void *
|
||||
usb_dev_sys_thread(void *arg)
|
||||
{
|
||||
struct timeval t = {1, 0};
|
||||
int rc = 0;
|
||||
|
||||
while (g_ctx.thread_exit == 0 &&
|
||||
libusb_handle_events_timeout(g_ctx.libusb_ctx, &t) >= 0)
|
||||
; /* nothing */
|
||||
while (g_ctx.thread_exit == 0) {
|
||||
rc = libusb_handle_events_timeout(g_ctx.libusb_ctx, &t);
|
||||
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");
|
||||
return NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user