[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.
This commit is contained in:
Vladimir Kondratyev 2019-11-03 20:55:28 +00:00
parent 6777ccd98b
commit 6825cefb23

View File

@ -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 @@ init_device(device_t dev, struct cyapa_cap *cap, int probe)
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);