Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / ide / pci / siimage.c
index 2b9961b..f1ca154 100644 (file)
@@ -6,7 +6,13 @@
  *
  *  May be copied or modified under the terms of the GNU General Public License
  *
- *  Documentation available under NDA only
+ *  Documentation for CMD680:
+ *  http://gkernel.sourceforge.net/specs/sii/sii-0680a-v1.31.pdf.bz2
+ *
+ *  Documentation for SiI 3112:
+ *  http://gkernel.sourceforge.net/specs/sii/3112A_SiI-DS-0095-B2.pdf.bz2
+ *
+ *  Errata and other documentation only available under NDA.
  *
  *
  *  FAQ Items:
@@ -701,6 +707,7 @@ static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name)
        unsigned long barsize   = pci_resource_len(dev, 5);
        u8 tmpbyte      = 0;
        void __iomem *ioaddr;
+       u32 tmp, irq_mask;
 
        /*
         *      Drop back to PIO if we can't map the mmio. Some
@@ -726,6 +733,14 @@ static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name)
        pci_set_drvdata(dev, (void *) ioaddr);
 
        if (pdev_is_sata(dev)) {
+               /* make sure IDE0/1 interrupts are not masked */
+               irq_mask = (1 << 22) | (1 << 23);
+               tmp = readl(ioaddr + 0x48);
+               if (tmp & irq_mask) {
+                       tmp &= ~irq_mask;
+                       writel(tmp, ioaddr + 0x48);
+                       readl(ioaddr + 0x48); /* flush */
+               }
                writel(0, ioaddr + 0x148);
                writel(0, ioaddr + 0x1C8);
        }