1 /******************************************************************* 2 * This file is part of the Emulex Linux Device Driver for * 3 * Fibre Channel Host Bus Adapters. * 4 * Copyright (C) 2004-2007 Emulex. All rights reserved. * 5 * EMULEX and SLI are trademarks of Emulex. * 6 * www.emulex.com * 7 * Portions Copyright (C) 2004-2005 Christoph Hellwig * 8 * * 9 * This program is free software; you can redistribute it and/or * 10 * modify it under the terms of version 2 of the GNU General * 11 * Public License as published by the Free Software Foundation. * 12 * This program is distributed in the hope that it will be useful. * 13 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * 14 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * 15 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE * 16 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * 17 * TO BE LEGALLY INVALID. See the GNU General Public License for * 18 * more details, a copy of which can be found in the file COPYING * 19 * included with this package. * 20 *******************************************************************/ 21 22 #include <linux/ctype.h> 23 #include <linux/delay.h> 24 #include <linux/pci.h> 25 #include <linux/interrupt.h> 26 27 #include <scsi/scsi.h> 28 #include <scsi/scsi_device.h> 29 #include <scsi/scsi_host.h> 30 #include <scsi/scsi_tcq.h> 31 #include <scsi/scsi_transport_fc.h> 32 33 #include "lpfc_hw.h" 34 #include "lpfc_sli.h" 35 #include "lpfc_disc.h" 36 #include "lpfc_scsi.h" 37 #include "lpfc.h" 38 #include "lpfc_logmsg.h" 39 #include "lpfc_version.h" 40 #include "lpfc_compat.h" 41 #include "lpfc_crtn.h" 42 #include "lpfc_vport.h" 43 44 #define LPFC_DEF_DEVLOSS_TMO 30 45 #define LPFC_MIN_DEVLOSS_TMO 1 46 #define LPFC_MAX_DEVLOSS_TMO 255 47 48 static void 49 lpfc_jedec_to_ascii(int incr, char hdw[]) 50 { 51 int i, j; 52 for (i = 0; i < 8; i++) { 53 j = (incr & 0xf); 54 if (j <= 9) 55 hdw[7 - i] = 0x30 + j; 56 else 57 hdw[7 - i] = 0x61 + j - 10; 58 incr = (incr >> 4); 59 } 60 hdw[8] = 0; 61 return; 62 } 63 64 static ssize_t 65 lpfc_drvr_version_show(struct class_device *cdev, char *buf) 66 { 67 return snprintf(buf, PAGE_SIZE, LPFC_MODULE_DESC "\n"); 68 } 69 70 static ssize_t 71 management_version_show(struct class_device *cdev, char *buf) 72 { 73 return snprintf(buf, PAGE_SIZE, DFC_API_VERSION "\n"); 74 } 75 76 static ssize_t 77 lpfc_info_show(struct class_device *cdev, char *buf) 78 { 79 struct Scsi_Host *host = class_to_shost(cdev); 80 81 return snprintf(buf, PAGE_SIZE, "%s\n",lpfc_info(host)); 82 } 83 84 static ssize_t 85 lpfc_serialnum_show(struct class_device *cdev, char *buf) 86 { 87 struct Scsi_Host *shost = class_to_shost(cdev); 88 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 89 struct lpfc_hba *phba = vport->phba; 90 91 return snprintf(buf, PAGE_SIZE, "%s\n",phba->SerialNumber); 92 } 93 94 static ssize_t 95 lpfc_modeldesc_show(struct class_device *cdev, char *buf) 96 { 97 struct Scsi_Host *shost = class_to_shost(cdev); 98 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 99 struct lpfc_hba *phba = vport->phba; 100 101 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelDesc); 102 } 103 104 static ssize_t 105 lpfc_modelname_show(struct class_device *cdev, char *buf) 106 { 107 struct Scsi_Host *shost = class_to_shost(cdev); 108 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 109 struct lpfc_hba *phba = vport->phba; 110 111 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelName); 112 } 113 114 static ssize_t 115 lpfc_programtype_show(struct class_device *cdev, char *buf) 116 { 117 struct Scsi_Host *shost = class_to_shost(cdev); 118 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 119 struct lpfc_hba *phba = vport->phba; 120 121 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ProgramType); 122 } 123 124 static ssize_t 125 lpfc_vportnum_show(struct class_device *cdev, char *buf) 126 { 127 struct Scsi_Host *shost = class_to_shost(cdev); 128 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 129 struct lpfc_hba *phba = vport->phba; 130 131 return snprintf(buf, PAGE_SIZE, "%s\n",phba->Port); 132 } 133 134 static ssize_t 135 lpfc_fwrev_show(struct class_device *cdev, char *buf) 136 { 137 struct Scsi_Host *shost = class_to_shost(cdev); 138 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 139 struct lpfc_hba *phba = vport->phba; 140 char fwrev[32]; 141 142 lpfc_decode_firmware_rev(phba, fwrev, 1); 143 return snprintf(buf, PAGE_SIZE, "%s, sli-%d\n", fwrev, phba->sli_rev); 144 } 145 146 static ssize_t 147 lpfc_hdw_show(struct class_device *cdev, char *buf) 148 { 149 char hdw[9]; 150 struct Scsi_Host *shost = class_to_shost(cdev); 151 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 152 struct lpfc_hba *phba = vport->phba; 153 lpfc_vpd_t *vp = &phba->vpd; 154 155 lpfc_jedec_to_ascii(vp->rev.biuRev, hdw); 156 return snprintf(buf, PAGE_SIZE, "%s\n", hdw); 157 } 158 static ssize_t 159 lpfc_option_rom_version_show(struct class_device *cdev, char *buf) 160 { 161 struct Scsi_Host *shost = class_to_shost(cdev); 162 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 163 struct lpfc_hba *phba = vport->phba; 164 165 return snprintf(buf, PAGE_SIZE, "%s\n", phba->OptionROMVersion); 166 } 167 static ssize_t 168 lpfc_state_show(struct class_device *cdev, char *buf) 169 { 170 struct Scsi_Host *shost = class_to_shost(cdev); 171 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 172 struct lpfc_hba *phba = vport->phba; 173 int len = 0; 174 175 switch (phba->link_state) { 176 case LPFC_LINK_UNKNOWN: 177 case LPFC_WARM_START: 178 case LPFC_INIT_START: 179 case LPFC_INIT_MBX_CMDS: 180 case LPFC_LINK_DOWN: 181 case LPFC_HBA_ERROR: 182 len += snprintf(buf + len, PAGE_SIZE-len, "Link Down\n"); 183 break; 184 case LPFC_LINK_UP: 185 case LPFC_CLEAR_LA: 186 case LPFC_HBA_READY: 187 len += snprintf(buf + len, PAGE_SIZE-len, "Link Up - \n"); 188 189 switch (vport->port_state) { 190 len += snprintf(buf + len, PAGE_SIZE-len, 191 "initializing\n"); 192 break; 193 case LPFC_LOCAL_CFG_LINK: 194 len += snprintf(buf + len, PAGE_SIZE-len, 195 "Configuring Link\n"); 196 break; 197 case LPFC_FDISC: 198 case LPFC_FLOGI: 199 case LPFC_FABRIC_CFG_LINK: 200 case LPFC_NS_REG: 201 case LPFC_NS_QRY: 202 case LPFC_BUILD_DISC_LIST: 203 case LPFC_DISC_AUTH: 204 len += snprintf(buf + len, PAGE_SIZE - len, 205 "Discovery\n"); 206 break; 207 case LPFC_VPORT_READY: 208 len += snprintf(buf + len, PAGE_SIZE - len, "Ready\n"); 209 break; 210 211 case LPFC_VPORT_FAILED: 212 len += snprintf(buf + len, PAGE_SIZE - len, "Failed\n"); 213 break; 214 215 case LPFC_VPORT_UNKNOWN: 216 len += snprintf(buf + len, PAGE_SIZE - len, 217 "Unknown\n"); 218 break; 219 } 220 221 if (phba->fc_topology == TOPOLOGY_LOOP) { 222 if (vport->fc_flag & FC_PUBLIC_LOOP) 223 len += snprintf(buf + len, PAGE_SIZE-len, 224 " Public Loop\n"); 225 else 226 len += snprintf(buf + len, PAGE_SIZE-len, 227 " Private Loop\n"); 228 } else { 229 if (vport->fc_flag & FC_FABRIC) 230 len += snprintf(buf + len, PAGE_SIZE-len, 231 " Fabric\n"); 232 else 233 len += snprintf(buf + len, PAGE_SIZE-len, 234 " Point-2-Point\n"); 235 } 236 } 237 238 return len; 239 } 240 241 static ssize_t 242 lpfc_num_discovered_ports_show(struct class_device *cdev, char *buf) 243 { 244 struct Scsi_Host *shost = class_to_shost(cdev); 245 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 246 247 return snprintf(buf, PAGE_SIZE, "%d\n", 248 vport->fc_map_cnt + vport->fc_unmap_cnt); 249 } 250 251 252 static int 253 lpfc_issue_lip(struct Scsi_Host *shost) 254 { 255 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 256 struct lpfc_hba *phba = vport->phba; 257 LPFC_MBOXQ_t *pmboxq; 258 int mbxstatus = MBXERR_ERROR; 259 260 if ((vport->fc_flag & FC_OFFLINE_MODE) || 261 (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) || 262 (vport->port_state != LPFC_VPORT_READY)) 263 return -EPERM; 264 265 pmboxq = mempool_alloc(phba->mbox_mem_pool,GFP_KERNEL); 266 267 if (!pmboxq) 268 return -ENOMEM; 269 270 memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); 271 pmboxq->mb.mbxCommand = MBX_DOWN_LINK; 272 pmboxq->mb.mbxOwner = OWN_HOST; 273 274 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2); 275 276 if ((mbxstatus == MBX_SUCCESS) && (pmboxq->mb.mbxStatus == 0)) { 277 memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); 278 lpfc_init_link(phba, pmboxq, phba->cfg_topology, 279 phba->cfg_link_speed); 280 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, 281 phba->fc_ratov * 2); 282 } 283 284 lpfc_set_loopback_flag(phba); 285 if (mbxstatus != MBX_TIMEOUT) 286 mempool_free(pmboxq, phba->mbox_mem_pool); 287 288 if (mbxstatus == MBXERR_ERROR) 289 return -EIO; 290 291 return 0; 292 } 293 294 static int 295 lpfc_do_offline(struct lpfc_hba *phba, uint32_t type) 296 { 297 struct completion online_compl; 298 struct lpfc_sli_ring *pring; 299 struct lpfc_sli *psli; 300 int status = 0; 301 int cnt = 0; 302 int i; 303 304 init_completion(&online_compl); 305 lpfc_workq_post_event(phba, &status, &online_compl, 306 LPFC_EVT_OFFLINE_PREP); 307 wait_for_completion(&online_compl); 308 309 if (status != 0) 310 return -EIO; 311 312 psli = &phba->sli; 313 314 for (i = 0; i < psli->num_rings; i++) { 315 pring = &psli->ring[i]; 316 /* The linkdown event takes 30 seconds to timeout. */ 317 while (pring->txcmplq_cnt) { 318 msleep(10); 319 if (cnt++ > 3000) { 320 lpfc_printf_log(phba, 321 KERN_WARNING, LOG_INIT, 322 "%d:0466 Outstanding IO when " 323 "bringing Adapter offline\n", 324 phba->brd_no); 325 break; 326 } 327 } 328 } 329 330 init_completion(&online_compl); 331 lpfc_workq_post_event(phba, &status, &online_compl, type); 332 wait_for_completion(&online_compl); 333 334 if (status != 0) 335 return -EIO; 336 337 return 0; 338 } 339 340 static int 341 lpfc_selective_reset(struct lpfc_hba *phba) 342 { 343 struct completion online_compl; 344 int status = 0; 345 346 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE); 347 348 if (status != 0) 349 return status; 350 351 init_completion(&online_compl); 352 lpfc_workq_post_event(phba, &status, &online_compl, 353 LPFC_EVT_ONLINE); 354 wait_for_completion(&online_compl); 355 356 if (status != 0) 357 return -EIO; 358 359 return 0; 360 } 361 362 static ssize_t 363 lpfc_issue_reset(struct class_device *cdev, const char *buf, size_t count) 364 { 365 struct Scsi_Host *shost = class_to_shost(cdev); 366 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 367 struct lpfc_hba *phba = vport->phba; 368 369 int status = -EINVAL; 370 371 if (strncmp(buf, "selective", sizeof("selective") - 1) == 0) 372 status = lpfc_selective_reset(phba); 373 374 if (status == 0) 375 return strlen(buf); 376 else 377 return status; 378 } 379 380 static ssize_t 381 lpfc_nport_evt_cnt_show(struct class_device *cdev, char *buf) 382 { 383 struct Scsi_Host *shost = class_to_shost(cdev); 384 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 385 struct lpfc_hba *phba = vport->phba; 386 387 return snprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt); 388 } 389 390 static ssize_t 391 lpfc_board_mode_show(struct class_device *cdev, char *buf) 392 { 393 struct Scsi_Host *shost = class_to_shost(cdev); 394 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 395 struct lpfc_hba *phba = vport->phba; 396 char * state; 397 398 if (phba->link_state == LPFC_HBA_ERROR) 399 state = "error"; 400 else if (phba->link_state == LPFC_WARM_START) 401 state = "warm start"; 402 else if (phba->link_state == LPFC_INIT_START) 403 state = "offline"; 404 else 405 state = "online"; 406 407 return snprintf(buf, PAGE_SIZE, "%s\n", state); 408 } 409 410 static ssize_t 411 lpfc_board_mode_store(struct class_device *cdev, const char *buf, size_t count) 412 { 413 struct Scsi_Host *shost = class_to_shost(cdev); 414 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 415 struct lpfc_hba *phba = vport->phba; 416 struct completion online_compl; 417 int status=0; 418 419 init_completion(&online_compl); 420 421 if(strncmp(buf, "online", sizeof("online") - 1) == 0) { 422 lpfc_workq_post_event(phba, &status, &online_compl, 423 LPFC_EVT_ONLINE); 424 wait_for_completion(&online_compl); 425 } else if (strncmp(buf, "offline", sizeof("offline") - 1) == 0) 426 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE); 427 else if (strncmp(buf, "warm", sizeof("warm") - 1) == 0) 428 status = lpfc_do_offline(phba, LPFC_EVT_WARM_START); 429 else if (strncmp(buf, "error", sizeof("error") - 1) == 0) 430 status = lpfc_do_offline(phba, LPFC_EVT_KILL); 431 else 432 return -EINVAL; 433 434 if (!status) 435 return strlen(buf); 436 else 437 return -EIO; 438 } 439 440 int 441 lpfc_get_hba_info(struct lpfc_hba *phba, 442 uint32_t *mxri, uint32_t *axri, 443 uint32_t *mrpi, uint32_t *arpi, 444 uint32_t *mvpi, uint32_t *avpi) 445 { 446 struct lpfc_sli *psli = &phba->sli; 447 LPFC_MBOXQ_t *pmboxq; 448 MAILBOX_t *pmb; 449 int rc = 0; 450 451 /* 452 * prevent udev from issuing mailbox commands until the port is 453 * configured. 454 */ 455 if (phba->link_state < LPFC_LINK_DOWN || 456 !phba->mbox_mem_pool || 457 (phba->sli.sli_flag & LPFC_SLI2_ACTIVE) == 0) 458 return 0; 459 460 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) 461 return 0; 462 463 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); 464 if (!pmboxq) 465 return 0; 466 memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); 467 468 pmb = &pmboxq->mb; 469 pmb->mbxCommand = MBX_READ_CONFIG; 470 pmb->mbxOwner = OWN_HOST; 471 pmboxq->context1 = NULL; 472 473 if ((phba->pport->fc_flag & FC_OFFLINE_MODE) || 474 (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) 475 rc = MBX_NOT_FINISHED; 476 else 477 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); 478 479 if (rc != MBX_SUCCESS) { 480 if (rc != MBX_TIMEOUT) 481 mempool_free(pmboxq, phba->mbox_mem_pool); 482 return 0; 483 } 484 485 if (mrpi) 486 *mrpi = pmb->un.varRdConfig.max_rpi; 487 if (arpi) 488 *arpi = pmb->un.varRdConfig.avail_rpi; 489 if (mxri) 490 *mxri = pmb->un.varRdConfig.max_xri; 491 if (axri) 492 *axri = pmb->un.varRdConfig.avail_xri; 493 if (mvpi) 494 *mvpi = pmb->un.varRdConfig.max_vpi; 495 if (avpi) 496 *avpi = pmb->un.varRdConfig.avail_vpi; 497 498 mempool_free(pmboxq, phba->mbox_mem_pool); 499 return 1; 500 } 501 502 static ssize_t 503 lpfc_max_rpi_show(struct class_device *cdev, char *buf) 504 { 505 struct Scsi_Host *shost = class_to_shost(cdev); 506 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 507 struct lpfc_hba *phba = vport->phba; 508 uint32_t cnt; 509 510 if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, NULL, NULL, NULL)) 511 return snprintf(buf, PAGE_SIZE, "%d\n", cnt); 512 return snprintf(buf, PAGE_SIZE, "Unknown\n"); 513 } 514 515 static ssize_t 516 lpfc_used_rpi_show(struct class_device *cdev, char *buf) 517 { 518 struct Scsi_Host *shost = class_to_shost(cdev); 519 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 520 struct lpfc_hba *phba = vport->phba; 521 uint32_t cnt, acnt; 522 523 if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, &acnt, NULL, NULL)) 524 return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt)); 525 return snprintf(buf, PAGE_SIZE, "Unknown\n"); 526 } 527 528 static ssize_t 529 lpfc_max_xri_show(struct class_device *cdev, char *buf) 530 { 531 struct Scsi_Host *shost = class_to_shost(cdev); 532 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 533 struct lpfc_hba *phba = vport->phba; 534 uint32_t cnt; 535 536 if (lpfc_get_hba_info(phba, &cnt, NULL, NULL, NULL, NULL, NULL)) 537 return snprintf(buf, PAGE_SIZE, "%d\n", cnt); 538 return snprintf(buf, PAGE_SIZE, "Unknown\n"); 539 } 540 541 static ssize_t 542 lpfc_used_xri_show(struct class_device *cdev, char *buf) 543 { 544 struct Scsi_Host *shost = class_to_shost(cdev); 545 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 546 struct lpfc_hba *phba = vport->phba; 547 uint32_t cnt, acnt; 548 549 if (lpfc_get_hba_info(phba, &cnt, &acnt, NULL, NULL, NULL, NULL)) 550 return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt)); 551 return snprintf(buf, PAGE_SIZE, "Unknown\n"); 552 } 553 554 static ssize_t 555 lpfc_max_vpi_show(struct class_device *cdev, char *buf) 556 { 557 struct Scsi_Host *shost = class_to_shost(cdev); 558 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 559 struct lpfc_hba *phba = vport->phba; 560 uint32_t cnt; 561 562 if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, NULL)) 563 return snprintf(buf, PAGE_SIZE, "%d\n", cnt); 564 return snprintf(buf, PAGE_SIZE, "Unknown\n"); 565 } 566 567 static ssize_t 568 lpfc_used_vpi_show(struct class_device *cdev, char *buf) 569 { 570 struct Scsi_Host *shost = class_to_shost(cdev); 571 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 572 struct lpfc_hba *phba = vport->phba; 573 uint32_t cnt, acnt; 574 575 if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, &acnt)) 576 return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt)); 577 return snprintf(buf, PAGE_SIZE, "Unknown\n"); 578 } 579 580 static ssize_t 581 lpfc_npiv_info_show(struct class_device *cdev, char *buf) 582 { 583 struct Scsi_Host *shost = class_to_shost(cdev); 584 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 585 struct lpfc_hba *phba = vport->phba; 586 587 if (!(phba->max_vpi)) 588 return snprintf(buf, PAGE_SIZE, "NPIV Not Supported\n"); 589 if (vport->port_type == LPFC_PHYSICAL_PORT) 590 return snprintf(buf, PAGE_SIZE, "NPIV Physical\n"); 591 return snprintf(buf, PAGE_SIZE, "NPIV Virtual (VPI %d)\n", vport->vpi); 592 } 593 594 static ssize_t 595 lpfc_poll_show(struct class_device *cdev, char *buf) 596 { 597 struct Scsi_Host *shost = class_to_shost(cdev); 598 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 599 struct lpfc_hba *phba = vport->phba; 600 601 return snprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll); 602 } 603 604 static ssize_t 605 lpfc_poll_store(struct class_device *cdev, const char *buf, 606 size_t count) 607 { 608 struct Scsi_Host *shost = class_to_shost(cdev); 609 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 610 struct lpfc_hba *phba = vport->phba; 611 uint32_t creg_val; 612 uint32_t old_val; 613 int val=0; 614 615 if (!isdigit(buf[0])) 616 return -EINVAL; 617 618 if (sscanf(buf, "%i", &val) != 1) 619 return -EINVAL; 620 621 if ((val & 0x3) != val) 622 return -EINVAL; 623 624 spin_lock_irq(&phba->hbalock); 625 626 old_val = phba->cfg_poll; 627 628 if (val & ENABLE_FCP_RING_POLLING) { 629 if ((val & DISABLE_FCP_RING_INT) && 630 !(old_val & DISABLE_FCP_RING_INT)) { 631 creg_val = readl(phba->HCregaddr); 632 creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING); 633 writel(creg_val, phba->HCregaddr); 634 readl(phba->HCregaddr); /* flush */ 635 636 lpfc_poll_start_timer(phba); 637 } 638 } else if (val != 0x0) { 639 spin_unlock_irq(&phba->hbalock); 640 return -EINVAL; 641 } 642 643 if (!(val & DISABLE_FCP_RING_INT) && 644 (old_val & DISABLE_FCP_RING_INT)) 645 { 646 spin_unlock_irq(&phba->hbalock); 647 del_timer(&phba->fcp_poll_timer); 648 spin_lock_irq(&phba->hbalock); 649 creg_val = readl(phba->HCregaddr); 650 creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); 651 writel(creg_val, phba->HCregaddr); 652 readl(phba->HCregaddr); /* flush */ 653 } 654 655 phba->cfg_poll = val; 656 657 spin_unlock_irq(&phba->hbalock); 658 659 return strlen(buf); 660 } 661 662 #define lpfc_param_show(attr) \ 663 static ssize_t \ 664 lpfc_##attr##_show(struct class_device *cdev, char *buf) \ 665 { \ 666 struct Scsi_Host *shost = class_to_shost(cdev);\ 667 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\ 668 struct lpfc_hba *phba = vport->phba;\ 669 int val = 0;\ 670 val = phba->cfg_##attr;\ 671 return snprintf(buf, PAGE_SIZE, "%d\n",\ 672 phba->cfg_##attr);\ 673 } 674 675 #define lpfc_param_hex_show(attr) \ 676 static ssize_t \ 677 lpfc_##attr##_show(struct class_device *cdev, char *buf) \ 678 { \ 679 struct Scsi_Host *shost = class_to_shost(cdev);\ 680 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\ 681 struct lpfc_hba *phba = vport->phba;\ 682 int val = 0;\ 683 val = phba->cfg_##attr;\ 684 return snprintf(buf, PAGE_SIZE, "%#x\n",\ 685 phba->cfg_##attr);\ 686 } 687 688 #define lpfc_param_init(attr, default, minval, maxval) \ 689 static int \ 690 lpfc_##attr##_init(struct lpfc_hba *phba, int val) \ 691 { \ 692 if (val >= minval && val <= maxval) {\ 693 phba->cfg_##attr = val;\ 694 return 0;\ 695 }\ 696 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \ 697 "%d:0449 lpfc_"#attr" attribute cannot be set to %d, "\ 698 "allowed range is ["#minval", "#maxval"]\n", \ 699 phba->brd_no, val); \ 700 phba->cfg_##attr = default;\ 701 return -EINVAL;\ 702 } 703 704 #define lpfc_param_set(attr, default, minval, maxval) \ 705 static int \ 706 lpfc_##attr##_set(struct lpfc_hba *phba, int val) \ 707 { \ 708 if (val >= minval && val <= maxval) {\ 709 phba->cfg_##attr = val;\ 710 return 0;\ 711 }\ 712 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \ 713 "%d:0450 lpfc_"#attr" attribute cannot be set to %d, "\ 714 "allowed range is ["#minval", "#maxval"]\n", \ 715 phba->brd_no, val); \ 716 return -EINVAL;\ 717 } 718 719 #define lpfc_param_store(attr) \ 720 static ssize_t \ 721 lpfc_##attr##_store(struct class_device *cdev, const char *buf, size_t count) \ 722 { \ 723 struct Scsi_Host *shost = class_to_shost(cdev);\ 724 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\ 725 struct lpfc_hba *phba = vport->phba;\ 726 int val=0;\ 727 if (!isdigit(buf[0]))\ 728 return -EINVAL;\ 729 if (sscanf(buf, "%i", &val) != 1)\ 730 return -EINVAL;\ 731 if (lpfc_##attr##_set(phba, val) == 0) \ 732 return strlen(buf);\ 733 else \ 734 return -EINVAL;\ 735 } 736 737 #define LPFC_ATTR(name, defval, minval, maxval, desc) \ 738 static int lpfc_##name = defval;\ 739 module_param(lpfc_##name, int, 0);\ 740 MODULE_PARM_DESC(lpfc_##name, desc);\ 741 lpfc_param_init(name, defval, minval, maxval) 742 743 #define LPFC_ATTR_R(name, defval, minval, maxval, desc) \ 744 static int lpfc_##name = defval;\ 745 module_param(lpfc_##name, int, 0);\ 746 MODULE_PARM_DESC(lpfc_##name, desc);\ 747 lpfc_param_show(name)\ 748 lpfc_param_init(name, defval, minval, maxval)\ 749 static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL) 750 751 #define LPFC_ATTR_RW(name, defval, minval, maxval, desc) \ 752 static int lpfc_##name = defval;\ 753 module_param(lpfc_##name, int, 0);\ 754 MODULE_PARM_DESC(lpfc_##name, desc);\ 755 lpfc_param_show(name)\ 756 lpfc_param_init(name, defval, minval, maxval)\ 757 lpfc_param_set(name, defval, minval, maxval)\ 758 lpfc_param_store(name)\ 759 static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\ 760 lpfc_##name##_show, lpfc_##name##_store) 761 762 #define LPFC_ATTR_HEX_R(name, defval, minval, maxval, desc) \ 763 static int lpfc_##name = defval;\ 764 module_param(lpfc_##name, int, 0);\ 765 MODULE_PARM_DESC(lpfc_##name, desc);\ 766 lpfc_param_hex_show(name)\ 767 lpfc_param_init(name, defval, minval, maxval)\ 768 static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL) 769 770 #define LPFC_ATTR_HEX_RW(name, defval, minval, maxval, desc) \ 771 static int lpfc_##name = defval;\ 772 module_param(lpfc_##name, int, 0);\ 773 MODULE_PARM_DESC(lpfc_##name, desc);\ 774 lpfc_param_hex_show(name)\ 775 lpfc_param_init(name, defval, minval, maxval)\ 776 lpfc_param_set(name, defval, minval, maxval)\ 777 lpfc_param_store(name)\ 778 static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\ 779 lpfc_##name##_show, lpfc_##name##_store) 780 781 static CLASS_DEVICE_ATTR(info, S_IRUGO, lpfc_info_show, NULL); 782 static CLASS_DEVICE_ATTR(serialnum, S_IRUGO, lpfc_serialnum_show, NULL); 783 static CLASS_DEVICE_ATTR(modeldesc, S_IRUGO, lpfc_modeldesc_show, NULL); 784 static CLASS_DEVICE_ATTR(modelname, S_IRUGO, lpfc_modelname_show, NULL); 785 static CLASS_DEVICE_ATTR(programtype, S_IRUGO, lpfc_programtype_show, NULL); 786 static CLASS_DEVICE_ATTR(portnum, S_IRUGO, lpfc_vportnum_show, NULL); 787 static CLASS_DEVICE_ATTR(fwrev, S_IRUGO, lpfc_fwrev_show, NULL); 788 static CLASS_DEVICE_ATTR(hdw, S_IRUGO, lpfc_hdw_show, NULL); 789 static CLASS_DEVICE_ATTR(state, S_IRUGO, lpfc_state_show, NULL); 790 static CLASS_DEVICE_ATTR(option_rom_version, S_IRUGO, 791 lpfc_option_rom_version_show, NULL); 792 static CLASS_DEVICE_ATTR(num_discovered_ports, S_IRUGO, 793 lpfc_num_discovered_ports_show, NULL); 794 static CLASS_DEVICE_ATTR(nport_evt_cnt, S_IRUGO, lpfc_nport_evt_cnt_show, NULL); 795 static CLASS_DEVICE_ATTR(lpfc_drvr_version, S_IRUGO, lpfc_drvr_version_show, 796 NULL); 797 static CLASS_DEVICE_ATTR(management_version, S_IRUGO, management_version_show, 798 NULL); 799 static CLASS_DEVICE_ATTR(board_mode, S_IRUGO | S_IWUSR, 800 lpfc_board_mode_show, lpfc_board_mode_store); 801 static CLASS_DEVICE_ATTR(issue_reset, S_IWUSR, NULL, lpfc_issue_reset); 802 static CLASS_DEVICE_ATTR(max_vpi, S_IRUGO, lpfc_max_vpi_show, NULL); 803 static CLASS_DEVICE_ATTR(used_vpi, S_IRUGO, lpfc_used_vpi_show, NULL); 804 static CLASS_DEVICE_ATTR(max_rpi, S_IRUGO, lpfc_max_rpi_show, NULL); 805 static CLASS_DEVICE_ATTR(used_rpi, S_IRUGO, lpfc_used_rpi_show, NULL); 806 static CLASS_DEVICE_ATTR(max_xri, S_IRUGO, lpfc_max_xri_show, NULL); 807 static CLASS_DEVICE_ATTR(used_xri, S_IRUGO, lpfc_used_xri_show, NULL); 808 static CLASS_DEVICE_ATTR(npiv_info, S_IRUGO, lpfc_npiv_info_show, NULL); 809 810 811 static char *lpfc_soft_wwn_key = "C99G71SL8032A"; 812 813 static ssize_t 814 lpfc_soft_wwn_enable_store(struct class_device *cdev, const char *buf, 815 size_t count) 816 { 817 struct Scsi_Host *shost = class_to_shost(cdev); 818 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 819 struct lpfc_hba *phba = vport->phba; 820 unsigned int cnt = count; 821 822 /* 823 * We're doing a simple sanity check for soft_wwpn setting. 824 * We require that the user write a specific key to enable 825 * the soft_wwpn attribute to be settable. Once the attribute 826 * is written, the enable key resets. If further updates are 827 * desired, the key must be written again to re-enable the 828 * attribute. 829 * 830 * The "key" is not secret - it is a hardcoded string shown 831 * here. The intent is to protect against the random user or 832 * application that is just writing attributes. 833 */ 834 835 /* count may include a LF at end of string */ 836 if (buf[cnt-1] == '\n') 837 cnt--; 838 839 if ((cnt != strlen(lpfc_soft_wwn_key)) || 840 (strncmp(buf, lpfc_soft_wwn_key, strlen(lpfc_soft_wwn_key)) != 0)) 841 return -EINVAL; 842 843 phba->soft_wwn_enable = 1; 844 return count; 845 } 846 static CLASS_DEVICE_ATTR(lpfc_soft_wwn_enable, S_IWUSR, NULL, 847 lpfc_soft_wwn_enable_store); 848 849 static ssize_t 850 lpfc_soft_wwpn_show(struct class_device *cdev, char *buf) 851 { 852 struct Scsi_Host *shost = class_to_shost(cdev); 853 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 854 struct lpfc_hba *phba = vport->phba; 855 856 return snprintf(buf, PAGE_SIZE, "0x%llx\n", 857 (unsigned long long)phba->cfg_soft_wwpn); 858 } 859 860 861 static ssize_t 862 lpfc_soft_wwpn_store(struct class_device *cdev, const char *buf, size_t count) 863 { 864 struct Scsi_Host *shost = class_to_shost(cdev); 865 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 866 struct lpfc_hba *phba = vport->phba; 867 struct completion online_compl; 868 int stat1=0, stat2=0; 869 unsigned int i, j, cnt=count; 870 u8 wwpn[8]; 871 872 /* count may include a LF at end of string */ 873 if (buf[cnt-1] == '\n') 874 cnt--; 875 876 if (!phba->soft_wwn_enable || (cnt < 16) || (cnt > 18) || 877 ((cnt == 17) && (*buf++ != 'x')) || 878 ((cnt == 18) && ((*buf++ != '0') || (*buf++ != 'x')))) 879 return -EINVAL; 880 881 phba->soft_wwn_enable = 0; 882 883 memset(wwpn, 0, sizeof(wwpn)); 884 885 /* Validate and store the new name */ 886 for (i=0, j=0; i < 16; i++) { 887 if ((*buf >= 'a') && (*buf <= 'f')) 888 j = ((j << 4) | ((*buf++ -'a') + 10)); 889 else if ((*buf >= 'A') && (*buf <= 'F')) 890 j = ((j << 4) | ((*buf++ -'A') + 10)); 891 else if ((*buf >= '0') && (*buf <= '9')) 892 j = ((j << 4) | (*buf++ -'0')); 893 else 894 return -EINVAL; 895 if (i % 2) { 896 wwpn[i/2] = j & 0xff; 897 j = 0; 898 } 899 } 900 phba->cfg_soft_wwpn = wwn_to_u64(wwpn); 901 fc_host_port_name(shost) = phba->cfg_soft_wwpn; 902 if (phba->cfg_soft_wwnn) 903 fc_host_node_name(shost) = phba->cfg_soft_wwnn; 904 905 dev_printk(KERN_NOTICE, &phba->pcidev->dev, 906 "lpfc%d: Reinitializing to use soft_wwpn\n", phba->brd_no); 907 908 stat1 = lpfc_do_offline(phba, LPFC_EVT_OFFLINE); 909 if (stat1) 910 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 911 "%d:0463 lpfc_soft_wwpn attribute set failed to reinit " 912 "adapter - %d\n", phba->brd_no, stat1); 913 914 init_completion(&online_compl); 915 lpfc_workq_post_event(phba, &stat2, &online_compl, LPFC_EVT_ONLINE); 916 wait_for_completion(&online_compl); 917 if (stat2) 918 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 919 "%d:0464 lpfc_soft_wwpn attribute set failed to reinit " 920 "adapter - %d\n", phba->brd_no, stat2); 921 922 return (stat1 || stat2) ? -EIO : count; 923 } 924 static CLASS_DEVICE_ATTR(lpfc_soft_wwpn, S_IRUGO | S_IWUSR,\ 925 lpfc_soft_wwpn_show, lpfc_soft_wwpn_store); 926 927 static ssize_t 928 lpfc_soft_wwnn_show(struct class_device *cdev, char *buf) 929 { 930 struct Scsi_Host *host = class_to_shost(cdev); 931 struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; 932 return snprintf(buf, PAGE_SIZE, "0x%llx\n", 933 (unsigned long long)phba->cfg_soft_wwnn); 934 } 935 936 937 static ssize_t 938 lpfc_soft_wwnn_store(struct class_device *cdev, const char *buf, size_t count) 939 { 940 struct Scsi_Host *host = class_to_shost(cdev); 941 struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; 942 unsigned int i, j, cnt=count; 943 u8 wwnn[8]; 944 945 /* count may include a LF at end of string */ 946 if (buf[cnt-1] == '\n') 947 cnt--; 948 949 if (!phba->soft_wwn_enable || (cnt < 16) || (cnt > 18) || 950 ((cnt == 17) && (*buf++ != 'x')) || 951 ((cnt == 18) && ((*buf++ != '0') || (*buf++ != 'x')))) 952 return -EINVAL; 953 954 /* 955 * Allow wwnn to be set many times, as long as the enable is set. 956 * However, once the wwpn is set, everything locks. 957 */ 958 959 memset(wwnn, 0, sizeof(wwnn)); 960 961 /* Validate and store the new name */ 962 for (i=0, j=0; i < 16; i++) { 963 if ((*buf >= 'a') && (*buf <= 'f')) 964 j = ((j << 4) | ((*buf++ -'a') + 10)); 965 else if ((*buf >= 'A') && (*buf <= 'F')) 966 j = ((j << 4) | ((*buf++ -'A') + 10)); 967 else if ((*buf >= '0') && (*buf <= '9')) 968 j = ((j << 4) | (*buf++ -'0')); 969 else 970 return -EINVAL; 971 if (i % 2) { 972 wwnn[i/2] = j & 0xff; 973 j = 0; 974 } 975 } 976 phba->cfg_soft_wwnn = wwn_to_u64(wwnn); 977 978 dev_printk(KERN_NOTICE, &phba->pcidev->dev, 979 "lpfc%d: soft_wwnn set. Value will take effect upon " 980 "setting of the soft_wwpn\n", phba->brd_no); 981 982 return count; 983 } 984 static CLASS_DEVICE_ATTR(lpfc_soft_wwnn, S_IRUGO | S_IWUSR,\ 985 lpfc_soft_wwnn_show, lpfc_soft_wwnn_store); 986 987 988 static int lpfc_poll = 0; 989 module_param(lpfc_poll, int, 0); 990 MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:" 991 " 0 - none," 992 " 1 - poll with interrupts enabled" 993 " 3 - poll and disable FCP ring interrupts"); 994 995 static CLASS_DEVICE_ATTR(lpfc_poll, S_IRUGO | S_IWUSR, 996 lpfc_poll_show, lpfc_poll_store); 997 998 int lpfc_sli_mode = 0; 999 module_param(lpfc_sli_mode, int, 0); 1000 MODULE_PARM_DESC(lpfc_sli_mode, "SLI mode selector:" 1001 " 0 - auto (SLI-3 if supported)," 1002 " 2 - select SLI-2 even on SLI-3 capable HBAs," 1003 " 3 - select SLI-3"); 1004 1005 LPFC_ATTR_R(npiv_enable, 0, 0, 1, "Enable NPIV functionality"); 1006 1007 /* 1008 # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear 1009 # until the timer expires. Value range is [0,255]. Default value is 30. 1010 */ 1011 static int lpfc_nodev_tmo = LPFC_DEF_DEVLOSS_TMO; 1012 static int lpfc_devloss_tmo = LPFC_DEF_DEVLOSS_TMO; 1013 module_param(lpfc_nodev_tmo, int, 0); 1014 MODULE_PARM_DESC(lpfc_nodev_tmo, 1015 "Seconds driver will hold I/O waiting " 1016 "for a device to come back"); 1017 static ssize_t 1018 lpfc_nodev_tmo_show(struct class_device *cdev, char *buf) 1019 { 1020 struct Scsi_Host *shost = class_to_shost(cdev); 1021 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1022 struct lpfc_hba *phba = vport->phba; 1023 int val = 0; 1024 val = phba->cfg_devloss_tmo; 1025 return snprintf(buf, PAGE_SIZE, "%d\n", 1026 phba->cfg_devloss_tmo); 1027 } 1028 1029 static int 1030 lpfc_nodev_tmo_init(struct lpfc_hba *phba, int val) 1031 { 1032 static int warned; 1033 if (phba->cfg_devloss_tmo != LPFC_DEF_DEVLOSS_TMO) { 1034 phba->cfg_nodev_tmo = phba->cfg_devloss_tmo; 1035 if (!warned && val != LPFC_DEF_DEVLOSS_TMO) { 1036 warned = 1; 1037 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 1038 "%d:0402 Ignoring nodev_tmo module " 1039 "parameter because devloss_tmo is" 1040 " set.\n", 1041 phba->brd_no); 1042 } 1043 return 0; 1044 } 1045 1046 if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) { 1047 phba->cfg_nodev_tmo = val; 1048 phba->cfg_devloss_tmo = val; 1049 return 0; 1050 } 1051 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 1052 "%d:0400 lpfc_nodev_tmo attribute cannot be set to %d, " 1053 "allowed range is [%d, %d]\n", 1054 phba->brd_no, val, 1055 LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO); 1056 phba->cfg_nodev_tmo = LPFC_DEF_DEVLOSS_TMO; 1057 return -EINVAL; 1058 } 1059 1060 static void 1061 lpfc_update_rport_devloss_tmo(struct lpfc_hba *phba) 1062 { 1063 struct lpfc_vport *vport; 1064 struct Scsi_Host *shost; 1065 struct lpfc_nodelist *ndlp; 1066 1067 list_for_each_entry(vport, &phba->port_list, listentry) { 1068 shost = lpfc_shost_from_vport(vport); 1069 spin_lock_irq(shost->host_lock); 1070 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) 1071 if (ndlp->rport) 1072 ndlp->rport->dev_loss_tmo = 1073 phba->cfg_devloss_tmo; 1074 spin_unlock_irq(shost->host_lock); 1075 } 1076 } 1077 1078 static int 1079 lpfc_nodev_tmo_set(struct lpfc_hba *phba, int val) 1080 { 1081 if (phba->dev_loss_tmo_changed || 1082 (lpfc_devloss_tmo != LPFC_DEF_DEVLOSS_TMO)) { 1083 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 1084 "%d:0401 Ignoring change to nodev_tmo " 1085 "because devloss_tmo is set.\n", 1086 phba->brd_no); 1087 return 0; 1088 } 1089 1090 if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) { 1091 phba->cfg_nodev_tmo = val; 1092 phba->cfg_devloss_tmo = val; 1093 lpfc_update_rport_devloss_tmo(phba); 1094 return 0; 1095 } 1096 1097 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 1098 "%d:0403 lpfc_nodev_tmo attribute cannot be set to %d, " 1099 "allowed range is [%d, %d]\n", 1100 phba->brd_no, val, LPFC_MIN_DEVLOSS_TMO, 1101 LPFC_MAX_DEVLOSS_TMO); 1102 return -EINVAL; 1103 } 1104 1105 lpfc_param_store(nodev_tmo) 1106 1107 static CLASS_DEVICE_ATTR(lpfc_nodev_tmo, S_IRUGO | S_IWUSR, 1108 lpfc_nodev_tmo_show, lpfc_nodev_tmo_store); 1109 1110 /* 1111 # lpfc_devloss_tmo: If set, it will hold all I/O errors on devices that 1112 # disappear until the timer expires. Value range is [0,255]. Default 1113 # value is 30. 1114 */ 1115 module_param(lpfc_devloss_tmo, int, 0); 1116 MODULE_PARM_DESC(lpfc_devloss_tmo, 1117 "Seconds driver will hold I/O waiting " 1118 "for a device to come back"); 1119 lpfc_param_init(devloss_tmo, LPFC_DEF_DEVLOSS_TMO, 1120 LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO) 1121 lpfc_param_show(devloss_tmo) 1122 static int 1123 lpfc_devloss_tmo_set(struct lpfc_hba *phba, int val) 1124 { 1125 if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) { 1126 phba->cfg_nodev_tmo = val; 1127 phba->cfg_devloss_tmo = val; 1128 phba->dev_loss_tmo_changed = 1; 1129 lpfc_update_rport_devloss_tmo(phba); 1130 return 0; 1131 } 1132 1133 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 1134 "%d:0404 lpfc_devloss_tmo attribute cannot be set to" 1135 " %d, allowed range is [%d, %d]\n", 1136 phba->brd_no, val, LPFC_MIN_DEVLOSS_TMO, 1137 LPFC_MAX_DEVLOSS_TMO); 1138 return -EINVAL; 1139 } 1140 1141 lpfc_param_store(devloss_tmo) 1142 static CLASS_DEVICE_ATTR(lpfc_devloss_tmo, S_IRUGO | S_IWUSR, 1143 lpfc_devloss_tmo_show, lpfc_devloss_tmo_store); 1144 1145 /* 1146 # lpfc_log_verbose: Only turn this flag on if you are willing to risk being 1147 # deluged with LOTS of information. 1148 # You can set a bit mask to record specific types of verbose messages: 1149 # 1150 # LOG_ELS 0x1 ELS events 1151 # LOG_DISCOVERY 0x2 Link discovery events 1152 # LOG_MBOX 0x4 Mailbox events 1153 # LOG_INIT 0x8 Initialization events 1154 # LOG_LINK_EVENT 0x10 Link events 1155 # LOG_FCP 0x40 FCP traffic history 1156 # LOG_NODE 0x80 Node table events 1157 # LOG_MISC 0x400 Miscellaneous events 1158 # LOG_SLI 0x800 SLI events 1159 # LOG_FCP_ERROR 0x1000 Only log FCP errors 1160 # LOG_LIBDFC 0x2000 LIBDFC events 1161 # LOG_ALL_MSG 0xffff LOG all messages 1162 */ 1163 LPFC_ATTR_HEX_RW(log_verbose, 0x0, 0x0, 0xffff, "Verbose logging bit-mask"); 1164 1165 /* 1166 # lun_queue_depth: This parameter is used to limit the number of outstanding 1167 # commands per FCP LUN. Value range is [1,128]. Default value is 30. 1168 */ 1169 LPFC_ATTR_R(lun_queue_depth, 30, 1, 128, 1170 "Max number of FCP commands we can queue to a specific LUN"); 1171 1172 /* 1173 # hba_queue_depth: This parameter is used to limit the number of outstanding 1174 # commands per lpfc HBA. Value range is [32,8192]. If this parameter 1175 # value is greater than the maximum number of exchanges supported by the HBA, 1176 # then maximum number of exchanges supported by the HBA is used to determine 1177 # the hba_queue_depth. 1178 */ 1179 LPFC_ATTR_R(hba_queue_depth, 8192, 32, 8192, 1180 "Max number of FCP commands we can queue to a lpfc HBA"); 1181 1182 /* 1183 # peer_port_login: This parameter allows/prevents logins 1184 # between peer ports hosted on the same physical port. 1185 # When this parameter is set 0 peer ports of same physical port 1186 # are not allowed to login to each other. 1187 # When this parameter is set 1 peer ports of same physical port 1188 # are allowed to login to each other. 1189 # Default value of this parameter is 0. 1190 */ 1191 LPFC_ATTR_R(peer_port_login, 0, 0, 1, 1192 "Allow peer ports on the same physical port to login to each " 1193 "other."); 1194 1195 /* 1196 # vport_restrict_login: This parameter allows/prevents logins 1197 # between Virtual Ports and remote initiators. 1198 # When this parameter is not set (0) Virtual Ports will accept PLOGIs from 1199 # other initiators and will attempt to PLOGI all remote ports. 1200 # When this parameter is set (1) Virtual Ports will reject PLOGIs from 1201 # remote ports and will not attempt to PLOGI to other initiators. 1202 # This parameter does not restrict to the physical port. 1203 # This parameter does not restrict logins to Fabric resident remote ports. 1204 # Default value of this parameter is 1. 1205 */ 1206 LPFC_ATTR_RW(vport_restrict_login, 1, 0, 1, 1207 "Restrict virtual ports login to remote initiators."); 1208 1209 /* 1210 # Some disk devices have a "select ID" or "select Target" capability. 1211 # From a protocol standpoint "select ID" usually means select the 1212 # Fibre channel "ALPA". In the FC-AL Profile there is an "informative 1213 # annex" which contains a table that maps a "select ID" (a number 1214 # between 0 and 7F) to an ALPA. By default, for compatibility with 1215 # older drivers, the lpfc driver scans this table from low ALPA to high 1216 # ALPA. 1217 # 1218 # Turning on the scan-down variable (on = 1, off = 0) will 1219 # cause the lpfc driver to use an inverted table, effectively 1220 # scanning ALPAs from high to low. Value range is [0,1]. Default value is 1. 1221 # 1222 # (Note: This "select ID" functionality is a LOOP ONLY characteristic 1223 # and will not work across a fabric. Also this parameter will take 1224 # effect only in the case when ALPA map is not available.) 1225 */ 1226 LPFC_ATTR_R(scan_down, 1, 0, 1, 1227 "Start scanning for devices from highest ALPA to lowest"); 1228 1229 /* 1230 # lpfc_topology: link topology for init link 1231 # 0x0 = attempt loop mode then point-to-point 1232 # 0x01 = internal loopback mode 1233 # 0x02 = attempt point-to-point mode only 1234 # 0x04 = attempt loop mode only 1235 # 0x06 = attempt point-to-point mode then loop 1236 # Set point-to-point mode if you want to run as an N_Port. 1237 # Set loop mode if you want to run as an NL_Port. Value range is [0,0x6]. 1238 # Default value is 0. 1239 */ 1240 LPFC_ATTR_RW(topology, 0, 0, 6, "Select Fibre Channel topology"); 1241 1242 /* 1243 # lpfc_link_speed: Link speed selection for initializing the Fibre Channel 1244 # connection. 1245 # 0 = auto select (default) 1246 # 1 = 1 Gigabaud 1247 # 2 = 2 Gigabaud 1248 # 4 = 4 Gigabaud 1249 # 8 = 8 Gigabaud 1250 # Value range is [0,8]. Default value is 0. 1251 */ 1252 LPFC_ATTR_R(link_speed, 0, 0, 8, "Select link speed"); 1253 1254 /* 1255 # lpfc_fcp_class: Determines FC class to use for the FCP protocol. 1256 # Value range is [2,3]. Default value is 3. 1257 */ 1258 LPFC_ATTR_R(fcp_class, 3, 2, 3, 1259 "Select Fibre Channel class of service for FCP sequences"); 1260 1261 /* 1262 # lpfc_use_adisc: Use ADISC for FCP rediscovery instead of PLOGI. Value range 1263 # is [0,1]. Default value is 0. 1264 */ 1265 LPFC_ATTR_RW(use_adisc, 0, 0, 1, 1266 "Use ADISC on rediscovery to authenticate FCP devices"); 1267 1268 /* 1269 # lpfc_ack0: Use ACK0, instead of ACK1 for class 2 acknowledgement. Value 1270 # range is [0,1]. Default value is 0. 1271 */ 1272 LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support"); 1273 1274 /* 1275 # lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing 1276 # cr_delay (msec) or cr_count outstanding commands. cr_delay can take 1277 # value [0,63]. cr_count can take value [1,255]. Default value of cr_delay 1278 # is 0. Default value of cr_count is 1. The cr_count feature is disabled if 1279 # cr_delay is set to 0. 1280 */ 1281 LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an " 1282 "interrupt response is generated"); 1283 1284 LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an " 1285 "interrupt response is generated"); 1286 1287 /* 1288 # lpfc_multi_ring_support: Determines how many rings to spread available 1289 # cmd/rsp IOCB entries across. 1290 # Value range is [1,2]. Default value is 1. 1291 */ 1292 LPFC_ATTR_R(multi_ring_support, 1, 1, 2, "Determines number of primary " 1293 "SLI rings to spread IOCB entries across"); 1294 1295 /* 1296 # lpfc_multi_ring_rctl: If lpfc_multi_ring_support is enabled, this 1297 # identifies what rctl value to configure the additional ring for. 1298 # Value range is [1,0xff]. Default value is 4 (Unsolicated Data). 1299 */ 1300 LPFC_ATTR_R(multi_ring_rctl, FC_UNSOL_DATA, 1, 1301 255, "Identifies RCTL for additional ring configuration"); 1302 1303 /* 1304 # lpfc_multi_ring_type: If lpfc_multi_ring_support is enabled, this 1305 # identifies what type value to configure the additional ring for. 1306 # Value range is [1,0xff]. Default value is 5 (LLC/SNAP). 1307 */ 1308 LPFC_ATTR_R(multi_ring_type, FC_LLC_SNAP, 1, 1309 255, "Identifies TYPE for additional ring configuration"); 1310 1311 /* 1312 # lpfc_fdmi_on: controls FDMI support. 1313 # 0 = no FDMI support 1314 # 1 = support FDMI without attribute of hostname 1315 # 2 = support FDMI with attribute of hostname 1316 # Value range [0,2]. Default value is 0. 1317 */ 1318 LPFC_ATTR_RW(fdmi_on, 0, 0, 2, "Enable FDMI support"); 1319 1320 /* 1321 # Specifies the maximum number of ELS cmds we can have outstanding (for 1322 # discovery). Value range is [1,64]. Default value = 32. 1323 */ 1324 LPFC_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands " 1325 "during discovery"); 1326 1327 /* 1328 # lpfc_max_luns: maximum allowed LUN. 1329 # Value range is [0,65535]. Default value is 255. 1330 # NOTE: The SCSI layer might probe all allowed LUN on some old targets. 1331 */ 1332 LPFC_ATTR_R(max_luns, 255, 0, 65535, 1333 "Maximum allowed LUN"); 1334 1335 /* 1336 # lpfc_poll_tmo: .Milliseconds driver will wait between polling FCP ring. 1337 # Value range is [1,255], default value is 10. 1338 */ 1339 LPFC_ATTR_RW(poll_tmo, 10, 1, 255, 1340 "Milliseconds driver will wait between polling FCP ring"); 1341 1342 /* 1343 # lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that 1344 # support this feature 1345 # 0 = MSI disabled (default) 1346 # 1 = MSI enabled 1347 # Value range is [0,1]. Default value is 0. 1348 */ 1349 LPFC_ATTR_R(use_msi, 0, 0, 1, "Use Message Signaled Interrupts, if possible"); 1350 1351 1352 1353 struct class_device_attribute *lpfc_hba_attrs[] = { 1354 &class_device_attr_info, 1355 &class_device_attr_serialnum, 1356 &class_device_attr_modeldesc, 1357 &class_device_attr_modelname, 1358 &class_device_attr_programtype, 1359 &class_device_attr_portnum, 1360 &class_device_attr_fwrev, 1361 &class_device_attr_hdw, 1362 &class_device_attr_option_rom_version, 1363 &class_device_attr_state, 1364 &class_device_attr_num_discovered_ports, 1365 &class_device_attr_lpfc_drvr_version, 1366 &class_device_attr_lpfc_log_verbose, 1367 &class_device_attr_lpfc_lun_queue_depth, 1368 &class_device_attr_lpfc_hba_queue_depth, 1369 &class_device_attr_lpfc_peer_port_login, 1370 &class_device_attr_lpfc_vport_restrict_login, 1371 &class_device_attr_lpfc_nodev_tmo, 1372 &class_device_attr_lpfc_devloss_tmo, 1373 &class_device_attr_lpfc_fcp_class, 1374 &class_device_attr_lpfc_use_adisc, 1375 &class_device_attr_lpfc_ack0, 1376 &class_device_attr_lpfc_topology, 1377 &class_device_attr_lpfc_scan_down, 1378 &class_device_attr_lpfc_link_speed, 1379 &class_device_attr_lpfc_cr_delay, 1380 &class_device_attr_lpfc_cr_count, 1381 &class_device_attr_lpfc_multi_ring_support, 1382 &class_device_attr_lpfc_multi_ring_rctl, 1383 &class_device_attr_lpfc_multi_ring_type, 1384 &class_device_attr_lpfc_fdmi_on, 1385 &class_device_attr_lpfc_max_luns, 1386 &class_device_attr_lpfc_npiv_enable, 1387 &class_device_attr_nport_evt_cnt, 1388 &class_device_attr_management_version, 1389 &class_device_attr_board_mode, 1390 &class_device_attr_max_vpi, 1391 &class_device_attr_used_vpi, 1392 &class_device_attr_max_rpi, 1393 &class_device_attr_used_rpi, 1394 &class_device_attr_max_xri, 1395 &class_device_attr_used_xri, 1396 &class_device_attr_npiv_info, 1397 &class_device_attr_issue_reset, 1398 &class_device_attr_lpfc_poll, 1399 &class_device_attr_lpfc_poll_tmo, 1400 &class_device_attr_lpfc_use_msi, 1401 &class_device_attr_lpfc_soft_wwnn, 1402 &class_device_attr_lpfc_soft_wwpn, 1403 &class_device_attr_lpfc_soft_wwn_enable, 1404 NULL, 1405 }; 1406 1407 static ssize_t 1408 sysfs_ctlreg_write(struct kobject *kobj, struct bin_attribute *bin_attr, 1409 char *buf, loff_t off, size_t count) 1410 { 1411 size_t buf_off; 1412 struct class_device *cdev = container_of(kobj, struct class_device, 1413 kobj); 1414 struct Scsi_Host *shost = class_to_shost(cdev); 1415 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1416 struct lpfc_hba *phba = vport->phba; 1417 1418 if ((off + count) > FF_REG_AREA_SIZE) 1419 return -ERANGE; 1420 1421 if (count == 0) return 0; 1422 1423 if (off % 4 || count % 4 || (unsigned long)buf % 4) 1424 return -EINVAL; 1425 1426 if (!(vport->fc_flag & FC_OFFLINE_MODE)) { 1427 return -EPERM; 1428 } 1429 1430 spin_lock_irq(&phba->hbalock); 1431 for (buf_off = 0; buf_off < count; buf_off += sizeof(uint32_t)) 1432 writel(*((uint32_t *)(buf + buf_off)), 1433 phba->ctrl_regs_memmap_p + off + buf_off); 1434 1435 spin_unlock_irq(&phba->hbalock); 1436 1437 return count; 1438 } 1439 1440 static ssize_t 1441 sysfs_ctlreg_read(struct kobject *kobj, struct bin_attribute *bin_attr, 1442 char *buf, loff_t off, size_t count) 1443 { 1444 size_t buf_off; 1445 uint32_t * tmp_ptr; 1446 struct class_device *cdev = container_of(kobj, struct class_device, 1447 kobj); 1448 struct Scsi_Host *shost = class_to_shost(cdev); 1449 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1450 struct lpfc_hba *phba = vport->phba; 1451 1452 if (off > FF_REG_AREA_SIZE) 1453 return -ERANGE; 1454 1455 if ((off + count) > FF_REG_AREA_SIZE) 1456 count = FF_REG_AREA_SIZE - off; 1457 1458 if (count == 0) return 0; 1459 1460 if (off % 4 || count % 4 || (unsigned long)buf % 4) 1461 return -EINVAL; 1462 1463 spin_lock_irq(&phba->hbalock); 1464 1465 for (buf_off = 0; buf_off < count; buf_off += sizeof(uint32_t)) { 1466 tmp_ptr = (uint32_t *)(buf + buf_off); 1467 *tmp_ptr = readl(phba->ctrl_regs_memmap_p + off + buf_off); 1468 } 1469 1470 spin_unlock_irq(&phba->hbalock); 1471 1472 return count; 1473 } 1474 1475 static struct bin_attribute sysfs_ctlreg_attr = { 1476 .attr = { 1477 .name = "ctlreg", 1478 .mode = S_IRUSR | S_IWUSR, 1479 }, 1480 .size = 256, 1481 .read = sysfs_ctlreg_read, 1482 .write = sysfs_ctlreg_write, 1483 }; 1484 1485 1486 static void 1487 sysfs_mbox_idle(struct lpfc_hba *phba) 1488 { 1489 phba->sysfs_mbox.state = SMBOX_IDLE; 1490 phba->sysfs_mbox.offset = 0; 1491 1492 if (phba->sysfs_mbox.mbox) { 1493 mempool_free(phba->sysfs_mbox.mbox, 1494 phba->mbox_mem_pool); 1495 phba->sysfs_mbox.mbox = NULL; 1496 } 1497 } 1498 1499 static ssize_t 1500 sysfs_mbox_write(struct kobject *kobj, struct bin_attribute *bin_attr, 1501 char *buf, loff_t off, size_t count) 1502 { 1503 struct class_device *cdev = container_of(kobj, struct class_device, 1504 kobj); 1505 struct Scsi_Host *shost = class_to_shost(cdev); 1506 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1507 struct lpfc_hba *phba = vport->phba; 1508 struct lpfcMboxq *mbox = NULL; 1509 1510 if ((count + off) > MAILBOX_CMD_SIZE) 1511 return -ERANGE; 1512 1513 if (off % 4 || count % 4 || (unsigned long)buf % 4) 1514 return -EINVAL; 1515 1516 if (count == 0) 1517 return 0; 1518 1519 if (off == 0) { 1520 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); 1521 if (!mbox) 1522 return -ENOMEM; 1523 memset(mbox, 0, sizeof (LPFC_MBOXQ_t)); 1524 } 1525 1526 spin_lock_irq(&phba->hbalock); 1527 1528 if (off == 0) { 1529 if (phba->sysfs_mbox.mbox) 1530 mempool_free(mbox, phba->mbox_mem_pool); 1531 else 1532 phba->sysfs_mbox.mbox = mbox; 1533 phba->sysfs_mbox.state = SMBOX_WRITING; 1534 } else { 1535 if (phba->sysfs_mbox.state != SMBOX_WRITING || 1536 phba->sysfs_mbox.offset != off || 1537 phba->sysfs_mbox.mbox == NULL) { 1538 sysfs_mbox_idle(phba); 1539 spin_unlock_irq(&phba->hbalock); 1540 return -EAGAIN; 1541 } 1542 } 1543 1544 memcpy((uint8_t *) & phba->sysfs_mbox.mbox->mb + off, 1545 buf, count); 1546 1547 phba->sysfs_mbox.offset = off + count; 1548 1549 spin_unlock_irq(&phba->hbalock); 1550 1551 return count; 1552 } 1553 1554 static ssize_t 1555 sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, 1556 char *buf, loff_t off, size_t count) 1557 { 1558 struct class_device *cdev = container_of(kobj, struct class_device, 1559 kobj); 1560 struct Scsi_Host *shost = class_to_shost(cdev); 1561 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1562 struct lpfc_hba *phba = vport->phba; 1563 int rc; 1564 1565 if (off > MAILBOX_CMD_SIZE) 1566 return -ERANGE; 1567 1568 if ((count + off) > MAILBOX_CMD_SIZE) 1569 count = MAILBOX_CMD_SIZE - off; 1570 1571 if (off % 4 || count % 4 || (unsigned long)buf % 4) 1572 return -EINVAL; 1573 1574 if (off && count == 0) 1575 return 0; 1576 1577 spin_lock_irq(&phba->hbalock); 1578 1579 if (off == 0 && 1580 phba->sysfs_mbox.state == SMBOX_WRITING && 1581 phba->sysfs_mbox.offset >= 2 * sizeof(uint32_t)) { 1582 1583 switch (phba->sysfs_mbox.mbox->mb.mbxCommand) { 1584 /* Offline only */ 1585 case MBX_WRITE_NV: 1586 case MBX_INIT_LINK: 1587 case MBX_DOWN_LINK: 1588 case MBX_CONFIG_LINK: 1589 case MBX_CONFIG_RING: 1590 case MBX_RESET_RING: 1591 case MBX_UNREG_LOGIN: 1592 case MBX_CLEAR_LA: 1593 case MBX_DUMP_CONTEXT: 1594 case MBX_RUN_DIAGS: 1595 case MBX_RESTART: 1596 case MBX_FLASH_WR_ULA: 1597 case MBX_SET_MASK: 1598 case MBX_SET_SLIM: 1599 case MBX_SET_DEBUG: 1600 if (!(vport->fc_flag & FC_OFFLINE_MODE)) { 1601 printk(KERN_WARNING "mbox_read:Command 0x%x " 1602 "is illegal in on-line state\n", 1603 phba->sysfs_mbox.mbox->mb.mbxCommand); 1604 sysfs_mbox_idle(phba); 1605 spin_unlock_irq(&phba->hbalock); 1606 return -EPERM; 1607 } 1608 case MBX_LOAD_SM: 1609 case MBX_READ_NV: 1610 case MBX_READ_CONFIG: 1611 case MBX_READ_RCONFIG: 1612 case MBX_READ_STATUS: 1613 case MBX_READ_XRI: 1614 case MBX_READ_REV: 1615 case MBX_READ_LNK_STAT: 1616 case MBX_DUMP_MEMORY: 1617 case MBX_DOWN_LOAD: 1618 case MBX_UPDATE_CFG: 1619 case MBX_KILL_BOARD: 1620 case MBX_LOAD_AREA: 1621 case MBX_LOAD_EXP_ROM: 1622 case MBX_BEACON: 1623 case MBX_DEL_LD_ENTRY: 1624 break; 1625 case MBX_READ_SPARM64: 1626 case MBX_READ_LA: 1627 case MBX_READ_LA64: 1628 case MBX_REG_LOGIN: 1629 case MBX_REG_LOGIN64: 1630 case MBX_CONFIG_PORT: 1631 case MBX_RUN_BIU_DIAG: 1632 printk(KERN_WARNING "mbox_read: Illegal Command 0x%x\n", 1633 phba->sysfs_mbox.mbox->mb.mbxCommand); 1634 sysfs_mbox_idle(phba); 1635 spin_unlock_irq(&phba->hbalock); 1636 return -EPERM; 1637 default: 1638 printk(KERN_WARNING "mbox_read: Unknown Command 0x%x\n", 1639 phba->sysfs_mbox.mbox->mb.mbxCommand); 1640 sysfs_mbox_idle(phba); 1641 spin_unlock_irq(&phba->hbalock); 1642 return -EPERM; 1643 } 1644 1645 phba->sysfs_mbox.mbox->vport = vport; 1646 1647 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) { 1648 sysfs_mbox_idle(phba); 1649 spin_unlock_irq(&phba->hbalock); 1650 return -EAGAIN; 1651 } 1652 1653 if ((vport->fc_flag & FC_OFFLINE_MODE) || 1654 (!(phba->sli.sli_flag & LPFC_SLI2_ACTIVE))){ 1655 1656 spin_unlock_irq(&phba->hbalock); 1657 rc = lpfc_sli_issue_mbox (phba, 1658 phba->sysfs_mbox.mbox, 1659 MBX_POLL); 1660 spin_lock_irq(&phba->hbalock); 1661 1662 } else { 1663 spin_unlock_irq(&phba->hbalock); 1664 rc = lpfc_sli_issue_mbox_wait (phba, 1665 phba->sysfs_mbox.mbox, 1666 lpfc_mbox_tmo_val(phba, 1667 phba->sysfs_mbox.mbox->mb.mbxCommand) * HZ); 1668 spin_lock_irq(&phba->hbalock); 1669 } 1670 1671 if (rc != MBX_SUCCESS) { 1672 if (rc == MBX_TIMEOUT) { 1673 phba->sysfs_mbox.mbox = NULL; 1674 } 1675 sysfs_mbox_idle(phba); 1676 spin_unlock_irq(&phba->hbalock); 1677 return (rc == MBX_TIMEOUT) ? -ETIME : -ENODEV; 1678 } 1679 phba->sysfs_mbox.state = SMBOX_READING; 1680 } 1681 else if (phba->sysfs_mbox.offset != off || 1682 phba->sysfs_mbox.state != SMBOX_READING) { 1683 printk(KERN_WARNING "mbox_read: Bad State\n"); 1684 sysfs_mbox_idle(phba); 1685 spin_unlock_irq(&phba->hbalock); 1686 return -EAGAIN; 1687 } 1688 1689 memcpy(buf, (uint8_t *) & phba->sysfs_mbox.mbox->mb + off, count); 1690 1691 phba->sysfs_mbox.offset = off + count; 1692 1693 if (phba->sysfs_mbox.offset == MAILBOX_CMD_SIZE) 1694 sysfs_mbox_idle(phba); 1695 1696 spin_unlock_irq(&phba->hbalock); 1697 1698 return count; 1699 } 1700 1701 static struct bin_attribute sysfs_mbox_attr = { 1702 .attr = { 1703 .name = "mbox", 1704 .mode = S_IRUSR | S_IWUSR, 1705 }, 1706 .size = MAILBOX_CMD_SIZE, 1707 .read = sysfs_mbox_read, 1708 .write = sysfs_mbox_write, 1709 }; 1710 1711 int 1712 lpfc_alloc_sysfs_attr(struct lpfc_vport *vport) 1713 { 1714 struct Scsi_Host *shost = lpfc_shost_from_vport(vport); 1715 int error; 1716 1717 error = sysfs_create_bin_file(&shost->shost_classdev.kobj, 1718 &sysfs_ctlreg_attr); 1719 if (error) 1720 goto out; 1721 1722 error = sysfs_create_bin_file(&shost->shost_classdev.kobj, 1723 &sysfs_mbox_attr); 1724 if (error) 1725 goto out_remove_ctlreg_attr; 1726 1727 return 0; 1728 out_remove_ctlreg_attr: 1729 sysfs_remove_bin_file(&shost->shost_classdev.kobj, &sysfs_ctlreg_attr); 1730 out: 1731 return error; 1732 } 1733 1734 void 1735 lpfc_free_sysfs_attr(struct lpfc_vport *vport) 1736 { 1737 struct Scsi_Host *shost = lpfc_shost_from_vport(vport); 1738 1739 sysfs_remove_bin_file(&shost->shost_classdev.kobj, &sysfs_mbox_attr); 1740 sysfs_remove_bin_file(&shost->shost_classdev.kobj, &sysfs_ctlreg_attr); 1741 } 1742 1743 1744 /* 1745 * Dynamic FC Host Attributes Support 1746 */ 1747 1748 static void 1749 lpfc_get_host_port_id(struct Scsi_Host *shost) 1750 { 1751 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1752 1753 /* note: fc_myDID already in cpu endianness */ 1754 fc_host_port_id(shost) = vport->fc_myDID; 1755 } 1756 1757 static void 1758 lpfc_get_host_port_type(struct Scsi_Host *shost) 1759 { 1760 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1761 struct lpfc_hba *phba = vport->phba; 1762 1763 spin_lock_irq(shost->host_lock); 1764 1765 if (vport->port_type == LPFC_NPIV_PORT) { 1766 fc_host_port_type(shost) = FC_PORTTYPE_NPIV; 1767 } else if (lpfc_is_link_up(phba)) { 1768 if (phba->fc_topology == TOPOLOGY_LOOP) { 1769 if (vport->fc_flag & FC_PUBLIC_LOOP) 1770 fc_host_port_type(shost) = FC_PORTTYPE_NLPORT; 1771 else 1772 fc_host_port_type(shost) = FC_PORTTYPE_LPORT; 1773 } else { 1774 if (vport->fc_flag & FC_FABRIC) 1775 fc_host_port_type(shost) = FC_PORTTYPE_NPORT; 1776 else 1777 fc_host_port_type(shost) = FC_PORTTYPE_PTP; 1778 } 1779 } else 1780 fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN; 1781 1782 spin_unlock_irq(shost->host_lock); 1783 } 1784 1785 static void 1786 lpfc_get_host_port_state(struct Scsi_Host *shost) 1787 { 1788 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1789 struct lpfc_hba *phba = vport->phba; 1790 1791 spin_lock_irq(shost->host_lock); 1792 1793 if (vport->fc_flag & FC_OFFLINE_MODE) 1794 fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; 1795 else { 1796 switch (phba->link_state) { 1797 case LPFC_LINK_UNKNOWN: 1798 case LPFC_LINK_DOWN: 1799 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN; 1800 break; 1801 case LPFC_LINK_UP: 1802 case LPFC_CLEAR_LA: 1803 case LPFC_HBA_READY: 1804 /* Links up, beyond this port_type reports state */ 1805 fc_host_port_state(shost) = FC_PORTSTATE_ONLINE; 1806 break; 1807 case LPFC_HBA_ERROR: 1808 fc_host_port_state(shost) = FC_PORTSTATE_ERROR; 1809 break; 1810 default: 1811 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; 1812 break; 1813 } 1814 } 1815 1816 spin_unlock_irq(shost->host_lock); 1817 } 1818 1819 static void 1820 lpfc_get_host_speed(struct Scsi_Host *shost) 1821 { 1822 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1823 struct lpfc_hba *phba = vport->phba; 1824 1825 spin_lock_irq(shost->host_lock); 1826 1827 if (lpfc_is_link_up(phba)) { 1828 switch(phba->fc_linkspeed) { 1829 case LA_1GHZ_LINK: 1830 fc_host_speed(shost) = FC_PORTSPEED_1GBIT; 1831 break; 1832 case LA_2GHZ_LINK: 1833 fc_host_speed(shost) = FC_PORTSPEED_2GBIT; 1834 break; 1835 case LA_4GHZ_LINK: 1836 fc_host_speed(shost) = FC_PORTSPEED_4GBIT; 1837 break; 1838 case LA_8GHZ_LINK: 1839 fc_host_speed(shost) = FC_PORTSPEED_8GBIT; 1840 break; 1841 default: 1842 fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; 1843 break; 1844 } 1845 } 1846 1847 spin_unlock_irq(shost->host_lock); 1848 } 1849 1850 static void 1851 lpfc_get_host_fabric_name (struct Scsi_Host *shost) 1852 { 1853 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1854 struct lpfc_hba *phba = vport->phba; 1855 u64 node_name; 1856 1857 spin_lock_irq(shost->host_lock); 1858 1859 if ((vport->fc_flag & FC_FABRIC) || 1860 ((phba->fc_topology == TOPOLOGY_LOOP) && 1861 (vport->fc_flag & FC_PUBLIC_LOOP))) 1862 node_name = wwn_to_u64(phba->fc_fabparam.nodeName.u.wwn); 1863 else 1864 /* fabric is local port if there is no F/FL_Port */ 1865 node_name = wwn_to_u64(vport->fc_nodename.u.wwn); 1866 1867 spin_unlock_irq(shost->host_lock); 1868 1869 fc_host_fabric_name(shost) = node_name; 1870 } 1871 1872 static struct fc_host_statistics * 1873 lpfc_get_stats(struct Scsi_Host *shost) 1874 { 1875 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1876 struct lpfc_hba *phba = vport->phba; 1877 struct lpfc_sli *psli = &phba->sli; 1878 struct fc_host_statistics *hs = &phba->link_stats; 1879 struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets; 1880 LPFC_MBOXQ_t *pmboxq; 1881 MAILBOX_t *pmb; 1882 unsigned long seconds; 1883 int rc = 0; 1884 1885 /* 1886 * prevent udev from issuing mailbox commands until the port is 1887 * configured. 1888 */ 1889 if (phba->link_state < LPFC_LINK_DOWN || 1890 !phba->mbox_mem_pool || 1891 (phba->sli.sli_flag & LPFC_SLI2_ACTIVE) == 0) 1892 return NULL; 1893 1894 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) 1895 return NULL; 1896 1897 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); 1898 if (!pmboxq) 1899 return NULL; 1900 memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); 1901 1902 pmb = &pmboxq->mb; 1903 pmb->mbxCommand = MBX_READ_STATUS; 1904 pmb->mbxOwner = OWN_HOST; 1905 pmboxq->context1 = NULL; 1906 pmboxq->vport = vport; 1907 1908 if ((vport->fc_flag & FC_OFFLINE_MODE) || 1909 (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) 1910 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); 1911 else 1912 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); 1913 1914 if (rc != MBX_SUCCESS) { 1915 if (rc != MBX_TIMEOUT) 1916 mempool_free(pmboxq, phba->mbox_mem_pool); 1917 return NULL; 1918 } 1919 1920 memset(hs, 0, sizeof (struct fc_host_statistics)); 1921 1922 hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt; 1923 hs->tx_words = (pmb->un.varRdStatus.xmitByteCnt * 256); 1924 hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt; 1925 hs->rx_words = (pmb->un.varRdStatus.rcvByteCnt * 256); 1926 1927 memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); 1928 pmb->mbxCommand = MBX_READ_LNK_STAT; 1929 pmb->mbxOwner = OWN_HOST; 1930 pmboxq->context1 = NULL; 1931 pmboxq->vport = vport; 1932 1933 if ((vport->fc_flag & FC_OFFLINE_MODE) || 1934 (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) 1935 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); 1936 else 1937 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); 1938 1939 if (rc != MBX_SUCCESS) { 1940 if (rc != MBX_TIMEOUT) 1941 mempool_free(pmboxq, phba->mbox_mem_pool); 1942 return NULL; 1943 } 1944 1945 hs->link_failure_count = pmb->un.varRdLnk.linkFailureCnt; 1946 hs->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt; 1947 hs->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt; 1948 hs->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt; 1949 hs->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord; 1950 hs->invalid_crc_count = pmb->un.varRdLnk.crcCnt; 1951 hs->error_frames = pmb->un.varRdLnk.crcCnt; 1952 1953 hs->link_failure_count -= lso->link_failure_count; 1954 hs->loss_of_sync_count -= lso->loss_of_sync_count; 1955 hs->loss_of_signal_count -= lso->loss_of_signal_count; 1956 hs->prim_seq_protocol_err_count -= lso->prim_seq_protocol_err_count; 1957 hs->invalid_tx_word_count -= lso->invalid_tx_word_count; 1958 hs->invalid_crc_count -= lso->invalid_crc_count; 1959 hs->error_frames -= lso->error_frames; 1960 1961 if (phba->fc_topology == TOPOLOGY_LOOP) { 1962 hs->lip_count = (phba->fc_eventTag >> 1); 1963 hs->lip_count -= lso->link_events; 1964 hs->nos_count = -1; 1965 } else { 1966 hs->lip_count = -1; 1967 hs->nos_count = (phba->fc_eventTag >> 1); 1968 hs->nos_count -= lso->link_events; 1969 } 1970 1971 hs->dumped_frames = -1; 1972 1973 seconds = get_seconds(); 1974 if (seconds < psli->stats_start) 1975 hs->seconds_since_last_reset = seconds + 1976 ((unsigned long)-1 - psli->stats_start); 1977 else 1978 hs->seconds_since_last_reset = seconds - psli->stats_start; 1979 1980 mempool_free(pmboxq, phba->mbox_mem_pool); 1981 1982 return hs; 1983 } 1984 1985 static void 1986 lpfc_reset_stats(struct Scsi_Host *shost) 1987 { 1988 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 1989 struct lpfc_hba *phba = vport->phba; 1990 struct lpfc_sli *psli = &phba->sli; 1991 struct lpfc_lnk_stat *lso = &psli->lnk_stat_offsets; 1992 LPFC_MBOXQ_t *pmboxq; 1993 MAILBOX_t *pmb; 1994 int rc = 0; 1995 1996 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) 1997 return; 1998 1999 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); 2000 if (!pmboxq) 2001 return; 2002 memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t)); 2003 2004 pmb = &pmboxq->mb; 2005 pmb->mbxCommand = MBX_READ_STATUS; 2006 pmb->mbxOwner = OWN_HOST; 2007 pmb->un.varWords[0] = 0x1; /* reset request */ 2008 pmboxq->context1 = NULL; 2009 pmboxq->vport = vport; 2010 2011 if ((vport->fc_flag & FC_OFFLINE_MODE) || 2012 (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) 2013 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); 2014 else 2015 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); 2016 2017 if (rc != MBX_SUCCESS) { 2018 if (rc != MBX_TIMEOUT) 2019 mempool_free(pmboxq, phba->mbox_mem_pool); 2020 return; 2021 } 2022 2023 memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t)); 2024 pmb->mbxCommand = MBX_READ_LNK_STAT; 2025 pmb->mbxOwner = OWN_HOST; 2026 pmboxq->context1 = NULL; 2027 pmboxq->vport = vport; 2028 2029 if ((vport->fc_flag & FC_OFFLINE_MODE) || 2030 (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) 2031 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); 2032 else 2033 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); 2034 2035 if (rc != MBX_SUCCESS) { 2036 if (rc != MBX_TIMEOUT) 2037 mempool_free( pmboxq, phba->mbox_mem_pool); 2038 return; 2039 } 2040 2041 lso->link_failure_count = pmb->un.varRdLnk.linkFailureCnt; 2042 lso->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt; 2043 lso->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt; 2044 lso->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt; 2045 lso->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord; 2046 lso->invalid_crc_count = pmb->un.varRdLnk.crcCnt; 2047 lso->error_frames = pmb->un.varRdLnk.crcCnt; 2048 lso->link_events = (phba->fc_eventTag >> 1); 2049 2050 psli->stats_start = get_seconds(); 2051 2052 mempool_free(pmboxq, phba->mbox_mem_pool); 2053 2054 return; 2055 } 2056 2057 /* 2058 * The LPFC driver treats linkdown handling as target loss events so there 2059 * are no sysfs handlers for link_down_tmo. 2060 */ 2061 2062 static struct lpfc_nodelist * 2063 lpfc_get_node_by_target(struct scsi_target *starget) 2064 { 2065 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); 2066 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; 2067 struct lpfc_nodelist *ndlp; 2068 2069 spin_lock_irq(shost->host_lock); 2070 /* Search for this, mapped, target ID */ 2071 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { 2072 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE && 2073 starget->id == ndlp->nlp_sid) { 2074 spin_unlock_irq(shost->host_lock); 2075 return ndlp; 2076 } 2077 } 2078 spin_unlock_irq(shost->host_lock); 2079 return NULL; 2080 } 2081 2082 static void 2083 lpfc_get_starget_port_id(struct scsi_target *starget) 2084 { 2085 struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget); 2086 2087 fc_starget_port_id(starget) = ndlp ? ndlp->nlp_DID : -1; 2088 } 2089 2090 static void 2091 lpfc_get_starget_node_name(struct scsi_target *starget) 2092 { 2093 struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget); 2094 2095 fc_starget_node_name(starget) = 2096 ndlp ? wwn_to_u64(ndlp->nlp_nodename.u.wwn) : 0; 2097 } 2098 2099 static void 2100 lpfc_get_starget_port_name(struct scsi_target *starget) 2101 { 2102 struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget); 2103 2104 fc_starget_port_name(starget) = 2105 ndlp ? wwn_to_u64(ndlp->nlp_portname.u.wwn) : 0; 2106 } 2107 2108 static void 2109 lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) 2110 { 2111 if (timeout) 2112 rport->dev_loss_tmo = timeout; 2113 else 2114 rport->dev_loss_tmo = 1; 2115 } 2116 2117 2118 #define lpfc_rport_show_function(field, format_string, sz, cast) \ 2119 static ssize_t \ 2120 lpfc_show_rport_##field (struct class_device *cdev, char *buf) \ 2121 { \ 2122 struct fc_rport *rport = transport_class_to_rport(cdev); \ 2123 struct lpfc_rport_data *rdata = rport->hostdata; \ 2124 return snprintf(buf, sz, format_string, \ 2125 (rdata->target) ? cast rdata->target->field : 0); \ 2126 } 2127 2128 #define lpfc_rport_rd_attr(field, format_string, sz) \ 2129 lpfc_rport_show_function(field, format_string, sz, ) \ 2130 static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL) 2131 2132 2133 struct fc_function_template lpfc_transport_functions = { 2134 /* fixed attributes the driver supports */ 2135 .show_host_node_name = 1, 2136 .show_host_port_name = 1, 2137 .show_host_supported_classes = 1, 2138 .show_host_supported_fc4s = 1, 2139 .show_host_supported_speeds = 1, 2140 .show_host_maxframe_size = 1, 2141 2142 /* dynamic attributes the driver supports */ 2143 .get_host_port_id = lpfc_get_host_port_id, 2144 .show_host_port_id = 1, 2145 2146 .get_host_port_type = lpfc_get_host_port_type, 2147 .show_host_port_type = 1, 2148 2149 .get_host_port_state = lpfc_get_host_port_state, 2150 .show_host_port_state = 1, 2151 2152 /* active_fc4s is shown but doesn't change (thus no get function) */ 2153 .show_host_active_fc4s = 1, 2154 2155 .get_host_speed = lpfc_get_host_speed, 2156 .show_host_speed = 1, 2157 2158 .get_host_fabric_name = lpfc_get_host_fabric_name, 2159 .show_host_fabric_name = 1, 2160 2161 /* 2162 * The LPFC driver treats linkdown handling as target loss events 2163 * so there are no sysfs handlers for link_down_tmo. 2164 */ 2165 2166 .get_fc_host_stats = lpfc_get_stats, 2167 .reset_fc_host_stats = lpfc_reset_stats, 2168 2169 .dd_fcrport_size = sizeof(struct lpfc_rport_data), 2170 .show_rport_maxframe_size = 1, 2171 .show_rport_supported_classes = 1, 2172 2173 .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo, 2174 .show_rport_dev_loss_tmo = 1, 2175 2176 .get_starget_port_id = lpfc_get_starget_port_id, 2177 .show_starget_port_id = 1, 2178 2179 .get_starget_node_name = lpfc_get_starget_node_name, 2180 .show_starget_node_name = 1, 2181 2182 .get_starget_port_name = lpfc_get_starget_port_name, 2183 .show_starget_port_name = 1, 2184 2185 .issue_fc_host_lip = lpfc_issue_lip, 2186 .dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk, 2187 .terminate_rport_io = lpfc_terminate_rport_io, 2188 2189 .vport_create = lpfc_vport_create, 2190 .vport_delete = lpfc_vport_delete, 2191 .dd_fcvport_size = sizeof(struct lpfc_vport *), 2192 }; 2193 2194 struct fc_function_template lpfc_vport_transport_functions = { 2195 /* fixed attributes the driver supports */ 2196 .show_host_node_name = 1, 2197 .show_host_port_name = 1, 2198 .show_host_supported_classes = 1, 2199 .show_host_supported_fc4s = 1, 2200 .show_host_supported_speeds = 1, 2201 .show_host_maxframe_size = 1, 2202 2203 /* dynamic attributes the driver supports */ 2204 .get_host_port_id = lpfc_get_host_port_id, 2205 .show_host_port_id = 1, 2206 2207 .get_host_port_type = lpfc_get_host_port_type, 2208 .show_host_port_type = 1, 2209 2210 .get_host_port_state = lpfc_get_host_port_state, 2211 .show_host_port_state = 1, 2212 2213 /* active_fc4s is shown but doesn't change (thus no get function) */ 2214 .show_host_active_fc4s = 1, 2215 2216 .get_host_speed = lpfc_get_host_speed, 2217 .show_host_speed = 1, 2218 2219 .get_host_fabric_name = lpfc_get_host_fabric_name, 2220 .show_host_fabric_name = 1, 2221 2222 /* 2223 * The LPFC driver treats linkdown handling as target loss events 2224 * so there are no sysfs handlers for link_down_tmo. 2225 */ 2226 2227 .get_fc_host_stats = lpfc_get_stats, 2228 .reset_fc_host_stats = lpfc_reset_stats, 2229 2230 .dd_fcrport_size = sizeof(struct lpfc_rport_data), 2231 .show_rport_maxframe_size = 1, 2232 .show_rport_supported_classes = 1, 2233 2234 .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo, 2235 .show_rport_dev_loss_tmo = 1, 2236 2237 .get_starget_port_id = lpfc_get_starget_port_id, 2238 .show_starget_port_id = 1, 2239 2240 .get_starget_node_name = lpfc_get_starget_node_name, 2241 .show_starget_node_name = 1, 2242 2243 .get_starget_port_name = lpfc_get_starget_port_name, 2244 .show_starget_port_name = 1, 2245 2246 .issue_fc_host_lip = lpfc_issue_lip, 2247 .dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk, 2248 .terminate_rport_io = lpfc_terminate_rport_io, 2249 2250 .vport_disable = lpfc_vport_disable, 2251 }; 2252 2253 void 2254 lpfc_get_cfgparam(struct lpfc_hba *phba) 2255 { 2256 lpfc_log_verbose_init(phba, lpfc_log_verbose); 2257 lpfc_cr_delay_init(phba, lpfc_cr_delay); 2258 lpfc_cr_count_init(phba, lpfc_cr_count); 2259 lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support); 2260 lpfc_multi_ring_rctl_init(phba, lpfc_multi_ring_rctl); 2261 lpfc_multi_ring_type_init(phba, lpfc_multi_ring_type); 2262 lpfc_lun_queue_depth_init(phba, lpfc_lun_queue_depth); 2263 lpfc_fcp_class_init(phba, lpfc_fcp_class); 2264 lpfc_use_adisc_init(phba, lpfc_use_adisc); 2265 lpfc_ack0_init(phba, lpfc_ack0); 2266 lpfc_topology_init(phba, lpfc_topology); 2267 lpfc_scan_down_init(phba, lpfc_scan_down); 2268 lpfc_link_speed_init(phba, lpfc_link_speed); 2269 lpfc_fdmi_on_init(phba, lpfc_fdmi_on); 2270 lpfc_discovery_threads_init(phba, lpfc_discovery_threads); 2271 lpfc_max_luns_init(phba, lpfc_max_luns); 2272 lpfc_poll_tmo_init(phba, lpfc_poll_tmo); 2273 lpfc_peer_port_login_init(phba, lpfc_peer_port_login); 2274 lpfc_npiv_enable_init(phba, lpfc_npiv_enable); 2275 lpfc_vport_restrict_login_init(phba, lpfc_vport_restrict_login); 2276 lpfc_use_msi_init(phba, lpfc_use_msi); 2277 lpfc_devloss_tmo_init(phba, lpfc_devloss_tmo); 2278 lpfc_nodev_tmo_init(phba, lpfc_nodev_tmo); 2279 phba->cfg_poll = lpfc_poll; 2280 phba->cfg_soft_wwnn = 0L; 2281 phba->cfg_soft_wwpn = 0L; 2282 2283 /* 2284 * The total number of segments is the configuration value plus 2 2285 * since the IOCB need a command and response bde. 2286 */ 2287 phba->cfg_sg_seg_cnt = LPFC_SG_SEG_CNT + 2; 2288 2289 /* 2290 * Since the sg_tablesize is module parameter, the sg_dma_buf_size 2291 * used to create the sg_dma_buf_pool must be dynamically calculated 2292 */ 2293 phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + 2294 sizeof(struct fcp_rsp) + 2295 (phba->cfg_sg_seg_cnt * sizeof(struct ulp_bde64)); 2296 2297 2298 lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth); 2299 2300 return; 2301 } 2302