1 /* 2 * Aic94xx SAS/SATA driver initialization. 3 * 4 * Copyright (C) 2005 Adaptec, Inc. All rights reserved. 5 * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com> 6 * 7 * This file is licensed under GPLv2. 8 * 9 * This file is part of the aic94xx driver. 10 * 11 * The aic94xx driver is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU General Public License as 13 * published by the Free Software Foundation; version 2 of the 14 * License. 15 * 16 * The aic94xx driver is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with the aic94xx driver; if not, write to the Free Software 23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 24 * 25 */ 26 27 #include <linux/module.h> 28 #include <linux/init.h> 29 #include <linux/kernel.h> 30 #include <linux/pci.h> 31 #include <linux/delay.h> 32 #include <linux/firmware.h> 33 #include <linux/slab.h> 34 35 #include <scsi/scsi_host.h> 36 37 #include "aic94xx.h" 38 #include "aic94xx_reg.h" 39 #include "aic94xx_hwi.h" 40 #include "aic94xx_seq.h" 41 #include "aic94xx_sds.h" 42 43 /* The format is "version.release.patchlevel" */ 44 #define ASD_DRIVER_VERSION "1.0.3" 45 46 static int use_msi = 0; 47 module_param_named(use_msi, use_msi, int, S_IRUGO); 48 MODULE_PARM_DESC(use_msi, "\n" 49 "\tEnable(1) or disable(0) using PCI MSI.\n" 50 "\tDefault: 0"); 51 52 static struct scsi_transport_template *aic94xx_transport_template; 53 static int asd_scan_finished(struct Scsi_Host *, unsigned long); 54 static void asd_scan_start(struct Scsi_Host *); 55 56 static struct scsi_host_template aic94xx_sht = { 57 .module = THIS_MODULE, 58 /* .name is initialized */ 59 .name = "aic94xx", 60 .queuecommand = sas_queuecommand, 61 .target_alloc = sas_target_alloc, 62 .slave_configure = sas_slave_configure, 63 .scan_finished = asd_scan_finished, 64 .scan_start = asd_scan_start, 65 .change_queue_depth = sas_change_queue_depth, 66 .bios_param = sas_bios_param, 67 .can_queue = 1, 68 .this_id = -1, 69 .sg_tablesize = SG_ALL, 70 .max_sectors = SCSI_DEFAULT_MAX_SECTORS, 71 .eh_device_reset_handler = sas_eh_device_reset_handler, 72 .eh_target_reset_handler = sas_eh_target_reset_handler, 73 .target_destroy = sas_target_destroy, 74 .ioctl = sas_ioctl, 75 .track_queue_depth = 1, 76 }; 77 78 static int asd_map_memio(struct asd_ha_struct *asd_ha) 79 { 80 int err, i; 81 struct asd_ha_addrspace *io_handle; 82 83 asd_ha->iospace = 0; 84 for (i = 0; i < 3; i += 2) { 85 io_handle = &asd_ha->io_handle[i==0?0:1]; 86 io_handle->start = pci_resource_start(asd_ha->pcidev, i); 87 io_handle->len = pci_resource_len(asd_ha->pcidev, i); 88 io_handle->flags = pci_resource_flags(asd_ha->pcidev, i); 89 err = -ENODEV; 90 if (!io_handle->start || !io_handle->len) { 91 asd_printk("MBAR%d start or length for %s is 0.\n", 92 i==0?0:1, pci_name(asd_ha->pcidev)); 93 goto Err; 94 } 95 err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME); 96 if (err) { 97 asd_printk("couldn't reserve memory region for %s\n", 98 pci_name(asd_ha->pcidev)); 99 goto Err; 100 } 101 io_handle->addr = ioremap(io_handle->start, io_handle->len); 102 if (!io_handle->addr) { 103 asd_printk("couldn't map MBAR%d of %s\n", i==0?0:1, 104 pci_name(asd_ha->pcidev)); 105 err = -ENOMEM; 106 goto Err_unreq; 107 } 108 } 109 110 return 0; 111 Err_unreq: 112 pci_release_region(asd_ha->pcidev, i); 113 Err: 114 if (i > 0) { 115 io_handle = &asd_ha->io_handle[0]; 116 iounmap(io_handle->addr); 117 pci_release_region(asd_ha->pcidev, 0); 118 } 119 return err; 120 } 121 122 static void asd_unmap_memio(struct asd_ha_struct *asd_ha) 123 { 124 struct asd_ha_addrspace *io_handle; 125 126 io_handle = &asd_ha->io_handle[1]; 127 iounmap(io_handle->addr); 128 pci_release_region(asd_ha->pcidev, 2); 129 130 io_handle = &asd_ha->io_handle[0]; 131 iounmap(io_handle->addr); 132 pci_release_region(asd_ha->pcidev, 0); 133 } 134 135 static int asd_map_ioport(struct asd_ha_struct *asd_ha) 136 { 137 int i = PCI_IOBAR_OFFSET, err; 138 struct asd_ha_addrspace *io_handle = &asd_ha->io_handle[0]; 139 140 asd_ha->iospace = 1; 141 io_handle->start = pci_resource_start(asd_ha->pcidev, i); 142 io_handle->len = pci_resource_len(asd_ha->pcidev, i); 143 io_handle->flags = pci_resource_flags(asd_ha->pcidev, i); 144 io_handle->addr = (void __iomem *) io_handle->start; 145 if (!io_handle->start || !io_handle->len) { 146 asd_printk("couldn't get IO ports for %s\n", 147 pci_name(asd_ha->pcidev)); 148 return -ENODEV; 149 } 150 err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME); 151 if (err) { 152 asd_printk("couldn't reserve io space for %s\n", 153 pci_name(asd_ha->pcidev)); 154 } 155 156 return err; 157 } 158 159 static void asd_unmap_ioport(struct asd_ha_struct *asd_ha) 160 { 161 pci_release_region(asd_ha->pcidev, PCI_IOBAR_OFFSET); 162 } 163 164 static int asd_map_ha(struct asd_ha_struct *asd_ha) 165 { 166 int err; 167 u16 cmd_reg; 168 169 err = pci_read_config_word(asd_ha->pcidev, PCI_COMMAND, &cmd_reg); 170 if (err) { 171 asd_printk("couldn't read command register of %s\n", 172 pci_name(asd_ha->pcidev)); 173 goto Err; 174 } 175 176 err = -ENODEV; 177 if (cmd_reg & PCI_COMMAND_MEMORY) { 178 if ((err = asd_map_memio(asd_ha))) 179 goto Err; 180 } else if (cmd_reg & PCI_COMMAND_IO) { 181 if ((err = asd_map_ioport(asd_ha))) 182 goto Err; 183 asd_printk("%s ioport mapped -- upgrade your hardware\n", 184 pci_name(asd_ha->pcidev)); 185 } else { 186 asd_printk("no proper device access to %s\n", 187 pci_name(asd_ha->pcidev)); 188 goto Err; 189 } 190 191 return 0; 192 Err: 193 return err; 194 } 195 196 static void asd_unmap_ha(struct asd_ha_struct *asd_ha) 197 { 198 if (asd_ha->iospace) 199 asd_unmap_ioport(asd_ha); 200 else 201 asd_unmap_memio(asd_ha); 202 } 203 204 static const char *asd_dev_rev[30] = { 205 [0] = "A0", 206 [1] = "A1", 207 [8] = "B0", 208 }; 209 210 static int asd_common_setup(struct asd_ha_struct *asd_ha) 211 { 212 int err, i; 213 214 asd_ha->revision_id = asd_ha->pcidev->revision; 215 216 err = -ENODEV; 217 if (asd_ha->revision_id < AIC9410_DEV_REV_B0) { 218 asd_printk("%s is revision %s (%X), which is not supported\n", 219 pci_name(asd_ha->pcidev), 220 asd_dev_rev[asd_ha->revision_id], 221 asd_ha->revision_id); 222 goto Err; 223 } 224 /* Provide some sane default values. */ 225 asd_ha->hw_prof.max_scbs = 512; 226 asd_ha->hw_prof.max_ddbs = ASD_MAX_DDBS; 227 asd_ha->hw_prof.num_phys = ASD_MAX_PHYS; 228 /* All phys are enabled, by default. */ 229 asd_ha->hw_prof.enabled_phys = 0xFF; 230 for (i = 0; i < ASD_MAX_PHYS; i++) { 231 asd_ha->hw_prof.phy_desc[i].max_sas_lrate = 232 SAS_LINK_RATE_3_0_GBPS; 233 asd_ha->hw_prof.phy_desc[i].min_sas_lrate = 234 SAS_LINK_RATE_1_5_GBPS; 235 asd_ha->hw_prof.phy_desc[i].max_sata_lrate = 236 SAS_LINK_RATE_1_5_GBPS; 237 asd_ha->hw_prof.phy_desc[i].min_sata_lrate = 238 SAS_LINK_RATE_1_5_GBPS; 239 } 240 241 return 0; 242 Err: 243 return err; 244 } 245 246 static int asd_aic9410_setup(struct asd_ha_struct *asd_ha) 247 { 248 int err = asd_common_setup(asd_ha); 249 250 if (err) 251 return err; 252 253 asd_ha->hw_prof.addr_range = 8; 254 asd_ha->hw_prof.port_name_base = 0; 255 asd_ha->hw_prof.dev_name_base = 8; 256 asd_ha->hw_prof.sata_name_base = 16; 257 258 return 0; 259 } 260 261 static int asd_aic9405_setup(struct asd_ha_struct *asd_ha) 262 { 263 int err = asd_common_setup(asd_ha); 264 265 if (err) 266 return err; 267 268 asd_ha->hw_prof.addr_range = 4; 269 asd_ha->hw_prof.port_name_base = 0; 270 asd_ha->hw_prof.dev_name_base = 4; 271 asd_ha->hw_prof.sata_name_base = 8; 272 273 return 0; 274 } 275 276 static ssize_t asd_show_dev_rev(struct device *dev, 277 struct device_attribute *attr, char *buf) 278 { 279 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev); 280 return snprintf(buf, PAGE_SIZE, "%s\n", 281 asd_dev_rev[asd_ha->revision_id]); 282 } 283 static DEVICE_ATTR(aic_revision, S_IRUGO, asd_show_dev_rev, NULL); 284 285 static ssize_t asd_show_dev_bios_build(struct device *dev, 286 struct device_attribute *attr,char *buf) 287 { 288 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev); 289 return snprintf(buf, PAGE_SIZE, "%d\n", asd_ha->hw_prof.bios.bld); 290 } 291 static DEVICE_ATTR(bios_build, S_IRUGO, asd_show_dev_bios_build, NULL); 292 293 static ssize_t asd_show_dev_pcba_sn(struct device *dev, 294 struct device_attribute *attr, char *buf) 295 { 296 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev); 297 return snprintf(buf, PAGE_SIZE, "%s\n", asd_ha->hw_prof.pcba_sn); 298 } 299 static DEVICE_ATTR(pcba_sn, S_IRUGO, asd_show_dev_pcba_sn, NULL); 300 301 #define FLASH_CMD_NONE 0x00 302 #define FLASH_CMD_UPDATE 0x01 303 #define FLASH_CMD_VERIFY 0x02 304 305 struct flash_command { 306 u8 command[8]; 307 int code; 308 }; 309 310 static struct flash_command flash_command_table[] = 311 { 312 {"verify", FLASH_CMD_VERIFY}, 313 {"update", FLASH_CMD_UPDATE}, 314 {"", FLASH_CMD_NONE} /* Last entry should be NULL. */ 315 }; 316 317 struct error_bios { 318 char *reason; 319 int err_code; 320 }; 321 322 static struct error_bios flash_error_table[] = 323 { 324 {"Failed to open bios image file", FAIL_OPEN_BIOS_FILE}, 325 {"PCI ID mismatch", FAIL_CHECK_PCI_ID}, 326 {"Checksum mismatch", FAIL_CHECK_SUM}, 327 {"Unknown Error", FAIL_UNKNOWN}, 328 {"Failed to verify.", FAIL_VERIFY}, 329 {"Failed to reset flash chip.", FAIL_RESET_FLASH}, 330 {"Failed to find flash chip type.", FAIL_FIND_FLASH_ID}, 331 {"Failed to erash flash chip.", FAIL_ERASE_FLASH}, 332 {"Failed to program flash chip.", FAIL_WRITE_FLASH}, 333 {"Flash in progress", FLASH_IN_PROGRESS}, 334 {"Image file size Error", FAIL_FILE_SIZE}, 335 {"Input parameter error", FAIL_PARAMETERS}, 336 {"Out of memory", FAIL_OUT_MEMORY}, 337 {"OK", 0} /* Last entry err_code = 0. */ 338 }; 339 340 static ssize_t asd_store_update_bios(struct device *dev, 341 struct device_attribute *attr, 342 const char *buf, size_t count) 343 { 344 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev); 345 char *cmd_ptr, *filename_ptr; 346 struct bios_file_header header, *hdr_ptr; 347 int res, i; 348 u32 csum = 0; 349 int flash_command = FLASH_CMD_NONE; 350 int err = 0; 351 352 cmd_ptr = kcalloc(count, 2, GFP_KERNEL); 353 354 if (!cmd_ptr) { 355 err = FAIL_OUT_MEMORY; 356 goto out; 357 } 358 359 filename_ptr = cmd_ptr + count; 360 res = sscanf(buf, "%s %s", cmd_ptr, filename_ptr); 361 if (res != 2) { 362 err = FAIL_PARAMETERS; 363 goto out1; 364 } 365 366 for (i = 0; flash_command_table[i].code != FLASH_CMD_NONE; i++) { 367 if (!memcmp(flash_command_table[i].command, 368 cmd_ptr, strlen(cmd_ptr))) { 369 flash_command = flash_command_table[i].code; 370 break; 371 } 372 } 373 if (flash_command == FLASH_CMD_NONE) { 374 err = FAIL_PARAMETERS; 375 goto out1; 376 } 377 378 if (asd_ha->bios_status == FLASH_IN_PROGRESS) { 379 err = FLASH_IN_PROGRESS; 380 goto out1; 381 } 382 err = request_firmware(&asd_ha->bios_image, 383 filename_ptr, 384 &asd_ha->pcidev->dev); 385 if (err) { 386 asd_printk("Failed to load bios image file %s, error %d\n", 387 filename_ptr, err); 388 err = FAIL_OPEN_BIOS_FILE; 389 goto out1; 390 } 391 392 hdr_ptr = (struct bios_file_header *)asd_ha->bios_image->data; 393 394 if ((hdr_ptr->contrl_id.vendor != asd_ha->pcidev->vendor || 395 hdr_ptr->contrl_id.device != asd_ha->pcidev->device) && 396 (hdr_ptr->contrl_id.sub_vendor != asd_ha->pcidev->vendor || 397 hdr_ptr->contrl_id.sub_device != asd_ha->pcidev->device)) { 398 399 ASD_DPRINTK("The PCI vendor or device id does not match\n"); 400 ASD_DPRINTK("vendor=%x dev=%x sub_vendor=%x sub_dev=%x" 401 " pci vendor=%x pci dev=%x\n", 402 hdr_ptr->contrl_id.vendor, 403 hdr_ptr->contrl_id.device, 404 hdr_ptr->contrl_id.sub_vendor, 405 hdr_ptr->contrl_id.sub_device, 406 asd_ha->pcidev->vendor, 407 asd_ha->pcidev->device); 408 err = FAIL_CHECK_PCI_ID; 409 goto out2; 410 } 411 412 if (hdr_ptr->filelen != asd_ha->bios_image->size) { 413 err = FAIL_FILE_SIZE; 414 goto out2; 415 } 416 417 /* calculate checksum */ 418 for (i = 0; i < hdr_ptr->filelen; i++) 419 csum += asd_ha->bios_image->data[i]; 420 421 if ((csum & 0x0000ffff) != hdr_ptr->checksum) { 422 ASD_DPRINTK("BIOS file checksum mismatch\n"); 423 err = FAIL_CHECK_SUM; 424 goto out2; 425 } 426 if (flash_command == FLASH_CMD_UPDATE) { 427 asd_ha->bios_status = FLASH_IN_PROGRESS; 428 err = asd_write_flash_seg(asd_ha, 429 &asd_ha->bios_image->data[sizeof(*hdr_ptr)], 430 0, hdr_ptr->filelen-sizeof(*hdr_ptr)); 431 if (!err) 432 err = asd_verify_flash_seg(asd_ha, 433 &asd_ha->bios_image->data[sizeof(*hdr_ptr)], 434 0, hdr_ptr->filelen-sizeof(*hdr_ptr)); 435 } else { 436 asd_ha->bios_status = FLASH_IN_PROGRESS; 437 err = asd_verify_flash_seg(asd_ha, 438 &asd_ha->bios_image->data[sizeof(header)], 439 0, hdr_ptr->filelen-sizeof(header)); 440 } 441 442 out2: 443 release_firmware(asd_ha->bios_image); 444 out1: 445 kfree(cmd_ptr); 446 out: 447 asd_ha->bios_status = err; 448 449 if (!err) 450 return count; 451 else 452 return -err; 453 } 454 455 static ssize_t asd_show_update_bios(struct device *dev, 456 struct device_attribute *attr, char *buf) 457 { 458 int i; 459 struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev); 460 461 for (i = 0; flash_error_table[i].err_code != 0; i++) { 462 if (flash_error_table[i].err_code == asd_ha->bios_status) 463 break; 464 } 465 if (asd_ha->bios_status != FLASH_IN_PROGRESS) 466 asd_ha->bios_status = FLASH_OK; 467 468 return snprintf(buf, PAGE_SIZE, "status=%x %s\n", 469 flash_error_table[i].err_code, 470 flash_error_table[i].reason); 471 } 472 473 static DEVICE_ATTR(update_bios, S_IRUGO|S_IWUSR, 474 asd_show_update_bios, asd_store_update_bios); 475 476 static int asd_create_dev_attrs(struct asd_ha_struct *asd_ha) 477 { 478 int err; 479 480 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision); 481 if (err) 482 return err; 483 484 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_bios_build); 485 if (err) 486 goto err_rev; 487 488 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn); 489 if (err) 490 goto err_biosb; 491 err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_update_bios); 492 if (err) 493 goto err_update_bios; 494 495 return 0; 496 497 err_update_bios: 498 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn); 499 err_biosb: 500 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build); 501 err_rev: 502 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision); 503 return err; 504 } 505 506 static void asd_remove_dev_attrs(struct asd_ha_struct *asd_ha) 507 { 508 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision); 509 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build); 510 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn); 511 device_remove_file(&asd_ha->pcidev->dev, &dev_attr_update_bios); 512 } 513 514 /* The first entry, 0, is used for dynamic ids, the rest for devices 515 * we know about. 516 */ 517 static const struct asd_pcidev_struct { 518 const char * name; 519 int (*setup)(struct asd_ha_struct *asd_ha); 520 } asd_pcidev_data[] = { 521 /* Id 0 is used for dynamic ids. */ 522 { .name = "Adaptec AIC-94xx SAS/SATA Host Adapter", 523 .setup = asd_aic9410_setup 524 }, 525 { .name = "Adaptec AIC-9410W SAS/SATA Host Adapter", 526 .setup = asd_aic9410_setup 527 }, 528 { .name = "Adaptec AIC-9405W SAS/SATA Host Adapter", 529 .setup = asd_aic9405_setup 530 }, 531 }; 532 533 static int asd_create_ha_caches(struct asd_ha_struct *asd_ha) 534 { 535 asd_ha->scb_pool = dma_pool_create(ASD_DRIVER_NAME "_scb_pool", 536 &asd_ha->pcidev->dev, 537 sizeof(struct scb), 538 8, 0); 539 if (!asd_ha->scb_pool) { 540 asd_printk("couldn't create scb pool\n"); 541 return -ENOMEM; 542 } 543 544 return 0; 545 } 546 547 /** 548 * asd_free_edbs -- free empty data buffers 549 * asd_ha: pointer to host adapter structure 550 */ 551 static void asd_free_edbs(struct asd_ha_struct *asd_ha) 552 { 553 struct asd_seq_data *seq = &asd_ha->seq; 554 int i; 555 556 for (i = 0; i < seq->num_edbs; i++) 557 asd_free_coherent(asd_ha, seq->edb_arr[i]); 558 kfree(seq->edb_arr); 559 seq->edb_arr = NULL; 560 } 561 562 static void asd_free_escbs(struct asd_ha_struct *asd_ha) 563 { 564 struct asd_seq_data *seq = &asd_ha->seq; 565 int i; 566 567 for (i = 0; i < seq->num_escbs; i++) { 568 if (!list_empty(&seq->escb_arr[i]->list)) 569 list_del_init(&seq->escb_arr[i]->list); 570 571 asd_ascb_free(seq->escb_arr[i]); 572 } 573 kfree(seq->escb_arr); 574 seq->escb_arr = NULL; 575 } 576 577 static void asd_destroy_ha_caches(struct asd_ha_struct *asd_ha) 578 { 579 int i; 580 581 if (asd_ha->hw_prof.ddb_ext) 582 asd_free_coherent(asd_ha, asd_ha->hw_prof.ddb_ext); 583 if (asd_ha->hw_prof.scb_ext) 584 asd_free_coherent(asd_ha, asd_ha->hw_prof.scb_ext); 585 586 if (asd_ha->hw_prof.ddb_bitmap) 587 kfree(asd_ha->hw_prof.ddb_bitmap); 588 asd_ha->hw_prof.ddb_bitmap = NULL; 589 590 for (i = 0; i < ASD_MAX_PHYS; i++) { 591 struct asd_phy *phy = &asd_ha->phys[i]; 592 593 asd_free_coherent(asd_ha, phy->id_frm_tok); 594 } 595 if (asd_ha->seq.escb_arr) 596 asd_free_escbs(asd_ha); 597 if (asd_ha->seq.edb_arr) 598 asd_free_edbs(asd_ha); 599 if (asd_ha->hw_prof.ue.area) { 600 kfree(asd_ha->hw_prof.ue.area); 601 asd_ha->hw_prof.ue.area = NULL; 602 } 603 if (asd_ha->seq.tc_index_array) { 604 kfree(asd_ha->seq.tc_index_array); 605 kfree(asd_ha->seq.tc_index_bitmap); 606 asd_ha->seq.tc_index_array = NULL; 607 asd_ha->seq.tc_index_bitmap = NULL; 608 } 609 if (asd_ha->seq.actual_dl) { 610 asd_free_coherent(asd_ha, asd_ha->seq.actual_dl); 611 asd_ha->seq.actual_dl = NULL; 612 asd_ha->seq.dl = NULL; 613 } 614 if (asd_ha->seq.next_scb.vaddr) { 615 dma_pool_free(asd_ha->scb_pool, asd_ha->seq.next_scb.vaddr, 616 asd_ha->seq.next_scb.dma_handle); 617 asd_ha->seq.next_scb.vaddr = NULL; 618 } 619 dma_pool_destroy(asd_ha->scb_pool); 620 asd_ha->scb_pool = NULL; 621 } 622 623 struct kmem_cache *asd_dma_token_cache; 624 struct kmem_cache *asd_ascb_cache; 625 626 static int asd_create_global_caches(void) 627 { 628 if (!asd_dma_token_cache) { 629 asd_dma_token_cache 630 = kmem_cache_create(ASD_DRIVER_NAME "_dma_token", 631 sizeof(struct asd_dma_tok), 632 0, 633 SLAB_HWCACHE_ALIGN, 634 NULL); 635 if (!asd_dma_token_cache) { 636 asd_printk("couldn't create dma token cache\n"); 637 return -ENOMEM; 638 } 639 } 640 641 if (!asd_ascb_cache) { 642 asd_ascb_cache = kmem_cache_create(ASD_DRIVER_NAME "_ascb", 643 sizeof(struct asd_ascb), 644 0, 645 SLAB_HWCACHE_ALIGN, 646 NULL); 647 if (!asd_ascb_cache) { 648 asd_printk("couldn't create ascb cache\n"); 649 goto Err; 650 } 651 } 652 653 return 0; 654 Err: 655 kmem_cache_destroy(asd_dma_token_cache); 656 asd_dma_token_cache = NULL; 657 return -ENOMEM; 658 } 659 660 static void asd_destroy_global_caches(void) 661 { 662 if (asd_dma_token_cache) 663 kmem_cache_destroy(asd_dma_token_cache); 664 asd_dma_token_cache = NULL; 665 666 if (asd_ascb_cache) 667 kmem_cache_destroy(asd_ascb_cache); 668 asd_ascb_cache = NULL; 669 } 670 671 static int asd_register_sas_ha(struct asd_ha_struct *asd_ha) 672 { 673 int i; 674 struct asd_sas_phy **sas_phys = 675 kcalloc(ASD_MAX_PHYS, sizeof(*sas_phys), GFP_KERNEL); 676 struct asd_sas_port **sas_ports = 677 kcalloc(ASD_MAX_PHYS, sizeof(*sas_ports), GFP_KERNEL); 678 679 if (!sas_phys || !sas_ports) { 680 kfree(sas_phys); 681 kfree(sas_ports); 682 return -ENOMEM; 683 } 684 685 asd_ha->sas_ha.sas_ha_name = (char *) asd_ha->name; 686 asd_ha->sas_ha.lldd_module = THIS_MODULE; 687 asd_ha->sas_ha.sas_addr = &asd_ha->hw_prof.sas_addr[0]; 688 689 for (i = 0; i < ASD_MAX_PHYS; i++) { 690 sas_phys[i] = &asd_ha->phys[i].sas_phy; 691 sas_ports[i] = &asd_ha->ports[i]; 692 } 693 694 asd_ha->sas_ha.sas_phy = sas_phys; 695 asd_ha->sas_ha.sas_port= sas_ports; 696 asd_ha->sas_ha.num_phys= ASD_MAX_PHYS; 697 698 return sas_register_ha(&asd_ha->sas_ha); 699 } 700 701 static int asd_unregister_sas_ha(struct asd_ha_struct *asd_ha) 702 { 703 int err; 704 705 err = sas_unregister_ha(&asd_ha->sas_ha); 706 707 sas_remove_host(asd_ha->sas_ha.core.shost); 708 scsi_host_put(asd_ha->sas_ha.core.shost); 709 710 kfree(asd_ha->sas_ha.sas_phy); 711 kfree(asd_ha->sas_ha.sas_port); 712 713 return err; 714 } 715 716 static int asd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) 717 { 718 const struct asd_pcidev_struct *asd_dev; 719 unsigned asd_id = (unsigned) id->driver_data; 720 struct asd_ha_struct *asd_ha; 721 struct Scsi_Host *shost; 722 int err; 723 724 if (asd_id >= ARRAY_SIZE(asd_pcidev_data)) { 725 asd_printk("wrong driver_data in PCI table\n"); 726 return -ENODEV; 727 } 728 729 if ((err = pci_enable_device(dev))) { 730 asd_printk("couldn't enable device %s\n", pci_name(dev)); 731 return err; 732 } 733 734 pci_set_master(dev); 735 736 err = -ENOMEM; 737 738 shost = scsi_host_alloc(&aic94xx_sht, sizeof(void *)); 739 if (!shost) 740 goto Err; 741 742 asd_dev = &asd_pcidev_data[asd_id]; 743 744 asd_ha = kzalloc(sizeof(*asd_ha), GFP_KERNEL); 745 if (!asd_ha) { 746 asd_printk("out of memory\n"); 747 goto Err_put; 748 } 749 asd_ha->pcidev = dev; 750 asd_ha->sas_ha.dev = &asd_ha->pcidev->dev; 751 asd_ha->sas_ha.lldd_ha = asd_ha; 752 753 asd_ha->bios_status = FLASH_OK; 754 asd_ha->name = asd_dev->name; 755 asd_printk("found %s, device %s\n", asd_ha->name, pci_name(dev)); 756 757 SHOST_TO_SAS_HA(shost) = &asd_ha->sas_ha; 758 asd_ha->sas_ha.core.shost = shost; 759 shost->transportt = aic94xx_transport_template; 760 shost->max_id = ~0; 761 shost->max_lun = ~0; 762 shost->max_cmd_len = 16; 763 764 err = scsi_add_host(shost, &dev->dev); 765 if (err) 766 goto Err_free; 767 768 err = asd_dev->setup(asd_ha); 769 if (err) 770 goto Err_remove; 771 772 err = dma_set_mask_and_coherent(&dev->dev, DMA_BIT_MASK(64)); 773 if (err) 774 err = dma_set_mask_and_coherent(&dev->dev, DMA_BIT_MASK(32)); 775 if (err) { 776 err = -ENODEV; 777 asd_printk("no suitable DMA mask for %s\n", pci_name(dev)); 778 goto Err_remove; 779 } 780 781 pci_set_drvdata(dev, asd_ha); 782 783 err = asd_map_ha(asd_ha); 784 if (err) 785 goto Err_remove; 786 787 err = asd_create_ha_caches(asd_ha); 788 if (err) 789 goto Err_unmap; 790 791 err = asd_init_hw(asd_ha); 792 if (err) 793 goto Err_free_cache; 794 795 asd_printk("device %s: SAS addr %llx, PCBA SN %s, %d phys, %d enabled " 796 "phys, flash %s, BIOS %s%d\n", 797 pci_name(dev), SAS_ADDR(asd_ha->hw_prof.sas_addr), 798 asd_ha->hw_prof.pcba_sn, asd_ha->hw_prof.max_phys, 799 asd_ha->hw_prof.num_phys, 800 asd_ha->hw_prof.flash.present ? "present" : "not present", 801 asd_ha->hw_prof.bios.present ? "build " : "not present", 802 asd_ha->hw_prof.bios.bld); 803 804 shost->can_queue = asd_ha->seq.can_queue; 805 806 if (use_msi) 807 pci_enable_msi(asd_ha->pcidev); 808 809 err = request_irq(asd_ha->pcidev->irq, asd_hw_isr, IRQF_SHARED, 810 ASD_DRIVER_NAME, asd_ha); 811 if (err) { 812 asd_printk("couldn't get irq %d for %s\n", 813 asd_ha->pcidev->irq, pci_name(asd_ha->pcidev)); 814 goto Err_irq; 815 } 816 asd_enable_ints(asd_ha); 817 818 err = asd_init_post_escbs(asd_ha); 819 if (err) { 820 asd_printk("couldn't post escbs for %s\n", 821 pci_name(asd_ha->pcidev)); 822 goto Err_escbs; 823 } 824 ASD_DPRINTK("escbs posted\n"); 825 826 err = asd_create_dev_attrs(asd_ha); 827 if (err) 828 goto Err_dev_attrs; 829 830 err = asd_register_sas_ha(asd_ha); 831 if (err) 832 goto Err_reg_sas; 833 834 scsi_scan_host(shost); 835 836 return 0; 837 838 Err_reg_sas: 839 asd_remove_dev_attrs(asd_ha); 840 Err_dev_attrs: 841 Err_escbs: 842 asd_disable_ints(asd_ha); 843 free_irq(dev->irq, asd_ha); 844 Err_irq: 845 if (use_msi) 846 pci_disable_msi(dev); 847 asd_chip_hardrst(asd_ha); 848 Err_free_cache: 849 asd_destroy_ha_caches(asd_ha); 850 Err_unmap: 851 asd_unmap_ha(asd_ha); 852 Err_remove: 853 scsi_remove_host(shost); 854 Err_free: 855 kfree(asd_ha); 856 Err_put: 857 scsi_host_put(shost); 858 Err: 859 pci_disable_device(dev); 860 return err; 861 } 862 863 static void asd_free_queues(struct asd_ha_struct *asd_ha) 864 { 865 unsigned long flags; 866 LIST_HEAD(pending); 867 struct list_head *n, *pos; 868 869 spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags); 870 asd_ha->seq.pending = 0; 871 list_splice_init(&asd_ha->seq.pend_q, &pending); 872 spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags); 873 874 if (!list_empty(&pending)) 875 ASD_DPRINTK("Uh-oh! Pending is not empty!\n"); 876 877 list_for_each_safe(pos, n, &pending) { 878 struct asd_ascb *ascb = list_entry(pos, struct asd_ascb, list); 879 /* 880 * Delete unexpired ascb timers. This may happen if we issue 881 * a CONTROL PHY scb to an adapter and rmmod before the scb 882 * times out. Apparently we don't wait for the CONTROL PHY 883 * to complete, so it doesn't matter if we kill the timer. 884 */ 885 del_timer_sync(&ascb->timer); 886 WARN_ON(ascb->scb->header.opcode != CONTROL_PHY); 887 888 list_del_init(pos); 889 ASD_DPRINTK("freeing from pending\n"); 890 asd_ascb_free(ascb); 891 } 892 } 893 894 static void asd_turn_off_leds(struct asd_ha_struct *asd_ha) 895 { 896 u8 phy_mask = asd_ha->hw_prof.enabled_phys; 897 u8 i; 898 899 for_each_phy(phy_mask, phy_mask, i) { 900 asd_turn_led(asd_ha, i, 0); 901 asd_control_led(asd_ha, i, 0); 902 } 903 } 904 905 static void asd_pci_remove(struct pci_dev *dev) 906 { 907 struct asd_ha_struct *asd_ha = pci_get_drvdata(dev); 908 909 if (!asd_ha) 910 return; 911 912 asd_unregister_sas_ha(asd_ha); 913 914 asd_disable_ints(asd_ha); 915 916 asd_remove_dev_attrs(asd_ha); 917 918 /* XXX more here as needed */ 919 920 free_irq(dev->irq, asd_ha); 921 if (use_msi) 922 pci_disable_msi(asd_ha->pcidev); 923 asd_turn_off_leds(asd_ha); 924 asd_chip_hardrst(asd_ha); 925 asd_free_queues(asd_ha); 926 asd_destroy_ha_caches(asd_ha); 927 asd_unmap_ha(asd_ha); 928 kfree(asd_ha); 929 pci_disable_device(dev); 930 return; 931 } 932 933 static void asd_scan_start(struct Scsi_Host *shost) 934 { 935 struct asd_ha_struct *asd_ha; 936 int err; 937 938 asd_ha = SHOST_TO_SAS_HA(shost)->lldd_ha; 939 err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys); 940 if (err) 941 asd_printk("Couldn't enable phys, err:%d\n", err); 942 } 943 944 static int asd_scan_finished(struct Scsi_Host *shost, unsigned long time) 945 { 946 /* give the phy enabling interrupt event time to come in (1s 947 * is empirically about all it takes) */ 948 if (time < HZ) 949 return 0; 950 /* Wait for discovery to finish */ 951 sas_drain_work(SHOST_TO_SAS_HA(shost)); 952 return 1; 953 } 954 955 static ssize_t version_show(struct device_driver *driver, char *buf) 956 { 957 return snprintf(buf, PAGE_SIZE, "%s\n", ASD_DRIVER_VERSION); 958 } 959 static DRIVER_ATTR_RO(version); 960 961 static int asd_create_driver_attrs(struct device_driver *driver) 962 { 963 return driver_create_file(driver, &driver_attr_version); 964 } 965 966 static void asd_remove_driver_attrs(struct device_driver *driver) 967 { 968 driver_remove_file(driver, &driver_attr_version); 969 } 970 971 static struct sas_domain_function_template aic94xx_transport_functions = { 972 .lldd_dev_found = asd_dev_found, 973 .lldd_dev_gone = asd_dev_gone, 974 975 .lldd_execute_task = asd_execute_task, 976 977 .lldd_abort_task = asd_abort_task, 978 .lldd_abort_task_set = asd_abort_task_set, 979 .lldd_clear_aca = asd_clear_aca, 980 .lldd_clear_task_set = asd_clear_task_set, 981 .lldd_I_T_nexus_reset = asd_I_T_nexus_reset, 982 .lldd_lu_reset = asd_lu_reset, 983 .lldd_query_task = asd_query_task, 984 985 .lldd_clear_nexus_port = asd_clear_nexus_port, 986 .lldd_clear_nexus_ha = asd_clear_nexus_ha, 987 988 .lldd_control_phy = asd_control_phy, 989 990 .lldd_ata_set_dmamode = asd_set_dmamode, 991 }; 992 993 static const struct pci_device_id aic94xx_pci_table[] = { 994 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x410),0, 0, 1}, 995 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x412),0, 0, 1}, 996 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x416),0, 0, 1}, 997 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x41E),0, 0, 1}, 998 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x41F),0, 0, 1}, 999 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x430),0, 0, 2}, 1000 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x432),0, 0, 2}, 1001 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x43E),0, 0, 2}, 1002 {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x43F),0, 0, 2}, 1003 {} 1004 }; 1005 1006 MODULE_DEVICE_TABLE(pci, aic94xx_pci_table); 1007 1008 static struct pci_driver aic94xx_pci_driver = { 1009 .name = ASD_DRIVER_NAME, 1010 .id_table = aic94xx_pci_table, 1011 .probe = asd_pci_probe, 1012 .remove = asd_pci_remove, 1013 }; 1014 1015 static int __init aic94xx_init(void) 1016 { 1017 int err; 1018 1019 1020 asd_printk("%s version %s loaded\n", ASD_DRIVER_DESCRIPTION, 1021 ASD_DRIVER_VERSION); 1022 1023 err = asd_create_global_caches(); 1024 if (err) 1025 return err; 1026 1027 aic94xx_transport_template = 1028 sas_domain_attach_transport(&aic94xx_transport_functions); 1029 if (!aic94xx_transport_template) { 1030 err = -ENOMEM; 1031 goto out_destroy_caches; 1032 } 1033 1034 err = pci_register_driver(&aic94xx_pci_driver); 1035 if (err) 1036 goto out_release_transport; 1037 1038 err = asd_create_driver_attrs(&aic94xx_pci_driver.driver); 1039 if (err) 1040 goto out_unregister_pcidrv; 1041 1042 return err; 1043 1044 out_unregister_pcidrv: 1045 pci_unregister_driver(&aic94xx_pci_driver); 1046 out_release_transport: 1047 sas_release_transport(aic94xx_transport_template); 1048 out_destroy_caches: 1049 asd_destroy_global_caches(); 1050 1051 return err; 1052 } 1053 1054 static void __exit aic94xx_exit(void) 1055 { 1056 asd_remove_driver_attrs(&aic94xx_pci_driver.driver); 1057 pci_unregister_driver(&aic94xx_pci_driver); 1058 sas_release_transport(aic94xx_transport_template); 1059 asd_release_firmware(); 1060 asd_destroy_global_caches(); 1061 asd_printk("%s version %s unloaded\n", ASD_DRIVER_DESCRIPTION, 1062 ASD_DRIVER_VERSION); 1063 } 1064 1065 module_init(aic94xx_init); 1066 module_exit(aic94xx_exit); 1067 1068 MODULE_AUTHOR("Luben Tuikov <luben_tuikov@adaptec.com>"); 1069 MODULE_DESCRIPTION(ASD_DRIVER_DESCRIPTION); 1070 MODULE_LICENSE("GPL v2"); 1071 MODULE_VERSION(ASD_DRIVER_VERSION); 1072