svn commit: r354304 - head/sys/dev/cyapa
Vladimir Kondratyev
wulf at FreeBSD.org
Sun Nov 3 20:55:29 UTC 2019
Author: wulf
Date: Sun Nov 3 20:55:28 2019
New Revision: 354304
URL: https://svnweb.freebsd.org/changeset/base/354304
Log:
[cyapa] Postpone start of the polling thread until sleep is available
After recent ig4 changes cyapa driver can be attached before timers
initialization is completed. Start polling thread from config_intrhook
to avoid busy loops in that case.
Modified:
head/sys/dev/cyapa/cyapa.c
Modified: head/sys/dev/cyapa/cyapa.c
==============================================================================
--- head/sys/dev/cyapa/cyapa.c Sun Nov 3 20:54:17 2019 (r354303)
+++ head/sys/dev/cyapa/cyapa.c Sun Nov 3 20:55:28 2019 (r354304)
@@ -152,6 +152,7 @@ struct cyapa_softc {
struct cdev *devnode;
struct selinfo selinfo;
struct mtx mutex;
+ struct intr_config_hook intr_hook;
int cap_resx;
int cap_resy;
@@ -419,6 +420,27 @@ done:
return (error);
}
+/*
+ * Start the polling thread
+ */
+static void
+cyapa_start(void *xdev)
+{
+ struct cyapa_softc *sc;
+ device_t dev = xdev;
+
+ sc = device_get_softc(dev);
+
+ config_intrhook_disestablish(&sc->intr_hook);
+
+ /* Setup input event tracking */
+ cyapa_set_power_mode(sc, CMD_POWER_MODE_IDLE);
+
+ /* Start the polling thread */
+ kthread_add(cyapa_poll_thread, sc, NULL, NULL,
+ 0, 0, "cyapa-poll");
+}
+
static int cyapa_probe(device_t);
static int cyapa_attach(device_t);
static int cyapa_detach(device_t);
@@ -536,12 +558,14 @@ cyapa_attach(device_t dev)
sc->mode.level = 0;
sc->mode.packetsize = MOUSE_PS2_PACKETSIZE;
- /* Setup input event tracking */
- cyapa_set_power_mode(sc, CMD_POWER_MODE_IDLE);
+ sc->intr_hook.ich_func = cyapa_start;
+ sc->intr_hook.ich_arg = sc->dev;
- /* Start the polling thread */
- kthread_add(cyapa_poll_thread, sc, NULL, NULL,
- 0, 0, "cyapa-poll");
+ /* Postpone start of the polling thread until sleep is available */
+ if (config_intrhook_establish(&sc->intr_hook) != 0) {
+ mtx_destroy(&sc->mutex);
+ return (ENOMEM);
+ }
sc->devnode = make_dev(&cyapa_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "cyapa%d", unit);
More information about the svn-src-all
mailing list