36 #include <linux/kernel.h>
37 #include <linux/module.h>
38 #include <linux/pci.h>
42 #include <linux/device.h>
43 #include <scsi/scsi.h>
48 #define DRV_NAME "sata_via"
49 #define DRV_VERSION "2.6"
83 static void svia_noop_freeze(
struct ata_port *ap);
84 static int vt6420_prereset(
struct ata_link *
link,
unsigned long deadline);
86 static int vt6421_pata_cable_detect(
struct ata_port *ap);
105 .id_table = svia_pci_tbl,
106 .probe = svia_init_one,
108 .suspend = ata_pci_device_suspend,
109 .resume = ata_pci_device_resume,
111 .remove = ata_pci_remove_one,
119 .inherits = &ata_bmdma_port_ops,
120 .sff_tf_load = svia_tf_load,
124 .inherits = &svia_base_ops,
125 .
freeze = svia_noop_freeze,
126 .prereset = vt6420_prereset,
127 .bmdma_start = vt6420_bmdma_start,
131 .inherits = &svia_base_ops,
133 .set_piomode = vt6421_set_pio_mode,
134 .set_dmamode = vt6421_set_dma_mode,
138 .inherits = &svia_base_ops,
140 .scr_write = svia_scr_write,
144 .inherits = &svia_base_ops,
146 .scr_read = vt8251_scr_read,
147 .scr_write = vt8251_scr_write,
155 .port_ops = &vt6420_sata_ops,
163 .port_ops = &vt6421_sata_ops,
171 .port_ops = &vt6421_pata_ops,
179 .port_ops = &vt8251_ops,
192 *val =
ioread32(link->
ap->ioaddr.scr_addr + (4 * sc_reg));
196 static int svia_scr_write(
struct ata_link *link,
unsigned int sc_reg,
u32 val)
200 iowrite32(val, link->
ap->ioaddr.scr_addr + (4 * sc_reg));
204 static int vt8251_scr_read(
struct ata_link *link,
unsigned int scr,
u32 *val)
206 static const u8 ipm_tbl[] = { 1, 2, 6, 0 };
208 int slot = 2 * link->
ap->port_no + link->
pmp;
214 pci_read_config_byte(pdev, 0xA0 + slot, &raw);
226 v |= ipm_tbl[(raw >> 2) & 0x3];
232 pci_read_config_dword(pdev, 0xB0 + slot * 4, &v);
236 pci_read_config_byte(pdev, 0xA4 + slot, &raw);
239 v |= ((raw & 0x02) << 1) | (raw & 0x01);
242 v |= ((raw >> 2) & 0x03) << 8;
253 static int vt8251_scr_write(
struct ata_link *link,
unsigned int scr,
u32 val)
256 int slot = 2 * link->
ap->port_no + link->
pmp;
263 pci_write_config_dword(pdev, 0xB0 + slot * 4, val);
268 v |= ((val & 0x4) >> 1) | (val & 0x1);
271 v |= ((val >> 8) & 0x3) << 2;
273 pci_write_config_byte(pdev, 0xA4 + slot, v);
296 if (tf->
ctl != ap->last_ctl) {
304 static void svia_noop_freeze(
struct ata_port *ap)
309 ap->
ops->sff_check_status(ap);
310 ata_bmdma_irq_clear(ap);
333 static int vt6420_prereset(
struct ata_link *link,
unsigned long deadline)
338 u32 sstatus, scontrol;
353 if ((sstatus & 0xf) != 1)
361 online = (sstatus & 0xf) == 0x3;
364 "SATA link %s 1.5 Gbps (SStatus %X SControl %X)\n",
365 online ?
"up" :
"down", sstatus, scontrol);
394 static int vt6421_pata_cable_detect(
struct ata_port *ap)
408 static const u8 pio_bits[] = { 0xA8, 0x65, 0x65, 0x31, 0x20 };
416 static const u8 udma_bits[] = { 0xEE, 0xE8, 0xE6, 0xE4, 0xE2, 0xE1, 0xE0, 0xE0 };
421 static const unsigned int svia_bar_sizes[] = {
425 static const unsigned int vt6421_bar_sizes[] = {
426 16, 16, 16, 16, 32, 128
431 return addr + (port * 128);
436 return addr + (port * 64);
439 static void vt6421_init_addrs(
struct ata_port *ap)
444 struct ata_ioports *ioaddr = &ap->ioaddr;
447 ioaddr->altstatus_addr =
448 ioaddr->ctl_addr = (
void __iomem *)
450 ioaddr->bmdma_addr = bmdma_addr;
451 ioaddr->scr_addr = vt6421_scr_addr(iomap[5], ap->
port_no);
455 ata_port_pbar_desc(ap, ap->
port_no, -1,
"port");
456 ata_port_pbar_desc(ap, 4, ap->
port_no * 8,
"bmdma");
459 static int vt6420_prepare_host(
struct pci_dev *pdev,
struct ata_host **r_host)
465 rc = ata_pci_bmdma_prepare_host(pdev, ppi, &host);
472 dev_err(&pdev->
dev,
"failed to iomap PCI BAR 5\n");
476 host->
ports[0]->ioaddr.scr_addr = svia_scr_addr(host->
iomap[5], 0);
477 host->
ports[1]->ioaddr.scr_addr = svia_scr_addr(host->
iomap[5], 1);
482 static int vt6421_prepare_host(
struct pci_dev *pdev,
struct ata_host **r_host)
485 { &vt6421_sport_info, &vt6421_sport_info, &vt6421_pport_info };
491 dev_err(&pdev->
dev,
"failed to allocate host\n");
497 dev_err(&pdev->
dev,
"failed to request/iomap PCI BARs (errno=%d)\n",
503 for (i = 0; i < host->
n_ports; i++)
504 vt6421_init_addrs(host->
ports[i]);
516 static int vt8251_prepare_host(
struct pci_dev *pdev,
struct ata_host **r_host)
522 rc = ata_pci_bmdma_prepare_host(pdev, ppi, &host);
529 dev_err(&pdev->
dev,
"failed to iomap PCI BAR 5\n");
534 for (i = 0; i < host->
n_ports; i++)
545 dev_info(&pdev->
dev,
"routed to hard irq line %d\n",
546 (
int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
551 dev_dbg(&pdev->
dev,
"enabling SATA channels (0x%x)\n",
559 if ((tmp8 & ALL_PORTS) != ALL_PORTS) {
560 dev_dbg(&pdev->
dev,
"enabling SATA channel interrupts (0x%x)\n",
570 "enabling SATA channel native mode (0x%x)\n",
599 pci_read_config_byte(pdev, 0x52, &tmp8);
601 pci_write_config_byte(pdev, 0x52, tmp8);
611 const unsigned *bar_sizes;
620 bar_sizes = &vt6421_bar_sizes[0];
622 bar_sizes = &svia_bar_sizes[0];
624 for (i = 0; i <
ARRAY_SIZE(svia_bar_sizes); i++)
628 "invalid PCI BAR %u (sz 0x%llx, val 0x%llx)\n",
637 rc = vt6420_prepare_host(pdev, &host);
640 rc = vt6421_prepare_host(pdev, &host);
643 rc = vt8251_prepare_host(pdev, &host);
651 svia_configure(pdev, board_id);