diff options
Diffstat (limited to 'drivers/ata/sata_promise.c')
-rw-r--r-- | drivers/ata/sata_promise.c | 32 |
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 @@ | |||
52 | enum { | 52 | enum { |
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 | ||
88 | struct pdc_host_priv { | 91 | struct 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 | ||
235 | static const struct pci_device_id pdc_ata_pci_tbl[] = { | 239 | static 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 | ||