aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc/lpfc_ct.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_ct.c')
-rw-r--r--drivers/scsi/lpfc/lpfc_ct.c225
1 files changed, 105 insertions, 120 deletions
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c
index 34a9e3bb2614..dc25a53524c4 100644
--- a/drivers/scsi/lpfc/lpfc_ct.c
+++ b/drivers/scsi/lpfc/lpfc_ct.c
@@ -59,13 +59,13 @@ static char *lpfc_release_version = LPFC_DRIVER_VERSION;
59 * lpfc_ct_unsol_event 59 * lpfc_ct_unsol_event
60 */ 60 */
61void 61void
62lpfc_ct_unsol_event(struct lpfc_hba * phba, 62lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
63 struct lpfc_sli_ring * pring, struct lpfc_iocbq * piocbq) 63 struct lpfc_iocbq *piocbq)
64{ 64{
65 65
66 struct lpfc_iocbq *next_piocbq; 66 struct lpfc_iocbq *next_piocbq;
67 struct lpfc_dmabuf *pmbuf = NULL; 67 struct lpfc_dmabuf *pmbuf = NULL;
68 struct lpfc_dmabuf *matp, *next_matp; 68 struct lpfc_dmabuf *matp = NULL, *next_matp;
69 uint32_t ctx = 0, size = 0, cnt = 0; 69 uint32_t ctx = 0, size = 0, cnt = 0;
70 IOCB_t *icmd = &piocbq->iocb; 70 IOCB_t *icmd = &piocbq->iocb;
71 IOCB_t *save_icmd = icmd; 71 IOCB_t *save_icmd = icmd;
@@ -145,7 +145,7 @@ ct_unsol_event_exit_piocbq:
145} 145}
146 146
147static void 147static void
148lpfc_free_ct_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mlist) 148lpfc_free_ct_rsp(struct lpfc_hba *phba, struct lpfc_dmabuf *mlist)
149{ 149{
150 struct lpfc_dmabuf *mlast, *next_mlast; 150 struct lpfc_dmabuf *mlast, *next_mlast;
151 151
@@ -160,7 +160,7 @@ lpfc_free_ct_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mlist)
160} 160}
161 161
162static struct lpfc_dmabuf * 162static struct lpfc_dmabuf *
163lpfc_alloc_ct_rsp(struct lpfc_hba * phba, int cmdcode, struct ulp_bde64 * bpl, 163lpfc_alloc_ct_rsp(struct lpfc_hba *phba, int cmdcode, struct ulp_bde64 *bpl,
164 uint32_t size, int *entries) 164 uint32_t size, int *entries)
165{ 165{
166 struct lpfc_dmabuf *mlist = NULL; 166 struct lpfc_dmabuf *mlist = NULL;
@@ -216,23 +216,21 @@ lpfc_alloc_ct_rsp(struct lpfc_hba * phba, int cmdcode, struct ulp_bde64 * bpl,
216} 216}
217 217
218static int 218static int
219lpfc_gen_req(struct lpfc_hba *phba, struct lpfc_dmabuf *bmp, 219lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
220 struct lpfc_dmabuf *inp, struct lpfc_dmabuf *outp, 220 struct lpfc_dmabuf *inp, struct lpfc_dmabuf *outp,
221 void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *, 221 void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
222 struct lpfc_iocbq *), 222 struct lpfc_iocbq *),
223 struct lpfc_nodelist *ndlp, uint32_t usr_flg, uint32_t num_entry, 223 struct lpfc_nodelist *ndlp, uint32_t usr_flg, uint32_t num_entry,
224 uint32_t tmo) 224 uint32_t tmo)
225{ 225{
226 226 struct lpfc_hba *phba = vport->phba;
227 struct lpfc_sli *psli = &phba->sli; 227 struct lpfc_sli *psli = &phba->sli;
228 struct lpfc_sli_ring *pring = &psli->ring[LPFC_ELS_RING]; 228 struct lpfc_sli_ring *pring = &psli->ring[LPFC_ELS_RING];
229 IOCB_t *icmd; 229 IOCB_t *icmd;
230 struct lpfc_iocbq *geniocb; 230 struct lpfc_iocbq *geniocb;
231 231
232 /* Allocate buffer for command iocb */ 232 /* Allocate buffer for command iocb */
233 spin_lock_irq(phba->host->host_lock);
234 geniocb = lpfc_sli_get_iocbq(phba); 233 geniocb = lpfc_sli_get_iocbq(phba);
235 spin_unlock_irq(phba->host->host_lock);
236 234
237 if (geniocb == NULL) 235 if (geniocb == NULL)
238 return 1; 236 return 1;
@@ -276,27 +274,26 @@ lpfc_gen_req(struct lpfc_hba *phba, struct lpfc_dmabuf *bmp,
276 lpfc_printf_log(phba, KERN_INFO, LOG_ELS, 274 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
277 "%d:0119 Issue GEN REQ IOCB for NPORT x%x " 275 "%d:0119 Issue GEN REQ IOCB for NPORT x%x "
278 "Data: x%x x%x\n", phba->brd_no, icmd->un.ulpWord[5], 276 "Data: x%x x%x\n", phba->brd_no, icmd->un.ulpWord[5],
279 icmd->ulpIoTag, phba->hba_state); 277 icmd->ulpIoTag, vport->port_state);
280 geniocb->iocb_cmpl = cmpl; 278 geniocb->iocb_cmpl = cmpl;
281 geniocb->drvrTimeout = icmd->ulpTimeout + LPFC_DRVR_TIMEOUT; 279 geniocb->drvrTimeout = icmd->ulpTimeout + LPFC_DRVR_TIMEOUT;
282 spin_lock_irq(phba->host->host_lock); 280 geniocb->vport = vport;
283 if (lpfc_sli_issue_iocb(phba, pring, geniocb, 0) == IOCB_ERROR) { 281 if (lpfc_sli_issue_iocb(phba, pring, geniocb, 0) == IOCB_ERROR) {
284 lpfc_sli_release_iocbq(phba, geniocb); 282 lpfc_sli_release_iocbq(phba, geniocb);
285 spin_unlock_irq(phba->host->host_lock);
286 return 1; 283 return 1;
287 } 284 }
288 spin_unlock_irq(phba->host->host_lock);
289 285
290 return 0; 286 return 0;
291} 287}
292 288
293static int 289static int
294lpfc_ct_cmd(struct lpfc_hba *phba, struct lpfc_dmabuf *inmp, 290lpfc_ct_cmd(struct lpfc_vport *vport, struct lpfc_dmabuf *inmp,
295 struct lpfc_dmabuf *bmp, struct lpfc_nodelist *ndlp, 291 struct lpfc_dmabuf *bmp, struct lpfc_nodelist *ndlp,
296 void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *, 292 void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
297 struct lpfc_iocbq *), 293 struct lpfc_iocbq *),
298 uint32_t rsp_size) 294 uint32_t rsp_size)
299{ 295{
296 struct lpfc_hba *phba = vport->phba;
300 struct ulp_bde64 *bpl = (struct ulp_bde64 *) bmp->virt; 297 struct ulp_bde64 *bpl = (struct ulp_bde64 *) bmp->virt;
301 struct lpfc_dmabuf *outmp; 298 struct lpfc_dmabuf *outmp;
302 int cnt = 0, status; 299 int cnt = 0, status;
@@ -310,7 +307,7 @@ lpfc_ct_cmd(struct lpfc_hba *phba, struct lpfc_dmabuf *inmp,
310 if (!outmp) 307 if (!outmp)
311 return -ENOMEM; 308 return -ENOMEM;
312 309
313 status = lpfc_gen_req(phba, bmp, inmp, outmp, cmpl, ndlp, 0, 310 status = lpfc_gen_req(vport, bmp, inmp, outmp, cmpl, ndlp, 0,
314 cnt+1, 0); 311 cnt+1, 0);
315 if (status) { 312 if (status) {
316 lpfc_free_ct_rsp(phba, outmp); 313 lpfc_free_ct_rsp(phba, outmp);
@@ -320,19 +317,20 @@ lpfc_ct_cmd(struct lpfc_hba *phba, struct lpfc_dmabuf *inmp,
320} 317}
321 318
322static int 319static int
323lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size) 320lpfc_ns_rsp(struct lpfc_vport *vport, struct lpfc_dmabuf *mp, uint32_t Size)
324{ 321{
322 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
323 struct lpfc_hba *phba = vport->phba;
325 struct lpfc_sli_ct_request *Response = 324 struct lpfc_sli_ct_request *Response =
326 (struct lpfc_sli_ct_request *) mp->virt; 325 (struct lpfc_sli_ct_request *) mp->virt;
327 struct lpfc_nodelist *ndlp = NULL; 326 struct lpfc_nodelist *ndlp = NULL;
328 struct lpfc_dmabuf *mlast, *next_mp; 327 struct lpfc_dmabuf *mlast, *next_mp;
329 uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType; 328 uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType;
330 uint32_t Did; 329 uint32_t Did, CTentry;
331 uint32_t CTentry;
332 int Cnt; 330 int Cnt;
333 struct list_head head; 331 struct list_head head;
334 332
335 lpfc_set_disctmo(phba); 333 lpfc_set_disctmo(vport);
336 334
337 335
338 list_add_tail(&head, &mp->list); 336 list_add_tail(&head, &mp->list);
@@ -350,39 +348,31 @@ lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size)
350 348
351 /* Loop through entire NameServer list of DIDs */ 349 /* Loop through entire NameServer list of DIDs */
352 while (Cnt >= sizeof (uint32_t)) { 350 while (Cnt >= sizeof (uint32_t)) {
353
354 /* Get next DID from NameServer List */ 351 /* Get next DID from NameServer List */
355 CTentry = *ctptr++; 352 CTentry = *ctptr++;
356 Did = ((be32_to_cpu(CTentry)) & Mask_DID); 353 Did = ((be32_to_cpu(CTentry)) & Mask_DID);
357
358 ndlp = NULL; 354 ndlp = NULL;
359 if (Did != phba->fc_myDID) { 355 /* Check for rscn processing or not */
360 /* Check for rscn processing or not */ 356 if (Did != vport->fc_myDID)
361 ndlp = lpfc_setup_disc_node(phba, Did); 357 ndlp = lpfc_setup_disc_node(vport, Did);
362 }
363 /* Mark all node table entries that are in the
364 Nameserver */
365 if (ndlp) { 358 if (ndlp) {
366 /* NameServer Rsp */
367 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, 359 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
368 "%d:0238 Process x%x NameServer" 360 "%d:0238 Process x%x NameServer"
369 " Rsp Data: x%x x%x x%x\n", 361 " Rsp Data: x%x x%x x%x\n",
370 phba->brd_no, 362 phba->brd_no,
371 Did, ndlp->nlp_flag, 363 Did, ndlp->nlp_flag,
372 phba->fc_flag, 364 vport->fc_flag,
373 phba->fc_rscn_id_cnt); 365 vport->fc_rscn_id_cnt);
374 } else { 366 } else {
375 /* NameServer Rsp */
376 lpfc_printf_log(phba, 367 lpfc_printf_log(phba,
377 KERN_INFO, 368 KERN_INFO,
378 LOG_DISCOVERY, 369 LOG_DISCOVERY,
379 "%d:0239 Skip x%x NameServer " 370 "%d:0239 Skip x%x NameServer "
380 "Rsp Data: x%x x%x x%x\n", 371 "Rsp Data: x%x x%x x%x\n",
381 phba->brd_no, 372 phba->brd_no,
382 Did, Size, phba->fc_flag, 373 Did, Size, vport->fc_flag,
383 phba->fc_rscn_id_cnt); 374 vport->fc_rscn_id_cnt);
384 } 375 }
385
386 if (CTentry & (be32_to_cpu(SLI_CT_LAST_ENTRY))) 376 if (CTentry & (be32_to_cpu(SLI_CT_LAST_ENTRY)))
387 goto nsout1; 377 goto nsout1;
388 Cnt -= sizeof (uint32_t); 378 Cnt -= sizeof (uint32_t);
@@ -395,15 +385,15 @@ nsout1:
395 list_del(&head); 385 list_del(&head);
396 386
397 /* 387 /*
398 * The driver has cycled through all Nports in the RSCN payload. 388 * The driver has cycled through all Nports in the RSCN payload.
399 * Complete the handling by cleaning up and marking the 389 * Complete the handling by cleaning up and marking the
400 * current driver state. 390 * current driver state.
401 */ 391 */
402 if (phba->hba_state == LPFC_HBA_READY) { 392 if (vport->port_state == LPFC_VPORT_READY) {
403 lpfc_els_flush_rscn(phba); 393 lpfc_els_flush_rscn(vport);
404 spin_lock_irq(phba->host->host_lock); 394 spin_lock_irq(shost->host_lock);
405 phba->fc_flag |= FC_RSCN_MODE; /* we are still in RSCN mode */ 395 vport->fc_flag |= FC_RSCN_MODE; /* we are still in RSCN mode */
406 spin_unlock_irq(phba->host->host_lock); 396 spin_unlock_irq(shost->host_lock);
407 } 397 }
408 return 0; 398 return 0;
409} 399}
@@ -412,18 +402,18 @@ nsout1:
412 402
413 403
414static void 404static void
415lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, 405lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
416 struct lpfc_iocbq * rspiocb) 406 struct lpfc_iocbq *rspiocb)
417{ 407{
408 struct lpfc_vport *vport = cmdiocb->vport;
418 IOCB_t *irsp; 409 IOCB_t *irsp;
419 struct lpfc_sli *psli;
420 struct lpfc_dmabuf *bmp; 410 struct lpfc_dmabuf *bmp;
421 struct lpfc_dmabuf *inp; 411 struct lpfc_dmabuf *inp;
422 struct lpfc_dmabuf *outp; 412 struct lpfc_dmabuf *outp;
423 struct lpfc_nodelist *ndlp; 413 struct lpfc_nodelist *ndlp;
424 struct lpfc_sli_ct_request *CTrsp; 414 struct lpfc_sli_ct_request *CTrsp;
415 int rc;
425 416
426 psli = &phba->sli;
427 /* we pass cmdiocb to state machine which needs rspiocb as well */ 417 /* we pass cmdiocb to state machine which needs rspiocb as well */
428 cmdiocb->context_un.rsp_iocb = rspiocb; 418 cmdiocb->context_un.rsp_iocb = rspiocb;
429 419
@@ -435,22 +425,20 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
435 if (irsp->ulpStatus) { 425 if (irsp->ulpStatus) {
436 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && 426 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
437 ((irsp->un.ulpWord[4] == IOERR_SLI_DOWN) || 427 ((irsp->un.ulpWord[4] == IOERR_SLI_DOWN) ||
438 (irsp->un.ulpWord[4] == IOERR_SLI_ABORTED))) { 428 (irsp->un.ulpWord[4] == IOERR_SLI_ABORTED)))
439 goto out; 429 goto out;
440 }
441 430
442 /* Check for retry */ 431 /* Check for retry */
443 if (phba->fc_ns_retry < LPFC_MAX_NS_RETRY) { 432 if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) {
444 phba->fc_ns_retry++; 433 vport->fc_ns_retry++;
445 /* CT command is being retried */ 434 /* CT command is being retried */
446 ndlp = lpfc_findnode_did(phba, NameServer_DID); 435 ndlp = lpfc_findnode_did(vport, NameServer_DID);
447 if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { 436 if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
448 if (lpfc_ns_cmd(phba, ndlp, SLI_CTNS_GID_FT) == 437 rc = lpfc_ns_cmd(vport, ndlp, SLI_CTNS_GID_FT);
449 0) { 438 if (rc == 0)
450 goto out; 439 goto out;
451 } 440 }
452 } 441 }
453 }
454 } else { 442 } else {
455 /* Good status, continue checking */ 443 /* Good status, continue checking */
456 CTrsp = (struct lpfc_sli_ct_request *) outp->virt; 444 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
@@ -460,8 +448,8 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
460 "%d:0208 NameServer Rsp " 448 "%d:0208 NameServer Rsp "
461 "Data: x%x\n", 449 "Data: x%x\n",
462 phba->brd_no, 450 phba->brd_no,
463 phba->fc_flag); 451 vport->fc_flag);
464 lpfc_ns_rsp(phba, outp, 452 lpfc_ns_rsp(vport, outp,
465 (uint32_t) (irsp->un.genreq64.bdl.bdeSize)); 453 (uint32_t) (irsp->un.genreq64.bdl.bdeSize));
466 } else if (CTrsp->CommandResponse.bits.CmdRsp == 454 } else if (CTrsp->CommandResponse.bits.CmdRsp ==
467 be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) { 455 be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) {
@@ -473,7 +461,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
473 CTrsp->CommandResponse.bits.CmdRsp, 461 CTrsp->CommandResponse.bits.CmdRsp,
474 (uint32_t) CTrsp->ReasonCode, 462 (uint32_t) CTrsp->ReasonCode,
475 (uint32_t) CTrsp->Explanation, 463 (uint32_t) CTrsp->Explanation,
476 phba->fc_flag); 464 vport->fc_flag);
477 } else { 465 } else {
478 /* NameServer Rsp Error */ 466 /* NameServer Rsp Error */
479 lpfc_printf_log(phba, 467 lpfc_printf_log(phba,
@@ -485,35 +473,31 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
485 CTrsp->CommandResponse.bits.CmdRsp, 473 CTrsp->CommandResponse.bits.CmdRsp,
486 (uint32_t) CTrsp->ReasonCode, 474 (uint32_t) CTrsp->ReasonCode,
487 (uint32_t) CTrsp->Explanation, 475 (uint32_t) CTrsp->Explanation,
488 phba->fc_flag); 476 vport->fc_flag);
489 } 477 }
490 } 478 }
491 /* Link up / RSCN discovery */ 479 /* Link up / RSCN discovery */
492 lpfc_disc_start(phba); 480 lpfc_disc_start(vport);
493out: 481out:
494 lpfc_free_ct_rsp(phba, outp); 482 lpfc_free_ct_rsp(phba, outp);
495 lpfc_mbuf_free(phba, inp->virt, inp->phys); 483 lpfc_mbuf_free(phba, inp->virt, inp->phys);
496 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); 484 lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
497 kfree(inp); 485 kfree(inp);
498 kfree(bmp); 486 kfree(bmp);
499 spin_lock_irq(phba->host->host_lock);
500 lpfc_sli_release_iocbq(phba, cmdiocb); 487 lpfc_sli_release_iocbq(phba, cmdiocb);
501 spin_unlock_irq(phba->host->host_lock);
502 return; 488 return;
503} 489}
504 490
505static void 491static void
506lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, 492lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
507 struct lpfc_iocbq * rspiocb) 493 struct lpfc_iocbq *rspiocb)
508{ 494{
509 struct lpfc_sli *psli;
510 struct lpfc_dmabuf *bmp; 495 struct lpfc_dmabuf *bmp;
511 struct lpfc_dmabuf *inp; 496 struct lpfc_dmabuf *inp;
512 struct lpfc_dmabuf *outp; 497 struct lpfc_dmabuf *outp;
513 IOCB_t *irsp; 498 IOCB_t *irsp;
514 struct lpfc_sli_ct_request *CTrsp; 499 struct lpfc_sli_ct_request *CTrsp;
515 500
516 psli = &phba->sli;
517 /* we pass cmdiocb to state machine which needs rspiocb as well */ 501 /* we pass cmdiocb to state machine which needs rspiocb as well */
518 cmdiocb->context_un.rsp_iocb = rspiocb; 502 cmdiocb->context_un.rsp_iocb = rspiocb;
519 503
@@ -527,31 +511,31 @@ lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
527 /* RFT request completes status <ulpStatus> CmdRsp <CmdRsp> */ 511 /* RFT request completes status <ulpStatus> CmdRsp <CmdRsp> */
528 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, 512 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
529 "%d:0209 RFT request completes ulpStatus x%x " 513 "%d:0209 RFT request completes ulpStatus x%x "
530 "CmdRsp x%x\n", phba->brd_no, irsp->ulpStatus, 514 "CmdRsp x%x, Context x%x, Tag x%x\n",
531 CTrsp->CommandResponse.bits.CmdRsp); 515 phba->brd_no, irsp->ulpStatus,
516 CTrsp->CommandResponse.bits.CmdRsp,
517 cmdiocb->iocb.ulpContext, cmdiocb->iocb.ulpIoTag);
532 518
533 lpfc_free_ct_rsp(phba, outp); 519 lpfc_free_ct_rsp(phba, outp);
534 lpfc_mbuf_free(phba, inp->virt, inp->phys); 520 lpfc_mbuf_free(phba, inp->virt, inp->phys);
535 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); 521 lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
536 kfree(inp); 522 kfree(inp);
537 kfree(bmp); 523 kfree(bmp);
538 spin_lock_irq(phba->host->host_lock);
539 lpfc_sli_release_iocbq(phba, cmdiocb); 524 lpfc_sli_release_iocbq(phba, cmdiocb);
540 spin_unlock_irq(phba->host->host_lock);
541 return; 525 return;
542} 526}
543 527
544static void 528static void
545lpfc_cmpl_ct_cmd_rnn_id(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, 529lpfc_cmpl_ct_cmd_rnn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
546 struct lpfc_iocbq * rspiocb) 530 struct lpfc_iocbq *rspiocb)
547{ 531{
548 lpfc_cmpl_ct_cmd_rft_id(phba, cmdiocb, rspiocb); 532 lpfc_cmpl_ct_cmd_rft_id(phba, cmdiocb, rspiocb);
549 return; 533 return;
550} 534}
551 535
552static void 536static void
553lpfc_cmpl_ct_cmd_rsnn_nn(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, 537lpfc_cmpl_ct_cmd_rsnn_nn(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
554 struct lpfc_iocbq * rspiocb) 538 struct lpfc_iocbq *rspiocb)
555{ 539{
556 lpfc_cmpl_ct_cmd_rft_id(phba, cmdiocb, rspiocb); 540 lpfc_cmpl_ct_cmd_rft_id(phba, cmdiocb, rspiocb);
557 return; 541 return;
@@ -566,7 +550,7 @@ lpfc_cmpl_ct_cmd_rff_id(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
566} 550}
567 551
568void 552void
569lpfc_get_hba_sym_node_name(struct lpfc_hba * phba, uint8_t * symbp) 553lpfc_get_hba_sym_node_name(struct lpfc_hba *phba, uint8_t *symbp)
570{ 554{
571 char fwrev[16]; 555 char fwrev[16];
572 556
@@ -585,8 +569,9 @@ lpfc_get_hba_sym_node_name(struct lpfc_hba * phba, uint8_t * symbp)
585 * LI_CTNS_RFT_ID 569 * LI_CTNS_RFT_ID
586 */ 570 */
587int 571int
588lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) 572lpfc_ns_cmd(struct lpfc_vport *vport, struct lpfc_nodelist * ndlp, int cmdcode)
589{ 573{
574 struct lpfc_hba *phba = vport->phba;
590 struct lpfc_dmabuf *mp, *bmp; 575 struct lpfc_dmabuf *mp, *bmp;
591 struct lpfc_sli_ct_request *CtReq; 576 struct lpfc_sli_ct_request *CtReq;
592 struct ulp_bde64 *bpl; 577 struct ulp_bde64 *bpl;
@@ -620,8 +605,8 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
620 KERN_INFO, 605 KERN_INFO,
621 LOG_DISCOVERY, 606 LOG_DISCOVERY,
622 "%d:0236 NameServer Req Data: x%x x%x x%x\n", 607 "%d:0236 NameServer Req Data: x%x x%x x%x\n",
623 phba->brd_no, cmdcode, phba->fc_flag, 608 phba->brd_no, cmdcode, vport->fc_flag,
624 phba->fc_rscn_id_cnt); 609 vport->fc_rscn_id_cnt);
625 610
626 bpl = (struct ulp_bde64 *) bmp->virt; 611 bpl = (struct ulp_bde64 *) bmp->virt;
627 memset(bpl, 0, sizeof(struct ulp_bde64)); 612 memset(bpl, 0, sizeof(struct ulp_bde64));
@@ -654,9 +639,9 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
654 CtReq->CommandResponse.bits.CmdRsp = 639 CtReq->CommandResponse.bits.CmdRsp =
655 be16_to_cpu(SLI_CTNS_GID_FT); 640 be16_to_cpu(SLI_CTNS_GID_FT);
656 CtReq->un.gid.Fc4Type = SLI_CTPT_FCP; 641 CtReq->un.gid.Fc4Type = SLI_CTPT_FCP;
657 if (phba->hba_state < LPFC_HBA_READY) 642 if (vport->port_state < LPFC_VPORT_READY)
658 phba->hba_state = LPFC_NS_QRY; 643 vport->port_state = LPFC_NS_QRY;
659 lpfc_set_disctmo(phba); 644 lpfc_set_disctmo(vport);
660 cmpl = lpfc_cmpl_ct_cmd_gid_ft; 645 cmpl = lpfc_cmpl_ct_cmd_gid_ft;
661 rsp_size = FC_MAX_NS_RSP; 646 rsp_size = FC_MAX_NS_RSP;
662 break; 647 break;
@@ -664,7 +649,7 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
664 case SLI_CTNS_RFT_ID: 649 case SLI_CTNS_RFT_ID:
665 CtReq->CommandResponse.bits.CmdRsp = 650 CtReq->CommandResponse.bits.CmdRsp =
666 be16_to_cpu(SLI_CTNS_RFT_ID); 651 be16_to_cpu(SLI_CTNS_RFT_ID);
667 CtReq->un.rft.PortId = be32_to_cpu(phba->fc_myDID); 652 CtReq->un.rft.PortId = be32_to_cpu(vport->fc_myDID);
668 CtReq->un.rft.fcpReg = 1; 653 CtReq->un.rft.fcpReg = 1;
669 cmpl = lpfc_cmpl_ct_cmd_rft_id; 654 cmpl = lpfc_cmpl_ct_cmd_rft_id;
670 break; 655 break;
@@ -672,7 +657,7 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
672 case SLI_CTNS_RFF_ID: 657 case SLI_CTNS_RFF_ID:
673 CtReq->CommandResponse.bits.CmdRsp = 658 CtReq->CommandResponse.bits.CmdRsp =
674 be16_to_cpu(SLI_CTNS_RFF_ID); 659 be16_to_cpu(SLI_CTNS_RFF_ID);
675 CtReq->un.rff.PortId = be32_to_cpu(phba->fc_myDID); 660 CtReq->un.rff.PortId = be32_to_cpu(vport->fc_myDID);
676 CtReq->un.rff.feature_res = 0; 661 CtReq->un.rff.feature_res = 0;
677 CtReq->un.rff.feature_tgt = 0; 662 CtReq->un.rff.feature_tgt = 0;
678 CtReq->un.rff.type_code = FC_FCP_DATA; 663 CtReq->un.rff.type_code = FC_FCP_DATA;
@@ -683,8 +668,8 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
683 case SLI_CTNS_RNN_ID: 668 case SLI_CTNS_RNN_ID:
684 CtReq->CommandResponse.bits.CmdRsp = 669 CtReq->CommandResponse.bits.CmdRsp =
685 be16_to_cpu(SLI_CTNS_RNN_ID); 670 be16_to_cpu(SLI_CTNS_RNN_ID);
686 CtReq->un.rnn.PortId = be32_to_cpu(phba->fc_myDID); 671 CtReq->un.rnn.PortId = be32_to_cpu(vport->fc_myDID);
687 memcpy(CtReq->un.rnn.wwnn, &phba->fc_nodename, 672 memcpy(CtReq->un.rnn.wwnn, &vport->fc_nodename,
688 sizeof (struct lpfc_name)); 673 sizeof (struct lpfc_name));
689 cmpl = lpfc_cmpl_ct_cmd_rnn_id; 674 cmpl = lpfc_cmpl_ct_cmd_rnn_id;
690 break; 675 break;
@@ -692,7 +677,7 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
692 case SLI_CTNS_RSNN_NN: 677 case SLI_CTNS_RSNN_NN:
693 CtReq->CommandResponse.bits.CmdRsp = 678 CtReq->CommandResponse.bits.CmdRsp =
694 be16_to_cpu(SLI_CTNS_RSNN_NN); 679 be16_to_cpu(SLI_CTNS_RSNN_NN);
695 memcpy(CtReq->un.rsnn.wwnn, &phba->fc_nodename, 680 memcpy(CtReq->un.rsnn.wwnn, &vport->fc_nodename,
696 sizeof (struct lpfc_name)); 681 sizeof (struct lpfc_name));
697 lpfc_get_hba_sym_node_name(phba, CtReq->un.rsnn.symbname); 682 lpfc_get_hba_sym_node_name(phba, CtReq->un.rsnn.symbname);
698 CtReq->un.rsnn.len = strlen(CtReq->un.rsnn.symbname); 683 CtReq->un.rsnn.len = strlen(CtReq->un.rsnn.symbname);
@@ -700,7 +685,7 @@ lpfc_ns_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
700 break; 685 break;
701 } 686 }
702 687
703 if (!lpfc_ct_cmd(phba, mp, bmp, ndlp, cmpl, rsp_size)) 688 if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, rsp_size))
704 /* On success, The cmpl function will free the buffers */ 689 /* On success, The cmpl function will free the buffers */
705 return 0; 690 return 0;
706 691
@@ -716,8 +701,8 @@ ns_cmd_exit:
716} 701}
717 702
718static void 703static void
719lpfc_cmpl_ct_cmd_fdmi(struct lpfc_hba * phba, 704lpfc_cmpl_ct_cmd_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
720 struct lpfc_iocbq * cmdiocb, struct lpfc_iocbq * rspiocb) 705 struct lpfc_iocbq * rspiocb)
721{ 706{
722 struct lpfc_dmabuf *bmp = cmdiocb->context3; 707 struct lpfc_dmabuf *bmp = cmdiocb->context3;
723 struct lpfc_dmabuf *inp = cmdiocb->context1; 708 struct lpfc_dmabuf *inp = cmdiocb->context1;
@@ -727,8 +712,9 @@ lpfc_cmpl_ct_cmd_fdmi(struct lpfc_hba * phba,
727 struct lpfc_nodelist *ndlp; 712 struct lpfc_nodelist *ndlp;
728 uint16_t fdmi_cmd = CTcmd->CommandResponse.bits.CmdRsp; 713 uint16_t fdmi_cmd = CTcmd->CommandResponse.bits.CmdRsp;
729 uint16_t fdmi_rsp = CTrsp->CommandResponse.bits.CmdRsp; 714 uint16_t fdmi_rsp = CTrsp->CommandResponse.bits.CmdRsp;
715 struct lpfc_vport *vport = cmdiocb->vport;
730 716
731 ndlp = lpfc_findnode_did(phba, FDMI_DID); 717 ndlp = lpfc_findnode_did(vport, FDMI_DID);
732 if (fdmi_rsp == be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) { 718 if (fdmi_rsp == be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) {
733 /* FDMI rsp failed */ 719 /* FDMI rsp failed */
734 lpfc_printf_log(phba, 720 lpfc_printf_log(phba,
@@ -741,18 +727,18 @@ lpfc_cmpl_ct_cmd_fdmi(struct lpfc_hba * phba,
741 727
742 switch (be16_to_cpu(fdmi_cmd)) { 728 switch (be16_to_cpu(fdmi_cmd)) {
743 case SLI_MGMT_RHBA: 729 case SLI_MGMT_RHBA:
744 lpfc_fdmi_cmd(phba, ndlp, SLI_MGMT_RPA); 730 lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPA);
745 break; 731 break;
746 732
747 case SLI_MGMT_RPA: 733 case SLI_MGMT_RPA:
748 break; 734 break;
749 735
750 case SLI_MGMT_DHBA: 736 case SLI_MGMT_DHBA:
751 lpfc_fdmi_cmd(phba, ndlp, SLI_MGMT_DPRT); 737 lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DPRT);
752 break; 738 break;
753 739
754 case SLI_MGMT_DPRT: 740 case SLI_MGMT_DPRT:
755 lpfc_fdmi_cmd(phba, ndlp, SLI_MGMT_RHBA); 741 lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RHBA);
756 break; 742 break;
757 } 743 }
758 744
@@ -761,14 +747,14 @@ lpfc_cmpl_ct_cmd_fdmi(struct lpfc_hba * phba,
761 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); 747 lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
762 kfree(inp); 748 kfree(inp);
763 kfree(bmp); 749 kfree(bmp);
764 spin_lock_irq(phba->host->host_lock);
765 lpfc_sli_release_iocbq(phba, cmdiocb); 750 lpfc_sli_release_iocbq(phba, cmdiocb);
766 spin_unlock_irq(phba->host->host_lock);
767 return; 751 return;
768} 752}
753
769int 754int
770lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode) 755lpfc_fdmi_cmd(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, int cmdcode)
771{ 756{
757 struct lpfc_hba *phba = vport->phba;
772 struct lpfc_dmabuf *mp, *bmp; 758 struct lpfc_dmabuf *mp, *bmp;
773 struct lpfc_sli_ct_request *CtReq; 759 struct lpfc_sli_ct_request *CtReq;
774 struct ulp_bde64 *bpl; 760 struct ulp_bde64 *bpl;
@@ -810,7 +796,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
810 LOG_DISCOVERY, 796 LOG_DISCOVERY,
811 "%d:0218 FDMI Request Data: x%x x%x x%x\n", 797 "%d:0218 FDMI Request Data: x%x x%x x%x\n",
812 phba->brd_no, 798 phba->brd_no,
813 phba->fc_flag, phba->hba_state, cmdcode); 799 vport->fc_flag, vport->port_state, cmdcode);
814 800
815 CtReq = (struct lpfc_sli_ct_request *) mp->virt; 801 CtReq = (struct lpfc_sli_ct_request *) mp->virt;
816 802
@@ -833,11 +819,11 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
833 be16_to_cpu(SLI_MGMT_RHBA); 819 be16_to_cpu(SLI_MGMT_RHBA);
834 CtReq->CommandResponse.bits.Size = 0; 820 CtReq->CommandResponse.bits.Size = 0;
835 rh = (REG_HBA *) & CtReq->un.PortID; 821 rh = (REG_HBA *) & CtReq->un.PortID;
836 memcpy(&rh->hi.PortName, &phba->fc_sparam.portName, 822 memcpy(&rh->hi.PortName, &vport->fc_sparam.portName,
837 sizeof (struct lpfc_name)); 823 sizeof (struct lpfc_name));
838 /* One entry (port) per adapter */ 824 /* One entry (port) per adapter */
839 rh->rpl.EntryCnt = be32_to_cpu(1); 825 rh->rpl.EntryCnt = be32_to_cpu(1);
840 memcpy(&rh->rpl.pe, &phba->fc_sparam.portName, 826 memcpy(&rh->rpl.pe, &vport->fc_sparam.portName,
841 sizeof (struct lpfc_name)); 827 sizeof (struct lpfc_name));
842 828
843 /* point to the HBA attribute block */ 829 /* point to the HBA attribute block */
@@ -853,7 +839,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
853 ae->ad.bits.AttrType = be16_to_cpu(NODE_NAME); 839 ae->ad.bits.AttrType = be16_to_cpu(NODE_NAME);
854 ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES 840 ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES
855 + sizeof (struct lpfc_name)); 841 + sizeof (struct lpfc_name));
856 memcpy(&ae->un.NodeName, &phba->fc_sparam.nodeName, 842 memcpy(&ae->un.NodeName, &vport->fc_sparam.nodeName,
857 sizeof (struct lpfc_name)); 843 sizeof (struct lpfc_name));
858 ab->EntryCnt++; 844 ab->EntryCnt++;
859 size += FOURBYTES + sizeof (struct lpfc_name); 845 size += FOURBYTES + sizeof (struct lpfc_name);
@@ -991,7 +977,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
991 pab = (REG_PORT_ATTRIBUTE *) & CtReq->un.PortID; 977 pab = (REG_PORT_ATTRIBUTE *) & CtReq->un.PortID;
992 size = sizeof (struct lpfc_name) + FOURBYTES; 978 size = sizeof (struct lpfc_name) + FOURBYTES;
993 memcpy((uint8_t *) & pab->PortName, 979 memcpy((uint8_t *) & pab->PortName,
994 (uint8_t *) & phba->fc_sparam.portName, 980 (uint8_t *) & vport->fc_sparam.portName,
995 sizeof (struct lpfc_name)); 981 sizeof (struct lpfc_name));
996 pab->ab.EntryCnt = 0; 982 pab->ab.EntryCnt = 0;
997 983
@@ -1053,7 +1039,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
1053 ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); 1039 ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size);
1054 ae->ad.bits.AttrType = be16_to_cpu(MAX_FRAME_SIZE); 1040 ae->ad.bits.AttrType = be16_to_cpu(MAX_FRAME_SIZE);
1055 ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4); 1041 ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4);
1056 hsp = (struct serv_parm *) & phba->fc_sparam; 1042 hsp = (struct serv_parm *) & vport->fc_sparam;
1057 ae->un.MaxFrameSize = 1043 ae->un.MaxFrameSize =
1058 (((uint32_t) hsp->cmn. 1044 (((uint32_t) hsp->cmn.
1059 bbRcvSizeMsb) << 8) | (uint32_t) hsp->cmn. 1045 bbRcvSizeMsb) << 8) | (uint32_t) hsp->cmn.
@@ -1097,7 +1083,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
1097 CtReq->CommandResponse.bits.Size = 0; 1083 CtReq->CommandResponse.bits.Size = 0;
1098 pe = (PORT_ENTRY *) & CtReq->un.PortID; 1084 pe = (PORT_ENTRY *) & CtReq->un.PortID;
1099 memcpy((uint8_t *) & pe->PortName, 1085 memcpy((uint8_t *) & pe->PortName,
1100 (uint8_t *) & phba->fc_sparam.portName, 1086 (uint8_t *) & vport->fc_sparam.portName,
1101 sizeof (struct lpfc_name)); 1087 sizeof (struct lpfc_name));
1102 size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name); 1088 size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name);
1103 break; 1089 break;
@@ -1107,7 +1093,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
1107 CtReq->CommandResponse.bits.Size = 0; 1093 CtReq->CommandResponse.bits.Size = 0;
1108 pe = (PORT_ENTRY *) & CtReq->un.PortID; 1094 pe = (PORT_ENTRY *) & CtReq->un.PortID;
1109 memcpy((uint8_t *) & pe->PortName, 1095 memcpy((uint8_t *) & pe->PortName,
1110 (uint8_t *) & phba->fc_sparam.portName, 1096 (uint8_t *) & vport->fc_sparam.portName,
1111 sizeof (struct lpfc_name)); 1097 sizeof (struct lpfc_name));
1112 size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name); 1098 size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name);
1113 break; 1099 break;
@@ -1122,7 +1108,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, int cmdcode)
1122 1108
1123 cmpl = lpfc_cmpl_ct_cmd_fdmi; 1109 cmpl = lpfc_cmpl_ct_cmd_fdmi;
1124 1110
1125 if (!lpfc_ct_cmd(phba, mp, bmp, ndlp, cmpl, FC_MAX_NS_RSP)) 1111 if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, FC_MAX_NS_RSP))
1126 return 0; 1112 return 0;
1127 1113
1128 lpfc_mbuf_free(phba, bmp->virt, bmp->phys); 1114 lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
@@ -1146,37 +1132,36 @@ fdmi_cmd_exit:
1146void 1132void
1147lpfc_fdmi_tmo(unsigned long ptr) 1133lpfc_fdmi_tmo(unsigned long ptr)
1148{ 1134{
1149 struct lpfc_hba *phba = (struct lpfc_hba *)ptr; 1135 struct lpfc_vport *vport = (struct lpfc_vport *)ptr;
1136 struct lpfc_hba *phba = vport->phba;
1150 unsigned long iflag; 1137 unsigned long iflag;
1151 1138
1152 spin_lock_irqsave(phba->host->host_lock, iflag); 1139 spin_lock_irqsave(&vport->work_port_lock, iflag);
1153 if (!(phba->work_hba_events & WORKER_FDMI_TMO)) { 1140 if (!(vport->work_port_events & WORKER_FDMI_TMO)) {
1154 phba->work_hba_events |= WORKER_FDMI_TMO; 1141 vport->work_port_events |= WORKER_FDMI_TMO;
1155 if (phba->work_wait) 1142 if (phba->work_wait)
1156 wake_up(phba->work_wait); 1143 wake_up(phba->work_wait);
1157 } 1144 }
1158 spin_unlock_irqrestore(phba->host->host_lock,iflag); 1145 spin_unlock_irqrestore(&vport->work_port_lock, iflag);
1159} 1146}
1160 1147
1161void 1148void
1162lpfc_fdmi_tmo_handler(struct lpfc_hba *phba) 1149lpfc_fdmi_timeout_handler(struct lpfc_vport *vport)
1163{ 1150{
1164 struct lpfc_nodelist *ndlp; 1151 struct lpfc_nodelist *ndlp;
1165 1152
1166 ndlp = lpfc_findnode_did(phba, FDMI_DID); 1153 ndlp = lpfc_findnode_did(vport, FDMI_DID);
1167 if (ndlp) { 1154 if (ndlp) {
1168 if (init_utsname()->nodename[0] != '\0') { 1155 if (init_utsname()->nodename[0] != '\0')
1169 lpfc_fdmi_cmd(phba, ndlp, SLI_MGMT_DHBA); 1156 lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA);
1170 } else { 1157 else
1171 mod_timer(&phba->fc_fdmitmo, jiffies + HZ * 60); 1158 mod_timer(&vport->fc_fdmitmo, jiffies + HZ * 60);
1172 }
1173 } 1159 }
1174 return; 1160 return;
1175} 1161}
1176 1162
1177
1178void 1163void
1179lpfc_decode_firmware_rev(struct lpfc_hba * phba, char *fwrevision, int flag) 1164lpfc_decode_firmware_rev(struct lpfc_hba *phba, char *fwrevision, int flag)
1180{ 1165{
1181 struct lpfc_sli *psli = &phba->sli; 1166 struct lpfc_sli *psli = &phba->sli;
1182 lpfc_vpd_t *vp = &phba->vpd; 1167 lpfc_vpd_t *vp = &phba->vpd;