|
@@ -1254,20 +1254,17 @@ setup_err:
|
|
static struct fc_lport *bnx2fc_if_create(struct bnx2fc_hba *hba,
|
|
static struct fc_lport *bnx2fc_if_create(struct bnx2fc_hba *hba,
|
|
struct device *parent, int npiv)
|
|
struct device *parent, int npiv)
|
|
{
|
|
{
|
|
- struct fc_lport *lport = NULL;
|
|
|
|
|
|
+ struct fc_lport *lport, *n_port;
|
|
struct fcoe_port *port;
|
|
struct fcoe_port *port;
|
|
struct Scsi_Host *shost;
|
|
struct Scsi_Host *shost;
|
|
struct fc_vport *vport = dev_to_vport(parent);
|
|
struct fc_vport *vport = dev_to_vport(parent);
|
|
int rc = 0;
|
|
int rc = 0;
|
|
|
|
|
|
/* Allocate Scsi_Host structure */
|
|
/* Allocate Scsi_Host structure */
|
|
- if (!npiv) {
|
|
|
|
- lport = libfc_host_alloc(&bnx2fc_shost_template,
|
|
|
|
- sizeof(struct fcoe_port));
|
|
|
|
- } else {
|
|
|
|
- lport = libfc_vport_create(vport,
|
|
|
|
- sizeof(struct fcoe_port));
|
|
|
|
- }
|
|
|
|
|
|
+ if (!npiv)
|
|
|
|
+ lport = libfc_host_alloc(&bnx2fc_shost_template, sizeof(*port));
|
|
|
|
+ else
|
|
|
|
+ lport = libfc_vport_create(vport, sizeof(*port));
|
|
|
|
|
|
if (!lport) {
|
|
if (!lport) {
|
|
printk(KERN_ERR PFX "could not allocate scsi host structure\n");
|
|
printk(KERN_ERR PFX "could not allocate scsi host structure\n");
|
|
@@ -1285,7 +1282,6 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_hba *hba,
|
|
goto lp_config_err;
|
|
goto lp_config_err;
|
|
|
|
|
|
if (npiv) {
|
|
if (npiv) {
|
|
- vport = dev_to_vport(parent);
|
|
|
|
printk(KERN_ERR PFX "Setting vport names, 0x%llX 0x%llX\n",
|
|
printk(KERN_ERR PFX "Setting vport names, 0x%llX 0x%llX\n",
|
|
vport->node_name, vport->port_name);
|
|
vport->node_name, vport->port_name);
|
|
fc_set_wwnn(lport, vport->node_name);
|
|
fc_set_wwnn(lport, vport->node_name);
|
|
@@ -1314,12 +1310,17 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_hba *hba,
|
|
fc_host_port_type(lport->host) = FC_PORTTYPE_UNKNOWN;
|
|
fc_host_port_type(lport->host) = FC_PORTTYPE_UNKNOWN;
|
|
|
|
|
|
/* Allocate exchange manager */
|
|
/* Allocate exchange manager */
|
|
- if (!npiv) {
|
|
|
|
|
|
+ if (!npiv)
|
|
rc = bnx2fc_em_config(lport);
|
|
rc = bnx2fc_em_config(lport);
|
|
- if (rc) {
|
|
|
|
- printk(KERN_ERR PFX "Error on bnx2fc_em_config\n");
|
|
|
|
- goto shost_err;
|
|
|
|
- }
|
|
|
|
|
|
+ else {
|
|
|
|
+ shost = vport_to_shost(vport);
|
|
|
|
+ n_port = shost_priv(shost);
|
|
|
|
+ rc = fc_exch_mgr_list_clone(n_port, lport);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (rc) {
|
|
|
|
+ printk(KERN_ERR PFX "Error on bnx2fc_em_config\n");
|
|
|
|
+ goto shost_err;
|
|
}
|
|
}
|
|
|
|
|
|
bnx2fc_interface_get(hba);
|
|
bnx2fc_interface_get(hba);
|