svn commit: r190017 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/atkbdc dev/cxgb

Robert Noland rnoland at FreeBSD.org
Thu Mar 19 00:40:42 PDT 2009


Author: rnoland
Date: Thu Mar 19 07:40:41 2009
New Revision: 190017
URL: http://svn.freebsd.org/changeset/base/190017

Log:
  Merge 189870
  
  Teach psm about O_ASYNC
  
  This makes Xorg happy if you aren't using moused.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/atkbdc/psm.c
  stable/7/sys/dev/cxgb/   (props changed)

Modified: stable/7/sys/dev/atkbdc/psm.c
==============================================================================
--- stable/7/sys/dev/atkbdc/psm.c	Thu Mar 19 07:39:07 2009	(r190016)
+++ stable/7/sys/dev/atkbdc/psm.c	Thu Mar 19 07:40:41 2009	(r190017)
@@ -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>
@@ -212,6 +215,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)	\
@@ -1383,6 +1387,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;
@@ -1522,6 +1527,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);
@@ -2083,6 +2094,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);
 	}
@@ -2972,6 +2992,9 @@ next:
 		wakeup(sc);
 	}
 	selwakeuppri(&sc->rsel, PZERO);
+	if (sc->async != NULL) {
+		pgsigio(&sc->async, SIGIO, 0);
+	}
 	sc->state &= ~PSM_SOFTARMED;
 	splx(s);
 }


More information about the svn-src-all mailing list