[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
					
				
			
		
					 4 changed files with 76 additions and 75 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue