Author: rnoland
Date: Mon Mar 16 08:21:51 2009
New Revision: 189870
URL: http://svn.freebsd.org/changeset/base/189870

Log:
  Teach psm about O_ASYNC
  
  This makes Xorg happy if you aren't using moused.
  
  MFC after:    3 days

Modified:
  head/sys/dev/atkbdc/psm.c

Modified: head/sys/dev/atkbdc/psm.c
==============================================================================
--- head/sys/dev/atkbdc/psm.c   Mon Mar 16 08:19:11 2009        (r189869)
+++ head/sys/dev/atkbdc/psm.c   Mon Mar 16 08:21:51 2009        (r189870)
@@ -70,7 +70,10 @@ __FBSDID("$FreeBSD$");
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/conf.h>
+#include <sys/filio.h>
 #include <sys/poll.h>
+#include <sys/sigio.h>
+#include <sys/signalvar.h>
 #include <sys/syslog.h>
 #include <machine/bus.h>
 #include <sys/rman.h>
@@ -299,6 +302,7 @@ struct psm_softc {          /* Driver status inf
        struct cdev     *bdev;
        int             lasterr;
        int             cmdcount;
+       struct sigio    *async;         /* Processes waiting for SIGIO */
 };
 static devclass_t psm_devclass;
 #define        PSM_SOFTC(unit) \
@@ -1490,6 +1494,7 @@ psmopen(struct cdev *dev, int flag, int 
        sc->mode.level = sc->dflt_mode.level;
        sc->mode.protocol = sc->dflt_mode.protocol;
        sc->watchdog = FALSE;
+       sc->async = NULL;
 
        /* flush the event queue */
        sc->queue.count = 0;
@@ -1629,6 +1634,12 @@ psmclose(struct cdev *dev, int flag, int
        /* remove anything left in the output buffer */
        empty_aux_buffer(sc->kbdc, 10);
 
+       /* clean up and sigio requests */
+       if (sc->async != NULL) {
+               funsetown(&sc->async);
+               sc->async = NULL;
+       }
+
        /* close is almost always successful */
        sc->state &= ~PSM_OPEN;
        kbdc_lock(sc->kbdc, FALSE);
@@ -2190,6 +2201,15 @@ psmioctl(struct cdev *dev, u_long cmd, c
                break;
 #endif /* MOUSE_GETHWID */
 
+       case FIONBIO:
+       case FIOASYNC:
+               break;
+       case FIOSETOWN:
+               error = fsetown(*(int *)addr, &sc->async);
+               break;
+       case FIOGETOWN:
+               *(int *) addr = fgetown(&sc->async);
+               break;
        default:
                return (ENOTTY);
        }
@@ -3454,6 +3474,9 @@ next:
                wakeup(sc);
        }
        selwakeuppri(&sc->rsel, PZERO);
+       if (sc->async != NULL) {
+               pgsigio(&sc->async, SIGIO, 0);
+       }
        sc->state &= ~PSM_SOFTARMED;
        splx(s);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to