]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOInterruptController.cpp
xnu-344.23.tar.gz
[apple/xnu.git] / iokit / Kernel / IOInterruptController.cpp
index 1bef319c7cc11aa1c0d61027427a4245e6b3fa45..bd3baa04db7b7bee1065f6d56543537177d2aa28 100644 (file)
@@ -3,22 +3,19 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
  * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
@@ -99,10 +96,10 @@ IOReturn IOInterruptController::registerInterrupt(IOService *nub, int source,
       originalNub = vector->nub;
       originalSource = vector->source;
       
-      // Physically disable the interrupt, but mark it as being enables in the hardware.
-      // The interruptDisabledSoft now indicates the driver's request for enablement.
-      disableVectorHard(vectorNumber, vector);
-      vector->interruptDisabledHard = 0;
+      // Save the dis/enable state for the original consumer's interrupt.
+      // Then disable the source
+      wasDisabledSoft = vector->interruptDisabledSoft;
+      disableInterrupt(originalNub, originalSource);
       
       // Initialize the new shared interrupt controller.
       error = vector->sharedController->initInterruptController(this,
@@ -128,17 +125,7 @@ IOReturn IOInterruptController::registerInterrupt(IOService *nub, int source,
       // put the original consumor's interrupt back to normal and
       // get rid of whats left of the shared controller.
       if (error != kIOReturnSuccess) {
-       // Save the driver's interrupt enablement state.
-       wasDisabledSoft = vector->interruptDisabledSoft;
-       
-       // Make the interrupt really hard disabled.
-       vector->interruptDisabledSoft = 1;
-       vector->interruptDisabledHard = 1;
-       
-       // Enable the original consumer's interrupt if needed.
-       if (!wasDisabledSoft) originalNub->enableInterrupt(originalSource);
         enableInterrupt(originalNub, originalSource);
-       
         vector->sharedController->release();
         vector->sharedController = 0;
         IOUnlock(vector->interruptLock);
@@ -152,13 +139,6 @@ IOReturn IOInterruptController::registerInterrupt(IOService *nub, int source,
       vector->target  = vector->sharedController;
       vector->refCon  = 0;
       
-      // Save the driver's interrupt enablement state.
-      wasDisabledSoft = vector->interruptDisabledSoft;
-      
-      // Make the interrupt really hard disabled.
-      vector->interruptDisabledSoft = 1;
-      vector->interruptDisabledHard = 1;
-      
       // Enable the original consumer's interrupt if needed.
       if (!wasDisabledSoft) originalNub->enableInterrupt(originalSource);
     }
@@ -419,7 +399,7 @@ IOReturn IOSharedInterruptController::initInterruptController(IOInterruptControl
   }
   
   // Allocate the memory for the vectors
-  numVectors = 32; // For now a constant number.
+  numVectors = 8; // For now a constant number.
   vectors = (IOInterruptVector *)IOMalloc(numVectors * sizeof(IOInterruptVector));
   if (vectors == NULL) {
     IOFree(_interruptSources, sizeof(IOInterruptSource));