Commit 9243626c authored by Karan Tilak Kumar's avatar Karan Tilak Kumar Committed by Martin K. Petersen
Browse files

scsi: fnic: Modify fnic interfaces to use FDLS



Modify fnic driver interfaces to use FDLS and supporting functions.

Refactor code in fnic_probe and fnic_remove.

Get fnic from shost_priv.

Add error handling in stats processing functions.

Modify some print statements.

Add support to do module unload cleanup.

Use placeholder functions/modify function declarations to not break
compilation.

Reviewed-by: default avatarSesidhar Baddela <sebaddel@cisco.com>
Reviewed-by: default avatarArulprabhu Ponnusamy <arulponn@cisco.com>
Reviewed-by: default avatarGian Carlo Boffa <gcboffa@cisco.com>
Co-developed-by: default avatarArun Easi <aeasi@cisco.com>
Signed-off-by: default avatarArun Easi <aeasi@cisco.com>
Co-developed-by: default avatarKaran Tilak Kumar <kartilak@cisco.com>
Signed-off-by: default avatarKaran Tilak Kumar <kartilak@cisco.com>
Link: https://lore.kernel.org/r/20241212020312.4786-12-kartilak@cisco.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 6335be1c
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@
#define IS_FNIC_FCP_INITIATOR(fnic) (fnic->role == FNIC_ROLE_FCP_INITIATOR)

#define FNIC_FW_RESET_TIMEOUT        60000	/* mSec   */
#define FNIC_FCOE_MAX_CMD_LEN        16
/* Retry supported by rport (returned by PRLI service parameters) */
#define FNIC_FC_RP_FLAGS_RETRY            0x1

