/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
 */

#ifndef __EFCLIB_H__
#define __EFCLIB_H__

#include "scsi/fc/fc_els.h"
#include "scsi/fc/fc_fs.h"
#include "scsi/fc/fc_ns.h"
#include "scsi/fc/fc_gs.h"
#include "scsi/fc_frame.h"
#include "../include/efc_common.h"
#include "../libefc_sli/sli4.h"

#define EFC_SERVICE_PARMS_LENGTH	120
#define EFC_NAME_LENGTH			32
#define EFC_SM_NAME_LENGTH		64
#define EFC_DISPLAY_BUS_INFO_LENGTH	16

#define EFC_WWN_LENGTH			32

#define EFC_FC_ELS_DEFAULT_RETRIES	3

/* Timeouts */
#define EFC_FC_ELS_SEND_DEFAULT_TIMEOUT	0
#define EFC_FC_FLOGI_TIMEOUT_SEC	5
#define EFC_SHUTDOWN_TIMEOUT_USEC	30000000

/* Return values for calls from base driver to libefc */
#define EFC_SCSI_CALL_COMPLETE		0
#define EFC_SCSI_CALL_ASYNC		1

/* Local port topology */
enum efc_nport_topology {
	EFC_NPORT_TOPO_UNKNOWN = 0,
	EFC_NPORT_TOPO_FABRIC,
	EFC_NPORT_TOPO_P2P,
	EFC_NPORT_TOPO_FC_AL,
};

#define enable_target_rscn(efc)		1

enum efc_node_shutd_rsn {
	EFC_NODE_SHUTDOWN_DEFAULT = 0,
	EFC_NODE_SHUTDOWN_EXPLICIT_LOGO,
	EFC_NODE_SHUTDOWN_IMPLICIT_LOGO,
};

enum efc_node_send_ls_acc {
	EFC_NODE_SEND_LS_ACC_NONE = 0,
	EFC_NODE_SEND_LS_ACC_PLOGI,
	EFC_NODE_SEND_LS_ACC_PRLI,
};

#define EFC_LINK_STATUS_UP		0
#define EFC_LINK_STATUS_DOWN		1

/* State machine context header  */
struct efc_sm_ctx {
	void (*current_state)(struct efc_sm_ctx *ctx,
			      u32 evt, void *arg);

	const char	*description;
	void		*app;
};

/* Description of discovered Fabric Domain */
struct efc_domain_record {
	u32		index;
	u32		priority;
	u8		address[6];
	u8		wwn[8];
	union {
		u8	vlan[512];
		u8	loop[128];
	} map;
	u32		speed;
	u32		fc_id;
	bool		is_loop;
	bool		is_nport;
};

/* Domain events */
enum efc_hw_domain_event {
	EFC_HW_DOMAIN_ALLOC_OK,
	EFC_HW_DOMAIN_ALLOC_FAIL,
	EFC_HW_DOMAIN_ATTACH_OK,
	EFC_HW_DOMAIN_ATTACH_FAIL,
	EFC_HW_DOMAIN_FREE_OK,
	EFC_HW_DOMAIN_FREE_FAIL,
	EFC_HW_DOMAIN_LOST,
	EFC_HW_DOMAIN_FOUND,
	EFC_HW_DOMAIN_CHANGED,
};

/**
 * Fibre Channel port object
 *
 * @list_entry:		nport list entry
 * @ref:		reference count, each node takes a reference
 * @release:		function to free nport object
 * @efc:		pointer back to efc
 * @instance_index:	unique instance index value
 * @display_name:	port display name
 * @is_vport:		Is NPIV port
 * @free_req_pending:	pending request to free resources
 * @attached:		mark attached if reg VPI succeeds
 * @p2p_winner:		TRUE if we're the point-to-point winner
 * @domain:		pointer back to domain
 * @wwpn:		port wwpn
 * @wwnn:		port wwnn
 * @tgt_data:		target backend private port data
 * @ini_data:		initiator backend private port data
 * @indicator:		VPI
 * @fc_id:		port FC address
 * @dma:		memory for Service Parameters
 * @wwnn_str:		wwpn string
 * @sli_wwpn:		SLI provided wwpn
 * @sli_wwnn:		SLI provided wwnn
 * @sm:			nport state machine context
 * @lookup:		fc_id to node lookup object
 * @enable_ini:		SCSI initiator enabled for this port
 * @enable_tgt:		SCSI target enabled for this port
 * @enable_rscn:	port will be expecting RSCN
 * @shutting_down:	nport in process of shutting down
 * @p2p_port_id:	our port id for point-to-point
 * @topology:		topology: fabric/p2p/unknown
 * @service_params:	login parameters
 * @p2p_remote_port_id:	remote node's port id for point-to-point
 */

