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 / sl82c105.c
index 38bd807..8a5c7b2 100644 (file)
@@ -236,15 +236,13 @@ static int sl82c105_ide_dma_lost_irq(ide_drive_t *drive)
  * The generic IDE core will have disabled the BMEN bit before this
  * function is called.
  */
-static int sl82c105_ide_dma_begin(ide_drive_t *drive)
+static void sl82c105_ide_dma_start(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = HWIF(drive);
        struct pci_dev *dev = hwif->pci_dev;
 
-//     DBG(("sl82c105_ide_dma_begin(drive:%s)\n", drive->name));
-
        sl82c105_reset_host(dev);
-       return __ide_dma_begin(drive);
+       ide_dma_start(drive);
 }
 
 static int sl82c105_ide_dma_timeout(ide_drive_t *drive)
@@ -388,7 +386,7 @@ static unsigned int sl82c105_bridge_revision(struct pci_dev *dev)
  * channel 0 here at least, but channel 1 has to be enabled by
  * firmware or arch code. We still set both to 16 bits mode.
  */
-static unsigned int __init init_chipset_sl82c105(struct pci_dev *dev, const char *msg)
+static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const char *msg)
 {
        u32 val;
 
@@ -401,41 +399,15 @@ static unsigned int __init init_chipset_sl82c105(struct pci_dev *dev, const char
        return dev->irq;
 }
 
-static void __init init_dma_sl82c105(ide_hwif_t *hwif, unsigned long dma_base)
-{
-       unsigned int rev;
-       u8 dma_state;
-
-       DBG(("init_dma_sl82c105(hwif: ide%d, dma_base: 0x%08x)\n", hwif->index, dma_base));
-
-       hwif->autodma = 0;
-
-       if (!dma_base)
-               return;
-
-       dma_state = hwif->INB(dma_base + 2);
-       rev = sl82c105_bridge_revision(hwif->pci_dev);
-       if (rev <= 5) {
-               printk("    %s: Winbond 553 bridge revision %d, BM-DMA disabled\n",
-                      hwif->name, rev);
-               dma_state &= ~0x60;
-       } else {
-               dma_state |= 0x60;
-               if (!noautodma)
-                       hwif->autodma = 1;
-       }
-       hwif->OUTB(dma_state, dma_base + 2);
-
-       ide_setup_dma(hwif, dma_base, 8);
-}
-
 /*
  * Initialise the chip
  */
 
-static void __init init_hwif_sl82c105(ide_hwif_t *hwif)
+static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = hwif->pci_dev;
+       unsigned int rev;
+       u8 dma_state;
        u32 val;
        
        DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index));
@@ -457,33 +429,54 @@ static void __init init_hwif_sl82c105(ide_hwif_t *hwif)
        pci_read_config_dword(dev, 0x40, &val);
        *((u32 *)&hwif->hwif_data) = val;
        
+       hwif->atapi_dma = 0;
+       hwif->mwdma_mask = 0;
+       hwif->swdma_mask = 0;
+       hwif->autodma = 0;
+
        if (!hwif->dma_base)
                return;
 
-       hwif->atapi_dma = 1;
-       hwif->mwdma_mask = 0x07;
-       hwif->swdma_mask = 0x07;
-
+       dma_state = hwif->INB(hwif->dma_base + 2) & ~0x60;
+       rev = sl82c105_bridge_revision(hwif->pci_dev);
+       if (rev <= 5) {
+               /*
+                * Never ever EVER under any circumstances enable
+                * DMA when the bridge is this old.
+                */
+               printk("    %s: Winbond 553 bridge revision %d, BM-DMA disabled\n",
+                      hwif->name, rev);
+       } else {
 #ifdef CONFIG_BLK_DEV_IDEDMA
-       hwif->ide_dma_check = &sl82c105_check_drive;
-       hwif->ide_dma_on = &sl82c105_ide_dma_on;
-       hwif->ide_dma_off_quietly = &sl82c105_ide_dma_off_quietly;
-       hwif->ide_dma_lostirq = &sl82c105_ide_dma_lost_irq;
-       hwif->ide_dma_begin = &sl82c105_ide_dma_begin;
-       hwif->ide_dma_timeout = &sl82c105_ide_dma_timeout;
-
-       if (!noautodma)
-               hwif->autodma = 1;
-       hwif->drives[0].autodma = hwif->autodma;
-       hwif->drives[1].autodma = hwif->autodma;
+               dma_state |= 0x60;
+
+               hwif->atapi_dma = 1;
+               hwif->mwdma_mask = 0x07;
+               hwif->swdma_mask = 0x07;
+
+               hwif->ide_dma_check = &sl82c105_check_drive;
+               hwif->ide_dma_on = &sl82c105_ide_dma_on;
+               hwif->ide_dma_off_quietly = &sl82c105_ide_dma_off_quietly;
+               hwif->ide_dma_lostirq = &sl82c105_ide_dma_lost_irq;
+               hwif->dma_start = &sl82c105_ide_dma_start;
+               hwif->ide_dma_timeout = &sl82c105_ide_dma_timeout;
+
+               if (!noautodma)
+                       hwif->autodma = 1;
+               hwif->drives[0].autodma = hwif->autodma;
+               hwif->drives[1].autodma = hwif->autodma;
+
+               if (hwif->mate)
+                       hwif->serialized = hwif->mate->serialized = 1;
 #endif /* CONFIG_BLK_DEV_IDEDMA */
+       }
+       hwif->OUTB(dma_state, hwif->dma_base + 2);
 }
 
 static ide_pci_device_t sl82c105_chipset __devinitdata = {
        .name           = "W82C105",
        .init_chipset   = init_chipset_sl82c105,
        .init_hwif      = init_hwif_sl82c105,
-       .init_dma       = init_dma_sl82c105,
        .channels       = 2,
        .autodma        = NOAUTODMA,
        .enablebits     = {{0x40,0x01,0x01}, {0x40,0x10,0x10}},
@@ -492,8 +485,7 @@ static ide_pci_device_t sl82c105_chipset __devinitdata = {
 
 static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       ide_setup_pci_device(dev, &sl82c105_chipset);
-       return 0;
+       return ide_setup_pci_device(dev, &sl82c105_chipset);
 }
 
 static struct pci_device_id sl82c105_pci_tbl[] = {
@@ -503,7 +495,7 @@ static struct pci_device_id sl82c105_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, sl82c105_pci_tbl);
 
 static struct pci_driver driver = {
-       .name           = "W82C105 IDE",
+       .name           = "W82C105_IDE",
        .id_table       = sl82c105_pci_tbl,
        .probe          = sl82c105_init_one,
 };