1 /* 2 * QLogic Fibre Channel HBA Driver 3 * Copyright (c) 2003-2013 QLogic Corporation 4 * 5 * See LICENSE.qla2xxx for copyright and licensing details. 6 */ 7 #include "qla_def.h" 8 #include "qla_target.h" 9 10 #include <linux/kthread.h> 11 #include <linux/vmalloc.h> 12 #include <linux/slab.h> 13 #include <linux/delay.h> 14 15 static int qla24xx_vport_disable(struct fc_vport *, bool); 16 17 /* SYSFS attributes --------------------------------------------------------- */ 18 19 static ssize_t 20 qla2x00_sysfs_read_fw_dump(struct file *filp, struct kobject *kobj, 21 struct bin_attribute *bin_attr, 22 char *buf, loff_t off, size_t count) 23 { 24 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 25 struct device, kobj))); 26 struct qla_hw_data *ha = vha->hw; 27 int rval = 0; 28 29 if (!(ha->fw_dump_reading || ha->mctp_dump_reading)) 30 return 0; 31 32 if (IS_P3P_TYPE(ha)) { 33 if (off < ha->md_template_size) { 34 rval = memory_read_from_buffer(buf, count, 35 &off, ha->md_tmplt_hdr, ha->md_template_size); 36 return rval; 37 } 38 off -= ha->md_template_size; 39 rval = memory_read_from_buffer(buf, count, 40 &off, ha->md_dump, ha->md_dump_size); 41 return rval; 42 } else if (ha->mctp_dumped && ha->mctp_dump_reading) 43 return memory_read_from_buffer(buf, count, &off, ha->mctp_dump, 44 MCTP_DUMP_SIZE); 45 else if (ha->fw_dump_reading) 46 return memory_read_from_buffer(buf, count, &off, ha->fw_dump, 47 ha->fw_dump_len); 48 else 49 return 0; 50 } 51 52 static ssize_t 53 qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj, 54 struct bin_attribute *bin_attr, 55 char *buf, loff_t off, size_t count) 56 { 57 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 58 struct device, kobj))); 59 struct qla_hw_data *ha = vha->hw; 60 int reading; 61 62 if (off != 0) 63 return (0); 64 65 reading = simple_strtol(buf, NULL, 10); 66 switch (reading) { 67 case 0: 68 if (!ha->fw_dump_reading) 69 break; 70 71 ql_log(ql_log_info, vha, 0x705d, 72 "Firmware dump cleared on (%ld).\n", vha->host_no); 73 74 if (IS_P3P_TYPE(ha)) { 75 qla82xx_md_free(vha); 76 qla82xx_md_prep(vha); 77 } 78 ha->fw_dump_reading = 0; 79 ha->fw_dumped = 0; 80 break; 81 case 1: 82 if (ha->fw_dumped && !ha->fw_dump_reading) { 83 ha->fw_dump_reading = 1; 84 85 ql_log(ql_log_info, vha, 0x705e, 86 "Raw firmware dump ready for read on (%ld).\n", 87 vha->host_no); 88 } 89 break; 90 case 2: 91 qla2x00_alloc_fw_dump(vha); 92 break; 93 case 3: 94 if (IS_QLA82XX(ha)) { 95 qla82xx_idc_lock(ha); 96 qla82xx_set_reset_owner(vha); 97 qla82xx_idc_unlock(ha); 98 } else if (IS_QLA8044(ha)) { 99 qla8044_idc_lock(ha); 100 qla82xx_set_reset_owner(vha); 101 qla8044_idc_unlock(ha); 102 } else 103 qla2x00_system_error(vha); 104 break; 105 case 4: 106 if (IS_P3P_TYPE(ha)) { 107 if (ha->md_tmplt_hdr) 108 ql_dbg(ql_dbg_user, vha, 0x705b, 109 "MiniDump supported with this firmware.\n"); 110 else 111 ql_dbg(ql_dbg_user, vha, 0x709d, 112 "MiniDump not supported with this firmware.\n"); 113 } 114 break; 115 case 5: 116 if (IS_P3P_TYPE(ha)) 117 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 118 break; 119 case 6: 120 if (!ha->mctp_dump_reading) 121 break; 122 ql_log(ql_log_info, vha, 0x70c1, 123 "MCTP dump cleared on (%ld).\n", vha->host_no); 124 ha->mctp_dump_reading = 0; 125 ha->mctp_dumped = 0; 126 break; 127 case 7: 128 if (ha->mctp_dumped && !ha->mctp_dump_reading) { 129 ha->mctp_dump_reading = 1; 130 ql_log(ql_log_info, vha, 0x70c2, 131 "Raw mctp dump ready for read on (%ld).\n", 132 vha->host_no); 133 } 134 break; 135 } 136 return count; 137 } 138 139 static struct bin_attribute sysfs_fw_dump_attr = { 140 .attr = { 141 .name = "fw_dump", 142 .mode = S_IRUSR | S_IWUSR, 143 }, 144 .size = 0, 145 .read = qla2x00_sysfs_read_fw_dump, 146 .write = qla2x00_sysfs_write_fw_dump, 147 }; 148 149 static ssize_t 150 qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj, 151 struct bin_attribute *bin_attr, 152 char *buf, loff_t off, size_t count) 153 { 154 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 155 struct device, kobj))); 156 struct qla_hw_data *ha = vha->hw; 157 158 if (!capable(CAP_SYS_ADMIN)) 159 return 0; 160 161 if (IS_NOCACHE_VPD_TYPE(ha)) 162 ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram << 2, 163 ha->nvram_size); 164 return memory_read_from_buffer(buf, count, &off, ha->nvram, 165 ha->nvram_size); 166 } 167 168 static ssize_t 169 qla2x00_sysfs_write_nvram(struct file *filp, struct kobject *kobj, 170 struct bin_attribute *bin_attr, 171 char *buf, loff_t off, size_t count) 172 { 173 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 174 struct device, kobj))); 175 struct qla_hw_data *ha = vha->hw; 176 uint16_t cnt; 177 178 if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size || 179 !ha->isp_ops->write_nvram) 180 return -EINVAL; 181 182 /* Checksum NVRAM. */ 183 if (IS_FWI2_CAPABLE(ha)) { 184 uint32_t *iter; 185 uint32_t chksum; 186 187 iter = (uint32_t *)buf; 188 chksum = 0; 189 for (cnt = 0; cnt < ((count >> 2) - 1); cnt++) 190 chksum += le32_to_cpu(*iter++); 191 chksum = ~chksum + 1; 192 *iter = cpu_to_le32(chksum); 193 } else { 194 uint8_t *iter; 195 uint8_t chksum; 196 197 iter = (uint8_t *)buf; 198 chksum = 0; 199 for (cnt = 0; cnt < count - 1; cnt++) 200 chksum += *iter++; 201 chksum = ~chksum + 1; 202 *iter = chksum; 203 } 204 205 if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) { 206 ql_log(ql_log_warn, vha, 0x705f, 207 "HBA not online, failing NVRAM update.\n"); 208 return -EAGAIN; 209 } 210 211 /* Write NVRAM. */ 212 ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->nvram_base, count); 213 ha->isp_ops->read_nvram(vha, (uint8_t *)ha->nvram, ha->nvram_base, 214 count); 215 216 ql_dbg(ql_dbg_user, vha, 0x7060, 217 "Setting ISP_ABORT_NEEDED\n"); 218 /* NVRAM settings take effect immediately. */ 219 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 220 qla2xxx_wake_dpc(vha); 221 qla2x00_wait_for_chip_reset(vha); 222 223 return count; 224 } 225 226 static struct bin_attribute sysfs_nvram_attr = { 227 .attr = { 228 .name = "nvram", 229 .mode = S_IRUSR | S_IWUSR, 230 }, 231 .size = 512, 232 .read = qla2x00_sysfs_read_nvram, 233 .write = qla2x00_sysfs_write_nvram, 234 }; 235 236 static ssize_t 237 qla2x00_sysfs_read_optrom(struct file *filp, struct kobject *kobj, 238 struct bin_attribute *bin_attr, 239 char *buf, loff_t off, size_t count) 240 { 241 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 242 struct device, kobj))); 243 struct qla_hw_data *ha = vha->hw; 244 245 if (ha->optrom_state != QLA_SREADING) 246 return 0; 247 248 return memory_read_from_buffer(buf, count, &off, ha->optrom_buffer, 249 ha->optrom_region_size); 250 } 251 252 static ssize_t 253 qla2x00_sysfs_write_optrom(struct file *filp, struct kobject *kobj, 254 struct bin_attribute *bin_attr, 255 char *buf, loff_t off, size_t count) 256 { 257 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 258 struct device, kobj))); 259 struct qla_hw_data *ha = vha->hw; 260 261 if (ha->optrom_state != QLA_SWRITING) 262 return -EINVAL; 263 if (off > ha->optrom_region_size) 264 return -ERANGE; 265 if (off + count > ha->optrom_region_size) 266 count = ha->optrom_region_size - off; 267 268 memcpy(&ha->optrom_buffer[off], buf, count); 269 270 return count; 271 } 272 273 static struct bin_attribute sysfs_optrom_attr = { 274 .attr = { 275 .name = "optrom", 276 .mode = S_IRUSR | S_IWUSR, 277 }, 278 .size = 0, 279 .read = qla2x00_sysfs_read_optrom, 280 .write = qla2x00_sysfs_write_optrom, 281 }; 282 283 static ssize_t 284 qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, 285 struct bin_attribute *bin_attr, 286 char *buf, loff_t off, size_t count) 287 { 288 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 289 struct device, kobj))); 290 struct qla_hw_data *ha = vha->hw; 291 292 uint32_t start = 0; 293 uint32_t size = ha->optrom_size; 294 int val, valid; 295 296 if (off) 297 return -EINVAL; 298 299 if (unlikely(pci_channel_offline(ha->pdev))) 300 return -EAGAIN; 301 302 if (sscanf(buf, "%d:%x:%x", &val, &start, &size) < 1) 303 return -EINVAL; 304 if (start > ha->optrom_size) 305 return -EINVAL; 306 307 switch (val) { 308 case 0: 309 if (ha->optrom_state != QLA_SREADING && 310 ha->optrom_state != QLA_SWRITING) 311 return -EINVAL; 312 313 ha->optrom_state = QLA_SWAITING; 314 315 ql_dbg(ql_dbg_user, vha, 0x7061, 316 "Freeing flash region allocation -- 0x%x bytes.\n", 317 ha->optrom_region_size); 318 319 vfree(ha->optrom_buffer); 320 ha->optrom_buffer = NULL; 321 break; 322 case 1: 323 if (ha->optrom_state != QLA_SWAITING) 324 return -EINVAL; 325 326 ha->optrom_region_start = start; 327 ha->optrom_region_size = start + size > ha->optrom_size ? 328 ha->optrom_size - start : size; 329 330 ha->optrom_state = QLA_SREADING; 331 ha->optrom_buffer = vmalloc(ha->optrom_region_size); 332 if (ha->optrom_buffer == NULL) { 333 ql_log(ql_log_warn, vha, 0x7062, 334 "Unable to allocate memory for optrom retrieval " 335 "(%x).\n", ha->optrom_region_size); 336 337 ha->optrom_state = QLA_SWAITING; 338 return -ENOMEM; 339 } 340 341 if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) { 342 ql_log(ql_log_warn, vha, 0x7063, 343 "HBA not online, failing NVRAM update.\n"); 344 return -EAGAIN; 345 } 346 347 ql_dbg(ql_dbg_user, vha, 0x7064, 348 "Reading flash region -- 0x%x/0x%x.\n", 349 ha->optrom_region_start, ha->optrom_region_size); 350 351 memset(ha->optrom_buffer, 0, ha->optrom_region_size); 352 ha->isp_ops->read_optrom(vha, ha->optrom_buffer, 353 ha->optrom_region_start, ha->optrom_region_size); 354 break; 355 case 2: 356 if (ha->optrom_state != QLA_SWAITING) 357 return -EINVAL; 358 359 /* 360 * We need to be more restrictive on which FLASH regions are 361 * allowed to be updated via user-space. Regions accessible 362 * via this method include: 363 * 364 * ISP21xx/ISP22xx/ISP23xx type boards: 365 * 366 * 0x000000 -> 0x020000 -- Boot code. 367 * 368 * ISP2322/ISP24xx type boards: 369 * 370 * 0x000000 -> 0x07ffff -- Boot code. 371 * 0x080000 -> 0x0fffff -- Firmware. 372 * 373 * ISP25xx type boards: 374 * 375 * 0x000000 -> 0x07ffff -- Boot code. 376 * 0x080000 -> 0x0fffff -- Firmware. 377 * 0x120000 -> 0x12ffff -- VPD and HBA parameters. 378 */ 379 valid = 0; 380 if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0) 381 valid = 1; 382 else if (start == (ha->flt_region_boot * 4) || 383 start == (ha->flt_region_fw * 4)) 384 valid = 1; 385 else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) 386 || IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) 387 valid = 1; 388 if (!valid) { 389 ql_log(ql_log_warn, vha, 0x7065, 390 "Invalid start region 0x%x/0x%x.\n", start, size); 391 return -EINVAL; 392 } 393 394 ha->optrom_region_start = start; 395 ha->optrom_region_size = start + size > ha->optrom_size ? 396 ha->optrom_size - start : size; 397 398 ha->optrom_state = QLA_SWRITING; 399 ha->optrom_buffer = vmalloc(ha->optrom_region_size); 400 if (ha->optrom_buffer == NULL) { 401 ql_log(ql_log_warn, vha, 0x7066, 402 "Unable to allocate memory for optrom update " 403 "(%x)\n", ha->optrom_region_size); 404 405 ha->optrom_state = QLA_SWAITING; 406 return -ENOMEM; 407 } 408 409 ql_dbg(ql_dbg_user, vha, 0x7067, 410 "Staging flash region write -- 0x%x/0x%x.\n", 411 ha->optrom_region_start, ha->optrom_region_size); 412 413 memset(ha->optrom_buffer, 0, ha->optrom_region_size); 414 break; 415 case 3: 416 if (ha->optrom_state != QLA_SWRITING) 417 return -EINVAL; 418 419 if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) { 420 ql_log(ql_log_warn, vha, 0x7068, 421 "HBA not online, failing flash update.\n"); 422 return -EAGAIN; 423 } 424 425 ql_dbg(ql_dbg_user, vha, 0x7069, 426 "Writing flash region -- 0x%x/0x%x.\n", 427 ha->optrom_region_start, ha->optrom_region_size); 428 429 ha->isp_ops->write_optrom(vha, ha->optrom_buffer, 430 ha->optrom_region_start, ha->optrom_region_size); 431 break; 432 default: 433 return -EINVAL; 434 } 435 return count; 436 } 437 438 static struct bin_attribute sysfs_optrom_ctl_attr = { 439 .attr = { 440 .name = "optrom_ctl", 441 .mode = S_IWUSR, 442 }, 443 .size = 0, 444 .write = qla2x00_sysfs_write_optrom_ctl, 445 }; 446 447 static ssize_t 448 qla2x00_sysfs_read_vpd(struct file *filp, struct kobject *kobj, 449 struct bin_attribute *bin_attr, 450 char *buf, loff_t off, size_t count) 451 { 452 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 453 struct device, kobj))); 454 struct qla_hw_data *ha = vha->hw; 455 456 if (unlikely(pci_channel_offline(ha->pdev))) 457 return -EAGAIN; 458 459 if (!capable(CAP_SYS_ADMIN)) 460 return -EINVAL; 461 462 if (IS_NOCACHE_VPD_TYPE(ha)) 463 ha->isp_ops->read_optrom(vha, ha->vpd, ha->flt_region_vpd << 2, 464 ha->vpd_size); 465 return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size); 466 } 467 468 static ssize_t 469 qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj, 470 struct bin_attribute *bin_attr, 471 char *buf, loff_t off, size_t count) 472 { 473 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 474 struct device, kobj))); 475 struct qla_hw_data *ha = vha->hw; 476 uint8_t *tmp_data; 477 478 if (unlikely(pci_channel_offline(ha->pdev))) 479 return 0; 480 481 if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size || 482 !ha->isp_ops->write_nvram) 483 return 0; 484 485 if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) { 486 ql_log(ql_log_warn, vha, 0x706a, 487 "HBA not online, failing VPD update.\n"); 488 return -EAGAIN; 489 } 490 491 /* Write NVRAM. */ 492 ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->vpd_base, count); 493 ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, ha->vpd_base, count); 494 495 /* Update flash version information for 4Gb & above. */ 496 if (!IS_FWI2_CAPABLE(ha)) 497 return -EINVAL; 498 499 tmp_data = vmalloc(256); 500 if (!tmp_data) { 501 ql_log(ql_log_warn, vha, 0x706b, 502 "Unable to allocate memory for VPD information update.\n"); 503 return -ENOMEM; 504 } 505 ha->isp_ops->get_flash_version(vha, tmp_data); 506 vfree(tmp_data); 507 508 return count; 509 } 510 511 static struct bin_attribute sysfs_vpd_attr = { 512 .attr = { 513 .name = "vpd", 514 .mode = S_IRUSR | S_IWUSR, 515 }, 516 .size = 0, 517 .read = qla2x00_sysfs_read_vpd, 518 .write = qla2x00_sysfs_write_vpd, 519 }; 520 521 static ssize_t 522 qla2x00_sysfs_read_sfp(struct file *filp, struct kobject *kobj, 523 struct bin_attribute *bin_attr, 524 char *buf, loff_t off, size_t count) 525 { 526 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 527 struct device, kobj))); 528 struct qla_hw_data *ha = vha->hw; 529 uint16_t iter, addr, offset; 530 int rval; 531 532 if (!capable(CAP_SYS_ADMIN) || off != 0 || count != SFP_DEV_SIZE * 2) 533 return 0; 534 535 if (ha->sfp_data) 536 goto do_read; 537 538 ha->sfp_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, 539 &ha->sfp_data_dma); 540 if (!ha->sfp_data) { 541 ql_log(ql_log_warn, vha, 0x706c, 542 "Unable to allocate memory for SFP read-data.\n"); 543 return 0; 544 } 545 546 do_read: 547 memset(ha->sfp_data, 0, SFP_BLOCK_SIZE); 548 addr = 0xa0; 549 for (iter = 0, offset = 0; iter < (SFP_DEV_SIZE * 2) / SFP_BLOCK_SIZE; 550 iter++, offset += SFP_BLOCK_SIZE) { 551 if (iter == 4) { 552 /* Skip to next device address. */ 553 addr = 0xa2; 554 offset = 0; 555 } 556 557 rval = qla2x00_read_sfp(vha, ha->sfp_data_dma, ha->sfp_data, 558 addr, offset, SFP_BLOCK_SIZE, 0); 559 if (rval != QLA_SUCCESS) { 560 ql_log(ql_log_warn, vha, 0x706d, 561 "Unable to read SFP data (%x/%x/%x).\n", rval, 562 addr, offset); 563 564 return -EIO; 565 } 566 memcpy(buf, ha->sfp_data, SFP_BLOCK_SIZE); 567 buf += SFP_BLOCK_SIZE; 568 } 569 570 return count; 571 } 572 573 static struct bin_attribute sysfs_sfp_attr = { 574 .attr = { 575 .name = "sfp", 576 .mode = S_IRUSR | S_IWUSR, 577 }, 578 .size = SFP_DEV_SIZE * 2, 579 .read = qla2x00_sysfs_read_sfp, 580 }; 581 582 static ssize_t 583 qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj, 584 struct bin_attribute *bin_attr, 585 char *buf, loff_t off, size_t count) 586 { 587 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 588 struct device, kobj))); 589 struct qla_hw_data *ha = vha->hw; 590 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); 591 int type; 592 uint32_t idc_control; 593 uint8_t *tmp_data = NULL; 594 if (off != 0) 595 return -EINVAL; 596 597 type = simple_strtol(buf, NULL, 10); 598 switch (type) { 599 case 0x2025c: 600 ql_log(ql_log_info, vha, 0x706e, 601 "Issuing ISP reset.\n"); 602 603 scsi_block_requests(vha->host); 604 if (IS_QLA82XX(ha)) { 605 ha->flags.isp82xx_no_md_cap = 1; 606 qla82xx_idc_lock(ha); 607 qla82xx_set_reset_owner(vha); 608 qla82xx_idc_unlock(ha); 609 } else if (IS_QLA8044(ha)) { 610 qla8044_idc_lock(ha); 611 idc_control = qla8044_rd_reg(ha, 612 QLA8044_IDC_DRV_CTRL); 613 qla8044_wr_reg(ha, QLA8044_IDC_DRV_CTRL, 614 (idc_control | GRACEFUL_RESET_BIT1)); 615 qla82xx_set_reset_owner(vha); 616 qla8044_idc_unlock(ha); 617 } else { 618 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 619 qla2xxx_wake_dpc(vha); 620 } 621 qla2x00_wait_for_chip_reset(vha); 622 scsi_unblock_requests(vha->host); 623 break; 624 case 0x2025d: 625 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) 626 return -EPERM; 627 628 ql_log(ql_log_info, vha, 0x706f, 629 "Issuing MPI reset.\n"); 630 631 if (IS_QLA83XX(ha)) { 632 uint32_t idc_control; 633 634 qla83xx_idc_lock(vha, 0); 635 __qla83xx_get_idc_control(vha, &idc_control); 636 idc_control |= QLA83XX_IDC_GRACEFUL_RESET; 637 __qla83xx_set_idc_control(vha, idc_control); 638 qla83xx_wr_reg(vha, QLA83XX_IDC_DEV_STATE, 639 QLA8XXX_DEV_NEED_RESET); 640 qla83xx_idc_audit(vha, IDC_AUDIT_TIMESTAMP); 641 qla83xx_idc_unlock(vha, 0); 642 break; 643 } else { 644 /* Make sure FC side is not in reset */ 645 qla2x00_wait_for_hba_online(vha); 646 647 /* Issue MPI reset */ 648 scsi_block_requests(vha->host); 649 if (qla81xx_restart_mpi_firmware(vha) != QLA_SUCCESS) 650 ql_log(ql_log_warn, vha, 0x7070, 651 "MPI reset failed.\n"); 652 scsi_unblock_requests(vha->host); 653 break; 654 } 655 case 0x2025e: 656 if (!IS_P3P_TYPE(ha) || vha != base_vha) { 657 ql_log(ql_log_info, vha, 0x7071, 658 "FCoE ctx reset no supported.\n"); 659 return -EPERM; 660 } 661 662 ql_log(ql_log_info, vha, 0x7072, 663 "Issuing FCoE ctx reset.\n"); 664 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); 665 qla2xxx_wake_dpc(vha); 666 qla2x00_wait_for_fcoe_ctx_reset(vha); 667 break; 668 case 0x2025f: 669 if (!IS_QLA8031(ha)) 670 return -EPERM; 671 ql_log(ql_log_info, vha, 0x70bc, 672 "Disabling Reset by IDC control\n"); 673 qla83xx_idc_lock(vha, 0); 674 __qla83xx_get_idc_control(vha, &idc_control); 675 idc_control |= QLA83XX_IDC_RESET_DISABLED; 676 __qla83xx_set_idc_control(vha, idc_control); 677 qla83xx_idc_unlock(vha, 0); 678 break; 679 case 0x20260: 680 if (!IS_QLA8031(ha)) 681 return -EPERM; 682 ql_log(ql_log_info, vha, 0x70bd, 683 "Enabling Reset by IDC control\n"); 684 qla83xx_idc_lock(vha, 0); 685 __qla83xx_get_idc_control(vha, &idc_control); 686 idc_control &= ~QLA83XX_IDC_RESET_DISABLED; 687 __qla83xx_set_idc_control(vha, idc_control); 688 qla83xx_idc_unlock(vha, 0); 689 break; 690 case 0x20261: 691 ql_dbg(ql_dbg_user, vha, 0x70e0, 692 "Updating cache versions without reset "); 693 694 tmp_data = vmalloc(256); 695 if (!tmp_data) { 696 ql_log(ql_log_warn, vha, 0x70e1, 697 "Unable to allocate memory for VPD information update.\n"); 698 return -ENOMEM; 699 } 700 ha->isp_ops->get_flash_version(vha, tmp_data); 701 vfree(tmp_data); 702 break; 703 } 704 return count; 705 } 706 707 static struct bin_attribute sysfs_reset_attr = { 708 .attr = { 709 .name = "reset", 710 .mode = S_IWUSR, 711 }, 712 .size = 0, 713 .write = qla2x00_sysfs_write_reset, 714 }; 715 716 static ssize_t 717 qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, 718 struct bin_attribute *bin_attr, 719 char *buf, loff_t off, size_t count) 720 { 721 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 722 struct device, kobj))); 723 struct qla_hw_data *ha = vha->hw; 724 int rval; 725 uint16_t actual_size; 726 727 if (!capable(CAP_SYS_ADMIN) || off != 0 || count > XGMAC_DATA_SIZE) 728 return 0; 729 730 if (ha->xgmac_data) 731 goto do_read; 732 733 ha->xgmac_data = dma_alloc_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE, 734 &ha->xgmac_data_dma, GFP_KERNEL); 735 if (!ha->xgmac_data) { 736 ql_log(ql_log_warn, vha, 0x7076, 737 "Unable to allocate memory for XGMAC read-data.\n"); 738 return 0; 739 } 740 741 do_read: 742 actual_size = 0; 743 memset(ha->xgmac_data, 0, XGMAC_DATA_SIZE); 744 745 rval = qla2x00_get_xgmac_stats(vha, ha->xgmac_data_dma, 746 XGMAC_DATA_SIZE, &actual_size); 747 if (rval != QLA_SUCCESS) { 748 ql_log(ql_log_warn, vha, 0x7077, 749 "Unable to read XGMAC data (%x).\n", rval); 750 count = 0; 751 } 752 753 count = actual_size > count ? count: actual_size; 754 memcpy(buf, ha->xgmac_data, count); 755 756 return count; 757 } 758 759 static struct bin_attribute sysfs_xgmac_stats_attr = { 760 .attr = { 761 .name = "xgmac_stats", 762 .mode = S_IRUSR, 763 }, 764 .size = 0, 765 .read = qla2x00_sysfs_read_xgmac_stats, 766 }; 767 768 static ssize_t 769 qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj, 770 struct bin_attribute *bin_attr, 771 char *buf, loff_t off, size_t count) 772 { 773 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, 774 struct device, kobj))); 775 struct qla_hw_data *ha = vha->hw; 776 int rval; 777 uint16_t actual_size; 778 779 if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE) 780 return 0; 781 782 if (ha->dcbx_tlv) 783 goto do_read; 784 785 ha->dcbx_tlv = dma_alloc_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, 786 &ha->dcbx_tlv_dma, GFP_KERNEL); 787 if (!ha->dcbx_tlv) { 788 ql_log(ql_log_warn, vha, 0x7078, 789 "Unable to allocate memory for DCBX TLV read-data.\n"); 790 return -ENOMEM; 791 } 792 793 do_read: 794 actual_size = 0; 795 memset(ha->dcbx_tlv, 0, DCBX_TLV_DATA_SIZE); 796 797 rval = qla2x00_get_dcbx_params(vha, ha->dcbx_tlv_dma, 798 DCBX_TLV_DATA_SIZE); 799 if (rval != QLA_SUCCESS) { 800 ql_log(ql_log_warn, vha, 0x7079, 801 "Unable to read DCBX TLV (%x).\n", rval); 802 return -EIO; 803 } 804 805 memcpy(buf, ha->dcbx_tlv, count); 806 807 return count; 808 } 809 810 static struct bin_attribute sysfs_dcbx_tlv_attr = { 811 .attr = { 812 .name = "dcbx_tlv", 813 .mode = S_IRUSR, 814 }, 815 .size = 0, 816 .read = qla2x00_sysfs_read_dcbx_tlv, 817 }; 818 819 static struct sysfs_entry { 820 char *name; 821 struct bin_attribute *attr; 822 int is4GBp_only; 823 } bin_file_entries[] = { 824 { "fw_dump", &sysfs_fw_dump_attr, }, 825 { "nvram", &sysfs_nvram_attr, }, 826 { "optrom", &sysfs_optrom_attr, }, 827 { "optrom_ctl", &sysfs_optrom_ctl_attr, }, 828 { "vpd", &sysfs_vpd_attr, 1 }, 829 { "sfp", &sysfs_sfp_attr, 1 }, 830 { "reset", &sysfs_reset_attr, }, 831 { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 }, 832 { "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 }, 833 { NULL }, 834 }; 835 836 void 837 qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha) 838 { 839 struct Scsi_Host *host = vha->host; 840 struct sysfs_entry *iter; 841 int ret; 842 843 for (iter = bin_file_entries; iter->name; iter++) { 844 if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw)) 845 continue; 846 if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw)) 847 continue; 848 if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw))) 849 continue; 850 851 ret = sysfs_create_bin_file(&host->shost_gendev.kobj, 852 iter->attr); 853 if (ret) 854 ql_log(ql_log_warn, vha, 0x00f3, 855 "Unable to create sysfs %s binary attribute (%d).\n", 856 iter->name, ret); 857 else 858 ql_dbg(ql_dbg_init, vha, 0x00f4, 859 "Successfully created sysfs %s binary attribure.\n", 860 iter->name); 861 } 862 } 863 864 void 865 qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool stop_beacon) 866 { 867 struct Scsi_Host *host = vha->host; 868 struct sysfs_entry *iter; 869 struct qla_hw_data *ha = vha->hw; 870 871 for (iter = bin_file_entries; iter->name; iter++) { 872 if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha)) 873 continue; 874 if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha)) 875 continue; 876 if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw))) 877 continue; 878 879 sysfs_remove_bin_file(&host->shost_gendev.kobj, 880 iter->attr); 881 } 882 883 if (stop_beacon && ha->beacon_blink_led == 1) 884 ha->isp_ops->beacon_off(vha); 885 } 886 887 /* Scsi_Host attributes. */ 888 889 static ssize_t 890 qla2x00_drvr_version_show(struct device *dev, 891 struct device_attribute *attr, char *buf) 892 { 893 return scnprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str); 894 } 895 896 static ssize_t 897 qla2x00_fw_version_show(struct device *dev, 898 struct device_attribute *attr, char *buf) 899 { 900 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 901 struct qla_hw_data *ha = vha->hw; 902 char fw_str[128]; 903 904 return scnprintf(buf, PAGE_SIZE, "%s\n", 905 ha->isp_ops->fw_version_str(vha, fw_str)); 906 } 907 908 static ssize_t 909 qla2x00_serial_num_show(struct device *dev, struct device_attribute *attr, 910 char *buf) 911 { 912 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 913 struct qla_hw_data *ha = vha->hw; 914 uint32_t sn; 915 916 if (IS_QLAFX00(vha->hw)) { 917 return scnprintf(buf, PAGE_SIZE, "%s\n", 918 vha->hw->mr.serial_num); 919 } else if (IS_FWI2_CAPABLE(ha)) { 920 qla2xxx_get_vpd_field(vha, "SN", buf, PAGE_SIZE - 1); 921 return strlen(strcat(buf, "\n")); 922 } 923 924 sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1; 925 return scnprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000, 926 sn % 100000); 927 } 928 929 static ssize_t 930 qla2x00_isp_name_show(struct device *dev, struct device_attribute *attr, 931 char *buf) 932 { 933 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 934 return scnprintf(buf, PAGE_SIZE, "ISP%04X\n", vha->hw->pdev->device); 935 } 936 937 static ssize_t 938 qla2x00_isp_id_show(struct device *dev, struct device_attribute *attr, 939 char *buf) 940 { 941 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 942 struct qla_hw_data *ha = vha->hw; 943 944 if (IS_QLAFX00(vha->hw)) 945 return scnprintf(buf, PAGE_SIZE, "%s\n", 946 vha->hw->mr.hw_version); 947 948 return scnprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n", 949 ha->product_id[0], ha->product_id[1], ha->product_id[2], 950 ha->product_id[3]); 951 } 952 953 static ssize_t 954 qla2x00_model_name_show(struct device *dev, struct device_attribute *attr, 955 char *buf) 956 { 957 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 958 959 return scnprintf(buf, PAGE_SIZE, "%s\n", vha->hw->model_number); 960 } 961 962 static ssize_t 963 qla2x00_model_desc_show(struct device *dev, struct device_attribute *attr, 964 char *buf) 965 { 966 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 967 return scnprintf(buf, PAGE_SIZE, "%s\n", 968 vha->hw->model_desc ? vha->hw->model_desc : ""); 969 } 970 971 static ssize_t 972 qla2x00_pci_info_show(struct device *dev, struct device_attribute *attr, 973 char *buf) 974 { 975 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 976 char pci_info[30]; 977 978 return scnprintf(buf, PAGE_SIZE, "%s\n", 979 vha->hw->isp_ops->pci_info_str(vha, pci_info)); 980 } 981 982 static ssize_t 983 qla2x00_link_state_show(struct device *dev, struct device_attribute *attr, 984 char *buf) 985 { 986 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 987 struct qla_hw_data *ha = vha->hw; 988 int len = 0; 989 990 if (atomic_read(&vha->loop_state) == LOOP_DOWN || 991 atomic_read(&vha->loop_state) == LOOP_DEAD || 992 vha->device_flags & DFLG_NO_CABLE) 993 len = scnprintf(buf, PAGE_SIZE, "Link Down\n"); 994 else if (atomic_read(&vha->loop_state) != LOOP_READY || 995 qla2x00_reset_active(vha)) 996 len = scnprintf(buf, PAGE_SIZE, "Unknown Link State\n"); 997 else { 998 len = scnprintf(buf, PAGE_SIZE, "Link Up - "); 999 1000 switch (ha->current_topology) { 1001 case ISP_CFG_NL: 1002 len += scnprintf(buf + len, PAGE_SIZE-len, "Loop\n"); 1003 break; 1004 case ISP_CFG_FL: 1005 len += scnprintf(buf + len, PAGE_SIZE-len, "FL_Port\n"); 1006 break; 1007 case ISP_CFG_N: 1008 len += scnprintf(buf + len, PAGE_SIZE-len, 1009 "N_Port to N_Port\n"); 1010 break; 1011 case ISP_CFG_F: 1012 len += scnprintf(buf + len, PAGE_SIZE-len, "F_Port\n"); 1013 break; 1014 default: 1015 len += scnprintf(buf + len, PAGE_SIZE-len, "Loop\n"); 1016 break; 1017 } 1018 } 1019 return len; 1020 } 1021 1022 static ssize_t 1023 qla2x00_zio_show(struct device *dev, struct device_attribute *attr, 1024 char *buf) 1025 { 1026 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1027 int len = 0; 1028 1029 switch (vha->hw->zio_mode) { 1030 case QLA_ZIO_MODE_6: 1031 len += scnprintf(buf + len, PAGE_SIZE-len, "Mode 6\n"); 1032 break; 1033 case QLA_ZIO_DISABLED: 1034 len += scnprintf(buf + len, PAGE_SIZE-len, "Disabled\n"); 1035 break; 1036 } 1037 return len; 1038 } 1039 1040 static ssize_t 1041 qla2x00_zio_store(struct device *dev, struct device_attribute *attr, 1042 const char *buf, size_t count) 1043 { 1044 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1045 struct qla_hw_data *ha = vha->hw; 1046 int val = 0; 1047 uint16_t zio_mode; 1048 1049 if (!IS_ZIO_SUPPORTED(ha)) 1050 return -ENOTSUPP; 1051 1052 if (sscanf(buf, "%d", &val) != 1) 1053 return -EINVAL; 1054 1055 if (val) 1056 zio_mode = QLA_ZIO_MODE_6; 1057 else 1058 zio_mode = QLA_ZIO_DISABLED; 1059 1060 /* Update per-hba values and queue a reset. */ 1061 if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) { 1062 ha->zio_mode = zio_mode; 1063 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 1064 } 1065 return strlen(buf); 1066 } 1067 1068 static ssize_t 1069 qla2x00_zio_timer_show(struct device *dev, struct device_attribute *attr, 1070 char *buf) 1071 { 1072 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1073 1074 return scnprintf(buf, PAGE_SIZE, "%d us\n", vha->hw->zio_timer * 100); 1075 } 1076 1077 static ssize_t 1078 qla2x00_zio_timer_store(struct device *dev, struct device_attribute *attr, 1079 const char *buf, size_t count) 1080 { 1081 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1082 int val = 0; 1083 uint16_t zio_timer; 1084 1085 if (sscanf(buf, "%d", &val) != 1) 1086 return -EINVAL; 1087 if (val > 25500 || val < 100) 1088 return -ERANGE; 1089 1090 zio_timer = (uint16_t)(val / 100); 1091 vha->hw->zio_timer = zio_timer; 1092 1093 return strlen(buf); 1094 } 1095 1096 static ssize_t 1097 qla2x00_beacon_show(struct device *dev, struct device_attribute *attr, 1098 char *buf) 1099 { 1100 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1101 int len = 0; 1102 1103 if (vha->hw->beacon_blink_led) 1104 len += scnprintf(buf + len, PAGE_SIZE-len, "Enabled\n"); 1105 else 1106 len += scnprintf(buf + len, PAGE_SIZE-len, "Disabled\n"); 1107 return len; 1108 } 1109 1110 static ssize_t 1111 qla2x00_beacon_store(struct device *dev, struct device_attribute *attr, 1112 const char *buf, size_t count) 1113 { 1114 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1115 struct qla_hw_data *ha = vha->hw; 1116 int val = 0; 1117 int rval; 1118 1119 if (IS_QLA2100(ha) || IS_QLA2200(ha)) 1120 return -EPERM; 1121 1122 if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) { 1123 ql_log(ql_log_warn, vha, 0x707a, 1124 "Abort ISP active -- ignoring beacon request.\n"); 1125 return -EBUSY; 1126 } 1127 1128 if (sscanf(buf, "%d", &val) != 1) 1129 return -EINVAL; 1130 1131 if (val) 1132 rval = ha->isp_ops->beacon_on(vha); 1133 else 1134 rval = ha->isp_ops->beacon_off(vha); 1135 1136 if (rval != QLA_SUCCESS) 1137 count = 0; 1138 1139 return count; 1140 } 1141 1142 static ssize_t 1143 qla2x00_optrom_bios_version_show(struct device *dev, 1144 struct device_attribute *attr, char *buf) 1145 { 1146 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1147 struct qla_hw_data *ha = vha->hw; 1148 return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1], 1149 ha->bios_revision[0]); 1150 } 1151 1152 static ssize_t 1153 qla2x00_optrom_efi_version_show(struct device *dev, 1154 struct device_attribute *attr, char *buf) 1155 { 1156 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1157 struct qla_hw_data *ha = vha->hw; 1158 return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1], 1159 ha->efi_revision[0]); 1160 } 1161 1162 static ssize_t 1163 qla2x00_optrom_fcode_version_show(struct device *dev, 1164 struct device_attribute *attr, char *buf) 1165 { 1166 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1167 struct qla_hw_data *ha = vha->hw; 1168 return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1], 1169 ha->fcode_revision[0]); 1170 } 1171 1172 static ssize_t 1173 qla2x00_optrom_fw_version_show(struct device *dev, 1174 struct device_attribute *attr, char *buf) 1175 { 1176 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1177 struct qla_hw_data *ha = vha->hw; 1178 return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n", 1179 ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2], 1180 ha->fw_revision[3]); 1181 } 1182 1183 static ssize_t 1184 qla2x00_optrom_gold_fw_version_show(struct device *dev, 1185 struct device_attribute *attr, char *buf) 1186 { 1187 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1188 struct qla_hw_data *ha = vha->hw; 1189 1190 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) 1191 return scnprintf(buf, PAGE_SIZE, "\n"); 1192 1193 return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n", 1194 ha->gold_fw_version[0], ha->gold_fw_version[1], 1195 ha->gold_fw_version[2], ha->gold_fw_version[3]); 1196 } 1197 1198 static ssize_t 1199 qla2x00_total_isp_aborts_show(struct device *dev, 1200 struct device_attribute *attr, char *buf) 1201 { 1202 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1203 return scnprintf(buf, PAGE_SIZE, "%d\n", 1204 vha->qla_stats.total_isp_aborts); 1205 } 1206 1207 static ssize_t 1208 qla24xx_84xx_fw_version_show(struct device *dev, 1209 struct device_attribute *attr, char *buf) 1210 { 1211 int rval = QLA_SUCCESS; 1212 uint16_t status[2] = {0, 0}; 1213 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1214 struct qla_hw_data *ha = vha->hw; 1215 1216 if (!IS_QLA84XX(ha)) 1217 return scnprintf(buf, PAGE_SIZE, "\n"); 1218 1219 if (ha->cs84xx->op_fw_version == 0) 1220 rval = qla84xx_verify_chip(vha, status); 1221 1222 if ((rval == QLA_SUCCESS) && (status[0] == 0)) 1223 return scnprintf(buf, PAGE_SIZE, "%u\n", 1224 (uint32_t)ha->cs84xx->op_fw_version); 1225 1226 return scnprintf(buf, PAGE_SIZE, "\n"); 1227 } 1228 1229 static ssize_t 1230 qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr, 1231 char *buf) 1232 { 1233 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1234 struct qla_hw_data *ha = vha->hw; 1235 1236 if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha)) 1237 return scnprintf(buf, PAGE_SIZE, "\n"); 1238 1239 return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n", 1240 ha->mpi_version[0], ha->mpi_version[1], ha->mpi_version[2], 1241 ha->mpi_capabilities); 1242 } 1243 1244 static ssize_t 1245 qla2x00_phy_version_show(struct device *dev, struct device_attribute *attr, 1246 char *buf) 1247 { 1248 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1249 struct qla_hw_data *ha = vha->hw; 1250 1251 if (!IS_QLA81XX(ha) && !IS_QLA8031(ha)) 1252 return scnprintf(buf, PAGE_SIZE, "\n"); 1253 1254 return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n", 1255 ha->phy_version[0], ha->phy_version[1], ha->phy_version[2]); 1256 } 1257 1258 static ssize_t 1259 qla2x00_flash_block_size_show(struct device *dev, 1260 struct device_attribute *attr, char *buf) 1261 { 1262 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1263 struct qla_hw_data *ha = vha->hw; 1264 1265 return scnprintf(buf, PAGE_SIZE, "0x%x\n", ha->fdt_block_size); 1266 } 1267 1268 static ssize_t 1269 qla2x00_vlan_id_show(struct device *dev, struct device_attribute *attr, 1270 char *buf) 1271 { 1272 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1273 1274 if (!IS_CNA_CAPABLE(vha->hw)) 1275 return scnprintf(buf, PAGE_SIZE, "\n"); 1276 1277 return scnprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id); 1278 } 1279 1280 static ssize_t 1281 qla2x00_vn_port_mac_address_show(struct device *dev, 1282 struct device_attribute *attr, char *buf) 1283 { 1284 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1285 1286 if (!IS_CNA_CAPABLE(vha->hw)) 1287 return scnprintf(buf, PAGE_SIZE, "\n"); 1288 1289 return scnprintf(buf, PAGE_SIZE, "%pMR\n", vha->fcoe_vn_port_mac); 1290 } 1291 1292 static ssize_t 1293 qla2x00_fabric_param_show(struct device *dev, struct device_attribute *attr, 1294 char *buf) 1295 { 1296 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1297 1298 return scnprintf(buf, PAGE_SIZE, "%d\n", vha->hw->switch_cap); 1299 } 1300 1301 static ssize_t 1302 qla2x00_thermal_temp_show(struct device *dev, 1303 struct device_attribute *attr, char *buf) 1304 { 1305 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1306 uint16_t temp = 0; 1307 1308 if (qla2x00_reset_active(vha)) { 1309 ql_log(ql_log_warn, vha, 0x70dc, "ISP reset active.\n"); 1310 goto done; 1311 } 1312 1313 if (vha->hw->flags.eeh_busy) { 1314 ql_log(ql_log_warn, vha, 0x70dd, "PCI EEH busy.\n"); 1315 goto done; 1316 } 1317 1318 if (qla2x00_get_thermal_temp(vha, &temp) == QLA_SUCCESS) 1319 return scnprintf(buf, PAGE_SIZE, "%d\n", temp); 1320 1321 done: 1322 return scnprintf(buf, PAGE_SIZE, "\n"); 1323 } 1324 1325 static ssize_t 1326 qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr, 1327 char *buf) 1328 { 1329 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1330 int rval = QLA_FUNCTION_FAILED; 1331 uint16_t state[5]; 1332 uint32_t pstate; 1333 1334 if (IS_QLAFX00(vha->hw)) { 1335 pstate = qlafx00_fw_state_show(dev, attr, buf); 1336 return scnprintf(buf, PAGE_SIZE, "0x%x\n", pstate); 1337 } 1338 1339 if (qla2x00_reset_active(vha)) 1340 ql_log(ql_log_warn, vha, 0x707c, 1341 "ISP reset active.\n"); 1342 else if (!vha->hw->flags.eeh_busy) 1343 rval = qla2x00_get_firmware_state(vha, state); 1344 if (rval != QLA_SUCCESS) 1345 memset(state, -1, sizeof(state)); 1346 1347 return scnprintf(buf, PAGE_SIZE, "0x%x 0x%x 0x%x 0x%x 0x%x\n", state[0], 1348 state[1], state[2], state[3], state[4]); 1349 } 1350 1351 static ssize_t 1352 qla2x00_diag_requests_show(struct device *dev, 1353 struct device_attribute *attr, char *buf) 1354 { 1355 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1356 1357 if (!IS_BIDI_CAPABLE(vha->hw)) 1358 return scnprintf(buf, PAGE_SIZE, "\n"); 1359 1360 return scnprintf(buf, PAGE_SIZE, "%llu\n", vha->bidi_stats.io_count); 1361 } 1362 1363 static ssize_t 1364 qla2x00_diag_megabytes_show(struct device *dev, 1365 struct device_attribute *attr, char *buf) 1366 { 1367 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1368 1369 if (!IS_BIDI_CAPABLE(vha->hw)) 1370 return scnprintf(buf, PAGE_SIZE, "\n"); 1371 1372 return scnprintf(buf, PAGE_SIZE, "%llu\n", 1373 vha->bidi_stats.transfer_bytes >> 20); 1374 } 1375 1376 static ssize_t 1377 qla2x00_fw_dump_size_show(struct device *dev, struct device_attribute *attr, 1378 char *buf) 1379 { 1380 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1381 struct qla_hw_data *ha = vha->hw; 1382 uint32_t size; 1383 1384 if (!ha->fw_dumped) 1385 size = 0; 1386 else if (IS_QLA82XX(ha)) 1387 size = ha->md_template_size + ha->md_dump_size; 1388 else 1389 size = ha->fw_dump_len; 1390 1391 return scnprintf(buf, PAGE_SIZE, "%d\n", size); 1392 } 1393 1394 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); 1395 static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); 1396 static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); 1397 static DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL); 1398 static DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL); 1399 static DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL); 1400 static DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL); 1401 static DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL); 1402 static DEVICE_ATTR(link_state, S_IRUGO, qla2x00_link_state_show, NULL); 1403 static DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show, qla2x00_zio_store); 1404 static DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show, 1405 qla2x00_zio_timer_store); 1406 static DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show, 1407 qla2x00_beacon_store); 1408 static DEVICE_ATTR(optrom_bios_version, S_IRUGO, 1409 qla2x00_optrom_bios_version_show, NULL); 1410 static DEVICE_ATTR(optrom_efi_version, S_IRUGO, 1411 qla2x00_optrom_efi_version_show, NULL); 1412 static DEVICE_ATTR(optrom_fcode_version, S_IRUGO, 1413 qla2x00_optrom_fcode_version_show, NULL); 1414 static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show, 1415 NULL); 1416 static DEVICE_ATTR(optrom_gold_fw_version, S_IRUGO, 1417 qla2x00_optrom_gold_fw_version_show, NULL); 1418 static DEVICE_ATTR(84xx_fw_version, S_IRUGO, qla24xx_84xx_fw_version_show, 1419 NULL); 1420 static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show, 1421 NULL); 1422 static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL); 1423 static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL); 1424 static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show, 1425 NULL); 1426 static DEVICE_ATTR(vlan_id, S_IRUGO, qla2x00_vlan_id_show, NULL); 1427 static DEVICE_ATTR(vn_port_mac_address, S_IRUGO, 1428 qla2x00_vn_port_mac_address_show, NULL); 1429 static DEVICE_ATTR(fabric_param, S_IRUGO, qla2x00_fabric_param_show, NULL); 1430 static DEVICE_ATTR(fw_state, S_IRUGO, qla2x00_fw_state_show, NULL); 1431 static DEVICE_ATTR(thermal_temp, S_IRUGO, qla2x00_thermal_temp_show, NULL); 1432 static DEVICE_ATTR(diag_requests, S_IRUGO, qla2x00_diag_requests_show, NULL); 1433 static DEVICE_ATTR(diag_megabytes, S_IRUGO, qla2x00_diag_megabytes_show, NULL); 1434 static DEVICE_ATTR(fw_dump_size, S_IRUGO, qla2x00_fw_dump_size_show, NULL); 1435 1436 struct device_attribute *qla2x00_host_attrs[] = { 1437 &dev_attr_driver_version, 1438 &dev_attr_fw_version, 1439 &dev_attr_serial_num, 1440 &dev_attr_isp_name, 1441 &dev_attr_isp_id, 1442 &dev_attr_model_name, 1443 &dev_attr_model_desc, 1444 &dev_attr_pci_info, 1445 &dev_attr_link_state, 1446 &dev_attr_zio, 1447 &dev_attr_zio_timer, 1448 &dev_attr_beacon, 1449 &dev_attr_optrom_bios_version, 1450 &dev_attr_optrom_efi_version, 1451 &dev_attr_optrom_fcode_version, 1452 &dev_attr_optrom_fw_version, 1453 &dev_attr_84xx_fw_version, 1454 &dev_attr_total_isp_aborts, 1455 &dev_attr_mpi_version, 1456 &dev_attr_phy_version, 1457 &dev_attr_flash_block_size, 1458 &dev_attr_vlan_id, 1459 &dev_attr_vn_port_mac_address, 1460 &dev_attr_fabric_param, 1461 &dev_attr_fw_state, 1462 &dev_attr_optrom_gold_fw_version, 1463 &dev_attr_thermal_temp, 1464 &dev_attr_diag_requests, 1465 &dev_attr_diag_megabytes, 1466 &dev_attr_fw_dump_size, 1467 NULL, 1468 }; 1469 1470 /* Host attributes. */ 1471 1472 static void 1473 qla2x00_get_host_port_id(struct Scsi_Host *shost) 1474 { 1475 scsi_qla_host_t *vha = shost_priv(shost); 1476 1477 fc_host_port_id(shost) = vha->d_id.b.domain << 16 | 1478 vha->d_id.b.area << 8 | vha->d_id.b.al_pa; 1479 } 1480 1481 static void 1482 qla2x00_get_host_speed(struct Scsi_Host *shost) 1483 { 1484 struct qla_hw_data *ha = ((struct scsi_qla_host *) 1485 (shost_priv(shost)))->hw; 1486 u32 speed = FC_PORTSPEED_UNKNOWN; 1487 1488 if (IS_QLAFX00(ha)) { 1489 qlafx00_get_host_speed(shost); 1490 return; 1491 } 1492 1493 switch (ha->link_data_rate) { 1494 case PORT_SPEED_1GB: 1495 speed = FC_PORTSPEED_1GBIT; 1496 break; 1497 case PORT_SPEED_2GB: 1498 speed = FC_PORTSPEED_2GBIT; 1499 break; 1500 case PORT_SPEED_4GB: 1501 speed = FC_PORTSPEED_4GBIT; 1502 break; 1503 case PORT_SPEED_8GB: 1504 speed = FC_PORTSPEED_8GBIT; 1505 break; 1506 case PORT_SPEED_10GB: 1507 speed = FC_PORTSPEED_10GBIT; 1508 break; 1509 case PORT_SPEED_16GB: 1510 speed = FC_PORTSPEED_16GBIT; 1511 break; 1512 } 1513 fc_host_speed(shost) = speed; 1514 } 1515 1516 static void 1517 qla2x00_get_host_port_type(struct Scsi_Host *shost) 1518 { 1519 scsi_qla_host_t *vha = shost_priv(shost); 1520 uint32_t port_type = FC_PORTTYPE_UNKNOWN; 1521 1522 if (vha->vp_idx) { 1523 fc_host_port_type(shost) = FC_PORTTYPE_NPIV; 1524 return; 1525 } 1526 switch (vha->hw->current_topology) { 1527 case ISP_CFG_NL: 1528 port_type = FC_PORTTYPE_LPORT; 1529 break; 1530 case ISP_CFG_FL: 1531 port_type = FC_PORTTYPE_NLPORT; 1532 break; 1533 case ISP_CFG_N: 1534 port_type = FC_PORTTYPE_PTP; 1535 break; 1536 case ISP_CFG_F: 1537 port_type = FC_PORTTYPE_NPORT; 1538 break; 1539 } 1540 fc_host_port_type(shost) = port_type; 1541 } 1542 1543 static void 1544 qla2x00_get_starget_node_name(struct scsi_target *starget) 1545 { 1546 struct Scsi_Host *host = dev_to_shost(starget->dev.parent); 1547 scsi_qla_host_t *vha = shost_priv(host); 1548 fc_port_t *fcport; 1549 u64 node_name = 0; 1550 1551 list_for_each_entry(fcport, &vha->vp_fcports, list) { 1552 if (fcport->rport && 1553 starget->id == fcport->rport->scsi_target_id) { 1554 node_name = wwn_to_u64(fcport->node_name); 1555 break; 1556 } 1557 } 1558 1559 fc_starget_node_name(starget) = node_name; 1560 } 1561 1562 static void 1563 qla2x00_get_starget_port_name(struct scsi_target *starget) 1564 { 1565 struct Scsi_Host *host = dev_to_shost(starget->dev.parent); 1566 scsi_qla_host_t *vha = shost_priv(host); 1567 fc_port_t *fcport; 1568 u64 port_name = 0; 1569 1570 list_for_each_entry(fcport, &vha->vp_fcports, list) { 1571 if (fcport->rport && 1572 starget->id == fcport->rport->scsi_target_id) { 1573 port_name = wwn_to_u64(fcport->port_name); 1574 break; 1575 } 1576 } 1577 1578 fc_starget_port_name(starget) = port_name; 1579 } 1580 1581 static void 1582 qla2x00_get_starget_port_id(struct scsi_target *starget) 1583 { 1584 struct Scsi_Host *host = dev_to_shost(starget->dev.parent); 1585 scsi_qla_host_t *vha = shost_priv(host); 1586 fc_port_t *fcport; 1587 uint32_t port_id = ~0U; 1588 1589 list_for_each_entry(fcport, &vha->vp_fcports, list) { 1590 if (fcport->rport && 1591 starget->id == fcport->rport->scsi_target_id) { 1592 port_id = fcport->d_id.b.domain << 16 | 1593 fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa; 1594 break; 1595 } 1596 } 1597 1598 fc_starget_port_id(starget) = port_id; 1599 } 1600 1601 static void 1602 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) 1603 { 1604 if (timeout) 1605 rport->dev_loss_tmo = timeout; 1606 else 1607 rport->dev_loss_tmo = 1; 1608 } 1609 1610 static void 1611 qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport) 1612 { 1613 struct Scsi_Host *host = rport_to_shost(rport); 1614 fc_port_t *fcport = *(fc_port_t **)rport->dd_data; 1615 unsigned long flags; 1616 1617 if (!fcport) 1618 return; 1619 1620 /* Now that the rport has been deleted, set the fcport state to 1621 FCS_DEVICE_DEAD */ 1622 qla2x00_set_fcport_state(fcport, FCS_DEVICE_DEAD); 1623 1624 /* 1625 * Transport has effectively 'deleted' the rport, clear 1626 * all local references. 1627 */ 1628 spin_lock_irqsave(host->host_lock, flags); 1629 fcport->rport = fcport->drport = NULL; 1630 *((fc_port_t **)rport->dd_data) = NULL; 1631 spin_unlock_irqrestore(host->host_lock, flags); 1632 1633 if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags)) 1634 return; 1635 1636 if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) { 1637 qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16); 1638 return; 1639 } 1640 } 1641 1642 static void 1643 qla2x00_terminate_rport_io(struct fc_rport *rport) 1644 { 1645 fc_port_t *fcport = *(fc_port_t **)rport->dd_data; 1646 1647 if (!fcport) 1648 return; 1649 1650 if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags)) 1651 return; 1652 1653 if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) { 1654 qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16); 1655 return; 1656 } 1657 /* 1658 * At this point all fcport's software-states are cleared. Perform any 1659 * final cleanup of firmware resources (PCBs and XCBs). 1660 */ 1661 if (fcport->loop_id != FC_NO_LOOP_ID) { 1662 if (IS_FWI2_CAPABLE(fcport->vha->hw)) 1663 fcport->vha->hw->isp_ops->fabric_logout(fcport->vha, 1664 fcport->loop_id, fcport->d_id.b.domain, 1665 fcport->d_id.b.area, fcport->d_id.b.al_pa); 1666 else 1667 qla2x00_port_logout(fcport->vha, fcport); 1668 } 1669 } 1670 1671 static int 1672 qla2x00_issue_lip(struct Scsi_Host *shost) 1673 { 1674 scsi_qla_host_t *vha = shost_priv(shost); 1675 1676 if (IS_QLAFX00(vha->hw)) 1677 return 0; 1678 1679 qla2x00_loop_reset(vha); 1680 return 0; 1681 } 1682 1683 static struct fc_host_statistics * 1684 qla2x00_get_fc_host_stats(struct Scsi_Host *shost) 1685 { 1686 scsi_qla_host_t *vha = shost_priv(shost); 1687 struct qla_hw_data *ha = vha->hw; 1688 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); 1689 int rval; 1690 struct link_statistics *stats; 1691 dma_addr_t stats_dma; 1692 struct fc_host_statistics *pfc_host_stat; 1693 1694 pfc_host_stat = &vha->fc_host_stat; 1695 memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics)); 1696 1697 if (IS_QLAFX00(vha->hw)) 1698 goto done; 1699 1700 if (test_bit(UNLOADING, &vha->dpc_flags)) 1701 goto done; 1702 1703 if (unlikely(pci_channel_offline(ha->pdev))) 1704 goto done; 1705 1706 if (qla2x00_reset_active(vha)) 1707 goto done; 1708 1709 stats = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &stats_dma); 1710 if (stats == NULL) { 1711 ql_log(ql_log_warn, vha, 0x707d, 1712 "Failed to allocate memory for stats.\n"); 1713 goto done; 1714 } 1715 memset(stats, 0, DMA_POOL_SIZE); 1716 1717 rval = QLA_FUNCTION_FAILED; 1718 if (IS_FWI2_CAPABLE(ha)) { 1719 rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma); 1720 } else if (atomic_read(&base_vha->loop_state) == LOOP_READY && 1721 !ha->dpc_active) { 1722 /* Must be in a 'READY' state for statistics retrieval. */ 1723 rval = qla2x00_get_link_status(base_vha, base_vha->loop_id, 1724 stats, stats_dma); 1725 } 1726 1727 if (rval != QLA_SUCCESS) 1728 goto done_free; 1729 1730 pfc_host_stat->link_failure_count = stats->link_fail_cnt; 1731 pfc_host_stat->loss_of_sync_count = stats->loss_sync_cnt; 1732 pfc_host_stat->loss_of_signal_count = stats->loss_sig_cnt; 1733 pfc_host_stat->prim_seq_protocol_err_count = stats->prim_seq_err_cnt; 1734 pfc_host_stat->invalid_tx_word_count = stats->inval_xmit_word_cnt; 1735 pfc_host_stat->invalid_crc_count = stats->inval_crc_cnt; 1736 if (IS_FWI2_CAPABLE(ha)) { 1737 pfc_host_stat->lip_count = stats->lip_cnt; 1738 pfc_host_stat->tx_frames = stats->tx_frames; 1739 pfc_host_stat->rx_frames = stats->rx_frames; 1740 pfc_host_stat->dumped_frames = stats->discarded_frames; 1741 pfc_host_stat->nos_count = stats->nos_rcvd; 1742 pfc_host_stat->error_frames = 1743 stats->dropped_frames + stats->discarded_frames; 1744 pfc_host_stat->rx_words = vha->qla_stats.input_bytes; 1745 pfc_host_stat->tx_words = vha->qla_stats.output_bytes; 1746 } 1747 pfc_host_stat->fcp_control_requests = vha->qla_stats.control_requests; 1748 pfc_host_stat->fcp_input_requests = vha->qla_stats.input_requests; 1749 pfc_host_stat->fcp_output_requests = vha->qla_stats.output_requests; 1750 pfc_host_stat->fcp_input_megabytes = vha->qla_stats.input_bytes >> 20; 1751 pfc_host_stat->fcp_output_megabytes = vha->qla_stats.output_bytes >> 20; 1752 pfc_host_stat->seconds_since_last_reset = 1753 get_jiffies_64() - vha->qla_stats.jiffies_at_last_reset; 1754 do_div(pfc_host_stat->seconds_since_last_reset, HZ); 1755 1756 done_free: 1757 dma_pool_free(ha->s_dma_pool, stats, stats_dma); 1758 done: 1759 return pfc_host_stat; 1760 } 1761 1762 static void 1763 qla2x00_reset_host_stats(struct Scsi_Host *shost) 1764 { 1765 scsi_qla_host_t *vha = shost_priv(shost); 1766 1767 memset(&vha->fc_host_stat, 0, sizeof(vha->fc_host_stat)); 1768 1769 vha->qla_stats.jiffies_at_last_reset = get_jiffies_64(); 1770 } 1771 1772 static void 1773 qla2x00_get_host_symbolic_name(struct Scsi_Host *shost) 1774 { 1775 scsi_qla_host_t *vha = shost_priv(shost); 1776 1777 qla2x00_get_sym_node_name(vha, fc_host_symbolic_name(shost)); 1778 } 1779 1780 static void 1781 qla2x00_set_host_system_hostname(struct Scsi_Host *shost) 1782 { 1783 scsi_qla_host_t *vha = shost_priv(shost); 1784 1785 set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); 1786 } 1787 1788 static void 1789 qla2x00_get_host_fabric_name(struct Scsi_Host *shost) 1790 { 1791 scsi_qla_host_t *vha = shost_priv(shost); 1792 uint8_t node_name[WWN_SIZE] = { 0xFF, 0xFF, 0xFF, 0xFF, \ 1793 0xFF, 0xFF, 0xFF, 0xFF}; 1794 u64 fabric_name = wwn_to_u64(node_name); 1795 1796 if (vha->device_flags & SWITCH_FOUND) 1797 fabric_name = wwn_to_u64(vha->fabric_node_name); 1798 1799 fc_host_fabric_name(shost) = fabric_name; 1800 } 1801 1802 static void 1803 qla2x00_get_host_port_state(struct Scsi_Host *shost) 1804 { 1805 scsi_qla_host_t *vha = shost_priv(shost); 1806 struct scsi_qla_host *base_vha = pci_get_drvdata(vha->hw->pdev); 1807 1808 if (!base_vha->flags.online) { 1809 fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; 1810 return; 1811 } 1812 1813 switch (atomic_read(&base_vha->loop_state)) { 1814 case LOOP_UPDATE: 1815 fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS; 1816 break; 1817 case LOOP_DOWN: 1818 if (test_bit(LOOP_RESYNC_NEEDED, &base_vha->dpc_flags)) 1819 fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS; 1820 else 1821 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN; 1822 break; 1823 case LOOP_DEAD: 1824 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN; 1825 break; 1826 case LOOP_READY: 1827 fc_host_port_state(shost) = FC_PORTSTATE_ONLINE; 1828 break; 1829 default: 1830 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; 1831 break; 1832 } 1833 } 1834 1835 static int 1836 qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) 1837 { 1838 int ret = 0; 1839 uint8_t qos = 0; 1840 scsi_qla_host_t *base_vha = shost_priv(fc_vport->shost); 1841 scsi_qla_host_t *vha = NULL; 1842 struct qla_hw_data *ha = base_vha->hw; 1843 uint16_t options = 0; 1844 int cnt; 1845 struct req_que *req = ha->req_q_map[0]; 1846 1847 ret = qla24xx_vport_create_req_sanity_check(fc_vport); 1848 if (ret) { 1849 ql_log(ql_log_warn, vha, 0x707e, 1850 "Vport sanity check failed, status %x\n", ret); 1851 return (ret); 1852 } 1853 1854 vha = qla24xx_create_vhost(fc_vport); 1855 if (vha == NULL) { 1856 ql_log(ql_log_warn, vha, 0x707f, "Vport create host failed.\n"); 1857 return FC_VPORT_FAILED; 1858 } 1859 if (disable) { 1860 atomic_set(&vha->vp_state, VP_OFFLINE); 1861 fc_vport_set_state(fc_vport, FC_VPORT_DISABLED); 1862 } else 1863 atomic_set(&vha->vp_state, VP_FAILED); 1864 1865 /* ready to create vport */ 1866 ql_log(ql_log_info, vha, 0x7080, 1867 "VP entry id %d assigned.\n", vha->vp_idx); 1868 1869 /* initialized vport states */ 1870 atomic_set(&vha->loop_state, LOOP_DOWN); 1871 vha->vp_err_state= VP_ERR_PORTDWN; 1872 vha->vp_prev_err_state= VP_ERR_UNKWN; 1873 /* Check if physical ha port is Up */ 1874 if (atomic_read(&base_vha->loop_state) == LOOP_DOWN || 1875 atomic_read(&base_vha->loop_state) == LOOP_DEAD) { 1876 /* Don't retry or attempt login of this virtual port */ 1877 ql_dbg(ql_dbg_user, vha, 0x7081, 1878 "Vport loop state is not UP.\n"); 1879 atomic_set(&vha->loop_state, LOOP_DEAD); 1880 if (!disable) 1881 fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN); 1882 } 1883 1884 if (IS_T10_PI_CAPABLE(ha) && ql2xenabledif) { 1885 if (ha->fw_attributes & BIT_4) { 1886 int prot = 0, guard; 1887 vha->flags.difdix_supported = 1; 1888 ql_dbg(ql_dbg_user, vha, 0x7082, 1889 "Registered for DIF/DIX type 1 and 3 protection.\n"); 1890 if (ql2xenabledif == 1) 1891 prot = SHOST_DIX_TYPE0_PROTECTION; 1892 scsi_host_set_prot(vha->host, 1893 prot | SHOST_DIF_TYPE1_PROTECTION 1894 | SHOST_DIF_TYPE2_PROTECTION 1895 | SHOST_DIF_TYPE3_PROTECTION 1896 | SHOST_DIX_TYPE1_PROTECTION 1897 | SHOST_DIX_TYPE2_PROTECTION 1898 | SHOST_DIX_TYPE3_PROTECTION); 1899 1900 guard = SHOST_DIX_GUARD_CRC; 1901 1902 if (IS_PI_IPGUARD_CAPABLE(ha) && 1903 (ql2xenabledif > 1 || IS_PI_DIFB_DIX0_CAPABLE(ha))) 1904 guard |= SHOST_DIX_GUARD_IP; 1905 1906 scsi_host_set_guard(vha->host, guard); 1907 } else 1908 vha->flags.difdix_supported = 0; 1909 } 1910 1911 if (scsi_add_host_with_dma(vha->host, &fc_vport->dev, 1912 &ha->pdev->dev)) { 1913 ql_dbg(ql_dbg_user, vha, 0x7083, 1914 "scsi_add_host failure for VP[%d].\n", vha->vp_idx); 1915 goto vport_create_failed_2; 1916 } 1917 1918 /* initialize attributes */ 1919 fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count; 1920 fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name); 1921 fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name); 1922 fc_host_supported_classes(vha->host) = 1923 fc_host_supported_classes(base_vha->host); 1924 fc_host_supported_speeds(vha->host) = 1925 fc_host_supported_speeds(base_vha->host); 1926 1927 qlt_vport_create(vha, ha); 1928 qla24xx_vport_disable(fc_vport, disable); 1929 1930 if (ha->flags.cpu_affinity_enabled) { 1931 req = ha->req_q_map[1]; 1932 ql_dbg(ql_dbg_multiq, vha, 0xc000, 1933 "Request queue %p attached with " 1934 "VP[%d], cpu affinity =%d\n", 1935 req, vha->vp_idx, ha->flags.cpu_affinity_enabled); 1936 goto vport_queue; 1937 } else if (ql2xmaxqueues == 1 || !ha->npiv_info) 1938 goto vport_queue; 1939 /* Create a request queue in QoS mode for the vport */ 1940 for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) { 1941 if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0 1942 && memcmp(ha->npiv_info[cnt].node_name, vha->node_name, 1943 8) == 0) { 1944 qos = ha->npiv_info[cnt].q_qos; 1945 break; 1946 } 1947 } 1948 1949 if (qos) { 1950 ret = qla25xx_create_req_que(ha, options, vha->vp_idx, 0, 0, 1951 qos); 1952 if (!ret) 1953 ql_log(ql_log_warn, vha, 0x7084, 1954 "Can't create request queue for VP[%d]\n", 1955 vha->vp_idx); 1956 else { 1957 ql_dbg(ql_dbg_multiq, vha, 0xc001, 1958 "Request Que:%d Q0s: %d) created for VP[%d]\n", 1959 ret, qos, vha->vp_idx); 1960 ql_dbg(ql_dbg_user, vha, 0x7085, 1961 "Request Que:%d Q0s: %d) created for VP[%d]\n", 1962 ret, qos, vha->vp_idx); 1963 req = ha->req_q_map[ret]; 1964 } 1965 } 1966 1967 vport_queue: 1968 vha->req = req; 1969 return 0; 1970 1971 vport_create_failed_2: 1972 qla24xx_disable_vp(vha); 1973 qla24xx_deallocate_vp_id(vha); 1974 scsi_host_put(vha->host); 1975 return FC_VPORT_FAILED; 1976 } 1977 1978 static int 1979 qla24xx_vport_delete(struct fc_vport *fc_vport) 1980 { 1981 scsi_qla_host_t *vha = fc_vport->dd_data; 1982 struct qla_hw_data *ha = vha->hw; 1983 uint16_t id = vha->vp_idx; 1984 1985 while (test_bit(LOOP_RESYNC_ACTIVE, &vha->dpc_flags) || 1986 test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags)) 1987 msleep(1000); 1988 1989 qla24xx_disable_vp(vha); 1990 1991 vha->flags.delete_progress = 1; 1992 1993 qlt_remove_target(ha, vha); 1994 1995 fc_remove_host(vha->host); 1996 1997 scsi_remove_host(vha->host); 1998 1999 /* Allow timer to run to drain queued items, when removing vp */ 2000 qla24xx_deallocate_vp_id(vha); 2001 2002 if (vha->timer_active) { 2003 qla2x00_vp_stop_timer(vha); 2004 ql_dbg(ql_dbg_user, vha, 0x7086, 2005 "Timer for the VP[%d] has stopped\n", vha->vp_idx); 2006 } 2007 2008 BUG_ON(atomic_read(&vha->vref_count)); 2009 2010 qla2x00_free_fcports(vha); 2011 2012 mutex_lock(&ha->vport_lock); 2013 ha->cur_vport_count--; 2014 clear_bit(vha->vp_idx, ha->vp_idx_map); 2015 mutex_unlock(&ha->vport_lock); 2016 2017 if (vha->req->id && !ha->flags.cpu_affinity_enabled) { 2018 if (qla25xx_delete_req_que(vha, vha->req) != QLA_SUCCESS) 2019 ql_log(ql_log_warn, vha, 0x7087, 2020 "Queue delete failed.\n"); 2021 } 2022 2023 ql_log(ql_log_info, vha, 0x7088, "VP[%d] deleted.\n", id); 2024 scsi_host_put(vha->host); 2025 return 0; 2026 } 2027 2028 static int 2029 qla24xx_vport_disable(struct fc_vport *fc_vport, bool disable) 2030 { 2031 scsi_qla_host_t *vha = fc_vport->dd_data; 2032 2033 if (disable) 2034 qla24xx_disable_vp(vha); 2035 else 2036 qla24xx_enable_vp(vha); 2037 2038 return 0; 2039 } 2040 2041 struct fc_function_template qla2xxx_transport_functions = { 2042 2043 .show_host_node_name = 1, 2044 .show_host_port_name = 1, 2045 .show_host_supported_classes = 1, 2046 .show_host_supported_speeds = 1, 2047 2048 .get_host_port_id = qla2x00_get_host_port_id, 2049 .show_host_port_id = 1, 2050 .get_host_speed = qla2x00_get_host_speed, 2051 .show_host_speed = 1, 2052 .get_host_port_type = qla2x00_get_host_port_type, 2053 .show_host_port_type = 1, 2054 .get_host_symbolic_name = qla2x00_get_host_symbolic_name, 2055 .show_host_symbolic_name = 1, 2056 .set_host_system_hostname = qla2x00_set_host_system_hostname, 2057 .show_host_system_hostname = 1, 2058 .get_host_fabric_name = qla2x00_get_host_fabric_name, 2059 .show_host_fabric_name = 1, 2060 .get_host_port_state = qla2x00_get_host_port_state, 2061 .show_host_port_state = 1, 2062 2063 .dd_fcrport_size = sizeof(struct fc_port *), 2064 .show_rport_supported_classes = 1, 2065 2066 .get_starget_node_name = qla2x00_get_starget_node_name, 2067 .show_starget_node_name = 1, 2068 .get_starget_port_name = qla2x00_get_starget_port_name, 2069 .show_starget_port_name = 1, 2070 .get_starget_port_id = qla2x00_get_starget_port_id, 2071 .show_starget_port_id = 1, 2072 2073 .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, 2074 .show_rport_dev_loss_tmo = 1, 2075 2076 .issue_fc_host_lip = qla2x00_issue_lip, 2077 .dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk, 2078 .terminate_rport_io = qla2x00_terminate_rport_io, 2079 .get_fc_host_stats = qla2x00_get_fc_host_stats, 2080 .reset_fc_host_stats = qla2x00_reset_host_stats, 2081 2082 .vport_create = qla24xx_vport_create, 2083 .vport_disable = qla24xx_vport_disable, 2084 .vport_delete = qla24xx_vport_delete, 2085 .bsg_request = qla24xx_bsg_request, 2086 .bsg_timeout = qla24xx_bsg_timeout, 2087 }; 2088 2089 struct fc_function_template qla2xxx_transport_vport_functions = { 2090 2091 .show_host_node_name = 1, 2092 .show_host_port_name = 1, 2093 .show_host_supported_classes = 1, 2094 2095 .get_host_port_id = qla2x00_get_host_port_id, 2096 .show_host_port_id = 1, 2097 .get_host_speed = qla2x00_get_host_speed, 2098 .show_host_speed = 1, 2099 .get_host_port_type = qla2x00_get_host_port_type, 2100 .show_host_port_type = 1, 2101 .get_host_symbolic_name = qla2x00_get_host_symbolic_name, 2102 .show_host_symbolic_name = 1, 2103 .set_host_system_hostname = qla2x00_set_host_system_hostname, 2104 .show_host_system_hostname = 1, 2105 .get_host_fabric_name = qla2x00_get_host_fabric_name, 2106 .show_host_fabric_name = 1, 2107 .get_host_port_state = qla2x00_get_host_port_state, 2108 .show_host_port_state = 1, 2109 2110 .dd_fcrport_size = sizeof(struct fc_port *), 2111 .show_rport_supported_classes = 1, 2112 2113 .get_starget_node_name = qla2x00_get_starget_node_name, 2114 .show_starget_node_name = 1, 2115 .get_starget_port_name = qla2x00_get_starget_port_name, 2116 .show_starget_port_name = 1, 2117 .get_starget_port_id = qla2x00_get_starget_port_id, 2118 .show_starget_port_id = 1, 2119 2120 .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, 2121 .show_rport_dev_loss_tmo = 1, 2122 2123 .issue_fc_host_lip = qla2x00_issue_lip, 2124 .dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk, 2125 .terminate_rport_io = qla2x00_terminate_rport_io, 2126 .get_fc_host_stats = qla2x00_get_fc_host_stats, 2127 .reset_fc_host_stats = qla2x00_reset_host_stats, 2128 2129 .bsg_request = qla24xx_bsg_request, 2130 .bsg_timeout = qla24xx_bsg_timeout, 2131 }; 2132 2133 void 2134 qla2x00_init_host_attr(scsi_qla_host_t *vha) 2135 { 2136 struct qla_hw_data *ha = vha->hw; 2137 u32 speed = FC_PORTSPEED_UNKNOWN; 2138 2139 fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count; 2140 fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name); 2141 fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name); 2142 fc_host_supported_classes(vha->host) = ha->tgt.enable_class_2 ? 2143 (FC_COS_CLASS2|FC_COS_CLASS3) : FC_COS_CLASS3; 2144 fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; 2145 fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; 2146 2147 if (IS_CNA_CAPABLE(ha)) 2148 speed = FC_PORTSPEED_10GBIT; 2149 else if (IS_QLA2031(ha)) 2150 speed = FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT | 2151 FC_PORTSPEED_4GBIT; 2152 else if (IS_QLA25XX(ha)) 2153 speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | 2154 FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; 2155 else if (IS_QLA24XX_TYPE(ha)) 2156 speed = FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT | 2157 FC_PORTSPEED_1GBIT; 2158 else if (IS_QLA23XX(ha)) 2159 speed = FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; 2160 else if (IS_QLAFX00(ha)) 2161 speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | 2162 FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; 2163 else 2164 speed = FC_PORTSPEED_1GBIT; 2165 fc_host_supported_speeds(vha->host) = speed; 2166 } 2167