aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorMikael Pettersson <mikpe@it.uu.se>2006-11-22 16:00:15 -0500
committerJeff Garzik <jeff@garzik.org>2006-12-01 22:46:41 -0500
commitb2d1eee1e99e15a80fa9623724d6861a81d2aba4 (patch)
tree3c175980cedf4be2d0497c61d55da214f05094c0 /drivers/ata
parent46b027cc30b6f6571191826afc718fa942403fc8 (diff)
[PATCH] sata_promise fixes and updates
This patch updates the sata_promise driver as follows: - Correct typo in definition of PDC_TBG_MODE: it's at 0x41C not 0x41 in first-generation chips. This error caused PCI access alignment exceptions on SPARC64, and on all platforms it disabled the expected initialisation of TBG mode. - Add flags field to struct pdc_host_priv. Define PDC_FLAG_GEN_II and use it to distinguish first- and second-generation chips. - Prevent the FLASH_CTL FIFO_SHD bit from being set to 1 on second- generation chips. This matches Promises' ulsata2 driver. - Prevent TBG mode and SLEW rate initialisation in second-generation chips. These two registers have moved, TBG mode has been redefined, and Promise's ulsata2 driver no longer attempts to initialise them. - Correct PCI device table so devices 0x3570, 0x3571, and 0x3d73 are marked as 2057x (2nd gen) not 2037x (1st gen). - Correct PCI device table so device 0x3d17 is marked as 40518 (2nd gen 4 ports) not 20319 (1st gen 4 ports). - Correct pdc_ata_init_one() to treat 20771 as a second-generation chip. Tested on 0x3d75 (2nd gen), 0x3d73 (2nd gen), and 0x3373 (1st gen) chips. The information comes from the newly uploaded Promise SATA HW specs, Promise's ultra and ulsata2 drivers, and debugging on 3d75/3d73/3373 chips. hp->hotplug_offset could now be removed and its value recomputed in pdc_host_init() using hp->flags, but that would be a cleanup not a functional change, so I'm ignoring it for now. Signed-off-by: Mikael Pettersson <mikpe@it.uu.se> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/sata_promise.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
index 9c4389b5689a..8daf5d67dfe2 100644
--- a/drivers/ata/sata_promise.c
+++ b/drivers/ata/sata_promise.c
@@ -52,13 +52,13 @@
52enum { 52enum {
53 PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */ 53 PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */
54 PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */ 54 PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */
55 PDC_TBG_MODE = 0x41C, /* TBG mode */
56 PDC_FLASH_CTL = 0x44, /* Flash control register */ 55 PDC_FLASH_CTL = 0x44, /* Flash control register */
57 PDC_GLOBAL_CTL = 0x48, /* Global control/status (per port) */ 56 PDC_GLOBAL_CTL = 0x48, /* Global control/status (per port) */
58 PDC_CTLSTAT = 0x60, /* IDE control and status (per port) */ 57 PDC_CTLSTAT = 0x60, /* IDE control and status (per port) */
59 PDC_SATA_PLUG_CSR = 0x6C, /* SATA Plug control/status reg */ 58 PDC_SATA_PLUG_CSR = 0x6C, /* SATA Plug control/status reg */
60 PDC2_SATA_PLUG_CSR = 0x60, /* SATAII Plug control/status reg */ 59 PDC2_SATA_PLUG_CSR = 0x60, /* SATAII Plug control/status reg */
61 PDC_SLEW_CTL = 0x470, /* slew rate control reg */ 60 PDC_TBG_MODE = 0x41C, /* TBG mode (not SATAII) */
61 PDC_SLEW_CTL = 0x470, /* slew rate control reg (not SATAII) */
62 62
63 PDC_ERR_MASK = (1<<19) | (1<<20) | (1<<21) | (1<<22) | 63 PDC_ERR_MASK = (1<<19) | (1<<20) | (1<<21) | (1<<22) |
64 (1<<8) | (1<<9) | (1<<10), 64 (1<<8) | (1<<9) | (1<<10),
@@ -77,6 +77,9 @@ enum {
77 PDC_COMMON_FLAGS = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST | 77 PDC_COMMON_FLAGS = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
78 ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI | 78 ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
79 ATA_FLAG_PIO_POLLING, 79 ATA_FLAG_PIO_POLLING,
80
81 /* hp->flags bits */
82 PDC_FLAG_GEN_II = (1 << 0),
80}; 83};
81 84
82 85
@@ -86,6 +89,7 @@ struct pdc_port_priv {
86}; 89};
87 90
88struct pdc_host_priv { 91struct pdc_host_priv {
92 unsigned long flags;
89 int hotplug_offset; 93 int hotplug_offset;
90}; 94};
91 95
@@ -234,20 +238,20 @@ static const struct ata_port_info pdc_port_info[] = {
234 238
235static const struct pci_device_id pdc_ata_pci_tbl[] = { 239static const struct pci_device_id pdc_ata_pci_tbl[] = {
236 { PCI_VDEVICE(PROMISE, 0x3371), board_2037x }, 240 { PCI_VDEVICE(PROMISE, 0x3371), board_2037x },
237 { PCI_VDEVICE(PROMISE, 0x3570), board_2037x },
238 { PCI_VDEVICE(PROMISE, 0x3571), board_2037x },
239 { PCI_VDEVICE(PROMISE, 0x3373), board_2037x }, 241 { PCI_VDEVICE(PROMISE, 0x3373), board_2037x },
240 { PCI_VDEVICE(PROMISE, 0x3375), board_2037x }, 242 { PCI_VDEVICE(PROMISE, 0x3375), board_2037x },
241 { PCI_VDEVICE(PROMISE, 0x3376), board_2037x }, 243 { PCI_VDEVICE(PROMISE, 0x3376), board_2037x },
244 { PCI_VDEVICE(PROMISE, 0x3570), board_2057x },
245 { PCI_VDEVICE(PROMISE, 0x3571), board_2057x },
242 { PCI_VDEVICE(PROMISE, 0x3574), board_2057x }, 246 { PCI_VDEVICE(PROMISE, 0x3574), board_2057x },
247 { PCI_VDEVICE(PROMISE, 0x3d73), board_2057x },
243 { PCI_VDEVICE(PROMISE, 0x3d75), board_2057x }, 248 { PCI_VDEVICE(PROMISE, 0x3d75), board_2057x },
244 { PCI_VDEVICE(PROMISE, 0x3d73), board_2037x },
245 249
246 { PCI_VDEVICE(PROMISE, 0x3318), board_20319 }, 250 { PCI_VDEVICE(PROMISE, 0x3318), board_20319 },
247 { PCI_VDEVICE(PROMISE, 0x3319), board_20319 }, 251 { PCI_VDEVICE(PROMISE, 0x3319), board_20319 },
248 { PCI_VDEVICE(PROMISE, 0x3515), board_20319 }, 252 { PCI_VDEVICE(PROMISE, 0x3515), board_20319 },
249 { PCI_VDEVICE(PROMISE, 0x3519), board_20319 }, 253 { PCI_VDEVICE(PROMISE, 0x3519), board_20319 },
250 { PCI_VDEVICE(PROMISE, 0x3d17), board_20319 }, 254 { PCI_VDEVICE(PROMISE, 0x3d17), board_40518 },
251 { PCI_VDEVICE(PROMISE, 0x3d18), board_40518 }, 255 { PCI_VDEVICE(PROMISE, 0x3d18), board_40518 },
252 256
253 { PCI_VDEVICE(PROMISE, 0x6629), board_20619 }, 257 { PCI_VDEVICE(PROMISE, 0x6629), board_20619 },
@@ -639,9 +643,11 @@ static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
639 * "TODO: figure out why we do this" 643 * "TODO: figure out why we do this"
640 */ 644 */
641 645
642 /* change FIFO_SHD to 8 dwords, enable BMR_BURST */ 646 /* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
643 tmp = readl(mmio + PDC_FLASH_CTL); 647 tmp = readl(mmio + PDC_FLASH_CTL);
644 tmp |= 0x12000; /* bit 16 (fifo 8 dw) and 13 (bmr burst?) */ 648 tmp |= 0x02000; /* bit 13 (enable bmr burst) */
649 if (!(hp->flags & PDC_FLAG_GEN_II))
650 tmp |= 0x10000; /* bit 16 (fifo threshold at 8 dw) */
645 writel(tmp, mmio + PDC_FLASH_CTL); 651 writel(tmp, mmio + PDC_FLASH_CTL);
646 652
647 /* clear plug/unplug flags for all ports */ 653 /* clear plug/unplug flags for all ports */
@@ -652,6 +658,10 @@ static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
652 tmp = readl(mmio + hotplug_offset); 658 tmp = readl(mmio + hotplug_offset);
653 writel(tmp | 0xff0000, mmio + hotplug_offset); 659 writel(tmp | 0xff0000, mmio + hotplug_offset);
654 660
661 /* don't initialise TBG or SLEW on 2nd generation chips */
662 if (hp->flags & PDC_FLAG_GEN_II)
663 return;
664
655 /* reduce TBG clock to 133 Mhz. */ 665 /* reduce TBG clock to 133 Mhz. */
656 tmp = readl(mmio + PDC_TBG_MODE); 666 tmp = readl(mmio + PDC_TBG_MODE);
657 tmp &= ~0x30000; /* clear bit 17, 16*/ 667 tmp &= ~0x30000; /* clear bit 17, 16*/
@@ -745,6 +755,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
745 /* notice 4-port boards */ 755 /* notice 4-port boards */
746 switch (board_idx) { 756 switch (board_idx) {
747 case board_40518: 757 case board_40518:
758 hp->flags |= PDC_FLAG_GEN_II;
748 /* Override hotplug offset for SATAII150 */ 759 /* Override hotplug offset for SATAII150 */
749 hp->hotplug_offset = PDC2_SATA_PLUG_CSR; 760 hp->hotplug_offset = PDC2_SATA_PLUG_CSR;
750 /* Fall through */ 761 /* Fall through */
@@ -758,15 +769,14 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
758 probe_ent->port[3].scr_addr = base + 0x700; 769 probe_ent->port[3].scr_addr = base + 0x700;
759 break; 770 break;
760 case board_2057x: 771 case board_2057x:
772 case board_20771:
773 hp->flags |= PDC_FLAG_GEN_II;
761 /* Override hotplug offset for SATAII150 */ 774 /* Override hotplug offset for SATAII150 */
762 hp->hotplug_offset = PDC2_SATA_PLUG_CSR; 775 hp->hotplug_offset = PDC2_SATA_PLUG_CSR;
763 /* Fall through */ 776 /* Fall through */
764 case board_2037x: 777 case board_2037x:
765 probe_ent->n_ports = 2; 778 probe_ent->n_ports = 2;
766 break; 779 break;
767 case board_20771:
768 probe_ent->n_ports = 2;
769 break;
770 case board_20619: 780 case board_20619:
771 probe_ent->n_ports = 4; 781 probe_ent->n_ports = 4;
772 782