aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa/bfa_fcs_lport.c
diff options
context:
space:
mode:
authorKrishna Gudipati <kgudipat@brocade.com>2012-08-22 22:50:20 -0400
committerJames Bottomley <JBottomley@Parallels.com>2012-09-24 04:10:55 -0400
commitebfe83921bd860e0b28a1a74e90be57baf2c8255 (patch)
tree3036edb85d9472a1f1f14032544edbc148f9fa30 /drivers/scsi/bfa/bfa_fcs_lport.c
parentc0e4eaae2e0affb498bd04b2a9923904d3868b26 (diff)
[SCSI] bfa: Support vport symbolic name change from sysfs.
- Implemented the FC function template set_vport_symbolic_name entry point to modify the vport symbolic name from sysfs. - Implemented support to send RSPN_ID to switch to register the modified vport symbolic name. Signed-off-by: Krishna Gudipati <kgudipat@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bfa/bfa_fcs_lport.c')
-rw-r--r--drivers/scsi/bfa/bfa_fcs_lport.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c
index bcc4966e8ba..f8e801747ea 100644
--- a/drivers/scsi/bfa/bfa_fcs_lport.c
+++ b/drivers/scsi/bfa/bfa_fcs_lport.c
@@ -4355,6 +4355,69 @@ bfa_fcs_lport_ns_boot_target_disc(bfa_fcs_lport_t *port)
4355 } 4355 }
4356} 4356}
4357 4357
4358void
4359bfa_fcs_lport_ns_util_send_rspn_id(void *cbarg, struct bfa_fcxp_s *fcxp_alloced)
4360{
4361 struct bfa_fcs_lport_ns_s *ns = cbarg;
4362 struct bfa_fcs_lport_s *port = ns->port;
4363 struct fchs_s fchs;
4364 struct bfa_fcxp_s *fcxp;
4365 u8 symbl[256];
4366 u8 *psymbl = &symbl[0];
4367 int len;
4368
4369 if (!bfa_sm_cmp_state(port, bfa_fcs_lport_sm_online))
4370 return;
4371
4372 /* Avoid sending RSPN in the following states. */
4373 if (bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_offline) ||
4374 bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_plogi_sending) ||
4375 bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_plogi) ||
4376 bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_plogi_retry) ||
4377 bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_rspn_id_retry))
4378 return;
4379
4380 memset(symbl, 0, sizeof(symbl));
4381 bfa_trc(port->fcs, port->port_cfg.pwwn);
4382
4383 fcxp = fcxp_alloced ? fcxp_alloced : bfa_fcs_fcxp_alloc(port->fcs);
4384 if (!fcxp) {
4385 port->stats.ns_rspnid_alloc_wait++;
4386 bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &ns->fcxp_wqe,
4387 bfa_fcs_lport_ns_util_send_rspn_id, ns);
4388 return;
4389 }
4390
4391 ns->fcxp = fcxp;
4392
4393 if (port->vport) {
4394 /*
4395 * For Vports, we append the vport's port symbolic name
4396 * to that of the base port.
4397 */
4398 strncpy((char *)psymbl, (char *)&(bfa_fcs_lport_get_psym_name
4399 (bfa_fcs_get_base_port(port->fcs))),
4400 strlen((char *)&bfa_fcs_lport_get_psym_name(
4401 bfa_fcs_get_base_port(port->fcs))));
4402
4403 /* Ensure we have a null terminating string. */
4404 ((char *)psymbl)[strlen((char *)&bfa_fcs_lport_get_psym_name(
4405 bfa_fcs_get_base_port(port->fcs)))] = 0;
4406
4407 strncat((char *)psymbl,
4408 (char *)&(bfa_fcs_lport_get_psym_name(port)),
4409 strlen((char *)&bfa_fcs_lport_get_psym_name(port)));
4410 }
4411
4412 len = fc_rspnid_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
4413 bfa_fcs_lport_get_fcid(port), 0, psymbl);
4414
4415 bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
4416 FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0);
4417
4418 port->stats.ns_rspnid_sent++;
4419}
4420
4358/* 4421/*
4359 * FCS SCN 4422 * FCS SCN
4360 */ 4423 */