[SCSI] bfa: add fc transport class based vport create/delete
Use duplicate fc transport template for physical and vitual port. Add vport create/delete/disalbe functions in the transport template of physical port. Changes to make the vport create/delete function to work under this framework. Signed-off-by: Jing Huang <huangj@brocade.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:

committed by
James Bottomley

parent
12fb8c1574
commit
b504293fe9
@@ -30,6 +30,7 @@ BFA_TRC_FILE(LDRV, IM);
|
||||
|
||||
DEFINE_IDR(bfad_im_port_index);
|
||||
struct scsi_transport_template *bfad_im_scsi_transport_template;
|
||||
struct scsi_transport_template *bfad_im_scsi_vport_transport_template;
|
||||
static void bfad_im_itnim_work_handler(struct work_struct *work);
|
||||
static int bfad_im_queuecommand(struct scsi_cmnd *cmnd,
|
||||
void (*done)(struct scsi_cmnd *));
|
||||
@@ -512,7 +513,8 @@ void bfa_fcb_itnim_tov(struct bfad_itnim_s *itnim)
|
||||
* Allocate a Scsi_Host for a port.
|
||||
*/
|
||||
int
|
||||
bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port)
|
||||
bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port,
|
||||
struct device *dev)
|
||||
{
|
||||
int error = 1;
|
||||
|
||||
@@ -541,12 +543,15 @@ bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port)
|
||||
im_port->shost->max_lun = MAX_FCP_LUN;
|
||||
im_port->shost->max_cmd_len = 16;
|
||||
im_port->shost->can_queue = bfad->cfg_data.ioc_queue_depth;
|
||||
im_port->shost->transportt = bfad_im_scsi_transport_template;
|
||||
if (im_port->port->pvb_type == BFAD_PORT_PHYS_BASE)
|
||||
im_port->shost->transportt = bfad_im_scsi_transport_template;
|
||||
else
|
||||
im_port->shost->transportt =
|
||||
bfad_im_scsi_vport_transport_template;
|
||||
|
||||
error = bfad_os_scsi_add_host(im_port->shost, im_port, bfad);
|
||||
error = scsi_add_host(im_port->shost, dev);
|
||||
if (error) {
|
||||
printk(KERN_WARNING "bfad_os_scsi_add_host failure %d\n",
|
||||
error);
|
||||
printk(KERN_WARNING "scsi_add_host failure %d\n", error);
|
||||
goto out_fc_rel;
|
||||
}
|
||||
|
||||
@@ -588,9 +593,11 @@ bfad_im_port_delete_handler(struct work_struct *work)
|
||||
struct bfad_im_port_s *im_port =
|
||||
container_of(work, struct bfad_im_port_s, port_delete_work);
|
||||
|
||||
bfad_im_scsi_host_free(im_port->bfad, im_port);
|
||||
bfad_im_port_clean(im_port);
|
||||
kfree(im_port);
|
||||
if (im_port->port->pvb_type != BFAD_PORT_PHYS_BASE) {
|
||||
im_port->flags |= BFAD_PORT_DELETE;
|
||||
fc_vport_terminate(im_port->fc_vport);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bfa_status_t
|
||||
@@ -689,23 +696,6 @@ bfad_im_probe_undo(struct bfad_s *bfad)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
bfad_os_scsi_add_host(struct Scsi_Host *shost, struct bfad_im_port_s *im_port,
|
||||
struct bfad_s *bfad)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
if (im_port->port->pvb_type == BFAD_PORT_PHYS_BASE)
|
||||
dev = &bfad->pcidev->dev;
|
||||
else
|
||||
dev = &bfad->pport.im_port->shost->shost_gendev;
|
||||
|
||||
return scsi_add_host(shost, dev);
|
||||
}
|
||||
|
||||
struct Scsi_Host *
|
||||
bfad_os_scsi_host_alloc(struct bfad_im_port_s *im_port, struct bfad_s *bfad)
|
||||
{
|
||||
@@ -724,7 +714,8 @@ bfad_os_scsi_host_alloc(struct bfad_im_port_s *im_port, struct bfad_s *bfad)
|
||||
void
|
||||
bfad_os_scsi_host_free(struct bfad_s *bfad, struct bfad_im_port_s *im_port)
|
||||
{
|
||||
flush_workqueue(bfad->im->drv_workq);
|
||||
if (!(im_port->flags & BFAD_PORT_DELETE))
|
||||
flush_workqueue(bfad->im->drv_workq);
|
||||
bfad_im_scsi_host_free(im_port->bfad, im_port);
|
||||
bfad_im_port_clean(im_port);
|
||||
kfree(im_port);
|
||||
@@ -829,6 +820,13 @@ bfad_im_module_init(void)
|
||||
if (!bfad_im_scsi_transport_template)
|
||||
return BFA_STATUS_ENOMEM;
|
||||
|
||||
bfad_im_scsi_vport_transport_template =
|
||||
fc_attach_transport(&bfad_im_vport_fc_function_template);
|
||||
if (!bfad_im_scsi_vport_transport_template) {
|
||||
fc_release_transport(bfad_im_scsi_transport_template);
|
||||
return BFA_STATUS_ENOMEM;
|
||||
}
|
||||
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
@@ -837,6 +835,8 @@ bfad_im_module_exit(void)
|
||||
{
|
||||
if (bfad_im_scsi_transport_template)
|
||||
fc_release_transport(bfad_im_scsi_transport_template);
|
||||
if (bfad_im_scsi_vport_transport_template)
|
||||
fc_release_transport(bfad_im_scsi_vport_transport_template);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -937,6 +937,7 @@ bfad_os_fc_host_init(struct bfad_im_port_s *im_port)
|
||||
bfa_os_htonll((bfa_fcs_port_get_nwwn(port->fcs_port)));
|
||||
fc_host_port_name(host) =
|
||||
bfa_os_htonll((bfa_fcs_port_get_pwwn(port->fcs_port)));
|
||||
fc_host_max_npiv_vports(host) = bfa_lps_get_max_vport(&bfad->bfa);
|
||||
|
||||
fc_host_supported_classes(host) = FC_COS_CLASS3;
|
||||
|
||||
|
Reference in New Issue
Block a user