struct efc_nport {
	struct list_head	list_entry;
	struct kref		ref;
	void			(*release)(struct kref *arg);
	struct efc		*efc;
	u32			instance_index;
	char			display_name[EFC_NAME_LENGTH];
	bool			is_vport;
	bool			free_req_pending;
	bool			attached;
	bool			attaching;
	bool			p2p_winner;
	struct efc_domain	*domain;
	u64			wwpn;
	u64			wwnn;
	void			*tgt_data;
	void			*ini_data;

	u32			indicator;
	u32			fc_id;
	struct efc_dma		dma;

	u8			wwnn_str[EFC_WWN_LENGTH];
	__be64			sli_wwpn;
	__be64			sli_wwnn;

	struct efc_sm_ctx	sm;
	struct xarray		lookup;
	bool			enable_ini;
	bool			enable_tgt;
	bool			enable_rscn;
	bool			shutting_down;
	u32			p2p_port_id;
	enum efc_nport_topology topology;
	u8			service_params[EFC_SERVICE_PARMS_LENGTH];
	u32			p2p_remote_port_id;
};

/**
 * Fibre Channel domain object
 *
 * This object is a container for the various SLI components needed
 * to connect to the domain of a FC or FCoE switch
 * @efc:		pointer back to efc
 * @instance_index:	unique instance index value
 * @display_name:	Node display name
 * @nport_list:		linked list of nports associated with this domain
 * @ref:		Reference count, each nport takes a reference
 * @release:		Function to free domain object
 * @ini_domain:		initiator backend private domain data
 * @tgt_domain:		target backend private domain data
 * @sm:			state machine context
 * @fcf:		FC Forwarder table index
 * @fcf_indicator:	FCFI
 * @indicator:		VFI
 * @nport_count:	Number of nports allocated
 * @dma:		memory for Service Parameters
 * @fcf_wwn:		WWN for FCF/switch
 * @drvsm:		driver domain sm context
 * @attached:		set true after attach completes
 * @is_fc:		is FC
 * @is_loop:		is loop topology
 * @is_nlport:		is public loop
 * @domain_found_pending:A domain found is pending, drec is updated
 * @req_domain_free:	True if domain object should be free'd
 * @req_accept_frames:	set in domain state machine to enable frames
 * @domain_notify_pend:	Set in domain SM to avoid duplicate node event post
 * @pending_drec:	Pending drec if a domain found is pending
 * @service_params:	any nports service parameters
 * @flogi_service_params:Fabric/P2p service parameters from FLOGI
 * @lookup:		d_id to node lookup object
 * @nport:		Pointer to first (physical) SLI port
 */
struct efc_domain {
	struct efc		*efc;
	char			display_name[EFC_NAME_LENGTH];
	struct list_head	nport_list;
	struct kref		ref;
	void			(*release)(struct kref *arg);
	void			*ini_domain;
	void			*tgt_domain;

	/* Declarations private to HW/SLI */
	u32			fcf;
	u32			fcf_indicator;
	u32			indicator;
	u32			nport_count;
	struct efc_dma		dma;

	/* Declarations private to FC trannport */
	u64			fcf_wwn;
	struct efc_sm_ctx	drvsm;
	bool			attached;
	bool			is_fc;
	bool			is_loop;
	bool			is_nlport;
	bool			domain_found_pending;
	bool			req_domain_free;
	bool			req_accept_frames;
	bool			domain_notify_pend;

	struct efc_domain_record pending_drec;
	u8			service_params[EFC_SERVICE_PARMS_LENGTH];
	u8			flogi_service_params[EFC_SERVICE_PARMS_LENGTH];

	struct xarray		lookup;

	struct efc_nport	*nport;
};

