diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-03-06 22:44:13 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-03-06 22:44:13 -0500 |
commit | ae5dd8e346efc25a5f9cc9d01bc0915c40eb38d9 (patch) | |
tree | 993d3486db9bd154859d20026875c11292e4e143 | |
parent | 38f3323037de22bb0089d08be27be01196e7148b (diff) | |
parent | 63ed71019c4437caef65fca1f83c990ae729024f (diff) |
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev:
pata_pdc202xx_old: fix data corruption and other problems
pata_legacy: fix io/irq mismatch
ahci: RAID mode SATA patch for Intel ICH9M
-rw-r--r-- | drivers/ata/ahci.c | 1 | ||||
-rw-r--r-- | drivers/ata/pata_legacy.c | 2 | ||||
-rw-r--r-- | drivers/ata/pata_pdc202xx_old.c | 22 |
3 files changed, 16 insertions, 9 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 43cc43d7b591..dc7b56225923 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -389,6 +389,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
389 | { PCI_VDEVICE(INTEL, 0x2929), board_ahci_pi }, /* ICH9M */ | 389 | { PCI_VDEVICE(INTEL, 0x2929), board_ahci_pi }, /* ICH9M */ |
390 | { PCI_VDEVICE(INTEL, 0x292a), board_ahci_pi }, /* ICH9M */ | 390 | { PCI_VDEVICE(INTEL, 0x292a), board_ahci_pi }, /* ICH9M */ |
391 | { PCI_VDEVICE(INTEL, 0x292b), board_ahci_pi }, /* ICH9M */ | 391 | { PCI_VDEVICE(INTEL, 0x292b), board_ahci_pi }, /* ICH9M */ |
392 | { PCI_VDEVICE(INTEL, 0x292c), board_ahci_pi }, /* ICH9M */ | ||
392 | { PCI_VDEVICE(INTEL, 0x292f), board_ahci_pi }, /* ICH9M */ | 393 | { PCI_VDEVICE(INTEL, 0x292f), board_ahci_pi }, /* ICH9M */ |
393 | { PCI_VDEVICE(INTEL, 0x294d), board_ahci_pi }, /* ICH9 */ | 394 | { PCI_VDEVICE(INTEL, 0x294d), board_ahci_pi }, /* ICH9 */ |
394 | { PCI_VDEVICE(INTEL, 0x294e), board_ahci_pi }, /* ICH9M */ | 395 | { PCI_VDEVICE(INTEL, 0x294e), board_ahci_pi }, /* ICH9M */ |
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c index fc5b73d78e00..86fbcd6a742b 100644 --- a/drivers/ata/pata_legacy.c +++ b/drivers/ata/pata_legacy.c | |||
@@ -69,7 +69,7 @@ | |||
69 | #define NR_HOST 6 | 69 | #define NR_HOST 6 |
70 | 70 | ||
71 | static int legacy_port[NR_HOST] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 }; | 71 | static int legacy_port[NR_HOST] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 }; |
72 | static int legacy_irq[NR_HOST] = { 15, 14, 11, 10, 8, 12 }; | 72 | static int legacy_irq[NR_HOST] = { 14, 15, 11, 10, 8, 12 }; |
73 | 73 | ||
74 | struct legacy_data { | 74 | struct legacy_data { |
75 | unsigned long timing; | 75 | unsigned long timing; |
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c index 3fb417780166..acdc52cbe38a 100644 --- a/drivers/ata/pata_pdc202xx_old.c +++ b/drivers/ata/pata_pdc202xx_old.c | |||
@@ -2,13 +2,14 @@ | |||
2 | * pata_pdc202xx_old.c - Promise PDC202xx PATA for new ATA layer | 2 | * pata_pdc202xx_old.c - Promise PDC202xx PATA for new ATA layer |
3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@redhat.com> |
5 | * (C) 2007 Bartlomiej Zolnierkiewicz | ||
5 | * | 6 | * |
6 | * Based in part on linux/drivers/ide/pci/pdc202xx_old.c | 7 | * Based in part on linux/drivers/ide/pci/pdc202xx_old.c |
7 | * | 8 | * |
8 | * First cut with LBA48/ATAPI | 9 | * First cut with LBA48/ATAPI |
9 | * | 10 | * |
10 | * TODO: | 11 | * TODO: |
11 | * Channel interlock/reset on both required ? | 12 | * Channel interlock/reset on both required |
12 | */ | 13 | */ |
13 | 14 | ||
14 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
@@ -21,7 +22,7 @@ | |||
21 | #include <linux/libata.h> | 22 | #include <linux/libata.h> |
22 | 23 | ||
23 | #define DRV_NAME "pata_pdc202xx_old" | 24 | #define DRV_NAME "pata_pdc202xx_old" |
24 | #define DRV_VERSION "0.3.0" | 25 | #define DRV_VERSION "0.4.0" |
25 | 26 | ||
26 | /** | 27 | /** |
27 | * pdc2024x_pre_reset - probe begin | 28 | * pdc2024x_pre_reset - probe begin |
@@ -76,7 +77,7 @@ static void pdc2026x_error_handler(struct ata_port *ap) | |||
76 | static void pdc202xx_configure_piomode(struct ata_port *ap, struct ata_device *adev, int pio) | 77 | static void pdc202xx_configure_piomode(struct ata_port *ap, struct ata_device *adev, int pio) |
77 | { | 78 | { |
78 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 79 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
79 | int port = 0x60 + 4 * ap->port_no + 2 * adev->devno; | 80 | int port = 0x60 + 8 * ap->port_no + 4 * adev->devno; |
80 | static u16 pio_timing[5] = { | 81 | static u16 pio_timing[5] = { |
81 | 0x0913, 0x050C , 0x0308, 0x0206, 0x0104 | 82 | 0x0913, 0x050C , 0x0308, 0x0206, 0x0104 |
82 | }; | 83 | }; |
@@ -85,7 +86,7 @@ static void pdc202xx_configure_piomode(struct ata_port *ap, struct ata_device *a | |||
85 | pci_read_config_byte(pdev, port, &r_ap); | 86 | pci_read_config_byte(pdev, port, &r_ap); |
86 | pci_read_config_byte(pdev, port + 1, &r_bp); | 87 | pci_read_config_byte(pdev, port + 1, &r_bp); |
87 | r_ap &= ~0x3F; /* Preserve ERRDY_EN, SYNC_IN */ | 88 | r_ap &= ~0x3F; /* Preserve ERRDY_EN, SYNC_IN */ |
88 | r_bp &= ~0x07; | 89 | r_bp &= ~0x1F; |
89 | r_ap |= (pio_timing[pio] >> 8); | 90 | r_ap |= (pio_timing[pio] >> 8); |
90 | r_bp |= (pio_timing[pio] & 0xFF); | 91 | r_bp |= (pio_timing[pio] & 0xFF); |
91 | 92 | ||
@@ -123,7 +124,7 @@ static void pdc202xx_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
123 | static void pdc202xx_set_dmamode(struct ata_port *ap, struct ata_device *adev) | 124 | static void pdc202xx_set_dmamode(struct ata_port *ap, struct ata_device *adev) |
124 | { | 125 | { |
125 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 126 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
126 | int port = 0x60 + 4 * ap->port_no + 2 * adev->devno; | 127 | int port = 0x60 + 8 * ap->port_no + 4 * adev->devno; |
127 | static u8 udma_timing[6][2] = { | 128 | static u8 udma_timing[6][2] = { |
128 | { 0x60, 0x03 }, /* 33 Mhz Clock */ | 129 | { 0x60, 0x03 }, /* 33 Mhz Clock */ |
129 | { 0x40, 0x02 }, | 130 | { 0x40, 0x02 }, |
@@ -132,12 +133,17 @@ static void pdc202xx_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
132 | { 0x20, 0x01 }, | 133 | { 0x20, 0x01 }, |
133 | { 0x20, 0x01 } | 134 | { 0x20, 0x01 } |
134 | }; | 135 | }; |
136 | static u8 mdma_timing[3][2] = { | ||
137 | { 0x60, 0x03 }, | ||
138 | { 0x60, 0x04 }, | ||
139 | { 0xe0, 0x0f }, | ||
140 | }; | ||
135 | u8 r_bp, r_cp; | 141 | u8 r_bp, r_cp; |
136 | 142 | ||
137 | pci_read_config_byte(pdev, port + 1, &r_bp); | 143 | pci_read_config_byte(pdev, port + 1, &r_bp); |
138 | pci_read_config_byte(pdev, port + 2, &r_cp); | 144 | pci_read_config_byte(pdev, port + 2, &r_cp); |
139 | 145 | ||
140 | r_bp &= ~0xF0; | 146 | r_bp &= ~0xE0; |
141 | r_cp &= ~0x0F; | 147 | r_cp &= ~0x0F; |
142 | 148 | ||
143 | if (adev->dma_mode >= XFER_UDMA_0) { | 149 | if (adev->dma_mode >= XFER_UDMA_0) { |
@@ -147,8 +153,8 @@ static void pdc202xx_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
147 | 153 | ||
148 | } else { | 154 | } else { |
149 | int speed = adev->dma_mode - XFER_MW_DMA_0; | 155 | int speed = adev->dma_mode - XFER_MW_DMA_0; |
150 | r_bp |= 0x60; | 156 | r_bp |= mdma_timing[speed][0]; |
151 | r_cp |= (5 - speed); | 157 | r_cp |= mdma_timing[speed][1]; |
152 | } | 158 | } |
153 | pci_write_config_byte(pdev, port + 1, r_bp); | 159 | pci_write_config_byte(pdev, port + 1, r_bp); |
154 | pci_write_config_byte(pdev, port + 2, r_cp); | 160 | pci_write_config_byte(pdev, port + 2, r_cp); |