33 #include <linux/kernel.h>
34 #include <linux/module.h>
35 #include <linux/pci.h>
40 #include <linux/device.h>
45 #define DRV_NAME "sata_sis"
46 #define DRV_VERSION "1.0"
83 .id_table = sis_pci_tbl,
84 .probe = sis_init_one,
85 .remove = ata_pci_remove_one,
93 .inherits = &ata_bmdma_port_ops,
94 .scr_read = sis_scr_read,
95 .scr_write = sis_scr_write,
103 .port_ops = &sis_ops,
107 MODULE_DESCRIPTION(
"low-level driver for Silicon Integrated Systems SATA controller");
112 static unsigned int get_scr_cfg_addr(
struct ata_link *
link,
unsigned int sc_reg)
123 pci_read_config_byte(pdev,
SIS_PMR, &pmr);
142 unsigned int sc_reg,
u32 *
val)
145 unsigned int cfg_addr = get_scr_cfg_addr(link, sc_reg);
150 pci_read_config_dword(pdev, cfg_addr, val);
154 static int sis_scr_cfg_write(
struct ata_link *link,
155 unsigned int sc_reg,
u32 val)
158 unsigned int cfg_addr = get_scr_cfg_addr(link, sc_reg);
160 pci_write_config_dword(pdev, cfg_addr, val);
164 static int sis_scr_read(
struct ata_link *link,
unsigned int sc_reg,
u32 *val)
173 return sis_scr_cfg_read(link, sc_reg, val);
179 static int sis_scr_write(
struct ata_link *link,
unsigned int sc_reg,
u32 val)
182 void __iomem *base = ap->ioaddr.scr_addr + link->
pmp * 0x10;
188 return sis_scr_cfg_write(link, sc_reg, val);
201 u8 port2_start = 0x20;
211 pci_read_config_dword(pdev,
SIS_GENCTL, &genctl);
221 genctl &= ~GENCTL_IOMAPPED_SCR;
222 pci_write_config_dword(pdev,
SIS_GENCTL, genctl);
226 pci_read_config_byte(pdev,
SIS_PMR, &pmr);
232 switch (pmr & 0x30) {
243 "Detected SiS 180/181/964 chipset in SATA mode\n");
247 "Detected SiS 180/181 chipset in combined mode\n");
255 pci_read_config_dword(pdev, 0x6C, &val);
256 if (val & (1L << 31)) {
257 dev_info(&pdev->
dev,
"Detected SiS 182/965 chipset\n");
260 dev_info(&pdev->
dev,
"Detected SiS 182/965L chipset\n");
266 "Detected SiS 1182/966/680 SATA controller\n");
272 "Detected SiS 1183/966/966L/968/680 controller in PATA mode\n");
278 rc = ata_pci_bmdma_prepare_host(pdev, ppi, &host);
282 for (i = 0; i < 2; i++) {
301 host->
ports[0]->ioaddr.scr_addr = mmio;
302 host->
ports[1]->ioaddr.scr_addr = mmio + port2_start;