static void zfcp_scsi_rport_register(struct zfcp_port *port) { struct fc_rport_identifiers ids; struct fc_rport *rport; if (port->rport) return; ids.node_name = port->wwnn; ids.port_name = port->wwpn; ids.port_id = port->d_id; ids.roles = FC_RPORT_ROLE_FCP_TARGET; zfcp_dbf_rec_trig_lock("scpaddy", port->adapter, port, NULL, ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD, ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD); rport = fc_remote_port_add(port->adapter->scsi_host, 0, &ids); if (!rport) { dev_err(&port->adapter->ccw_device->dev, "Registering port 0x%016Lx failed\n", (unsigned long long)port->wwpn); return; } rport->maxframe_size = port->maxframe_size; rport->supported_classes = port->supported_classes; port->rport = rport; port->starget_id = rport->scsi_target_id; zfcp_unit_queue_scsi_scan(port); }
/* * csio_reg_rnode - Register a remote port with FC transport. * @rn: Rnode representing remote port. * * Call fc_remote_port_add() to register this remote port with FC transport. * If remote port is Initiator OR Target OR both, change the role appropriately. * */ void csio_reg_rnode(struct csio_rnode *rn) { struct csio_lnode *ln = csio_rnode_to_lnode(rn); struct Scsi_Host *shost = csio_ln_to_shost(ln); struct fc_rport_identifiers ids; struct fc_rport *rport; struct csio_service_parms *sp; ids.node_name = wwn_to_u64(csio_rn_wwnn(rn)); ids.port_name = wwn_to_u64(csio_rn_wwpn(rn)); ids.port_id = rn->nport_id; ids.roles = FC_RPORT_ROLE_UNKNOWN; if (rn->role & CSIO_RNFR_INITIATOR || rn->role & CSIO_RNFR_TARGET) { rport = rn->rport; CSIO_ASSERT(rport != NULL); goto update_role; } rn->rport = fc_remote_port_add(shost, 0, &ids); if (!rn->rport) { csio_ln_err(ln, "Failed to register rport = 0x%x.\n", rn->nport_id); return; } ln->num_reg_rnodes++; rport = rn->rport; spin_lock_irq(shost->host_lock); *((struct csio_rnode **)rport->dd_data) = rn; spin_unlock_irq(shost->host_lock); sp = &rn->rn_sparm; rport->maxframe_size = ntohs(sp->csp.sp_bb_data); if (ntohs(sp->clsp[2].cp_class) & FC_CPC_VALID) rport->supported_classes = FC_COS_CLASS3; else rport->supported_classes = FC_COS_UNSPECIFIED; update_role: if (rn->role & CSIO_RNFR_INITIATOR) ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR; if (rn->role & CSIO_RNFR_TARGET) ids.roles |= FC_RPORT_ROLE_FCP_TARGET; if (ids.roles != FC_RPORT_ROLE_UNKNOWN) fc_remote_port_rolechg(rport, ids.roles); rn->scsi_id = rport->scsi_target_id; csio_ln_dbg(ln, "Remote port x%x role 0x%x registered\n", rn->nport_id, ids.roles); }