Ignore:
Timestamp:
Mar 16, 2011, 11:54:53 PM (14 years ago)
Author:
David Azarewicz
Message:

APIC interrupt fixes from trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/branches/uniaud32-2.1.x/lib32/pci.c

    r546 r548  
    4848
    4949BOOL    fSuspended = FALSE;
     50BOOL    fRewired = FALSE;
    5051extern int nrCardsDetected;
    5152
     
    248249                                                                                "Uniaud32");                                             // Name for acpi log
    249250                                if (!rc) {
    250                                         // Check APIC IRQ, if we have /SMP /APIC, must be set
    251                                         if (ApicIRQ) ulTmp1 = (ulTmp1 & (~0xff)) | (ApicIRQ & 0xff);
    252                                         else if (PicIRQ) ulTmp1 = (ulTmp1 & (~0xff)) | (PicIRQ & 0xff);
     251                                        if (PicIRQ) ulTmp1 = (ulTmp1 & (~0xff)) | (PicIRQ & 0xff); // Choose Pic interrupt for init time processing
     252                                        else if (ApicIRQ) ulTmp1 = (ulTmp1 & (~0xff)) | (ApicIRQ & 0xff);
    253253                                        rprintf(("pci_query_device: IRQs ACPI PIC=%ld APIC=%ld chosen=%d", PicIRQ, ApicIRQ, ulTmp1&0xff));
     254                                        pcidev->picirq = PicIRQ;   // Save the Pic and
     255                                        pcidev->apicirq = ApicIRQ; // Save the Apic interrupt for switching later
    254256                                }
    255257#endif /* ACPI */
     
    257259                                        pcidev->irq_resource[0].flags = IORESOURCE_IRQ;
    258260                                        pcidev->irq_resource[0].start = pcidev->irq_resource[0].end   = ulTmp1 & 0xffff;
    259                                         pcidev->irq = (u8)ulTmp1;
     261                                        pcidev->irq = (u8)ulTmp1; // This is the interrupt used for init time processing
    260262                                }
    261263
     
    502504
    503505                                // create adapter
    504                                 RMDone((pcidev->device << 16) | pcidev->vendor);
     506                                RMDone((pcidev->device << 16) | pcidev->vendor, &pcidev->hAdapter, &pcidev->hDevice);
    505507                                iNumCards++;
    506508
     
    516518                        }
    517519
    518                         RMDone(0);
     520                        RMDone(0, 0, 0);
    519521                }
    520522        }
     
    938940                if(pci_devices[i].devfn)
    939941                {
     942                        RMSetHandles(pci_devices[i].hAdapter, pci_devices[i].hDevice); /* DAZ - dirty hack */
    940943                        driver = pci_devices[i].pcidriver;
    941944                        if(driver && driver->resume) {
     
    962965                if(pci_devices[i].devfn)
    963966                {
     967                        RMSetHandles(pci_devices[i].hAdapter, pci_devices[i].hDevice); /* DAZ - dirty hack */
    964968                        driver = pci_devices[i].pcidriver;
    965969                        if(driver && driver->suspend) {
     
    977981        struct pci_dev *pcidev;
    978982        struct pci_driver *driver;
    979         ULONG PicIRQ, ApicIRQ, ulTmp1, rc;
     983        ULONG ulTmp1, rc;
    980984
    981985        for (i=0; i<MAX_PCI_DEVICES; i++) {
    982986                if (!pci_devices[i].devfn) continue;
    983987                pcidev = &pci_devices[i];
    984                 rc = ACPIFindPCIDevice( pcidev->bus->number,                             // Bus
    985                                                                 PCI_SLOT(pcidev->devfn),                         // Dev
    986                                                                 PCI_FUNC(pcidev->devfn),                         // Function
    987                                                                 &PicIRQ,                                                         // PIC IRQ
    988                                                                 &ApicIRQ,                                                        // APIC IRQ
    989                                                                 NULL,                                                            // ACPI handle to finding device
    990                                                                 "Uniaud32");                                             // Name for acpi log
    991                 if (!rc) {
    992                         ulTmp1 = 0;
    993                         // Check APIC IRQ, if we have /SMP /APIC, must be set
    994                         if (ApicIRQ) ulTmp1 = (ulTmp1 & (~0xff)) | (ApicIRQ & 0xff);
    995                         else if (PicIRQ) ulTmp1 = (ulTmp1 & (~0xff)) | (PicIRQ & 0xff);
    996                         rprintf(("PciAdjustInterrupts: IRQs ACPI PIC=%ld APIC=%ld was=%d chosen=%ld", PicIRQ, ApicIRQ, pcidev->irq, ulTmp1));
    997                         if( (u8)ulTmp1 && ((u8)ulTmp1 != 0xff) && ((u8)ulTmp1 != pcidev->irq) ) {
    998                                 driver = pcidev->pcidriver;
    999                                 if(driver && driver->suspend) driver->suspend(pcidev, SNDRV_CTL_POWER_D0);
    1000 
    1001                                 pcidev->irq_resource[0].flags = IORESOURCE_IRQ;
    1002                                 pcidev->irq_resource[0].start = pcidev->irq_resource[0].end   = ulTmp1 & 0xffff;
    1003                                 pcidev->irq = (u8)ulTmp1;
    1004 
    1005                                 if(driver && driver->resume) driver->resume(pcidev);
    1006                         }
     988                ulTmp1 = pcidev->irq;
     989                if (pcidev->apicirq) ulTmp1 = pcidev->apicirq;
     990                else if (pcidev->picirq) ulTmp1 = pcidev->picirq;
     991                rprintf(("PciAdjustInterrupts: IRQs ACPI PIC=%ld APIC=%ld was=%d chosen=%ld", pcidev->picirq, pcidev->apicirq, pcidev->irq, ulTmp1));
     992                if( (u8)ulTmp1 && ((u8)ulTmp1 != 0xff) && ((u8)ulTmp1 != pcidev->irq) ) {
     993                        RMSetHandles(pcidev->hAdapter, pcidev->hDevice); /* DAZ - dirty hack */
     994                        driver = pcidev->pcidriver;
     995                        if(driver && driver->suspend) driver->suspend(pcidev, SNDRV_CTL_POWER_D0);
     996                        fSuspended = TRUE;
     997
     998                        pcidev->irq_resource[0].flags = IORESOURCE_IRQ;
     999                        pcidev->irq_resource[0].start = pcidev->irq_resource[0].end   = ulTmp1 & 0xffff;
     1000                        pcidev->irq = (u8)ulTmp1;
     1001
     1002                        fRewired = TRUE;
     1003                        // if(driver && driver->resume) driver->resume(pcidev);
    10071004                }
    10081005        } /* for loop */
Note: See TracChangeset for help on using the changeset viewer.