Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.14-rc2 392 lines 10 kB view raw
1/* 2 * sata_via.c - VIA Serial ATA controllers 3 * 4 * Maintained by: Jeff Garzik <jgarzik@pobox.com> 5 * Please ALWAYS copy linux-ide@vger.kernel.org 6 on emails. 7 * 8 * Copyright 2003-2004 Red Hat, Inc. All rights reserved. 9 * Copyright 2003-2004 Jeff Garzik 10 * 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2, or (at your option) 15 * any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 * 22 * You should have received a copy of the GNU General Public License 23 * along with this program; see the file COPYING. If not, write to 24 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 25 * 26 * 27 * libata documentation is available via 'make {ps|pdf}docs', 28 * as Documentation/DocBook/libata.* 29 * 30 * Hardware documentation available under NDA. 31 * 32 * 33 * To-do list: 34 * - VT6421 PATA support 35 * 36 */ 37 38#include <linux/kernel.h> 39#include <linux/module.h> 40#include <linux/pci.h> 41#include <linux/init.h> 42#include <linux/blkdev.h> 43#include <linux/delay.h> 44#include "scsi.h" 45#include <scsi/scsi_host.h> 46#include <linux/libata.h> 47#include <asm/io.h> 48 49#define DRV_NAME "sata_via" 50#define DRV_VERSION "1.1" 51 52enum board_ids_enum { 53 vt6420, 54 vt6421, 55}; 56 57enum { 58 SATA_CHAN_ENAB = 0x40, /* SATA channel enable */ 59 SATA_INT_GATE = 0x41, /* SATA interrupt gating */ 60 SATA_NATIVE_MODE = 0x42, /* Native mode enable */ 61 SATA_PATA_SHARING = 0x49, /* PATA/SATA sharing func ctrl */ 62 63 PORT0 = (1 << 1), 64 PORT1 = (1 << 0), 65 ALL_PORTS = PORT0 | PORT1, 66 N_PORTS = 2, 67 68 NATIVE_MODE_ALL = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4), 69 70 SATA_EXT_PHY = (1 << 6), /* 0==use PATA, 1==ext phy */ 71 SATA_2DEV = (1 << 5), /* SATA is master/slave */ 72}; 73 74static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); 75static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg); 76static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); 77 78static struct pci_device_id svia_pci_tbl[] = { 79 { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 }, 80 { 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 }, 81 82 { } /* terminate list */ 83}; 84 85static struct pci_driver svia_pci_driver = { 86 .name = DRV_NAME, 87 .id_table = svia_pci_tbl, 88 .probe = svia_init_one, 89 .remove = ata_pci_remove_one, 90}; 91 92static Scsi_Host_Template svia_sht = { 93 .module = THIS_MODULE, 94 .name = DRV_NAME, 95 .ioctl = ata_scsi_ioctl, 96 .queuecommand = ata_scsi_queuecmd, 97 .eh_strategy_handler = ata_scsi_error, 98 .can_queue = ATA_DEF_QUEUE, 99 .this_id = ATA_SHT_THIS_ID, 100 .sg_tablesize = LIBATA_MAX_PRD, 101 .max_sectors = ATA_MAX_SECTORS, 102 .cmd_per_lun = ATA_SHT_CMD_PER_LUN, 103 .emulated = ATA_SHT_EMULATED, 104 .use_clustering = ATA_SHT_USE_CLUSTERING, 105 .proc_name = DRV_NAME, 106 .dma_boundary = ATA_DMA_BOUNDARY, 107 .slave_configure = ata_scsi_slave_config, 108 .bios_param = ata_std_bios_param, 109 .ordered_flush = 1, 110}; 111 112static struct ata_port_operations svia_sata_ops = { 113 .port_disable = ata_port_disable, 114 115 .tf_load = ata_tf_load, 116 .tf_read = ata_tf_read, 117 .check_status = ata_check_status, 118 .exec_command = ata_exec_command, 119 .dev_select = ata_std_dev_select, 120 121 .phy_reset = sata_phy_reset, 122 123 .bmdma_setup = ata_bmdma_setup, 124 .bmdma_start = ata_bmdma_start, 125 .bmdma_stop = ata_bmdma_stop, 126 .bmdma_status = ata_bmdma_status, 127 128 .qc_prep = ata_qc_prep, 129 .qc_issue = ata_qc_issue_prot, 130 131 .eng_timeout = ata_eng_timeout, 132 133 .irq_handler = ata_interrupt, 134 .irq_clear = ata_bmdma_irq_clear, 135 136 .scr_read = svia_scr_read, 137 .scr_write = svia_scr_write, 138 139 .port_start = ata_port_start, 140 .port_stop = ata_port_stop, 141 .host_stop = ata_host_stop, 142}; 143 144static struct ata_port_info svia_port_info = { 145 .sht = &svia_sht, 146 .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | ATA_FLAG_NO_LEGACY, 147 .pio_mask = 0x1f, 148 .mwdma_mask = 0x07, 149 .udma_mask = 0x7f, 150 .port_ops = &svia_sata_ops, 151}; 152 153MODULE_AUTHOR("Jeff Garzik"); 154MODULE_DESCRIPTION("SCSI low-level driver for VIA SATA controllers"); 155MODULE_LICENSE("GPL"); 156MODULE_DEVICE_TABLE(pci, svia_pci_tbl); 157MODULE_VERSION(DRV_VERSION); 158 159static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg) 160{ 161 if (sc_reg > SCR_CONTROL) 162 return 0xffffffffU; 163 return inl(ap->ioaddr.scr_addr + (4 * sc_reg)); 164} 165 166static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) 167{ 168 if (sc_reg > SCR_CONTROL) 169 return; 170 outl(val, ap->ioaddr.scr_addr + (4 * sc_reg)); 171} 172 173static const unsigned int svia_bar_sizes[] = { 174 8, 4, 8, 4, 16, 256 175}; 176 177static const unsigned int vt6421_bar_sizes[] = { 178 16, 16, 16, 16, 32, 128 179}; 180 181static unsigned long svia_scr_addr(unsigned long addr, unsigned int port) 182{ 183 return addr + (port * 128); 184} 185 186static unsigned long vt6421_scr_addr(unsigned long addr, unsigned int port) 187{ 188 return addr + (port * 64); 189} 190 191static void vt6421_init_addrs(struct ata_probe_ent *probe_ent, 192 struct pci_dev *pdev, 193 unsigned int port) 194{ 195 unsigned long reg_addr = pci_resource_start(pdev, port); 196 unsigned long bmdma_addr = pci_resource_start(pdev, 4) + (port * 8); 197 unsigned long scr_addr; 198 199 probe_ent->port[port].cmd_addr = reg_addr; 200 probe_ent->port[port].altstatus_addr = 201 probe_ent->port[port].ctl_addr = (reg_addr + 8) | ATA_PCI_CTL_OFS; 202 probe_ent->port[port].bmdma_addr = bmdma_addr; 203 204 scr_addr = vt6421_scr_addr(pci_resource_start(pdev, 5), port); 205 probe_ent->port[port].scr_addr = scr_addr; 206 207 ata_std_ports(&probe_ent->port[port]); 208} 209 210static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev) 211{ 212 struct ata_probe_ent *probe_ent; 213 struct ata_port_info *ppi = &svia_port_info; 214 215 probe_ent = ata_pci_init_native_mode(pdev, &ppi); 216 if (!probe_ent) 217 return NULL; 218 219 probe_ent->port[0].scr_addr = 220 svia_scr_addr(pci_resource_start(pdev, 5), 0); 221 probe_ent->port[1].scr_addr = 222 svia_scr_addr(pci_resource_start(pdev, 5), 1); 223 224 return probe_ent; 225} 226 227static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev) 228{ 229 struct ata_probe_ent *probe_ent; 230 unsigned int i; 231 232 probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); 233 if (!probe_ent) 234 return NULL; 235 236 memset(probe_ent, 0, sizeof(*probe_ent)); 237 probe_ent->dev = pci_dev_to_dev(pdev); 238 INIT_LIST_HEAD(&probe_ent->node); 239 240 probe_ent->sht = &svia_sht; 241 probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | 242 ATA_FLAG_NO_LEGACY; 243 probe_ent->port_ops = &svia_sata_ops; 244 probe_ent->n_ports = N_PORTS; 245 probe_ent->irq = pdev->irq; 246 probe_ent->irq_flags = SA_SHIRQ; 247 probe_ent->pio_mask = 0x1f; 248 probe_ent->mwdma_mask = 0x07; 249 probe_ent->udma_mask = 0x7f; 250 251 for (i = 0; i < N_PORTS; i++) 252 vt6421_init_addrs(probe_ent, pdev, i); 253 254 return probe_ent; 255} 256 257static void svia_configure(struct pci_dev *pdev) 258{ 259 u8 tmp8; 260 261 pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8); 262 printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n", 263 pci_name(pdev), 264 (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f); 265 266 /* make sure SATA channels are enabled */ 267 pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8); 268 if ((tmp8 & ALL_PORTS) != ALL_PORTS) { 269 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n", 270 pci_name(pdev), (int) tmp8); 271 tmp8 |= ALL_PORTS; 272 pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8); 273 } 274 275 /* make sure interrupts for each channel sent to us */ 276 pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8); 277 if ((tmp8 & ALL_PORTS) != ALL_PORTS) { 278 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n", 279 pci_name(pdev), (int) tmp8); 280 tmp8 |= ALL_PORTS; 281 pci_write_config_byte(pdev, SATA_INT_GATE, tmp8); 282 } 283 284 /* make sure native mode is enabled */ 285 pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8); 286 if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) { 287 printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n", 288 pci_name(pdev), (int) tmp8); 289 tmp8 |= NATIVE_MODE_ALL; 290 pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8); 291 } 292} 293 294static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 295{ 296 static int printed_version; 297 unsigned int i; 298 int rc; 299 struct ata_probe_ent *probe_ent; 300 int board_id = (int) ent->driver_data; 301 const int *bar_sizes; 302 int pci_dev_busy = 0; 303 u8 tmp8; 304 305 if (!printed_version++) 306 printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n"); 307 308 rc = pci_enable_device(pdev); 309 if (rc) 310 return rc; 311 312 rc = pci_request_regions(pdev, DRV_NAME); 313 if (rc) { 314 pci_dev_busy = 1; 315 goto err_out; 316 } 317 318 if (board_id == vt6420) { 319 pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8); 320 if (tmp8 & SATA_2DEV) { 321 printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n", 322 pci_name(pdev), (int) tmp8); 323 rc = -EIO; 324 goto err_out_regions; 325 } 326 327 bar_sizes = &svia_bar_sizes[0]; 328 } else { 329 bar_sizes = &vt6421_bar_sizes[0]; 330 } 331 332 for (i = 0; i < ARRAY_SIZE(svia_bar_sizes); i++) 333 if ((pci_resource_start(pdev, i) == 0) || 334 (pci_resource_len(pdev, i) < bar_sizes[i])) { 335 printk(KERN_ERR DRV_NAME "(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n", 336 pci_name(pdev), i, 337 pci_resource_start(pdev, i), 338 pci_resource_len(pdev, i)); 339 rc = -ENODEV; 340 goto err_out_regions; 341 } 342 343 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); 344 if (rc) 345 goto err_out_regions; 346 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK); 347 if (rc) 348 goto err_out_regions; 349 350 if (board_id == vt6420) 351 probe_ent = vt6420_init_probe_ent(pdev); 352 else 353 probe_ent = vt6421_init_probe_ent(pdev); 354 355 if (!probe_ent) { 356 printk(KERN_ERR DRV_NAME "(%s): out of memory\n", 357 pci_name(pdev)); 358 rc = -ENOMEM; 359 goto err_out_regions; 360 } 361 362 svia_configure(pdev); 363 364 pci_set_master(pdev); 365 366 /* FIXME: check ata_device_add return value */ 367 ata_device_add(probe_ent); 368 kfree(probe_ent); 369 370 return 0; 371 372err_out_regions: 373 pci_release_regions(pdev); 374err_out: 375 if (!pci_dev_busy) 376 pci_disable_device(pdev); 377 return rc; 378} 379 380static int __init svia_init(void) 381{ 382 return pci_module_init(&svia_pci_driver); 383} 384 385static void __exit svia_exit(void) 386{ 387 pci_unregister_driver(&svia_pci_driver); 388} 389 390module_init(svia_init); 391module_exit(svia_exit); 392