PERFORCE change 111914 for review

Paolo Pisati piso at FreeBSD.org
Mon Dec 18 16:06:18 PST 2006


http://perforce.freebsd.org/chv.cgi?CH=111914

Change 111914 by piso at piso_newluxor on 2006/12/19 00:06:12

	Teach pccard how to handle filters.

Affected files ...

.. //depot/projects/soc2006/intr_filter/dev/pccard/pccard.c#4 edit
.. //depot/projects/soc2006/intr_filter/dev/pccard/pccardvarp.h#2 edit

Differences ...

==== //depot/projects/soc2006/intr_filter/dev/pccard/pccard.c#4 (text+ko) ====

@@ -118,6 +118,7 @@
 static int	pccard_release_resource(device_t dev, device_t child, int type,
 		    int rid, struct resource *r);
 static void	pccard_child_detached(device_t parent, device_t dev);
+static int      pccard_filter(void *arg);
 static void	pccard_intr(void *arg);
 static int	pccard_setup_intr(device_t dev, device_t child,
 		    struct resource *irq, int flags, driver_filter_t *filter, 
@@ -1173,8 +1174,8 @@
 	pccard_function_disable(pf);
 }
 
-static void
-pccard_intr(void *arg)
+static int
+pccard_filter(void *arg)
 {
 	struct pccard_function *pf = (struct pccard_function*) arg;
 	int reg;
@@ -1204,8 +1205,21 @@
 		else
 			doisr = 0;
 	}
-	if (pf->intr_handler != NULL && doisr)
-		pf->intr_handler(pf->intr_handler_arg);
+	if (pf->intr_handler != NULL && doisr) {
+		if (pf->intr_filter != NULL)
+			return (pf->intr_filter(pf->intr_handler_arg));
+		else 
+			return (FILTER_HANDLED | FILTER_SCHEDULE_THREAD);
+	}
+	return (FILTER_STRAY);
+}
+
+static void
+pccard_intr(void *arg)
+{
+	struct pccard_function *pf = (struct pccard_function*) arg;
+	
+	pf->intr_handler(pf->intr_handler_arg);	
 }
 
 static int
@@ -1220,13 +1234,11 @@
 
 	if (pf->intr_handler != NULL)
 		panic("Only one interrupt handler per function allowed");
-	err = bus_generic_setup_intr(dev, child, irq, flags, filter, pccard_intr,
+	err = bus_generic_setup_intr(dev, child, irq, flags, pccard_filter, pccard_intr,
 	    pf, cookiep);
 	if (err != 0)
 		return (err);
-	/*
-	 * XXX_FILTER this code doesn't take care of filters.
-	 */
+	pf->intr_filter = filter;
 	pf->intr_handler = intr;
 	pf->intr_handler_arg = arg;
 	pf->intr_handler_cookie = *cookiep;

==== //depot/projects/soc2006/intr_filter/dev/pccard/pccardvarp.h#2 (text+ko) ====

@@ -112,6 +112,7 @@
 	bus_addr_t	pf_mfc_iobase;
 	bus_addr_t	pf_mfc_iomax;
 	int		pf_flags;
+	driver_filter_t	*intr_filter;
 	driver_intr_t	*intr_handler;
 	void		*intr_handler_arg;
 	void		*intr_handler_cookie;


More information about the p4-projects mailing list