aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa/bfad_attr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/bfa/bfad_attr.c')
-rw-r--r--drivers/scsi/bfa/bfad_attr.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/drivers/scsi/bfa/bfad_attr.c b/drivers/scsi/bfa/bfad_attr.c
index e477bfbfa7d..871a3036356 100644
--- a/drivers/scsi/bfa/bfad_attr.c
+++ b/drivers/scsi/bfa/bfad_attr.c
@@ -373,47 +373,53 @@ bfad_im_vport_create(struct fc_vport *fc_vport, bool disable)
373 (struct bfad_im_port_s *) shost->hostdata[0]; 373 (struct bfad_im_port_s *) shost->hostdata[0];
374 struct bfad_s *bfad = im_port->bfad; 374 struct bfad_s *bfad = im_port->bfad;
375 struct bfa_port_cfg_s port_cfg; 375 struct bfa_port_cfg_s port_cfg;
376 struct bfad_pcfg_s *pcfg;
376 int status = 0, rc; 377 int status = 0, rc;
377 unsigned long flags; 378 unsigned long flags;
378 379
379 memset(&port_cfg, 0, sizeof(port_cfg)); 380 memset(&port_cfg, 0, sizeof(port_cfg));
380 381 u64_to_wwn(fc_vport->node_name, (u8 *)&port_cfg.nwwn);
381 port_cfg.pwwn = wwn_to_u64((u8 *) &fc_vport->port_name); 382 u64_to_wwn(fc_vport->port_name, (u8 *)&port_cfg.pwwn);
382 port_cfg.nwwn = wwn_to_u64((u8 *) &fc_vport->node_name);
383
384 if (strlen(vname) > 0) 383 if (strlen(vname) > 0)
385 strcpy((char *)&port_cfg.sym_name, vname); 384 strcpy((char *)&port_cfg.sym_name, vname);
386
387 port_cfg.roles = BFA_PORT_ROLE_FCP_IM; 385 port_cfg.roles = BFA_PORT_ROLE_FCP_IM;
388 rc = bfad_vport_create(bfad, 0, &port_cfg, &fc_vport->dev);
389 386
387 spin_lock_irqsave(&bfad->bfad_lock, flags);
388 list_for_each_entry(pcfg, &bfad->pbc_pcfg_list, list_entry) {
389 if (port_cfg.pwwn == pcfg->port_cfg.pwwn) {
390 port_cfg.preboot_vp = pcfg->port_cfg.preboot_vp;
391 break;
392 }
393 }
394 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
395
396 rc = bfad_vport_create(bfad, 0, &port_cfg, &fc_vport->dev);
390 if (rc == BFA_STATUS_OK) { 397 if (rc == BFA_STATUS_OK) {
391 struct bfad_vport_s *vport; 398 struct bfad_vport_s *vport;
392 struct bfa_fcs_vport_s *fcs_vport; 399 struct bfa_fcs_vport_s *fcs_vport;
393 struct Scsi_Host *vshost; 400 struct Scsi_Host *vshost;
394 401
395 spin_lock_irqsave(&bfad->bfad_lock, flags); 402 spin_lock_irqsave(&bfad->bfad_lock, flags);
396 fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 0, 403 fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 0,
397 port_cfg.pwwn); 404 port_cfg.pwwn);
398 if (fcs_vport == NULL) { 405 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
399 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 406 if (fcs_vport == NULL)
400 return VPCERR_BAD_WWN; 407 return VPCERR_BAD_WWN;
401 }
402 408
403 fc_vport_set_state(fc_vport, FC_VPORT_ACTIVE); 409 fc_vport_set_state(fc_vport, FC_VPORT_ACTIVE);
404 if (disable) { 410 if (disable) {
411 spin_lock_irqsave(&bfad->bfad_lock, flags);
405 bfa_fcs_vport_stop(fcs_vport); 412 bfa_fcs_vport_stop(fcs_vport);
413 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
406 fc_vport_set_state(fc_vport, FC_VPORT_DISABLED); 414 fc_vport_set_state(fc_vport, FC_VPORT_DISABLED);
407 } 415 }
408 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
409 416
410 vport = fcs_vport->vport_drv; 417 vport = fcs_vport->vport_drv;
411 vshost = vport->drv_port.im_port->shost; 418 vshost = vport->drv_port.im_port->shost;
412 fc_host_node_name(vshost) = wwn_to_u64((u8 *) &port_cfg.nwwn); 419 fc_host_node_name(vshost) = wwn_to_u64((u8 *)&port_cfg.nwwn);
413 fc_host_port_name(vshost) = wwn_to_u64((u8 *) &port_cfg.pwwn); 420 fc_host_port_name(vshost) = wwn_to_u64((u8 *)&port_cfg.pwwn);
414 fc_vport->dd_data = vport; 421 fc_vport->dd_data = vport;
415 vport->drv_port.im_port->fc_vport = fc_vport; 422 vport->drv_port.im_port->fc_vport = fc_vport;
416
417 } else if (rc == BFA_STATUS_INVALID_WWN) 423 } else if (rc == BFA_STATUS_INVALID_WWN)
418 return VPCERR_BAD_WWN; 424 return VPCERR_BAD_WWN;
419 else if (rc == BFA_STATUS_VPORT_EXISTS) 425 else if (rc == BFA_STATUS_VPORT_EXISTS)
@@ -422,7 +428,7 @@ bfad_im_vport_create(struct fc_vport *fc_vport, bool disable)
422 return VPCERR_NO_FABRIC_SUPP; 428 return VPCERR_NO_FABRIC_SUPP;
423 else if (rc == BFA_STATUS_VPORT_WWN_BP) 429 else if (rc == BFA_STATUS_VPORT_WWN_BP)
424 return VPCERR_BAD_WWN; 430 return VPCERR_BAD_WWN;
425 else 431 else
426 return FC_VPORT_FAILED; 432 return FC_VPORT_FAILED;
427 433
428 return status; 434 return status;
@@ -449,7 +455,7 @@ bfad_im_vport_delete(struct fc_vport *fc_vport)
449 port = im_port->port; 455 port = im_port->port;
450 456
451 vshost = vport->drv_port.im_port->shost; 457 vshost = vport->drv_port.im_port->shost;
452 pwwn = wwn_to_u64((u8 *) &fc_host_port_name(vshost)); 458 u64_to_wwn(fc_host_port_name(vshost), (u8 *)&pwwn);
453 459
454 spin_lock_irqsave(&bfad->bfad_lock, flags); 460 spin_lock_irqsave(&bfad->bfad_lock, flags);
455 fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 0, pwwn); 461 fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 0, pwwn);
@@ -467,6 +473,9 @@ bfad_im_vport_delete(struct fc_vport *fc_vport)
467 rc = bfa_fcs_vport_delete(&vport->fcs_vport); 473 rc = bfa_fcs_vport_delete(&vport->fcs_vport);
468 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 474 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
469 475
476 if (rc == BFA_STATUS_PBC)
477 return -1;
478
470 wait_for_completion(vport->comp_del); 479 wait_for_completion(vport->comp_del);
471 480
472free_scsi_host: 481free_scsi_host:
@@ -490,7 +499,7 @@ bfad_im_vport_disable(struct fc_vport *fc_vport, bool disable)
490 vport = (struct bfad_vport_s *)fc_vport->dd_data; 499 vport = (struct bfad_vport_s *)fc_vport->dd_data;
491 bfad = vport->drv_port.bfad; 500 bfad = vport->drv_port.bfad;
492 vshost = vport->drv_port.im_port->shost; 501 vshost = vport->drv_port.im_port->shost;
493 pwwn = wwn_to_u64((u8 *) &fc_vport->port_name); 502 u64_to_wwn(fc_host_port_name(vshost), (u8 *)&pwwn);
494 503
495 spin_lock_irqsave(&bfad->bfad_lock, flags); 504 spin_lock_irqsave(&bfad->bfad_lock, flags);
496 fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 0, pwwn); 505 fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs, 0, pwwn);