Skip to content

Commit

Permalink
DM USB: refine the polling thread for libusb events
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
xiaoguangwu authored and wenlingz committed Dec 4, 2018
1 parent 966c587 commit b159d66
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions devicemodel/hw/platform/usb_pmapper.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit b159d66

Please sign in to comment.