diff options
Diffstat (limited to 'drivers/scsi/bfa/bfad_attr.c')
-rw-r--r-- | drivers/scsi/bfa/bfad_attr.c | 43 |
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 | ||
472 | free_scsi_host: | 481 | free_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); |