1 /* 2 * QLogic Fibre Channel HBA Driver 3 * Copyright (c) 2003-2005 QLogic Corporation 4 * 5 * See LICENSE.qla2xxx for copyright and licensing details. 6 */ 7 #include "qla_def.h" 8 9 #include <linux/kthread.h> 10 #include <linux/vmalloc.h> 11 12 static int qla24xx_vport_disable(struct fc_vport *, bool); 13 14 /* SYSFS attributes --------------------------------------------------------- */ 15 16 static ssize_t 17 qla2x00_sysfs_read_fw_dump(struct kobject *kobj, 18 struct bin_attribute *bin_attr, 19 char *buf, loff_t off, size_t count) 20 { 21 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 22 struct device, kobj))); 23 char *rbuf = (char *)ha->fw_dump; 24 25 if (ha->fw_dump_reading == 0) 26 return 0; 27 if (off > ha->fw_dump_len) 28 return 0; 29 if (off + count > ha->fw_dump_len) 30 count = ha->fw_dump_len - off; 31 32 memcpy(buf, &rbuf[off], count); 33 34 return (count); 35 } 36 37 static ssize_t 38 qla2x00_sysfs_write_fw_dump(struct kobject *kobj, 39 struct bin_attribute *bin_attr, 40 char *buf, loff_t off, size_t count) 41 { 42 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 43 struct device, kobj))); 44 int reading; 45 46 if (off != 0) 47 return (0); 48 49 reading = simple_strtol(buf, NULL, 10); 50 switch (reading) { 51 case 0: 52 if (!ha->fw_dump_reading) 53 break; 54 55 qla_printk(KERN_INFO, ha, 56 "Firmware dump cleared on (%ld).\n", ha->host_no); 57 58 ha->fw_dump_reading = 0; 59 ha->fw_dumped = 0; 60 break; 61 case 1: 62 if (ha->fw_dumped && !ha->fw_dump_reading) { 63 ha->fw_dump_reading = 1; 64 65 qla_printk(KERN_INFO, ha, 66 "Raw firmware dump ready for read on (%ld).\n", 67 ha->host_no); 68 } 69 break; 70 case 2: 71 qla2x00_alloc_fw_dump(ha); 72 break; 73 } 74 return (count); 75 } 76 77 static struct bin_attribute sysfs_fw_dump_attr = { 78 .attr = { 79 .name = "fw_dump", 80 .mode = S_IRUSR | S_IWUSR, 81 }, 82 .size = 0, 83 .read = qla2x00_sysfs_read_fw_dump, 84 .write = qla2x00_sysfs_write_fw_dump, 85 }; 86 87 static ssize_t 88 qla2x00_sysfs_read_nvram(struct kobject *kobj, 89 struct bin_attribute *bin_attr, 90 char *buf, loff_t off, size_t count) 91 { 92 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 93 struct device, kobj))); 94 int size = ha->nvram_size; 95 char *nvram_cache = ha->nvram; 96 97 if (!capable(CAP_SYS_ADMIN) || off > size || count == 0) 98 return 0; 99 if (off + count > size) { 100 size -= off; 101 count = size; 102 } 103 104 /* Read NVRAM data from cache. */ 105 memcpy(buf, &nvram_cache[off], count); 106 107 return count; 108 } 109 110 static ssize_t 111 qla2x00_sysfs_write_nvram(struct kobject *kobj, 112 struct bin_attribute *bin_attr, 113 char *buf, loff_t off, size_t count) 114 { 115 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 116 struct device, kobj))); 117 uint16_t cnt; 118 119 if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size) 120 return 0; 121 122 /* Checksum NVRAM. */ 123 if (IS_FWI2_CAPABLE(ha)) { 124 uint32_t *iter; 125 uint32_t chksum; 126 127 iter = (uint32_t *)buf; 128 chksum = 0; 129 for (cnt = 0; cnt < ((count >> 2) - 1); cnt++) 130 chksum += le32_to_cpu(*iter++); 131 chksum = ~chksum + 1; 132 *iter = cpu_to_le32(chksum); 133 } else { 134 uint8_t *iter; 135 uint8_t chksum; 136 137 iter = (uint8_t *)buf; 138 chksum = 0; 139 for (cnt = 0; cnt < count - 1; cnt++) 140 chksum += *iter++; 141 chksum = ~chksum + 1; 142 *iter = chksum; 143 } 144 145 /* Write NVRAM. */ 146 ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->nvram_base, count); 147 ha->isp_ops->read_nvram(ha, (uint8_t *)ha->nvram, ha->nvram_base, 148 count); 149 150 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); 151 152 return (count); 153 } 154 155 static struct bin_attribute sysfs_nvram_attr = { 156 .attr = { 157 .name = "nvram", 158 .mode = S_IRUSR | S_IWUSR, 159 }, 160 .size = 512, 161 .read = qla2x00_sysfs_read_nvram, 162 .write = qla2x00_sysfs_write_nvram, 163 }; 164 165 static ssize_t 166 qla2x00_sysfs_read_optrom(struct kobject *kobj, 167 struct bin_attribute *bin_attr, 168 char *buf, loff_t off, size_t count) 169 { 170 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 171 struct device, kobj))); 172 173 if (ha->optrom_state != QLA_SREADING) 174 return 0; 175 if (off > ha->optrom_region_size) 176 return 0; 177 if (off + count > ha->optrom_region_size) 178 count = ha->optrom_region_size - off; 179 180 memcpy(buf, &ha->optrom_buffer[off], count); 181 182 return count; 183 } 184 185 static ssize_t 186 qla2x00_sysfs_write_optrom(struct kobject *kobj, 187 struct bin_attribute *bin_attr, 188 char *buf, loff_t off, size_t count) 189 { 190 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 191 struct device, kobj))); 192 193 if (ha->optrom_state != QLA_SWRITING) 194 return -EINVAL; 195 if (off > ha->optrom_region_size) 196 return -ERANGE; 197 if (off + count > ha->optrom_region_size) 198 count = ha->optrom_region_size - off; 199 200 memcpy(&ha->optrom_buffer[off], buf, count); 201 202 return count; 203 } 204 205 static struct bin_attribute sysfs_optrom_attr = { 206 .attr = { 207 .name = "optrom", 208 .mode = S_IRUSR | S_IWUSR, 209 }, 210 .size = 0, 211 .read = qla2x00_sysfs_read_optrom, 212 .write = qla2x00_sysfs_write_optrom, 213 }; 214 215 static ssize_t 216 qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj, 217 struct bin_attribute *bin_attr, 218 char *buf, loff_t off, size_t count) 219 { 220 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 221 struct device, kobj))); 222 uint32_t start = 0; 223 uint32_t size = ha->optrom_size; 224 int val, valid; 225 226 if (off) 227 return 0; 228 229 if (sscanf(buf, "%d:%x:%x", &val, &start, &size) < 1) 230 return -EINVAL; 231 if (start > ha->optrom_size) 232 return -EINVAL; 233 234 switch (val) { 235 case 0: 236 if (ha->optrom_state != QLA_SREADING && 237 ha->optrom_state != QLA_SWRITING) 238 break; 239 240 ha->optrom_state = QLA_SWAITING; 241 242 DEBUG2(qla_printk(KERN_INFO, ha, 243 "Freeing flash region allocation -- 0x%x bytes.\n", 244 ha->optrom_region_size)); 245 246 vfree(ha->optrom_buffer); 247 ha->optrom_buffer = NULL; 248 break; 249 case 1: 250 if (ha->optrom_state != QLA_SWAITING) 251 break; 252 253 if (start & 0xfff) { 254 qla_printk(KERN_WARNING, ha, 255 "Invalid start region 0x%x/0x%x.\n", start, size); 256 return -EINVAL; 257 } 258 259 ha->optrom_region_start = start; 260 ha->optrom_region_size = start + size > ha->optrom_size ? 261 ha->optrom_size - start : size; 262 263 ha->optrom_state = QLA_SREADING; 264 ha->optrom_buffer = vmalloc(ha->optrom_region_size); 265 if (ha->optrom_buffer == NULL) { 266 qla_printk(KERN_WARNING, ha, 267 "Unable to allocate memory for optrom retrieval " 268 "(%x).\n", ha->optrom_region_size); 269 270 ha->optrom_state = QLA_SWAITING; 271 return count; 272 } 273 274 DEBUG2(qla_printk(KERN_INFO, ha, 275 "Reading flash region -- 0x%x/0x%x.\n", 276 ha->optrom_region_start, ha->optrom_region_size)); 277 278 memset(ha->optrom_buffer, 0, ha->optrom_region_size); 279 ha->isp_ops->read_optrom(ha, ha->optrom_buffer, 280 ha->optrom_region_start, ha->optrom_region_size); 281 break; 282 case 2: 283 if (ha->optrom_state != QLA_SWAITING) 284 break; 285 286 /* 287 * We need to be more restrictive on which FLASH regions are 288 * allowed to be updated via user-space. Regions accessible 289 * via this method include: 290 * 291 * ISP21xx/ISP22xx/ISP23xx type boards: 292 * 293 * 0x000000 -> 0x020000 -- Boot code. 294 * 295 * ISP2322/ISP24xx type boards: 296 * 297 * 0x000000 -> 0x07ffff -- Boot code. 298 * 0x080000 -> 0x0fffff -- Firmware. 299 * 300 * ISP25xx type boards: 301 * 302 * 0x000000 -> 0x07ffff -- Boot code. 303 * 0x080000 -> 0x0fffff -- Firmware. 304 * 0x120000 -> 0x12ffff -- VPD and HBA parameters. 305 */ 306 valid = 0; 307 if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0) 308 valid = 1; 309 else if (start == (FA_BOOT_CODE_ADDR*4) || 310 start == (FA_RISC_CODE_ADDR*4)) 311 valid = 1; 312 else if (IS_QLA25XX(ha) && start == (FA_VPD_NVRAM_ADDR*4)) 313 valid = 1; 314 if (!valid) { 315 qla_printk(KERN_WARNING, ha, 316 "Invalid start region 0x%x/0x%x.\n", start, size); 317 return -EINVAL; 318 } 319 320 ha->optrom_region_start = start; 321 ha->optrom_region_size = start + size > ha->optrom_size ? 322 ha->optrom_size - start : size; 323 324 ha->optrom_state = QLA_SWRITING; 325 ha->optrom_buffer = vmalloc(ha->optrom_region_size); 326 if (ha->optrom_buffer == NULL) { 327 qla_printk(KERN_WARNING, ha, 328 "Unable to allocate memory for optrom update " 329 "(%x).\n", ha->optrom_region_size); 330 331 ha->optrom_state = QLA_SWAITING; 332 return count; 333 } 334 335 DEBUG2(qla_printk(KERN_INFO, ha, 336 "Staging flash region write -- 0x%x/0x%x.\n", 337 ha->optrom_region_start, ha->optrom_region_size)); 338 339 memset(ha->optrom_buffer, 0, ha->optrom_region_size); 340 break; 341 case 3: 342 if (ha->optrom_state != QLA_SWRITING) 343 break; 344 345 DEBUG2(qla_printk(KERN_INFO, ha, 346 "Writing flash region -- 0x%x/0x%x.\n", 347 ha->optrom_region_start, ha->optrom_region_size)); 348 349 ha->isp_ops->write_optrom(ha, ha->optrom_buffer, 350 ha->optrom_region_start, ha->optrom_region_size); 351 break; 352 default: 353 count = -EINVAL; 354 } 355 return count; 356 } 357 358 static struct bin_attribute sysfs_optrom_ctl_attr = { 359 .attr = { 360 .name = "optrom_ctl", 361 .mode = S_IWUSR, 362 }, 363 .size = 0, 364 .write = qla2x00_sysfs_write_optrom_ctl, 365 }; 366 367 static ssize_t 368 qla2x00_sysfs_read_vpd(struct kobject *kobj, 369 struct bin_attribute *bin_attr, 370 char *buf, loff_t off, size_t count) 371 { 372 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 373 struct device, kobj))); 374 int size = ha->vpd_size; 375 char *vpd_cache = ha->vpd; 376 377 if (!capable(CAP_SYS_ADMIN) || off > size || count == 0) 378 return 0; 379 if (off + count > size) { 380 size -= off; 381 count = size; 382 } 383 384 /* Read NVRAM data from cache. */ 385 memcpy(buf, &vpd_cache[off], count); 386 387 return count; 388 } 389 390 static ssize_t 391 qla2x00_sysfs_write_vpd(struct kobject *kobj, 392 struct bin_attribute *bin_attr, 393 char *buf, loff_t off, size_t count) 394 { 395 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 396 struct device, kobj))); 397 398 if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size) 399 return 0; 400 401 /* Write NVRAM. */ 402 ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->vpd_base, count); 403 ha->isp_ops->read_nvram(ha, (uint8_t *)ha->vpd, ha->vpd_base, count); 404 405 return count; 406 } 407 408 static struct bin_attribute sysfs_vpd_attr = { 409 .attr = { 410 .name = "vpd", 411 .mode = S_IRUSR | S_IWUSR, 412 }, 413 .size = 0, 414 .read = qla2x00_sysfs_read_vpd, 415 .write = qla2x00_sysfs_write_vpd, 416 }; 417 418 static ssize_t 419 qla2x00_sysfs_read_sfp(struct kobject *kobj, 420 struct bin_attribute *bin_attr, 421 char *buf, loff_t off, size_t count) 422 { 423 struct scsi_qla_host *ha = shost_priv(dev_to_shost(container_of(kobj, 424 struct device, kobj))); 425 uint16_t iter, addr, offset; 426 int rval; 427 428 if (!capable(CAP_SYS_ADMIN) || off != 0 || count != SFP_DEV_SIZE * 2) 429 return 0; 430 431 addr = 0xa0; 432 for (iter = 0, offset = 0; iter < (SFP_DEV_SIZE * 2) / SFP_BLOCK_SIZE; 433 iter++, offset += SFP_BLOCK_SIZE) { 434 if (iter == 4) { 435 /* Skip to next device address. */ 436 addr = 0xa2; 437 offset = 0; 438 } 439 440 rval = qla2x00_read_sfp(ha, ha->sfp_data_dma, addr, offset, 441 SFP_BLOCK_SIZE); 442 if (rval != QLA_SUCCESS) { 443 qla_printk(KERN_WARNING, ha, 444 "Unable to read SFP data (%x/%x/%x).\n", rval, 445 addr, offset); 446 count = 0; 447 break; 448 } 449 memcpy(buf, ha->sfp_data, SFP_BLOCK_SIZE); 450 buf += SFP_BLOCK_SIZE; 451 } 452 453 return count; 454 } 455 456 static struct bin_attribute sysfs_sfp_attr = { 457 .attr = { 458 .name = "sfp", 459 .mode = S_IRUSR | S_IWUSR, 460 }, 461 .size = SFP_DEV_SIZE * 2, 462 .read = qla2x00_sysfs_read_sfp, 463 }; 464 465 static struct sysfs_entry { 466 char *name; 467 struct bin_attribute *attr; 468 int is4GBp_only; 469 } bin_file_entries[] = { 470 { "fw_dump", &sysfs_fw_dump_attr, }, 471 { "nvram", &sysfs_nvram_attr, }, 472 { "optrom", &sysfs_optrom_attr, }, 473 { "optrom_ctl", &sysfs_optrom_ctl_attr, }, 474 { "vpd", &sysfs_vpd_attr, 1 }, 475 { "sfp", &sysfs_sfp_attr, 1 }, 476 { NULL }, 477 }; 478 479 void 480 qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) 481 { 482 struct Scsi_Host *host = ha->host; 483 struct sysfs_entry *iter; 484 int ret; 485 486 for (iter = bin_file_entries; iter->name; iter++) { 487 if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha)) 488 continue; 489 490 ret = sysfs_create_bin_file(&host->shost_gendev.kobj, 491 iter->attr); 492 if (ret) 493 qla_printk(KERN_INFO, ha, 494 "Unable to create sysfs %s binary attribute " 495 "(%d).\n", iter->name, ret); 496 } 497 } 498 499 void 500 qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) 501 { 502 struct Scsi_Host *host = ha->host; 503 struct sysfs_entry *iter; 504 505 for (iter = bin_file_entries; iter->name; iter++) { 506 if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha)) 507 continue; 508 509 sysfs_remove_bin_file(&host->shost_gendev.kobj, 510 iter->attr); 511 } 512 513 if (ha->beacon_blink_led == 1) 514 ha->isp_ops->beacon_off(ha); 515 } 516 517 /* Scsi_Host attributes. */ 518 519 static ssize_t 520 qla2x00_drvr_version_show(struct class_device *cdev, char *buf) 521 { 522 return snprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str); 523 } 524 525 static ssize_t 526 qla2x00_fw_version_show(struct class_device *cdev, char *buf) 527 { 528 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 529 char fw_str[30]; 530 531 return snprintf(buf, PAGE_SIZE, "%s\n", 532 ha->isp_ops->fw_version_str(ha, fw_str)); 533 } 534 535 static ssize_t 536 qla2x00_serial_num_show(struct class_device *cdev, char *buf) 537 { 538 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 539 uint32_t sn; 540 541 if (IS_FWI2_CAPABLE(ha)) 542 return snprintf(buf, PAGE_SIZE, "\n"); 543 544 sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1; 545 return snprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000, 546 sn % 100000); 547 } 548 549 static ssize_t 550 qla2x00_isp_name_show(struct class_device *cdev, char *buf) 551 { 552 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 553 return snprintf(buf, PAGE_SIZE, "ISP%04X\n", ha->pdev->device); 554 } 555 556 static ssize_t 557 qla2x00_isp_id_show(struct class_device *cdev, char *buf) 558 { 559 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 560 return snprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n", 561 ha->product_id[0], ha->product_id[1], ha->product_id[2], 562 ha->product_id[3]); 563 } 564 565 static ssize_t 566 qla2x00_model_name_show(struct class_device *cdev, char *buf) 567 { 568 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 569 return snprintf(buf, PAGE_SIZE, "%s\n", ha->model_number); 570 } 571 572 static ssize_t 573 qla2x00_model_desc_show(struct class_device *cdev, char *buf) 574 { 575 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 576 return snprintf(buf, PAGE_SIZE, "%s\n", 577 ha->model_desc ? ha->model_desc: ""); 578 } 579 580 static ssize_t 581 qla2x00_pci_info_show(struct class_device *cdev, char *buf) 582 { 583 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 584 char pci_info[30]; 585 586 return snprintf(buf, PAGE_SIZE, "%s\n", 587 ha->isp_ops->pci_info_str(ha, pci_info)); 588 } 589 590 static ssize_t 591 qla2x00_state_show(struct class_device *cdev, char *buf) 592 { 593 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 594 int len = 0; 595 596 if (atomic_read(&ha->loop_state) == LOOP_DOWN || 597 atomic_read(&ha->loop_state) == LOOP_DEAD) 598 len = snprintf(buf, PAGE_SIZE, "Link Down\n"); 599 else if (atomic_read(&ha->loop_state) != LOOP_READY || 600 test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || 601 test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) 602 len = snprintf(buf, PAGE_SIZE, "Unknown Link State\n"); 603 else { 604 len = snprintf(buf, PAGE_SIZE, "Link Up - "); 605 606 switch (ha->current_topology) { 607 case ISP_CFG_NL: 608 len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n"); 609 break; 610 case ISP_CFG_FL: 611 len += snprintf(buf + len, PAGE_SIZE-len, "FL_Port\n"); 612 break; 613 case ISP_CFG_N: 614 len += snprintf(buf + len, PAGE_SIZE-len, 615 "N_Port to N_Port\n"); 616 break; 617 case ISP_CFG_F: 618 len += snprintf(buf + len, PAGE_SIZE-len, "F_Port\n"); 619 break; 620 default: 621 len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n"); 622 break; 623 } 624 } 625 return len; 626 } 627 628 static ssize_t 629 qla2x00_zio_show(struct class_device *cdev, char *buf) 630 { 631 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 632 int len = 0; 633 634 switch (ha->zio_mode) { 635 case QLA_ZIO_MODE_6: 636 len += snprintf(buf + len, PAGE_SIZE-len, "Mode 6\n"); 637 break; 638 case QLA_ZIO_DISABLED: 639 len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n"); 640 break; 641 } 642 return len; 643 } 644 645 static ssize_t 646 qla2x00_zio_store(struct class_device *cdev, const char *buf, size_t count) 647 { 648 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 649 int val = 0; 650 uint16_t zio_mode; 651 652 if (!IS_ZIO_SUPPORTED(ha)) 653 return -ENOTSUPP; 654 655 if (sscanf(buf, "%d", &val) != 1) 656 return -EINVAL; 657 658 if (val) 659 zio_mode = QLA_ZIO_MODE_6; 660 else 661 zio_mode = QLA_ZIO_DISABLED; 662 663 /* Update per-hba values and queue a reset. */ 664 if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) { 665 ha->zio_mode = zio_mode; 666 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); 667 } 668 return strlen(buf); 669 } 670 671 static ssize_t 672 qla2x00_zio_timer_show(struct class_device *cdev, char *buf) 673 { 674 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 675 676 return snprintf(buf, PAGE_SIZE, "%d us\n", ha->zio_timer * 100); 677 } 678 679 static ssize_t 680 qla2x00_zio_timer_store(struct class_device *cdev, const char *buf, 681 size_t count) 682 { 683 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 684 int val = 0; 685 uint16_t zio_timer; 686 687 if (sscanf(buf, "%d", &val) != 1) 688 return -EINVAL; 689 if (val > 25500 || val < 100) 690 return -ERANGE; 691 692 zio_timer = (uint16_t)(val / 100); 693 ha->zio_timer = zio_timer; 694 695 return strlen(buf); 696 } 697 698 static ssize_t 699 qla2x00_beacon_show(struct class_device *cdev, char *buf) 700 { 701 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 702 int len = 0; 703 704 if (ha->beacon_blink_led) 705 len += snprintf(buf + len, PAGE_SIZE-len, "Enabled\n"); 706 else 707 len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n"); 708 return len; 709 } 710 711 static ssize_t 712 qla2x00_beacon_store(struct class_device *cdev, const char *buf, 713 size_t count) 714 { 715 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 716 int val = 0; 717 int rval; 718 719 if (IS_QLA2100(ha) || IS_QLA2200(ha)) 720 return -EPERM; 721 722 if (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) { 723 qla_printk(KERN_WARNING, ha, 724 "Abort ISP active -- ignoring beacon request.\n"); 725 return -EBUSY; 726 } 727 728 if (sscanf(buf, "%d", &val) != 1) 729 return -EINVAL; 730 731 if (val) 732 rval = ha->isp_ops->beacon_on(ha); 733 else 734 rval = ha->isp_ops->beacon_off(ha); 735 736 if (rval != QLA_SUCCESS) 737 count = 0; 738 739 return count; 740 } 741 742 static ssize_t 743 qla2x00_optrom_bios_version_show(struct class_device *cdev, char *buf) 744 { 745 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 746 747 return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1], 748 ha->bios_revision[0]); 749 } 750 751 static ssize_t 752 qla2x00_optrom_efi_version_show(struct class_device *cdev, char *buf) 753 { 754 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 755 756 return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1], 757 ha->efi_revision[0]); 758 } 759 760 static ssize_t 761 qla2x00_optrom_fcode_version_show(struct class_device *cdev, char *buf) 762 { 763 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 764 765 return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1], 766 ha->fcode_revision[0]); 767 } 768 769 static ssize_t 770 qla2x00_optrom_fw_version_show(struct class_device *cdev, char *buf) 771 { 772 scsi_qla_host_t *ha = shost_priv(class_to_shost(cdev)); 773 774 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n", 775 ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2], 776 ha->fw_revision[3]); 777 } 778 779 static CLASS_DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, 780 NULL); 781 static CLASS_DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); 782 static CLASS_DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); 783 static CLASS_DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL); 784 static CLASS_DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL); 785 static CLASS_DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL); 786 static CLASS_DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL); 787 static CLASS_DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL); 788 static CLASS_DEVICE_ATTR(state, S_IRUGO, qla2x00_state_show, NULL); 789 static CLASS_DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show, 790 qla2x00_zio_store); 791 static CLASS_DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show, 792 qla2x00_zio_timer_store); 793 static CLASS_DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show, 794 qla2x00_beacon_store); 795 static CLASS_DEVICE_ATTR(optrom_bios_version, S_IRUGO, 796 qla2x00_optrom_bios_version_show, NULL); 797 static CLASS_DEVICE_ATTR(optrom_efi_version, S_IRUGO, 798 qla2x00_optrom_efi_version_show, NULL); 799 static CLASS_DEVICE_ATTR(optrom_fcode_version, S_IRUGO, 800 qla2x00_optrom_fcode_version_show, NULL); 801 static CLASS_DEVICE_ATTR(optrom_fw_version, S_IRUGO, 802 qla2x00_optrom_fw_version_show, NULL); 803 804 struct class_device_attribute *qla2x00_host_attrs[] = { 805 &class_device_attr_driver_version, 806 &class_device_attr_fw_version, 807 &class_device_attr_serial_num, 808 &class_device_attr_isp_name, 809 &class_device_attr_isp_id, 810 &class_device_attr_model_name, 811 &class_device_attr_model_desc, 812 &class_device_attr_pci_info, 813 &class_device_attr_state, 814 &class_device_attr_zio, 815 &class_device_attr_zio_timer, 816 &class_device_attr_beacon, 817 &class_device_attr_optrom_bios_version, 818 &class_device_attr_optrom_efi_version, 819 &class_device_attr_optrom_fcode_version, 820 &class_device_attr_optrom_fw_version, 821 NULL, 822 }; 823 824 /* Host attributes. */ 825 826 static void 827 qla2x00_get_host_port_id(struct Scsi_Host *shost) 828 { 829 scsi_qla_host_t *ha = shost_priv(shost); 830 831 fc_host_port_id(shost) = ha->d_id.b.domain << 16 | 832 ha->d_id.b.area << 8 | ha->d_id.b.al_pa; 833 } 834 835 static void 836 qla2x00_get_host_speed(struct Scsi_Host *shost) 837 { 838 scsi_qla_host_t *ha = shost_priv(shost); 839 uint32_t speed = 0; 840 841 switch (ha->link_data_rate) { 842 case PORT_SPEED_1GB: 843 speed = 1; 844 break; 845 case PORT_SPEED_2GB: 846 speed = 2; 847 break; 848 case PORT_SPEED_4GB: 849 speed = 4; 850 break; 851 } 852 fc_host_speed(shost) = speed; 853 } 854 855 static void 856 qla2x00_get_host_port_type(struct Scsi_Host *shost) 857 { 858 scsi_qla_host_t *ha = shost_priv(shost); 859 uint32_t port_type = FC_PORTTYPE_UNKNOWN; 860 861 switch (ha->current_topology) { 862 case ISP_CFG_NL: 863 port_type = FC_PORTTYPE_LPORT; 864 break; 865 case ISP_CFG_FL: 866 port_type = FC_PORTTYPE_NLPORT; 867 break; 868 case ISP_CFG_N: 869 port_type = FC_PORTTYPE_PTP; 870 break; 871 case ISP_CFG_F: 872 port_type = FC_PORTTYPE_NPORT; 873 break; 874 } 875 fc_host_port_type(shost) = port_type; 876 } 877 878 static void 879 qla2x00_get_starget_node_name(struct scsi_target *starget) 880 { 881 struct Scsi_Host *host = dev_to_shost(starget->dev.parent); 882 scsi_qla_host_t *ha = shost_priv(host); 883 fc_port_t *fcport; 884 u64 node_name = 0; 885 886 list_for_each_entry(fcport, &ha->fcports, list) { 887 if (starget->id == fcport->os_target_id) { 888 node_name = wwn_to_u64(fcport->node_name); 889 break; 890 } 891 } 892 893 fc_starget_node_name(starget) = node_name; 894 } 895 896 static void 897 qla2x00_get_starget_port_name(struct scsi_target *starget) 898 { 899 struct Scsi_Host *host = dev_to_shost(starget->dev.parent); 900 scsi_qla_host_t *ha = shost_priv(host); 901 fc_port_t *fcport; 902 u64 port_name = 0; 903 904 list_for_each_entry(fcport, &ha->fcports, list) { 905 if (starget->id == fcport->os_target_id) { 906 port_name = wwn_to_u64(fcport->port_name); 907 break; 908 } 909 } 910 911 fc_starget_port_name(starget) = port_name; 912 } 913 914 static void 915 qla2x00_get_starget_port_id(struct scsi_target *starget) 916 { 917 struct Scsi_Host *host = dev_to_shost(starget->dev.parent); 918 scsi_qla_host_t *ha = shost_priv(host); 919 fc_port_t *fcport; 920 uint32_t port_id = ~0U; 921 922 list_for_each_entry(fcport, &ha->fcports, list) { 923 if (starget->id == fcport->os_target_id) { 924 port_id = fcport->d_id.b.domain << 16 | 925 fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa; 926 break; 927 } 928 } 929 930 fc_starget_port_id(starget) = port_id; 931 } 932 933 static void 934 qla2x00_get_rport_loss_tmo(struct fc_rport *rport) 935 { 936 struct Scsi_Host *host = rport_to_shost(rport); 937 scsi_qla_host_t *ha = shost_priv(host); 938 939 rport->dev_loss_tmo = ha->port_down_retry_count + 5; 940 } 941 942 static void 943 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) 944 { 945 struct Scsi_Host *host = rport_to_shost(rport); 946 scsi_qla_host_t *ha = shost_priv(host); 947 948 if (timeout) 949 ha->port_down_retry_count = timeout; 950 else 951 ha->port_down_retry_count = 1; 952 953 rport->dev_loss_tmo = ha->port_down_retry_count + 5; 954 } 955 956 static int 957 qla2x00_issue_lip(struct Scsi_Host *shost) 958 { 959 scsi_qla_host_t *ha = shost_priv(shost); 960 961 qla2x00_loop_reset(ha); 962 return 0; 963 } 964 965 static struct fc_host_statistics * 966 qla2x00_get_fc_host_stats(struct Scsi_Host *shost) 967 { 968 scsi_qla_host_t *ha = shost_priv(shost); 969 int rval; 970 struct link_statistics *stats; 971 dma_addr_t stats_dma; 972 struct fc_host_statistics *pfc_host_stat; 973 974 pfc_host_stat = &ha->fc_host_stat; 975 memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics)); 976 977 stats = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &stats_dma); 978 if (stats == NULL) { 979 DEBUG2_3_11(printk("%s(%ld): Failed to allocate memory.\n", 980 __func__, ha->host_no)); 981 goto done; 982 } 983 memset(stats, 0, DMA_POOL_SIZE); 984 985 rval = QLA_FUNCTION_FAILED; 986 if (IS_FWI2_CAPABLE(ha)) { 987 rval = qla24xx_get_isp_stats(ha, stats, stats_dma); 988 } else if (atomic_read(&ha->loop_state) == LOOP_READY && 989 !test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) && 990 !test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) && 991 !ha->dpc_active) { 992 /* Must be in a 'READY' state for statistics retrieval. */ 993 rval = qla2x00_get_link_status(ha, ha->loop_id, stats, 994 stats_dma); 995 } 996 997 if (rval != QLA_SUCCESS) 998 goto done_free; 999 1000 pfc_host_stat->link_failure_count = stats->link_fail_cnt; 1001 pfc_host_stat->loss_of_sync_count = stats->loss_sync_cnt; 1002 pfc_host_stat->loss_of_signal_count = stats->loss_sig_cnt; 1003 pfc_host_stat->prim_seq_protocol_err_count = stats->prim_seq_err_cnt; 1004 pfc_host_stat->invalid_tx_word_count = stats->inval_xmit_word_cnt; 1005 pfc_host_stat->invalid_crc_count = stats->inval_crc_cnt; 1006 if (IS_FWI2_CAPABLE(ha)) { 1007 pfc_host_stat->tx_frames = stats->tx_frames; 1008 pfc_host_stat->rx_frames = stats->rx_frames; 1009 pfc_host_stat->dumped_frames = stats->dumped_frames; 1010 pfc_host_stat->nos_count = stats->nos_rcvd; 1011 } 1012 1013 done_free: 1014 dma_pool_free(ha->s_dma_pool, stats, stats_dma); 1015 done: 1016 return pfc_host_stat; 1017 } 1018 1019 static void 1020 qla2x00_get_host_symbolic_name(struct Scsi_Host *shost) 1021 { 1022 scsi_qla_host_t *ha = shost_priv(shost); 1023 1024 qla2x00_get_sym_node_name(ha, fc_host_symbolic_name(shost)); 1025 } 1026 1027 static void 1028 qla2x00_set_host_system_hostname(struct Scsi_Host *shost) 1029 { 1030 scsi_qla_host_t *ha = shost_priv(shost); 1031 1032 set_bit(REGISTER_FDMI_NEEDED, &ha->dpc_flags); 1033 } 1034 1035 static void 1036 qla2x00_get_host_fabric_name(struct Scsi_Host *shost) 1037 { 1038 scsi_qla_host_t *ha = shost_priv(shost); 1039 u64 node_name; 1040 1041 if (ha->device_flags & SWITCH_FOUND) 1042 node_name = wwn_to_u64(ha->fabric_node_name); 1043 else 1044 node_name = wwn_to_u64(ha->node_name); 1045 1046 fc_host_fabric_name(shost) = node_name; 1047 } 1048 1049 static void 1050 qla2x00_get_host_port_state(struct Scsi_Host *shost) 1051 { 1052 scsi_qla_host_t *ha = shost_priv(shost); 1053 1054 if (!ha->flags.online) 1055 fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; 1056 else if (atomic_read(&ha->loop_state) == LOOP_TIMEOUT) 1057 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; 1058 else 1059 fc_host_port_state(shost) = FC_PORTSTATE_ONLINE; 1060 } 1061 1062 static int 1063 qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) 1064 { 1065 int ret = 0; 1066 scsi_qla_host_t *ha = shost_priv(fc_vport->shost); 1067 scsi_qla_host_t *vha; 1068 1069 ret = qla24xx_vport_create_req_sanity_check(fc_vport); 1070 if (ret) { 1071 DEBUG15(printk("qla24xx_vport_create_req_sanity_check failed, " 1072 "status %x\n", ret)); 1073 return (ret); 1074 } 1075 1076 vha = qla24xx_create_vhost(fc_vport); 1077 if (vha == NULL) { 1078 DEBUG15(printk ("qla24xx_create_vhost failed, vha = %p\n", 1079 vha)); 1080 return FC_VPORT_FAILED; 1081 } 1082 if (disable) { 1083 atomic_set(&vha->vp_state, VP_OFFLINE); 1084 fc_vport_set_state(fc_vport, FC_VPORT_DISABLED); 1085 } else 1086 atomic_set(&vha->vp_state, VP_FAILED); 1087 1088 /* ready to create vport */ 1089 qla_printk(KERN_INFO, vha, "VP entry id %d assigned.\n", vha->vp_idx); 1090 1091 /* initialized vport states */ 1092 atomic_set(&vha->loop_state, LOOP_DOWN); 1093 vha->vp_err_state= VP_ERR_PORTDWN; 1094 vha->vp_prev_err_state= VP_ERR_UNKWN; 1095 /* Check if physical ha port is Up */ 1096 if (atomic_read(&ha->loop_state) == LOOP_DOWN || 1097 atomic_read(&ha->loop_state) == LOOP_DEAD) { 1098 /* Don't retry or attempt login of this virtual port */ 1099 DEBUG15(printk ("scsi(%ld): pport loop_state is not UP.\n", 1100 vha->host_no)); 1101 atomic_set(&vha->loop_state, LOOP_DEAD); 1102 if (!disable) 1103 fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN); 1104 } 1105 1106 if (scsi_add_host(vha->host, &fc_vport->dev)) { 1107 DEBUG15(printk("scsi(%ld): scsi_add_host failure for VP[%d].\n", 1108 vha->host_no, vha->vp_idx)); 1109 goto vport_create_failed_2; 1110 } 1111 1112 /* initialize attributes */ 1113 fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name); 1114 fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name); 1115 fc_host_supported_classes(vha->host) = 1116 fc_host_supported_classes(ha->host); 1117 fc_host_supported_speeds(vha->host) = 1118 fc_host_supported_speeds(ha->host); 1119 1120 qla24xx_vport_disable(fc_vport, disable); 1121 1122 return 0; 1123 vport_create_failed_2: 1124 qla24xx_disable_vp(vha); 1125 qla24xx_deallocate_vp_id(vha); 1126 kfree(vha->port_name); 1127 kfree(vha->node_name); 1128 scsi_host_put(vha->host); 1129 return FC_VPORT_FAILED; 1130 } 1131 1132 static int 1133 qla24xx_vport_delete(struct fc_vport *fc_vport) 1134 { 1135 scsi_qla_host_t *ha = shost_priv(fc_vport->shost); 1136 scsi_qla_host_t *vha = fc_vport->dd_data; 1137 1138 qla24xx_disable_vp(vha); 1139 qla24xx_deallocate_vp_id(vha); 1140 1141 down(&ha->vport_sem); 1142 ha->cur_vport_count--; 1143 clear_bit(vha->vp_idx, ha->vp_idx_map); 1144 up(&ha->vport_sem); 1145 1146 kfree(vha->node_name); 1147 kfree(vha->port_name); 1148 1149 if (vha->timer_active) { 1150 qla2x00_vp_stop_timer(vha); 1151 DEBUG15(printk ("scsi(%ld): timer for the vport[%d] = %p " 1152 "has stopped\n", 1153 vha->host_no, vha->vp_idx, vha)); 1154 } 1155 1156 fc_remove_host(vha->host); 1157 1158 scsi_remove_host(vha->host); 1159 1160 scsi_host_put(vha->host); 1161 1162 return 0; 1163 } 1164 1165 static int 1166 qla24xx_vport_disable(struct fc_vport *fc_vport, bool disable) 1167 { 1168 scsi_qla_host_t *vha = fc_vport->dd_data; 1169 1170 if (disable) 1171 qla24xx_disable_vp(vha); 1172 else 1173 qla24xx_enable_vp(vha); 1174 1175 return 0; 1176 } 1177 1178 struct fc_function_template qla2xxx_transport_functions = { 1179 1180 .show_host_node_name = 1, 1181 .show_host_port_name = 1, 1182 .show_host_supported_classes = 1, 1183 1184 .get_host_port_id = qla2x00_get_host_port_id, 1185 .show_host_port_id = 1, 1186 .get_host_speed = qla2x00_get_host_speed, 1187 .show_host_speed = 1, 1188 .get_host_port_type = qla2x00_get_host_port_type, 1189 .show_host_port_type = 1, 1190 .get_host_symbolic_name = qla2x00_get_host_symbolic_name, 1191 .show_host_symbolic_name = 1, 1192 .set_host_system_hostname = qla2x00_set_host_system_hostname, 1193 .show_host_system_hostname = 1, 1194 .get_host_fabric_name = qla2x00_get_host_fabric_name, 1195 .show_host_fabric_name = 1, 1196 .get_host_port_state = qla2x00_get_host_port_state, 1197 .show_host_port_state = 1, 1198 1199 .dd_fcrport_size = sizeof(struct fc_port *), 1200 .show_rport_supported_classes = 1, 1201 1202 .get_starget_node_name = qla2x00_get_starget_node_name, 1203 .show_starget_node_name = 1, 1204 .get_starget_port_name = qla2x00_get_starget_port_name, 1205 .show_starget_port_name = 1, 1206 .get_starget_port_id = qla2x00_get_starget_port_id, 1207 .show_starget_port_id = 1, 1208 1209 .get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo, 1210 .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, 1211 .show_rport_dev_loss_tmo = 1, 1212 1213 .issue_fc_host_lip = qla2x00_issue_lip, 1214 .get_fc_host_stats = qla2x00_get_fc_host_stats, 1215 1216 .vport_create = qla24xx_vport_create, 1217 .vport_disable = qla24xx_vport_disable, 1218 .vport_delete = qla24xx_vport_delete, 1219 }; 1220 1221 struct fc_function_template qla2xxx_transport_vport_functions = { 1222 1223 .show_host_node_name = 1, 1224 .show_host_port_name = 1, 1225 .show_host_supported_classes = 1, 1226 1227 .get_host_port_id = qla2x00_get_host_port_id, 1228 .show_host_port_id = 1, 1229 .get_host_speed = qla2x00_get_host_speed, 1230 .show_host_speed = 1, 1231 .get_host_port_type = qla2x00_get_host_port_type, 1232 .show_host_port_type = 1, 1233 .get_host_symbolic_name = qla2x00_get_host_symbolic_name, 1234 .show_host_symbolic_name = 1, 1235 .set_host_system_hostname = qla2x00_set_host_system_hostname, 1236 .show_host_system_hostname = 1, 1237 .get_host_fabric_name = qla2x00_get_host_fabric_name, 1238 .show_host_fabric_name = 1, 1239 .get_host_port_state = qla2x00_get_host_port_state, 1240 .show_host_port_state = 1, 1241 1242 .dd_fcrport_size = sizeof(struct fc_port *), 1243 .show_rport_supported_classes = 1, 1244 1245 .get_starget_node_name = qla2x00_get_starget_node_name, 1246 .show_starget_node_name = 1, 1247 .get_starget_port_name = qla2x00_get_starget_port_name, 1248 .show_starget_port_name = 1, 1249 .get_starget_port_id = qla2x00_get_starget_port_id, 1250 .show_starget_port_id = 1, 1251 1252 .get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo, 1253 .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, 1254 .show_rport_dev_loss_tmo = 1, 1255 1256 .issue_fc_host_lip = qla2x00_issue_lip, 1257 .get_fc_host_stats = qla2x00_get_fc_host_stats, 1258 }; 1259 1260 void 1261 qla2x00_init_host_attr(scsi_qla_host_t *ha) 1262 { 1263 fc_host_node_name(ha->host) = wwn_to_u64(ha->node_name); 1264 fc_host_port_name(ha->host) = wwn_to_u64(ha->port_name); 1265 fc_host_supported_classes(ha->host) = FC_COS_CLASS3; 1266 fc_host_max_npiv_vports(ha->host) = ha->max_npiv_vports;; 1267 fc_host_npiv_vports_inuse(ha->host) = ha->cur_vport_count; 1268 } 1269