]> err.no Git - linux-2.6/blobdiff - drivers/ata/ata_generic.c
ata: fix sparse warning in pata_acpi.c
[linux-2.6] / drivers / ata / ata_generic.c
index fb5434c8ae6e39bdb96a1f9a4926eb5d45853d09..20534202fc79b28c5e93f944fe3224a460016318 100644 (file)
@@ -26,7 +26,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME "ata_generic"
-#define DRV_VERSION "0.2.13"
+#define DRV_VERSION "0.2.15"
 
 /*
  *     A generic parallel ATA driver using libata
@@ -48,11 +48,15 @@ static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
        struct ata_port *ap = link->ap;
        int dma_enabled = 0;
        struct ata_device *dev;
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
 
        /* Bits 5 and 6 indicate if DMA is active on master/slave */
        if (ap->ioaddr.bmdma_addr)
                dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 
+       if (pdev->vendor == PCI_VENDOR_ID_CENATEK)
+               dma_enabled = 0xFF;
+
        ata_link_for_each_dev(dev, link) {
                if (!ata_dev_enabled(dev))
                        continue;
@@ -63,7 +67,22 @@ static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
                /* We do need the right mode information for DMA or PIO
                   and this comes from the current configuration flags */
                if (dma_enabled & (1 << (5 + dev->devno))) {
-                       ata_id_to_dma_mode(dev, XFER_MW_DMA_0);
+                       unsigned int xfer_mask = ata_id_xfermask(dev->id);
+                       const char *name;
+
+                       if (xfer_mask & (ATA_MASK_MWDMA | ATA_MASK_UDMA))
+                               name = ata_mode_string(xfer_mask);
+                       else {
+                               /* SWDMA perhaps? */
+                               name = "DMA";
+                               xfer_mask |= ata_xfer_mode2mask(XFER_MW_DMA_0);
+                       }
+
+                       ata_dev_printk(dev, KERN_INFO, "configured for %s\n",
+                                      name);
+
+                       dev->xfer_mode = ata_xfer_mask2mode(xfer_mask);
+                       dev->xfer_shift = ata_xfer_mode2shift(dev->xfer_mode);
                        dev->flags &= ~ATA_DFLAG_PIO;
                } else {
                        ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
@@ -186,6 +205,7 @@ static struct pci_device_id ata_generic[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_HINT,   PCI_DEVICE_ID_HINT_VXPROII_IDE), },
        { PCI_DEVICE(PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_82C561), },
        { PCI_DEVICE(PCI_VENDOR_ID_OPTI,   PCI_DEVICE_ID_OPTI_82C558), },
+       { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), },
        { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO), },
        { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), },
        { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2),  },