Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d9852a8 authored by Thomas Pugliese's avatar Thomas Pugliese Committed by Greg Kroah-Hartman
Browse files

wusbcore: reduce keepalive threshold from timeout/2 to timeout/3



This patch reduces the keepalive threshold of WUSB host controllers from
timeout/2 to timeout/3.  The keepalive timer fires every timeout/2 ms, but
due to rounding errors and jitter, the host may decide not to send a
keepalive at timeout/2.  By the time the next timer fires, a full timeout
period may have expired causing the device to be disconnected without ever
having been sent a keepalive.  Changing the keepalive threshold to
timeout/3 ensures that at least one keepalive will be sent before a device
is disconnected.  The patch also updates the code to use msecs_to_jiffies
consistently.

Signed-off-by: default avatarThomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d9ea21a7
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -455,8 +455,8 @@ static void __wusbhc_keep_alive(struct wusbhc *wusbhc)
			dev_err(dev, "KEEPALIVE: device %u timed out\n",
				wusb_dev->addr);
			__wusbhc_dev_disconnect(wusbhc, wusb_port);
		} else if (time_after(jiffies, wusb_dev->entry_ts + tt/2)) {
			/* Approaching timeout cut out, need to refresh */
		} else if (time_after(jiffies, wusb_dev->entry_ts + tt/3)) {
			/* Approaching timeout cut off, need to refresh */
			ie->bDeviceAddress[keep_alives++] = wusb_dev->addr;
		}
	}
@@ -1062,7 +1062,7 @@ int wusbhc_devconnect_start(struct wusbhc *wusbhc)
	wusbhc->wuie_host_info = hi;

	queue_delayed_work(wusbd, &wusbhc->keep_alive_timer,
			   (wusbhc->trust_timeout*CONFIG_HZ)/1000/2);
			   msecs_to_jiffies(wusbhc->trust_timeout / 2));

	return 0;

+2 −3
Original line number Diff line number Diff line
@@ -75,12 +75,11 @@ static ssize_t wusb_trust_timeout_store(struct device *dev,
		result = -EINVAL;
		goto out;
	}
	/* FIXME: maybe we should check for range validity? */
	wusbhc->trust_timeout = trust_timeout;
	wusbhc->trust_timeout = min_t(unsigned, trust_timeout, 500);
	cancel_delayed_work(&wusbhc->keep_alive_timer);
	flush_workqueue(wusbd);
	queue_delayed_work(wusbd, &wusbhc->keep_alive_timer,
			   (trust_timeout * CONFIG_HZ)/1000/2);
			   msecs_to_jiffies(wusbhc->trust_timeout / 2));
out:
	return result < 0 ? result : size;
}