|
@@ -24,7 +24,7 @@
|
|
#include <linux/libata.h>
|
|
#include <linux/libata.h>
|
|
|
|
|
|
#define DRV_NAME "pata_hpt37x"
|
|
#define DRV_NAME "pata_hpt37x"
|
|
-#define DRV_VERSION "0.6.12"
|
|
|
|
|
|
+#define DRV_VERSION "0.6.14"
|
|
|
|
|
|
struct hpt_clock {
|
|
struct hpt_clock {
|
|
u8 xfer_speed;
|
|
u8 xfer_speed;
|
|
@@ -411,9 +411,8 @@ static void hpt370_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
|
|
|
|
pci_read_config_dword(pdev, addr1, ®);
|
|
pci_read_config_dword(pdev, addr1, ®);
|
|
mode = hpt37x_find_mode(ap, adev->pio_mode);
|
|
mode = hpt37x_find_mode(ap, adev->pio_mode);
|
|
- mode &= ~0x8000000; /* No FIFO in PIO */
|
|
|
|
- mode &= ~0x30070000; /* Leave config bits alone */
|
|
|
|
- reg &= 0x30070000; /* Strip timing bits */
|
|
|
|
|
|
+ mode &= 0xCFC3FFFF; /* Leave DMA bits alone */
|
|
|
|
+ reg &= ~0xCFC3FFFF; /* Strip timing bits */
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -430,8 +429,7 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
{
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
u32 addr1, addr2;
|
|
u32 addr1, addr2;
|
|
- u32 reg;
|
|
|
|
- u32 mode;
|
|
|
|
|
|
+ u32 reg, mode, mask;
|
|
u8 fast;
|
|
u8 fast;
|
|
|
|
|
|
addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no);
|
|
addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no);
|
|
@@ -443,11 +441,12 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
fast |= 0x01;
|
|
fast |= 0x01;
|
|
pci_write_config_byte(pdev, addr2, fast);
|
|
pci_write_config_byte(pdev, addr2, fast);
|
|
|
|
|
|
|
|
+ mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000;
|
|
|
|
+
|
|
pci_read_config_dword(pdev, addr1, ®);
|
|
pci_read_config_dword(pdev, addr1, ®);
|
|
mode = hpt37x_find_mode(ap, adev->dma_mode);
|
|
mode = hpt37x_find_mode(ap, adev->dma_mode);
|
|
- mode |= 0x8000000; /* FIFO in MWDMA or UDMA */
|
|
|
|
- mode &= ~0xC0000000; /* Leave config bits alone */
|
|
|
|
- reg &= 0xC0000000; /* Strip timing bits */
|
|
|
|
|
|
+ mode &= mask;
|
|
|
|
+ reg &= ~mask;
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -515,9 +514,8 @@ static void hpt372_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
mode = hpt37x_find_mode(ap, adev->pio_mode);
|
|
mode = hpt37x_find_mode(ap, adev->pio_mode);
|
|
|
|
|
|
printk("Find mode for %d reports %X\n", adev->pio_mode, mode);
|
|
printk("Find mode for %d reports %X\n", adev->pio_mode, mode);
|
|
- mode &= ~0x80000000; /* No FIFO in PIO */
|
|
|
|
- mode &= ~0x30070000; /* Leave config bits alone */
|
|
|
|
- reg &= 0x30070000; /* Strip timing bits */
|
|
|
|
|
|
+ mode &= 0xCFC3FFFF; /* Leave DMA bits alone */
|
|
|
|
+ reg &= ~0xCFC3FFFF; /* Strip timing bits */
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -534,8 +532,7 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
{
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
u32 addr1, addr2;
|
|
u32 addr1, addr2;
|
|
- u32 reg;
|
|
|
|
- u32 mode;
|
|
|
|
|
|
+ u32 reg, mode, mask;
|
|
u8 fast;
|
|
u8 fast;
|
|
|
|
|
|
addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no);
|
|
addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no);
|
|
@@ -546,12 +543,13 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
fast &= ~0x07;
|
|
fast &= ~0x07;
|
|
pci_write_config_byte(pdev, addr2, fast);
|
|
pci_write_config_byte(pdev, addr2, fast);
|
|
|
|
|
|
|
|
+ mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000;
|
|
|
|
+
|
|
pci_read_config_dword(pdev, addr1, ®);
|
|
pci_read_config_dword(pdev, addr1, ®);
|
|
mode = hpt37x_find_mode(ap, adev->dma_mode);
|
|
mode = hpt37x_find_mode(ap, adev->dma_mode);
|
|
printk("Find mode for DMA %d reports %X\n", adev->dma_mode, mode);
|
|
printk("Find mode for DMA %d reports %X\n", adev->dma_mode, mode);
|
|
- mode &= ~0xC0000000; /* Leave config bits alone */
|
|
|
|
- mode |= 0x80000000; /* FIFO in MWDMA or UDMA */
|
|
|
|
- reg &= 0xC0000000; /* Strip timing bits */
|
|
|
|
|
|
+ mode &= mask;
|
|
|
|
+ reg &= ~mask;
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
pci_write_config_dword(pdev, addr1, reg | mode);
|
|
}
|
|
}
|
|
|
|
|