mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-06 12:45:57 +07:00
[SCSI] fcoe: Move common functions to fcoe_transport library
Export fcoe_get_wwn, fcoe_validate_vport_create and fcoe_wwn_to_str so that all LLDs can use these common function. Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
3f8744d147
commit
d834895c41
@ -138,7 +138,6 @@ static int fcoe_vport_create(struct fc_vport *, bool disabled);
|
|||||||
static int fcoe_vport_disable(struct fc_vport *, bool disable);
|
static int fcoe_vport_disable(struct fc_vport *, bool disable);
|
||||||
static void fcoe_set_vport_symbolic_name(struct fc_vport *);
|
static void fcoe_set_vport_symbolic_name(struct fc_vport *);
|
||||||
static void fcoe_set_port_id(struct fc_lport *, u32, struct fc_frame *);
|
static void fcoe_set_port_id(struct fc_lport *, u32, struct fc_frame *);
|
||||||
static int fcoe_validate_vport_create(struct fc_vport *);
|
|
||||||
|
|
||||||
static struct libfc_function_template fcoe_libfc_fcn_templ = {
|
static struct libfc_function_template fcoe_libfc_fcn_templ = {
|
||||||
.frame_send = fcoe_xmit,
|
.frame_send = fcoe_xmit,
|
||||||
@ -576,23 +575,6 @@ static int fcoe_lport_config(struct fc_lport *lport)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fcoe_get_wwn() - Get the world wide name from LLD if it supports it
|
|
||||||
* @netdev: the associated net device
|
|
||||||
* @wwn: the output WWN
|
|
||||||
* @type: the type of WWN (WWPN or WWNN)
|
|
||||||
*
|
|
||||||
* Returns: 0 for success
|
|
||||||
*/
|
|
||||||
static int fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type)
|
|
||||||
{
|
|
||||||
const struct net_device_ops *ops = netdev->netdev_ops;
|
|
||||||
|
|
||||||
if (ops->ndo_fcoe_get_wwn)
|
|
||||||
return ops->ndo_fcoe_get_wwn(netdev, wwn, type);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fcoe_netdev_features_change - Updates the lport's offload flags based
|
* fcoe_netdev_features_change - Updates the lport's offload flags based
|
||||||
* on the LLD netdev's FCoE feature flags
|
* on the LLD netdev's FCoE feature flags
|
||||||
@ -2444,7 +2426,7 @@ static int fcoe_vport_create(struct fc_vport *vport, bool disabled)
|
|||||||
|
|
||||||
rc = fcoe_validate_vport_create(vport);
|
rc = fcoe_validate_vport_create(vport);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
wwn_to_str(vport->port_name, buf, sizeof(buf));
|
fcoe_wwn_to_str(vport->port_name, buf, sizeof(buf));
|
||||||
printk(KERN_ERR "fcoe: Failed to create vport, "
|
printk(KERN_ERR "fcoe: Failed to create vport, "
|
||||||
"WWPN (0x%s) already exists\n",
|
"WWPN (0x%s) already exists\n",
|
||||||
buf);
|
buf);
|
||||||
@ -2596,49 +2578,3 @@ static void fcoe_set_port_id(struct fc_lport *lport,
|
|||||||
if (fp && fc_frame_payload_op(fp) == ELS_FLOGI)
|
if (fp && fc_frame_payload_op(fp) == ELS_FLOGI)
|
||||||
fcoe_ctlr_recv_flogi(&fcoe->ctlr, lport, fp);
|
fcoe_ctlr_recv_flogi(&fcoe->ctlr, lport, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fcoe_validate_vport_create() - Validate a vport before creating it
|
|
||||||
* @vport: NPIV port to be created
|
|
||||||
*
|
|
||||||
* This routine is meant to add validation for a vport before creating it
|
|
||||||
* via fcoe_vport_create().
|
|
||||||
* Current validations are:
|
|
||||||
* - WWPN supplied is unique for given lport
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int fcoe_validate_vport_create(struct fc_vport *vport)
|
|
||||||
{
|
|
||||||
struct Scsi_Host *shost = vport_to_shost(vport);
|
|
||||||
struct fc_lport *n_port = shost_priv(shost);
|
|
||||||
struct fc_lport *vn_port;
|
|
||||||
int rc = 0;
|
|
||||||
char buf[32];
|
|
||||||
|
|
||||||
mutex_lock(&n_port->lp_mutex);
|
|
||||||
|
|
||||||
wwn_to_str(vport->port_name, buf, sizeof(buf));
|
|
||||||
/* Check if the wwpn is not same as that of the lport */
|
|
||||||
if (!memcmp(&n_port->wwpn, &vport->port_name, sizeof(u64))) {
|
|
||||||
FCOE_DBG("vport WWPN 0x%s is same as that of the "
|
|
||||||
"base port WWPN\n", buf);
|
|
||||||
rc = -EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if there is any existing vport with same wwpn */
|
|
||||||
list_for_each_entry(vn_port, &n_port->vports, list) {
|
|
||||||
if (!memcmp(&vn_port->wwpn, &vport->port_name, sizeof(u64))) {
|
|
||||||
FCOE_DBG("vport with given WWPN 0x%s already "
|
|
||||||
"exists\n", buf);
|
|
||||||
rc = -EINVAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
mutex_unlock(&n_port->lp_mutex);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
@ -99,14 +99,4 @@ static inline struct net_device *fcoe_netdev(const struct fc_lport *lport)
|
|||||||
((struct fcoe_port *)lport_priv(lport))->priv)->netdev;
|
((struct fcoe_port *)lport_priv(lport))->priv)->netdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void wwn_to_str(u64 wwn, char *buf, int len)
|
|
||||||
{
|
|
||||||
u8 wwpn[8];
|
|
||||||
|
|
||||||
u64_to_wwn(wwn, wwpn);
|
|
||||||
snprintf(buf, len, "%02x%02x%02x%02x%02x%02x%02x%02x",
|
|
||||||
wwpn[0], wwpn[1], wwpn[2], wwpn[3],
|
|
||||||
wwpn[4], wwpn[5], wwpn[6], wwpn[7]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _FCOE_H_ */
|
#endif /* _FCOE_H_ */
|
||||||
|
@ -83,6 +83,78 @@ static struct notifier_block libfcoe_notifier = {
|
|||||||
.notifier_call = libfcoe_device_notification,
|
.notifier_call = libfcoe_device_notification,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void fcoe_wwn_to_str(u64 wwn, char *buf, int len)
|
||||||
|
{
|
||||||
|
u8 wwpn[8];
|
||||||
|
|
||||||
|
u64_to_wwn(wwn, wwpn);
|
||||||
|
snprintf(buf, len, "%02x%02x%02x%02x%02x%02x%02x%02x",
|
||||||
|
wwpn[0], wwpn[1], wwpn[2], wwpn[3],
|
||||||
|
wwpn[4], wwpn[5], wwpn[6], wwpn[7]);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(fcoe_wwn_to_str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fcoe_validate_vport_create() - Validate a vport before creating it
|
||||||
|
* @vport: NPIV port to be created
|
||||||
|
*
|
||||||
|
* This routine is meant to add validation for a vport before creating it
|
||||||
|
* via fcoe_vport_create().
|
||||||
|
* Current validations are:
|
||||||
|
* - WWPN supplied is unique for given lport
|
||||||
|
*/
|
||||||
|
int fcoe_validate_vport_create(struct fc_vport *vport)
|
||||||
|
{
|
||||||
|
struct Scsi_Host *shost = vport_to_shost(vport);
|
||||||
|
struct fc_lport *n_port = shost_priv(shost);
|
||||||
|
struct fc_lport *vn_port;
|
||||||
|
int rc = 0;
|
||||||
|
char buf[32];
|
||||||
|
|
||||||
|
mutex_lock(&n_port->lp_mutex);
|
||||||
|
|
||||||
|
fcoe_wwn_to_str(vport->port_name, buf, sizeof(buf));
|
||||||
|
/* Check if the wwpn is not same as that of the lport */
|
||||||
|
if (!memcmp(&n_port->wwpn, &vport->port_name, sizeof(u64))) {
|
||||||
|
LIBFCOE_TRANSPORT_DBG("vport WWPN 0x%s is same as that of the "
|
||||||
|
"base port WWPN\n", buf);
|
||||||
|
rc = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if there is any existing vport with same wwpn */
|
||||||
|
list_for_each_entry(vn_port, &n_port->vports, list) {
|
||||||
|
if (!memcmp(&vn_port->wwpn, &vport->port_name, sizeof(u64))) {
|
||||||
|
LIBFCOE_TRANSPORT_DBG("vport with given WWPN 0x%s "
|
||||||
|
"already exists\n", buf);
|
||||||
|
rc = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
mutex_unlock(&n_port->lp_mutex);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(fcoe_validate_vport_create);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fcoe_get_wwn() - Get the world wide name from LLD if it supports it
|
||||||
|
* @netdev: the associated net device
|
||||||
|
* @wwn: the output WWN
|
||||||
|
* @type: the type of WWN (WWPN or WWNN)
|
||||||
|
*
|
||||||
|
* Returns: 0 for success
|
||||||
|
*/
|
||||||
|
int fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type)
|
||||||
|
{
|
||||||
|
const struct net_device_ops *ops = netdev->netdev_ops;
|
||||||
|
|
||||||
|
if (ops->ndo_fcoe_get_wwn)
|
||||||
|
return ops->ndo_fcoe_get_wwn(netdev, wwn, type);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(fcoe_get_wwn);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fcoe_fc_crc() - Calculates the CRC for a given frame
|
* fcoe_fc_crc() - Calculates the CRC for a given frame
|
||||||
* @fp: The frame to be checksumed
|
* @fp: The frame to be checksumed
|
||||||
|
@ -229,6 +229,9 @@ int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *,
|
|||||||
const struct libfc_function_template *, int init_fcp);
|
const struct libfc_function_template *, int init_fcp);
|
||||||
u32 fcoe_fc_crc(struct fc_frame *fp);
|
u32 fcoe_fc_crc(struct fc_frame *fp);
|
||||||
int fcoe_start_io(struct sk_buff *skb);
|
int fcoe_start_io(struct sk_buff *skb);
|
||||||
|
int fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type);
|
||||||
|
void fcoe_wwn_to_str(u64 wwn, char *buf, int len);
|
||||||
|
int fcoe_validate_vport_create(struct fc_vport *vport);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* is_fip_mode() - returns true if FIP mode selected.
|
* is_fip_mode() - returns true if FIP mode selected.
|
||||||
|
Loading…
Reference in New Issue
Block a user