@@ -344,6 +345,7 @@ struct fnic {
	int fnic_num;
	enum fnic_role_e role;
	struct fnic_iport_s iport;
	struct Scsi_Host *host;
	struct fc_lport *lport;
	struct fcoe_ctlr ctlr;		/* FIP FCoE controller structure */
	struct vnic_dev_bar bar0;
@@ -464,11 +466,6 @@ struct fnic {
	____cacheline_aligned struct vnic_intr intr[FNIC_MSIX_INTR_MAX];
};

static inline struct fnic *fnic_from_ctlr(struct fcoe_ctlr *fip)
{
	return container_of(fip, struct fnic, ctlr);
}

extern struct workqueue_struct *fnic_event_queue;
extern struct workqueue_struct *fnic_fip_queue;
extern const struct attribute_group *fnic_host_groups[];
@@ -500,6 +497,7 @@ int fnic_eh_host_reset_handler(struct scsi_cmnd *sc);
int fnic_host_reset(struct Scsi_Host *shost);
void fnic_reset(struct Scsi_Host *shost);
int fnic_issue_fc_host_lip(struct Scsi_Host *shost);
void fnic_get_host_port_state(struct Scsi_Host *shost);
void fnic_scsi_fcpio_reset(struct fnic *fnic);
int fnic_wq_copy_cmpl_handler(struct fnic *fnic, int copy_work_to_do, unsigned int cq_index);
int fnic_wq_cmpl_handler(struct fnic *fnic, int);
@@ -512,7 +510,7 @@ const char *fnic_state_to_str(unsigned int state);
void fnic_mq_map_queues_cpus(struct Scsi_Host *host);
void fnic_log_q_error(struct fnic *fnic);
void fnic_handle_link_event(struct fnic *fnic);
void fnic_stats_debugfs_init(struct fnic *fnic);
int fnic_stats_debugfs_init(struct fnic *fnic);
void fnic_stats_debugfs_remove(struct fnic *fnic);
int fnic_is_abts_pending(struct fnic *, struct scsi_cmnd *);

@@ -541,6 +539,10 @@ unsigned int fnic_count_lun_ioreqs_wq(struct fnic *fnic, u32 hwq,
						  struct scsi_device *device);
unsigned int fnic_count_lun_ioreqs(struct fnic *fnic,
					   struct scsi_device *device);
void fnic_scsi_unload(struct fnic *fnic);
void fnic_scsi_unload_cleanup(struct fnic *fnic);
int fnic_get_debug_info(struct stats_debug_info *info,
			struct fnic *fnic);

struct fnic_scsi_iter_data {
	struct fnic *fnic;
+8 −4
Original line number Diff line number Diff line
@@ -11,8 +11,8 @@
static ssize_t fnic_show_state(struct device *dev,
			       struct device_attribute *attr, char *buf)
{
	struct fc_lport *lp = shost_priv(class_to_shost(dev));
	struct fnic *fnic = lport_priv(lp);
	struct fnic *fnic =
		*((struct fnic **) shost_priv(class_to_shost(dev)));

	return sysfs_emit(buf, "%s\n", fnic_state_str[fnic->state]);
}
@@ -26,9 +26,13 @@ static ssize_t fnic_show_drv_version(struct device *dev,
static ssize_t fnic_show_link_state(struct device *dev,
				    struct device_attribute *attr, char *buf)
{
	struct fc_lport *lp = shost_priv(class_to_shost(dev));
	struct fnic *fnic =
		*((struct fnic **) shost_priv(class_to_shost(dev)));

	return sysfs_emit(buf, "%s\n", (lp->link_up) ? "Link Up" : "Link Down");
	return sysfs_emit(buf, "%s\n",
					  ((fnic->iport.state != FNIC_IPORT_STATE_INIT) &&
					   (fnic->iport.state != FNIC_IPORT_STATE_LINK_WAIT)) ?
					  "Link Up" : "Link Down");
}

static DEVICE_ATTR(fnic_state, S_IRUGO, fnic_show_state, NULL);
+27 −1
Original line number Diff line number Diff line
@@ -7,6 +7,9 @@
#include <linux/vmalloc.h>
#include "fnic.h"

extern int fnic_get_debug_info(struct stats_debug_info *debug_buffer,
							   struct fnic *fnic);

static struct dentry *fnic_trace_debugfs_root;
static struct dentry *fnic_trace_debugfs_file;
static struct dentry *fnic_trace_enable;
@@ -593,6 +596,7 @@ static int fnic_stats_debugfs_open(struct inode *inode,
	debug->buf_size = buf_size;
	memset((void *)debug->debug_buffer, 0, buf_size);
	debug->buffer_len = fnic_get_stats_data(debug, fnic_stats);
	debug->buffer_len += fnic_get_debug_info(debug, fnic);

	file->private_data = debug;

@@ -673,26 +677,48 @@ static const struct file_operations fnic_reset_debugfs_fops = {
 * It will create file stats and reset_stats under statistics/host# directory
 * to log per fnic stats.
 */
void fnic_stats_debugfs_init(struct fnic *fnic)
int fnic_stats_debugfs_init(struct fnic *fnic)
{
	int rc = -1;
	char name[16];

	snprintf(name, sizeof(name), "host%d", fnic->lport->host->host_no);

	if (!fnic_stats_debugfs_root) {
		pr_debug("fnic_stats root doesn't exist\n");
		return rc;
	}

	fnic->fnic_stats_debugfs_host = debugfs_create_dir(name,
						fnic_stats_debugfs_root);

	if (!fnic->fnic_stats_debugfs_host) {
		pr_debug("Cannot create host directory\n");
		return rc;
	}

	fnic->fnic_stats_debugfs_file = debugfs_create_file("stats",
						S_IFREG|S_IRUGO|S_IWUSR,
						fnic->fnic_stats_debugfs_host,
						fnic,
						&fnic_stats_debugfs_fops);

	if (!fnic->fnic_stats_debugfs_file) {
		pr_debug("Cannot create host stats file\n");
		return rc;
	}

	fnic->fnic_reset_debugfs_file = debugfs_create_file("reset_stats",
						S_IFREG|S_IRUGO|S_IWUSR,
						fnic->fnic_stats_debugfs_host,
						fnic,
						&fnic_reset_debugfs_fops);
	if (!fnic->fnic_reset_debugfs_file) {
		pr_debug("Cannot create host stats file\n");
		return rc;
	}
	rc = 0;
	return rc;
}

/*
+16 −0
Original line number Diff line number Diff line
@@ -63,6 +63,22 @@ static inline void fnic_fdls_set_fcoe_dstmac(struct fnic *fnic,
	memcpy(fnic->iport.fcfmac, dst_mac, 6);
}

void fnic_get_host_port_state(struct Scsi_Host *shost)
{
	struct fnic *fnic = *((struct fnic **) shost_priv(shost));
	struct fnic_iport_s *iport = &fnic->iport;
	unsigned long flags;

	spin_lock_irqsave(&fnic->fnic_lock, flags);
	if (!fnic->link_status)
		fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
	else if (iport->state == FNIC_IPORT_STATE_READY)
		fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
	else
		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
}

void fnic_fdls_link_status_change(struct fnic *fnic, int linkup)
{
	struct fnic_iport_s *iport = &fnic->iport;
+275 −223

File changed.

Preview size limit exceeded, changes collapsed.

Loading