mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
[SCSI] fc_transport: Add an API to allow an LLD to create vports
There's already a fc_vport_termintate() call exported by the transport. This patch adds a symmetric call to the API to allow an NPIV-capable LLD to instantiate vports sans user intervention. Additional comments/updates: Re: scsi_fc_transport.txt Add a function prototype for fc_vport_terminate similar to what's done for fc_vport_create Re: fc_vport_create I recommend we pass the channel number in fc_vport_create rather than fixing it at zero. Also, ids->vport_type should be set to FC_PORTTYPE_NPIV prior to calling fc_vport_create. The comment is also meaningless. Added-by and Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
7404ad3b6d
commit
a30c3f69e6
3 changed files with 84 additions and 29 deletions
|
@ -436,6 +436,42 @@ Other:
|
||||||
was updated to remove all vports for the fc_host as well.
|
was updated to remove all vports for the fc_host as well.
|
||||||
|
|
||||||
|
|
||||||
|
Transport supplied functions
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
The following functions are supplied by the FC-transport for use by LLDs.
|
||||||
|
|
||||||
|
fc_vport_create - create a vport
|
||||||
|
fc_vport_terminate - detach and remove a vport
|
||||||
|
|
||||||
|
Details:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fc_vport_create - Admin App or LLDD requests creation of a vport
|
||||||
|
* @shost: scsi host the virtual port is connected to.
|
||||||
|
* @ids: The world wide names, FC4 port roles, etc for
|
||||||
|
* the virtual port.
|
||||||
|
*
|
||||||
|
* Notes:
|
||||||
|
* This routine assumes no locks are held on entry.
|
||||||
|
*/
|
||||||
|
struct fc_vport *
|
||||||
|
fc_vport_create(struct Scsi_Host *shost, struct fc_vport_identifiers *ids)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fc_vport_terminate - Admin App or LLDD requests termination of a vport
|
||||||
|
* @vport: fc_vport to be terminated
|
||||||
|
*
|
||||||
|
* Calls the LLDD vport_delete() function, then deallocates and removes
|
||||||
|
* the vport from the shost and object tree.
|
||||||
|
*
|
||||||
|
* Notes:
|
||||||
|
* This routine assumes no locks are held on entry.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
fc_vport_terminate(struct fc_vport *vport)
|
||||||
|
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
=======
|
=======
|
||||||
The following people have contributed to this document:
|
The following people have contributed to this document:
|
||||||
|
|
|
@ -40,31 +40,7 @@
|
||||||
|
|
||||||
static int fc_queue_work(struct Scsi_Host *, struct work_struct *);
|
static int fc_queue_work(struct Scsi_Host *, struct work_struct *);
|
||||||
static void fc_vport_sched_delete(struct work_struct *work);
|
static void fc_vport_sched_delete(struct work_struct *work);
|
||||||
|
static int fc_vport_setup(struct Scsi_Host *shost, int channel,
|
||||||
/*
|
|
||||||
* This is a temporary carrier for creating a vport. It will eventually
|
|
||||||
* be replaced by a real message definition for sgio or netlink.
|
|
||||||
*
|
|
||||||
* fc_vport_identifiers: This set of data contains all elements
|
|
||||||
* to uniquely identify and instantiate a FC virtual port.
|
|
||||||
*
|
|
||||||
* Notes:
|
|
||||||
* symbolic_name: The driver is to append the symbolic_name string data
|
|
||||||
* to the symbolic_node_name data that it generates by default.
|
|
||||||
* the resulting combination should then be registered with the switch.
|
|
||||||
* It is expected that things like Xen may stuff a VM title into
|
|
||||||
* this field.
|
|
||||||
*/
|
|
||||||
struct fc_vport_identifiers {
|
|
||||||
u64 node_name;
|
|
||||||
u64 port_name;
|
|
||||||
u32 roles;
|
|
||||||
bool disable;
|
|
||||||
enum fc_port_type vport_type; /* only FC_PORTTYPE_NPIV allowed */
|
|
||||||
char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
|
|
||||||
};
|
|
||||||
|
|
||||||
static int fc_vport_create(struct Scsi_Host *shost, int channel,
|
|
||||||
struct device *pdev, struct fc_vport_identifiers *ids,
|
struct device *pdev, struct fc_vport_identifiers *ids,
|
||||||
struct fc_vport **vport);
|
struct fc_vport **vport);
|
||||||
|
|
||||||
|
@ -1760,7 +1736,7 @@ store_fc_host_vport_create(struct device *dev, struct device_attribute *attr,
|
||||||
vid.disable = false; /* always enabled */
|
vid.disable = false; /* always enabled */
|
||||||
|
|
||||||
/* we only allow support on Channel 0 !!! */
|
/* we only allow support on Channel 0 !!! */
|
||||||
stat = fc_vport_create(shost, 0, &shost->shost_gendev, &vid, &vport);
|
stat = fc_vport_setup(shost, 0, &shost->shost_gendev, &vid, &vport);
|
||||||
return stat ? stat : count;
|
return stat ? stat : count;
|
||||||
}
|
}
|
||||||
static FC_DEVICE_ATTR(host, vport_create, S_IWUSR, NULL,
|
static FC_DEVICE_ATTR(host, vport_create, S_IWUSR, NULL,
|
||||||
|
@ -3103,7 +3079,7 @@ fc_scsi_scan_rport(struct work_struct *work)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fc_vport_create - allocates and creates a FC virtual port.
|
* fc_vport_setup - allocates and creates a FC virtual port.
|
||||||
* @shost: scsi host the virtual port is connected to.
|
* @shost: scsi host the virtual port is connected to.
|
||||||
* @channel: Channel on shost port connected to.
|
* @channel: Channel on shost port connected to.
|
||||||
* @pdev: parent device for vport
|
* @pdev: parent device for vport
|
||||||
|
@ -3118,7 +3094,7 @@ fc_scsi_scan_rport(struct work_struct *work)
|
||||||
* This routine assumes no locks are held on entry.
|
* This routine assumes no locks are held on entry.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
fc_vport_create(struct Scsi_Host *shost, int channel, struct device *pdev,
|
fc_vport_setup(struct Scsi_Host *shost, int channel, struct device *pdev,
|
||||||
struct fc_vport_identifiers *ids, struct fc_vport **ret_vport)
|
struct fc_vport_identifiers *ids, struct fc_vport **ret_vport)
|
||||||
{
|
{
|
||||||
struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
|
struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
|
||||||
|
@ -3231,6 +3207,28 @@ delete_vport:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fc_vport_create - Admin App or LLDD requests creation of a vport
|
||||||
|
* @shost: scsi host the virtual port is connected to.
|
||||||
|
* @channel: channel on shost port connected to.
|
||||||
|
* @ids: The world wide names, FC4 port roles, etc for
|
||||||
|
* the virtual port.
|
||||||
|
*
|
||||||
|
* Notes:
|
||||||
|
* This routine assumes no locks are held on entry.
|
||||||
|
*/
|
||||||
|
struct fc_vport *
|
||||||
|
fc_vport_create(struct Scsi_Host *shost, int channel,
|
||||||
|
struct fc_vport_identifiers *ids)
|
||||||
|
{
|
||||||
|
int stat;
|
||||||
|
struct fc_vport *vport;
|
||||||
|
|
||||||
|
stat = fc_vport_setup(shost, channel, &shost->shost_gendev,
|
||||||
|
ids, &vport);
|
||||||
|
return stat ? NULL : vport;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(fc_vport_create);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fc_vport_terminate - Admin App or LLDD requests termination of a vport
|
* fc_vport_terminate - Admin App or LLDD requests termination of a vport
|
||||||
|
|
|
@ -167,6 +167,26 @@ enum fc_tgtid_binding_type {
|
||||||
struct device_attribute dev_attr_vport_##_name = \
|
struct device_attribute dev_attr_vport_##_name = \
|
||||||
__ATTR(_name,_mode,_show,_store)
|
__ATTR(_name,_mode,_show,_store)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* fc_vport_identifiers: This set of data contains all elements
|
||||||
|
* to uniquely identify and instantiate a FC virtual port.
|
||||||
|
*
|
||||||
|
* Notes:
|
||||||
|
* symbolic_name: The driver is to append the symbolic_name string data
|
||||||
|
* to the symbolic_node_name data that it generates by default.
|
||||||
|
* the resulting combination should then be registered with the switch.
|
||||||
|
* It is expected that things like Xen may stuff a VM title into
|
||||||
|
* this field.
|
||||||
|
*/
|
||||||
|
#define FC_VPORT_SYMBOLIC_NAMELEN 64
|
||||||
|
struct fc_vport_identifiers {
|
||||||
|
u64 node_name;
|
||||||
|
u64 port_name;
|
||||||
|
u32 roles;
|
||||||
|
bool disable;
|
||||||
|
enum fc_port_type vport_type; /* only FC_PORTTYPE_NPIV allowed */
|
||||||
|
char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FC Virtual Port Attributes
|
* FC Virtual Port Attributes
|
||||||
|
@ -197,7 +217,6 @@ struct device_attribute dev_attr_vport_##_name = \
|
||||||
* managed by the transport w/o driver interaction.
|
* managed by the transport w/o driver interaction.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define FC_VPORT_SYMBOLIC_NAMELEN 64
|
|
||||||
struct fc_vport {
|
struct fc_vport {
|
||||||
/* Fixed Attributes */
|
/* Fixed Attributes */
|
||||||
|
|
||||||
|
@ -732,6 +751,8 @@ void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
|
||||||
* be sure to read the Vendor Type and ID formatting requirements
|
* be sure to read the Vendor Type and ID formatting requirements
|
||||||
* specified in scsi_netlink.h
|
* specified in scsi_netlink.h
|
||||||
*/
|
*/
|
||||||
|
struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
|
||||||
|
struct fc_vport_identifiers *);
|
||||||
int fc_vport_terminate(struct fc_vport *vport);
|
int fc_vport_terminate(struct fc_vport *vport);
|
||||||
|
|
||||||
#endif /* SCSI_TRANSPORT_FC_H */
|
#endif /* SCSI_TRANSPORT_FC_H */
|
||||||
|
|
Loading…
Reference in a new issue