/**
 * Remote Node object
 *
 * This object represents a connection between the SLI port and another
 * Nx_Port on the fabric. Note this can be either a well known port such
 * as a F_Port (i.e. ff:ff:fe) or another N_Port.
 * @indicator:		RPI
 * @fc_id:		FC address
 * @attached:		true if attached
 * @nport:		associated SLI port
 * @node:		associated node
 */
struct efc_remote_node {
	u32			indicator;
	u32			index;
	u32			fc_id;

	bool			attached;

	struct efc_nport	*nport;
	void			*node;
};

/**
 * FC Node object
 * @efc:		pointer back to efc structure
 * @display_name:	Node display name
 * @nort:		Assosiated nport pointer.
 * @hold_frames:	hold incoming frames if true
 * @els_io_enabled:	Enable allocating els ios for this node
 * @els_ios_lock:	lock to protect the els ios list
 * @els_ios_list:	ELS I/O's for this node
 * @ini_node:		backend initiator private node data
 * @tgt_node:		backend target private node data
 * @rnode:		Remote node
 * @sm:			state machine context
 * @evtdepth:		current event posting nesting depth
 * @req_free:		this node is to be free'd
 * @attached:		node is attached (REGLOGIN complete)
 * @fcp_enabled:	node is enabled to handle FCP
 * @rscn_pending:	for name server node RSCN is pending
 * @send_plogi:		send PLOGI accept, upon completion of node attach
 * @send_plogi_acc:	TRUE if io_alloc() is enabled.
 * @send_ls_acc:	type of LS acc to send
 * @ls_acc_io:		SCSI IO for LS acc
 * @ls_acc_oxid:	OX_ID for pending accept
 * @ls_acc_did:		D_ID for pending accept
 * @shutdown_reason:	reason for node shutdown
 * @sparm_dma_buf:	service parameters buffer
 * @service_params:	plogi/acc frame from remote device
 * @pend_frames_lock:	lock for inbound pending frames list
 * @pend_frames:	inbound pending frames list
 * @pend_frames_processed:count of frames processed in hold frames interval
 * @ox_id_in_use:	used to verify one at a time us of ox_id
 * @els_retries_remaining:for ELS, number of retries remaining
 * @els_req_cnt:	number of outstanding ELS requests
 * @els_cmpl_cnt:	number of outstanding ELS completions
 * @abort_cnt:		Abort counter for debugging purpos
 * @current_state_name:	current node state
 * @prev_state_name:	previous node state
 * @current_evt:	current event
 * @prev_evt:		previous event
 * @targ:		node is target capable
 * @init:		node is init capable
 * @refound:		Handle node refound case when node is being deleted
 * @els_io_pend_list:	list of pending (not yet processed) ELS IOs
 * @els_io_active_list:	list of active (processed) ELS IOs
 * @nodedb_state:	Node debugging, saved state
 * @gidpt_delay_timer:	GIDPT delay timer
 * @time_last_gidpt_msec:Start time of last target RSCN GIDPT
 * @wwnn:		remote port WWNN
 * @wwpn:		remote port WWPN
 */
struct efc_node {
	struct efc		*efc;
	char			display_name[EFC_NAME_LENGTH];
	struct efc_nport	*nport;
	struct kref		ref;
	void			(*release)(struct kref *arg);
	bool			hold_frames;
	bool			els_io_enabled;
	bool			send_plogi_acc;
	bool			send_plogi;
	bool			rscn_pending;
	bool			fcp_enabled;
	bool			attached;
	bool			req_free;

	spinlock_t		els_ios_lock;
	struct list_head	els_ios_list;
	void			*ini_node;
	void			*tgt_node;

	struct efc_remote_node	rnode;
	/* Declarations private to FC trannport */
	struct efc_sm_ctx	sm;
	u32			evtdepth;

	enum efc_node_send_ls_acc send_ls_acc;
	void			*ls_acc_io;
	u32			ls_acc_oxid;
	u32			ls_acc_did;
	enum efc_node_shutd_rsn	shutdown_reason;
	bool			targ;
	bool			init;
	bool			refound;
	struct efc_dma		sparm_dma_buf;
	u8			service_params[EFC_SERVICE_PARMS_LENGTH];
	spinlock_t		pend_frames_lock;
	struct list_head	pend_frames;
	u32			pend_frames_processed;
	u32			ox_id_in_use;
	u32			els_retries_remaining;
	u32			els_req_cnt;
	u32			els_cmpl_cnt;
	u32			abort_cnt;

