Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Aug 2012 17:58:59 +0000 (UTC)
From:      Jakub Wojciech Klama <jceel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r239098 - user/jceel/soc2012_armv6/sys/arm/arm
Message-ID:  <201208061758.q76Hwx2r065419@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jceel
Date: Mon Aug  6 17:58:58 2012
New Revision: 239098
URL: http://svn.freebsd.org/changeset/base/239098

Log:
  Improvements in intrng code: fill in arm_remove_irqhandler() routine,
  add support for interrupt counting, some general cleanup.

Modified:
  user/jceel/soc2012_armv6/sys/arm/arm/intrng.c

Modified: user/jceel/soc2012_armv6/sys/arm/arm/intrng.c
==============================================================================
--- user/jceel/soc2012_armv6/sys/arm/arm/intrng.c	Mon Aug  6 17:00:29 2012	(r239097)
+++ user/jceel/soc2012_armv6/sys/arm/arm/intrng.c	Mon Aug  6 17:58:58 2012	(r239098)
@@ -73,11 +73,10 @@ struct arm_intr_controller {
 
 struct arm_intr_handler {
 	device_t		ih_dev;
-	int			ih_intrcnt;
+	int			ih_intrcnt_idx;
 	int			ih_irq;
 	struct intr_event *	ih_event;
 	struct arm_intr_controller *ih_pic;
-	struct arm_intr_controller *ih_self;
 };
 
 static void arm_mask_irq(void *);
@@ -87,6 +86,9 @@ static void arm_eoi(void *);
 static struct arm_intr_handler arm_intrs[NIRQ];
 static struct arm_intr_controller arm_pics[NPIC];
 
+static int intrcnt_index = 0;
+static int last_printed = 0;
+
 void
 arm_dispatch_irq(device_t dev, struct trapframe *tf, int irq)
 {
@@ -108,7 +110,7 @@ arm_dispatch_irq(device_t dev, struct tr
 
 	debugf("requested by %s\n", device_get_nameunit(ih->ih_dev));
 
-	ih->ih_intrcnt++;
+	intrcnt[ih->ih_intrcnt_idx]++;
 	if (intr_event_handle(ih->ih_event, tf) != 0) {
 		/* Stray IRQ */
 		arm_mask_irq(ih);
@@ -241,44 +243,45 @@ arm_setup_irqhandler(device_t dev, drive
 
 		arm_unmask_irq(ih);
 
-		debugf("self interrupt controller %p\n", ih->ih_self);
-#if 0
 		last_printed += 
 		    snprintf(intrnames + last_printed,
-		    MAXCOMLEN + 1,
-		    "irq%d: %s", irq, device_get_nameunit(dev));
+		    MAXCOMLEN + 1, "%s:%d: %s",
+		    device_get_nameunit(pic->ic_dev),
+		    ih->ih_irq, device_get_nameunit(dev));
+		
 		last_printed++;
-		intrcnt_tab[irq] = intrcnt_index;
+		ih->ih_intrcnt_idx = intrcnt_index;
 		intrcnt_index++;
 		
-#endif
 	}
 
 	intr_event_add_handler(ih->ih_event, device_get_nameunit(dev), filt, hand, arg,
 	    intr_priority(flags), flags, cookiep);
-
-	debugf("done\n");
-	*cookiep = ih;
 }
 
 int
 arm_remove_irqhandler(int irq, void *cookie)
 {
-	struct arm_intr_handler *ih = (struct arm_intr_handler *)ih;
-	/*
-	struct intr_event *event;
+	struct arm_intr_controller *pic;
+	struct arm_intr_handler *ih;
 	int error;
 
-	event = intr_events[irq];
-	arm_mask_irq(irq);
-	
+	if (irq < 0)
+		return (ENXIO);
+
+	pic = &arm_pics[IRQ_PIC_IDX(irq)];
+	ih = arm_lookup_intr_handler(pic->ic_dev, IRQ_VECTOR_IDX(irq));
+
+	if (ih->ih_event == NULL)
+		return (ENXIO);
+
+	arm_mask_irq(ih);
 	error = intr_event_remove_handler(cookie);
 
-	if (!TAILQ_EMPTY(&event->ie_handlers))
-		arm_unmask_irq(irq);
+	if (!TAILQ_EMPTY(&ih->ih_event->ie_handlers))
+		arm_unmask_irq(ih);
+
 	return (error);
-	*/
-	return (ENXIO);
 }
 
 void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208061758.q76Hwx2r065419>