[TG3]: Set minimal hw interrupt mitigation.
[linux-2.6/verdex.git] / drivers / scsi / sata_via.c
blob3a7830667277f35f71a83db5705b8cb2d376bafc
1 /*
2 sata_via.c - VIA Serial ATA controllers
4 Maintained by: Jeff Garzik <jgarzik@pobox.com>
5 Please ALWAYS copy linux-ide@vger.kernel.org
6 on emails.
8 Copyright 2003-2004 Red Hat, Inc. All rights reserved.
9 Copyright 2003-2004 Jeff Garzik
11 The contents of this file are subject to the Open
12 Software License version 1.1 that can be found at
13 http://www.opensource.org/licenses/osl-1.1.txt and is included herein
14 by reference.
16 Alternatively, the contents of this file may be used under the terms
17 of the GNU General Public License version 2 (the "GPL") as distributed
18 in the kernel source COPYING file, in which case the provisions of
19 the GPL are applicable instead of the above. If you wish to allow
20 the use of your version of this file only under the terms of the
21 GPL and not to allow others to use your version of this file under
22 the OSL, indicate your decision by deleting the provisions above and
23 replace them with the notice and other provisions required by the GPL.
24 If you do not delete the provisions above, a recipient may use your
25 version of this file under either the OSL or the GPL.
27 ----------------------------------------------------------------------
29 To-do list:
30 * VT6421 PATA support
34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/pci.h>
37 #include <linux/init.h>
38 #include <linux/blkdev.h>
39 #include <linux/delay.h>
40 #include "scsi.h"
41 #include <scsi/scsi_host.h>
42 #include <linux/libata.h>
43 #include <asm/io.h>
45 #define DRV_NAME "sata_via"
46 #define DRV_VERSION "1.1"
48 enum board_ids_enum {
49 vt6420,
50 vt6421,
53 enum {
54 SATA_CHAN_ENAB = 0x40, /* SATA channel enable */
55 SATA_INT_GATE = 0x41, /* SATA interrupt gating */
56 SATA_NATIVE_MODE = 0x42, /* Native mode enable */
57 SATA_PATA_SHARING = 0x49, /* PATA/SATA sharing func ctrl */
59 PORT0 = (1 << 1),
60 PORT1 = (1 << 0),
61 ALL_PORTS = PORT0 | PORT1,
62 N_PORTS = 2,
64 NATIVE_MODE_ALL = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4),
66 SATA_EXT_PHY = (1 << 6), /* 0==use PATA, 1==ext phy */
67 SATA_2DEV = (1 << 5), /* SATA is master/slave */
70 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
71 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
72 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
74 static struct pci_device_id svia_pci_tbl[] = {
75 { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
76 { 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
78 { } /* terminate list */
81 static struct pci_driver svia_pci_driver = {
82 .name = DRV_NAME,
83 .id_table = svia_pci_tbl,
84 .probe = svia_init_one,
85 .remove = ata_pci_remove_one,
88 static Scsi_Host_Template svia_sht = {
89 .module = THIS_MODULE,
90 .name = DRV_NAME,
91 .ioctl = ata_scsi_ioctl,
92 .queuecommand = ata_scsi_queuecmd,
93 .eh_strategy_handler = ata_scsi_error,
94 .can_queue = ATA_DEF_QUEUE,
95 .this_id = ATA_SHT_THIS_ID,
96 .sg_tablesize = LIBATA_MAX_PRD,
97 .max_sectors = ATA_MAX_SECTORS,
98 .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
99 .emulated = ATA_SHT_EMULATED,
100 .use_clustering = ATA_SHT_USE_CLUSTERING,
101 .proc_name = DRV_NAME,
102 .dma_boundary = ATA_DMA_BOUNDARY,
103 .slave_configure = ata_scsi_slave_config,
104 .bios_param = ata_std_bios_param,
105 .ordered_flush = 1,
108 static struct ata_port_operations svia_sata_ops = {
109 .port_disable = ata_port_disable,
111 .tf_load = ata_tf_load,
112 .tf_read = ata_tf_read,
113 .check_status = ata_check_status,
114 .exec_command = ata_exec_command,
115 .dev_select = ata_std_dev_select,
117 .phy_reset = sata_phy_reset,
119 .bmdma_setup = ata_bmdma_setup,
120 .bmdma_start = ata_bmdma_start,
121 .bmdma_stop = ata_bmdma_stop,
122 .bmdma_status = ata_bmdma_status,
124 .qc_prep = ata_qc_prep,
125 .qc_issue = ata_qc_issue_prot,
127 .eng_timeout = ata_eng_timeout,
129 .irq_handler = ata_interrupt,
130 .irq_clear = ata_bmdma_irq_clear,
132 .scr_read = svia_scr_read,
133 .scr_write = svia_scr_write,
135 .port_start = ata_port_start,
136 .port_stop = ata_port_stop,
139 static struct ata_port_info svia_port_info = {
140 .sht = &svia_sht,
141 .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | ATA_FLAG_NO_LEGACY,
142 .pio_mask = 0x1f,
143 .mwdma_mask = 0x07,
144 .udma_mask = 0x7f,
145 .port_ops = &svia_sata_ops,
148 MODULE_AUTHOR("Jeff Garzik");
149 MODULE_DESCRIPTION("SCSI low-level driver for VIA SATA controllers");
150 MODULE_LICENSE("GPL");
151 MODULE_DEVICE_TABLE(pci, svia_pci_tbl);
152 MODULE_VERSION(DRV_VERSION);
154 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg)
156 if (sc_reg > SCR_CONTROL)
157 return 0xffffffffU;
158 return inl(ap->ioaddr.scr_addr + (4 * sc_reg));
161 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
163 if (sc_reg > SCR_CONTROL)
164 return;
165 outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
168 static const unsigned int svia_bar_sizes[] = {
169 8, 4, 8, 4, 16, 256
172 static const unsigned int vt6421_bar_sizes[] = {
173 16, 16, 16, 16, 32, 128
176 static unsigned long svia_scr_addr(unsigned long addr, unsigned int port)
178 return addr + (port * 128);
181 static unsigned long vt6421_scr_addr(unsigned long addr, unsigned int port)
183 return addr + (port * 64);
186 static void vt6421_init_addrs(struct ata_probe_ent *probe_ent,
187 struct pci_dev *pdev,
188 unsigned int port)
190 unsigned long reg_addr = pci_resource_start(pdev, port);
191 unsigned long bmdma_addr = pci_resource_start(pdev, 4) + (port * 8);
192 unsigned long scr_addr;
194 probe_ent->port[port].cmd_addr = reg_addr;
195 probe_ent->port[port].altstatus_addr =
196 probe_ent->port[port].ctl_addr = (reg_addr + 8) | ATA_PCI_CTL_OFS;
197 probe_ent->port[port].bmdma_addr = bmdma_addr;
199 scr_addr = vt6421_scr_addr(pci_resource_start(pdev, 5), port);
200 probe_ent->port[port].scr_addr = scr_addr;
202 ata_std_ports(&probe_ent->port[port]);
205 static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev)
207 struct ata_probe_ent *probe_ent;
208 struct ata_port_info *ppi = &svia_port_info;
210 probe_ent = ata_pci_init_native_mode(pdev, &ppi);
211 if (!probe_ent)
212 return NULL;
214 probe_ent->port[0].scr_addr =
215 svia_scr_addr(pci_resource_start(pdev, 5), 0);
216 probe_ent->port[1].scr_addr =
217 svia_scr_addr(pci_resource_start(pdev, 5), 1);
219 return probe_ent;
222 static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
224 struct ata_probe_ent *probe_ent;
225 unsigned int i;
227 probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
228 if (!probe_ent)
229 return NULL;
231 memset(probe_ent, 0, sizeof(*probe_ent));
232 probe_ent->dev = pci_dev_to_dev(pdev);
233 INIT_LIST_HEAD(&probe_ent->node);
235 probe_ent->sht = &svia_sht;
236 probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET |
237 ATA_FLAG_NO_LEGACY;
238 probe_ent->port_ops = &svia_sata_ops;
239 probe_ent->n_ports = N_PORTS;
240 probe_ent->irq = pdev->irq;
241 probe_ent->irq_flags = SA_SHIRQ;
242 probe_ent->pio_mask = 0x1f;
243 probe_ent->mwdma_mask = 0x07;
244 probe_ent->udma_mask = 0x7f;
246 for (i = 0; i < N_PORTS; i++)
247 vt6421_init_addrs(probe_ent, pdev, i);
249 return probe_ent;
252 static void svia_configure(struct pci_dev *pdev)
254 u8 tmp8;
256 pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
257 printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
258 pci_name(pdev),
259 (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
261 /* make sure SATA channels are enabled */
262 pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
263 if ((tmp8 & ALL_PORTS) != ALL_PORTS) {
264 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
265 pci_name(pdev), (int) tmp8);
266 tmp8 |= ALL_PORTS;
267 pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
270 /* make sure interrupts for each channel sent to us */
271 pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
272 if ((tmp8 & ALL_PORTS) != ALL_PORTS) {
273 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
274 pci_name(pdev), (int) tmp8);
275 tmp8 |= ALL_PORTS;
276 pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
279 /* make sure native mode is enabled */
280 pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
281 if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
282 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
283 pci_name(pdev), (int) tmp8);
284 tmp8 |= NATIVE_MODE_ALL;
285 pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
289 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
291 static int printed_version;
292 unsigned int i;
293 int rc;
294 struct ata_probe_ent *probe_ent;
295 int board_id = (int) ent->driver_data;
296 const int *bar_sizes;
297 int pci_dev_busy = 0;
298 u8 tmp8;
300 if (!printed_version++)
301 printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
303 rc = pci_enable_device(pdev);
304 if (rc)
305 return rc;
307 rc = pci_request_regions(pdev, DRV_NAME);
308 if (rc) {
309 pci_dev_busy = 1;
310 goto err_out;
313 if (board_id == vt6420) {
314 pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
315 if (tmp8 & SATA_2DEV) {
316 printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
317 pci_name(pdev), (int) tmp8);
318 rc = -EIO;
319 goto err_out_regions;
322 bar_sizes = &svia_bar_sizes[0];
323 } else {
324 bar_sizes = &vt6421_bar_sizes[0];
327 for (i = 0; i < ARRAY_SIZE(svia_bar_sizes); i++)
328 if ((pci_resource_start(pdev, i) == 0) ||
329 (pci_resource_len(pdev, i) < bar_sizes[i])) {
330 printk(KERN_ERR DRV_NAME "(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n",
331 pci_name(pdev), i,
332 pci_resource_start(pdev, i),
333 pci_resource_len(pdev, i));
334 rc = -ENODEV;
335 goto err_out_regions;
338 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
339 if (rc)
340 goto err_out_regions;
341 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
342 if (rc)
343 goto err_out_regions;
345 if (board_id == vt6420)
346 probe_ent = vt6420_init_probe_ent(pdev);
347 else
348 probe_ent = vt6421_init_probe_ent(pdev);
350 if (!probe_ent) {
351 printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
352 pci_name(pdev));
353 rc = -ENOMEM;
354 goto err_out_regions;
357 svia_configure(pdev);
359 pci_set_master(pdev);
361 /* FIXME: check ata_device_add return value */
362 ata_device_add(probe_ent);
363 kfree(probe_ent);
365 return 0;
367 err_out_regions:
368 pci_release_regions(pdev);
369 err_out:
370 if (!pci_dev_busy)
371 pci_disable_device(pdev);
372 return rc;
375 static int __init svia_init(void)
377 return pci_module_init(&svia_pci_driver);
380 static void __exit svia_exit(void)
382 pci_unregister_driver(&svia_pci_driver);
385 module_init(svia_init);
386 module_exit(svia_exit);