	char			current_state_name[EFC_SM_NAME_LENGTH];
	char			prev_state_name[EFC_SM_NAME_LENGTH];
	int			current_evt;
	int			prev_evt;

	void (*nodedb_state)(struct efc_sm_ctx *ctx,
			     u32 evt, void *arg);
	struct timer_list	gidpt_delay_timer;
	u64			time_last_gidpt_msec;

	char			wwnn[EFC_WWN_LENGTH];
	char			wwpn[EFC_WWN_LENGTH];
};

/**
 * NPIV port
 *
 * Collection of the information required to restore a virtual port across
 * link events
 * @wwnn:		node name
 * @wwpn:		port name
 * @fc_id:		port id
 * @tgt_data:		target backend pointer
 * @ini_data:		initiator backend pointe
 * @nport:		Used to match record after attaching for update
 *
 */

struct efc_vport {
	struct list_head	list_entry;
	u64			wwnn;
	u64			wwpn;
	u32			fc_id;
	bool			enable_tgt;
	bool			enable_ini;
	void			*tgt_data;
	void			*ini_data;
	struct efc_nport	*nport;
};

#define node_printf(node, fmt, args...) \
	efc_log_info(node->efc, "[%s] " fmt, node->display_name, ##args)

/* Node SM IO Context Callback structure */
struct efc_node_cb {
	int			status;
	int			ext_status;
	struct efc_hw_rq_buffer *header;
	struct efc_hw_rq_buffer *payload;
	struct efc_dma		els_rsp;

	/* Actual length of data received */
	int			rsp_len;
};

struct efc_hw_rq_buffer {
	u16			rqindex;
	struct efc_dma		dma;
};

/**
 * FC sequence object
 *
 * Defines a general FC sequence object
 * @hw:			HW that owns this sequence
 * @fcfi:		FCFI associated with sequence
 * @header:		Received frame header
 * @payload:		Received frame header
 * @hw_priv:		HW private context
 */
struct efc_hw_sequence {
	struct list_head	list_entry;
	void			*hw;
	u8			fcfi;
	struct efc_hw_rq_buffer *header;
	struct efc_hw_rq_buffer *payload;
	void			*hw_priv;
};

enum efc_disc_io_type {
	EFC_DISC_IO_ELS_REQ,
	EFC_DISC_IO_ELS_RESP,
	EFC_DISC_IO_CT_REQ,
	EFC_DISC_IO_CT_RESP
};

struct efc_io_els_params {
	u32             s_id;
	u16             ox_id;
	u8              timeout;
};

struct efc_io_ct_params {
	u8              r_ctl;
	u8              type;
	u8              df_ctl;
	u8              timeout;
	u16             ox_id;
};

union efc_disc_io_param {
	struct efc_io_els_params els;
	struct efc_io_ct_params ct;
};

struct efc_disc_io {
	struct efc_dma		req;         /* send buffer */
	struct efc_dma		rsp;         /* receive buffer */
	enum efc_disc_io_type	io_type;     /* EFC_DISC_IO_TYPE enum*/
	u16			xmit_len;    /* Length of els request*/
	u16			rsp_len;     /* Max length of rsps to be rcvd */
	u32			rpi;         /* Registered RPI */
	u32			vpi;         /* VPI for this nport */
	u32			s_id;
	u32			d_id;
	bool			rpi_registered; /* if false, use tmp RPI */
	union efc_disc_io_param iparam;
};

/* Return value indiacating the sequence can not be freed */
#define EFC_HW_SEQ_HOLD		0
/* Return value indiacating the sequence can be freed */
#define EFC_HW_SEQ_FREE		1

struct libefc_function_template {
	/*Sport*/
	int (*new_nport)(struct efc *efc, struct efc_nport *sp);
	void (*del_nport)(struct efc *efc, struct efc_nport *sp);

	/*Scsi Node*/
	int (*scsi_new_node)(struct efc *efc, struct efc_node *n);
	int (*scsi_del_node)(struct efc *efc, struct efc_node *n, int reason);

	int (*issue_mbox_rqst)(void *efct, void *buf, void *cb, void *arg);
	/*Send ELS IO*/
	int (*send_els)(struct efc *efc, struct efc_disc_io *io);
	/*Send BLS IO*/
	int (*send_bls)(struct efc *efc, u32 type, struct sli_bls_params *bls);
	/*Free HW frame*/
	int (*hw_seq_free)(struct efc *efc, struct efc_hw_sequence *seq);
};

#define EFC_LOG_LIB		0x01
#define EFC_LOG_NODE		0x02
#define EFC_LOG_PORT		0x04
#define EFC_LOG_DOMAIN		0x08
#define EFC_LOG_ELS		0x10
#define EFC_LOG_DOMAIN_SM	0x20
#define EFC_LOG_SM		0x40

/* efc library port structure */
struct efc {
	void			*base;
	struct pci_dev		*pci;
	struct sli4		*sli;
	u32			fcfi;
	u64			req_wwpn;
	u64			req_wwnn;

	u64			def_wwpn;
	u64			def_wwnn;
	u64			max_xfer_size;
	mempool_t		*node_pool;
	struct dma_pool		*node_dma_pool;
	u32			nodes_count;

	u32			link_status;

	struct list_head	vport_list;
	/* lock to protect the vport list */
	spinlock_t		vport_lock;

	struct libefc_function_template tt;
	/* lock to protect the discovery library.
	 * Refer to efclib.c for more details.
	 */
	spinlock_t		lock;

	bool			enable_ini;
	bool			enable_tgt;

	u32			log_level;

	struct efc_domain	*domain;
	void (*domain_free_cb)(struct efc *efc, void *arg);
	void			*domain_free_cb_arg;

	u64			tgt_rscn_delay_msec;
	u64			tgt_rscn_period_msec;

	bool			external_loopback;
	u32			nodedb_mask;
	u32			logmask;
	mempool_t		*els_io_pool;
	atomic_t		els_io_alloc_failed_count;

	/* hold pending frames */
	bool			hold_frames;
	/* lock to protect pending frames list access */
	spinlock_t		pend_frames_lock;
	struct list_head	pend_frames;
	/* count of pending frames that were processed */
	u32			pend_frames_processed;

};

/*
 * EFC library registration
 * **********************************/
int efcport_init(struct efc *efc);
void efcport_destroy(struct efc *efc);
/*
 * EFC Domain
 * **********************************/
int efc_domain_cb(void *arg, int event, void *data);
void
efc_register_domain_free_cb(struct efc *efc,
			    void (*callback)(struct efc *efc, void *arg),
			    void *arg);

/*
 * EFC nport
 * **********************************/
void efc_nport_cb(void *arg, int event, void *data);
struct efc_vport *
efc_vport_create_spec(struct efc *efc, u64 wwnn, u64 wwpn, u32 fc_id,
		      bool enable_ini, bool enable_tgt,
		      void *tgt_data, void *ini_data);
int efc_nport_vport_new(struct efc_domain *domain, u64 wwpn,
			u64 wwnn, u32 fc_id, bool ini, bool tgt,
			void *tgt_data, void *ini_data);
int efc_nport_vport_del(struct efc *efc, struct efc_domain *domain,
			u64 wwpn, u64 wwnn);

void efc_vport_del_all(struct efc *efc);

/*
 * EFC Node
 * **********************************/
int efc_remote_node_cb(void *arg, int event, void *data);
void efc_node_fcid_display(u32 fc_id, char *buffer, u32 buf_len);
void efc_node_post_shutdown(struct efc_node *node, void *arg);
u64 efc_node_get_wwpn(struct efc_node *node);

/*
 * EFC FCP/ELS/CT interface
 * **********************************/
void efc_dispatch_frame(struct efc *efc, struct efc_hw_sequence *seq);
void efc_disc_io_complete(struct efc_disc_io *io, u32 len, u32 status,
			  u32 ext_status);

/*
 * EFC SCSI INTERACTION LAYER
 * **********************************/
void efc_scsi_sess_reg_complete(struct efc_node *node, u32 status);
void efc_scsi_del_initiator_complete(struct efc *efc, struct efc_node *node);
void efc_scsi_del_target_complete(struct efc *efc, struct efc_node *node);
void efc_scsi_io_list_empty(struct efc *efc, struct efc_node *node);

#endif /* __EFCLIB_H__ */
