aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_promise.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/sata_promise.c')
-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