diff options
| author | Tomasz Kramkowski <tk@the-tk.com> | 2017-02-11 16:13:49 +0000 | 
|---|---|---|
| committer | Tomasz Kramkowski <tk@the-tk.com> | 2017-02-11 16:13:49 +0000 | 
| commit | a6b325d7bfc68282ccbedec8778e993529af26b2 (patch) | |
| tree | 3fadbf7bc6148f97ce7f2ed723574f37c64698ff /halfkay.c | |
| parent | b8ede3c284299173f3981aa85dcbd16806a57f55 (diff) | |
| download | hktool-a6b325d7bfc68282ccbedec8778e993529af26b2.tar.gz hktool-a6b325d7bfc68282ccbedec8778e993529af26b2.tar.xz hktool-a6b325d7bfc68282ccbedec8778e993529af26b2.zip  | |
halfkay: Replace usleep with udelay based on nanosleep
A point was raised that usleep is deprecated, a new function was written
to replace it: udelay.
Diffstat (limited to 'halfkay.c')
| -rw-r--r-- | halfkay.c | 20 | 
1 files changed, 18 insertions, 2 deletions
@@ -86,16 +86,32 @@ static void usbclose(void)  	hk_usb_hnd = NULL;  } +/* TODO: move somewhere or consider a cleaner replacement */ +/* udelay: usleep replacement */ +static void udelay(unsigned long usec) +{ +	enum { USECSEC = 1000000, NSECUSEC = 1000, }; +	struct timespec ts = { +		.tv_sec = usec / USECSEC, +		.tv_nsec = usec % USECSEC * NSECUSEC, +	}; +	/* If we get interrupted, oh well */ +	nanosleep(&ts, NULL); +} +  static void usbsendcmd(void *data, size_t size, bool firstxfer)  {  	unsigned int timeout = firstxfer ? TIMEOUT_FIRST : TIMEOUT;  	int rc, attempt = 0; -	useconds_t delay = SEND_DELAY; +	unsigned long delay = SEND_DELAY; + +	_Static_assert(SEND_DELAY << SEND_ATTEMPTS <= (1UL << 32) - 1, +		       "SEND_DELAY << SEND_ATTEMPTS > 2^32 - 1");  	do {  		rc = libusb_control_transfer(hk_usb_hnd, HK_USB_REQTYP, HK_USB_REQ,  					     HK_USB_VAL, 0, data, size, timeout); -		usleep(delay); +		udelay(delay);  		delay *= 2;  	} while (rc == LIBUSB_ERROR_PIPE && ++attempt < SEND_ATTEMPTS);  | 
