|
@@ -410,17 +410,14 @@ fast_ata_pio:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * init_chipset_piix - set up the PIIX chipset
|
|
|
- * @dev: PCI device to set up
|
|
|
- * @name: Name of the device
|
|
|
+ * piix_is_ichx - check if ICHx
|
|
|
+ * @dev: PCI device to check
|
|
|
*
|
|
|
- * Initialize the PCI device as required. For the PIIX this turns
|
|
|
- * out to be nice and simple
|
|
|
+ * returns 1 if ICHx, 0 otherwise.
|
|
|
*/
|
|
|
-
|
|
|
-static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char *name)
|
|
|
+static int piix_is_ichx(struct pci_dev *dev)
|
|
|
{
|
|
|
- switch(dev->device) {
|
|
|
+ switch (dev->device) {
|
|
|
case PCI_DEVICE_ID_INTEL_82801EB_1:
|
|
|
case PCI_DEVICE_ID_INTEL_82801AA_1:
|
|
|
case PCI_DEVICE_ID_INTEL_82801AB_1:
|
|
@@ -438,18 +435,50 @@ static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char
|
|
|
case PCI_DEVICE_ID_INTEL_ICH7_21:
|
|
|
case PCI_DEVICE_ID_INTEL_ESB2_18:
|
|
|
case PCI_DEVICE_ID_INTEL_ICH8_6:
|
|
|
- {
|
|
|
- unsigned int extra = 0;
|
|
|
- pci_read_config_dword(dev, 0x54, &extra);
|
|
|
- pci_write_config_dword(dev, 0x54, extra|0x400);
|
|
|
- }
|
|
|
- default:
|
|
|
- break;
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * init_chipset_piix - set up the PIIX chipset
|
|
|
+ * @dev: PCI device to set up
|
|
|
+ * @name: Name of the device
|
|
|
+ *
|
|
|
+ * Initialize the PCI device as required. For the PIIX this turns
|
|
|
+ * out to be nice and simple
|
|
|
+ */
|
|
|
+
|
|
|
+static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char *name)
|
|
|
+{
|
|
|
+ if (piix_is_ichx(dev)) {
|
|
|
+ unsigned int extra = 0;
|
|
|
+ pci_read_config_dword(dev, 0x54, &extra);
|
|
|
+ pci_write_config_dword(dev, 0x54, extra|0x400);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * piix_dma_clear_irq - clear BMDMA status
|
|
|
+ * @drive: IDE drive to clear
|
|
|
+ *
|
|
|
+ * Called from ide_intr() for PIO interrupts
|
|
|
+ * to clear BMDMA status as needed by ICHx
|
|
|
+ */
|
|
|
+static void piix_dma_clear_irq(ide_drive_t *drive)
|
|
|
+{
|
|
|
+ ide_hwif_t *hwif = HWIF(drive);
|
|
|
+ u8 dma_stat;
|
|
|
+
|
|
|
+ /* clear the INTR & ERROR bits */
|
|
|
+ dma_stat = hwif->INB(hwif->dma_status);
|
|
|
+ /* Should we force the bit as well ? */
|
|
|
+ hwif->OUTB(dma_stat, hwif->dma_status);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* init_hwif_piix - fill in the hwif for the PIIX
|
|
|
* @hwif: IDE interface
|
|
@@ -486,6 +515,10 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif)
|
|
|
if (!hwif->dma_base)
|
|
|
return;
|
|
|
|
|
|
+ /* ICHx need to clear the bmdma status for all interrupts */
|
|
|
+ if (piix_is_ichx(hwif->pci_dev))
|
|
|
+ hwif->ide_dma_clear_irq = &piix_dma_clear_irq;
|
|
|
+
|
|
|
hwif->atapi_dma = 1;
|
|
|
hwif->ultra_mask = 0x3f;
|
|
|
hwif->mwdma_mask = 0x06;
|