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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to