162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
462306a36Sopenharmony_ci * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#if !defined(__EFCT_XPORT_H__)
862306a36Sopenharmony_ci#define __EFCT_XPORT_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cienum efct_xport_ctrl {
1162306a36Sopenharmony_ci	EFCT_XPORT_PORT_ONLINE = 1,
1262306a36Sopenharmony_ci	EFCT_XPORT_PORT_OFFLINE,
1362306a36Sopenharmony_ci	EFCT_XPORT_SHUTDOWN,
1462306a36Sopenharmony_ci	EFCT_XPORT_POST_NODE_EVENT,
1562306a36Sopenharmony_ci	EFCT_XPORT_WWNN_SET,
1662306a36Sopenharmony_ci	EFCT_XPORT_WWPN_SET,
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cienum efct_xport_status {
2062306a36Sopenharmony_ci	EFCT_XPORT_PORT_STATUS,
2162306a36Sopenharmony_ci	EFCT_XPORT_CONFIG_PORT_STATUS,
2262306a36Sopenharmony_ci	EFCT_XPORT_LINK_SPEED,
2362306a36Sopenharmony_ci	EFCT_XPORT_IS_SUPPORTED_LINK_SPEED,
2462306a36Sopenharmony_ci	EFCT_XPORT_LINK_STATISTICS,
2562306a36Sopenharmony_ci	EFCT_XPORT_LINK_STAT_RESET,
2662306a36Sopenharmony_ci	EFCT_XPORT_IS_QUIESCED
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct efct_xport_link_stats {
3062306a36Sopenharmony_ci	bool		rec;
3162306a36Sopenharmony_ci	bool		gec;
3262306a36Sopenharmony_ci	bool		w02of;
3362306a36Sopenharmony_ci	bool		w03of;
3462306a36Sopenharmony_ci	bool		w04of;
3562306a36Sopenharmony_ci	bool		w05of;
3662306a36Sopenharmony_ci	bool		w06of;
3762306a36Sopenharmony_ci	bool		w07of;
3862306a36Sopenharmony_ci	bool		w08of;
3962306a36Sopenharmony_ci	bool		w09of;
4062306a36Sopenharmony_ci	bool		w10of;
4162306a36Sopenharmony_ci	bool		w11of;
4262306a36Sopenharmony_ci	bool		w12of;
4362306a36Sopenharmony_ci	bool		w13of;
4462306a36Sopenharmony_ci	bool		w14of;
4562306a36Sopenharmony_ci	bool		w15of;
4662306a36Sopenharmony_ci	bool		w16of;
4762306a36Sopenharmony_ci	bool		w17of;
4862306a36Sopenharmony_ci	bool		w18of;
4962306a36Sopenharmony_ci	bool		w19of;
5062306a36Sopenharmony_ci	bool		w20of;
5162306a36Sopenharmony_ci	bool		w21of;
5262306a36Sopenharmony_ci	bool		clrc;
5362306a36Sopenharmony_ci	bool		clof1;
5462306a36Sopenharmony_ci	u32		link_failure_error_count;
5562306a36Sopenharmony_ci	u32		loss_of_sync_error_count;
5662306a36Sopenharmony_ci	u32		loss_of_signal_error_count;
5762306a36Sopenharmony_ci	u32		primitive_sequence_error_count;
5862306a36Sopenharmony_ci	u32		invalid_transmission_word_error_count;
5962306a36Sopenharmony_ci	u32		crc_error_count;
6062306a36Sopenharmony_ci	u32		primitive_sequence_event_timeout_count;
6162306a36Sopenharmony_ci	u32		elastic_buffer_overrun_error_count;
6262306a36Sopenharmony_ci	u32		arbitration_fc_al_timeout_count;
6362306a36Sopenharmony_ci	u32		advertised_receive_bufftor_to_buffer_credit;
6462306a36Sopenharmony_ci	u32		current_receive_buffer_to_buffer_credit;
6562306a36Sopenharmony_ci	u32		advertised_transmit_buffer_to_buffer_credit;
6662306a36Sopenharmony_ci	u32		current_transmit_buffer_to_buffer_credit;
6762306a36Sopenharmony_ci	u32		received_eofa_count;
6862306a36Sopenharmony_ci	u32		received_eofdti_count;
6962306a36Sopenharmony_ci	u32		received_eofni_count;
7062306a36Sopenharmony_ci	u32		received_soff_count;
7162306a36Sopenharmony_ci	u32		received_dropped_no_aer_count;
7262306a36Sopenharmony_ci	u32		received_dropped_no_available_rpi_resources_count;
7362306a36Sopenharmony_ci	u32		received_dropped_no_available_xri_resources_count;
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistruct efct_xport_host_stats {
7762306a36Sopenharmony_ci	bool		cc;
7862306a36Sopenharmony_ci	u32		transmit_kbyte_count;
7962306a36Sopenharmony_ci	u32		receive_kbyte_count;
8062306a36Sopenharmony_ci	u32		transmit_frame_count;
8162306a36Sopenharmony_ci	u32		receive_frame_count;
8262306a36Sopenharmony_ci	u32		transmit_sequence_count;
8362306a36Sopenharmony_ci	u32		receive_sequence_count;
8462306a36Sopenharmony_ci	u32		total_exchanges_originator;
8562306a36Sopenharmony_ci	u32		total_exchanges_responder;
8662306a36Sopenharmony_ci	u32		receive_p_bsy_count;
8762306a36Sopenharmony_ci	u32		receive_f_bsy_count;
8862306a36Sopenharmony_ci	u32		dropped_frames_due_to_no_rq_buffer_count;
8962306a36Sopenharmony_ci	u32		empty_rq_timeout_count;
9062306a36Sopenharmony_ci	u32		dropped_frames_due_to_no_xri_count;
9162306a36Sopenharmony_ci	u32		empty_xri_pool_count;
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct efct_xport_host_statistics {
9562306a36Sopenharmony_ci	struct completion		done;
9662306a36Sopenharmony_ci	struct efct_xport_link_stats	link_stats;
9762306a36Sopenharmony_ci	struct efct_xport_host_stats	host_stats;
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ciunion efct_xport_stats_u {
10162306a36Sopenharmony_ci	u32	value;
10262306a36Sopenharmony_ci	struct efct_xport_host_statistics stats;
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistruct efct_xport_fcp_stats {
10662306a36Sopenharmony_ci	u64		input_bytes;
10762306a36Sopenharmony_ci	u64		output_bytes;
10862306a36Sopenharmony_ci	u64		input_requests;
10962306a36Sopenharmony_ci	u64		output_requests;
11062306a36Sopenharmony_ci	u64		control_requests;
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistruct efct_xport {
11462306a36Sopenharmony_ci	struct efct		*efct;
11562306a36Sopenharmony_ci	/* wwpn requested by user for primary nport */
11662306a36Sopenharmony_ci	u64			req_wwpn;
11762306a36Sopenharmony_ci	/* wwnn requested by user for primary nport */
11862306a36Sopenharmony_ci	u64			req_wwnn;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	/* Nodes */
12162306a36Sopenharmony_ci	/* number of allocated nodes */
12262306a36Sopenharmony_ci	u32			nodes_count;
12362306a36Sopenharmony_ci	/* used to track how often IO pool is empty */
12462306a36Sopenharmony_ci	atomic_t		io_alloc_failed_count;
12562306a36Sopenharmony_ci	/* array of pointers to nodes */
12662306a36Sopenharmony_ci	struct efc_node		**nodes;
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	/* Io pool and counts */
12962306a36Sopenharmony_ci	/* pointer to IO pool */
13062306a36Sopenharmony_ci	struct efct_io_pool	*io_pool;
13162306a36Sopenharmony_ci	/* lock for io_pending_list */
13262306a36Sopenharmony_ci	spinlock_t		io_pending_lock;
13362306a36Sopenharmony_ci	/* list of IOs waiting for HW resources
13462306a36Sopenharmony_ci	 *  lock: xport->io_pending_lock
13562306a36Sopenharmony_ci	 *  link: efct_io_s->io_pending_link
13662306a36Sopenharmony_ci	 */
13762306a36Sopenharmony_ci	struct list_head	io_pending_list;
13862306a36Sopenharmony_ci	/* count of totals IOS allocated */
13962306a36Sopenharmony_ci	atomic_t		io_total_alloc;
14062306a36Sopenharmony_ci	/* count of totals IOS free'd */
14162306a36Sopenharmony_ci	atomic_t		io_total_free;
14262306a36Sopenharmony_ci	/* count of totals IOS that were pended */
14362306a36Sopenharmony_ci	atomic_t		io_total_pending;
14462306a36Sopenharmony_ci	/* count of active IOS */
14562306a36Sopenharmony_ci	atomic_t		io_active_count;
14662306a36Sopenharmony_ci	/* count of pending IOS */
14762306a36Sopenharmony_ci	atomic_t		io_pending_count;
14862306a36Sopenharmony_ci	/* non-zero if efct_scsi_check_pending is executing */
14962306a36Sopenharmony_ci	atomic_t		io_pending_recursing;
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	/* Port */
15262306a36Sopenharmony_ci	/* requested link state */
15362306a36Sopenharmony_ci	u32			configured_link_state;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	/* Timer for Statistics */
15662306a36Sopenharmony_ci	struct timer_list	stats_timer;
15762306a36Sopenharmony_ci	union efct_xport_stats_u fc_xport_stats;
15862306a36Sopenharmony_ci	struct efct_xport_fcp_stats fcp_stats;
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistruct efct_rport_data {
16262306a36Sopenharmony_ci	struct efc_node		*node;
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistruct efct_xport *
16662306a36Sopenharmony_ciefct_xport_alloc(struct efct *efct);
16762306a36Sopenharmony_ciint
16862306a36Sopenharmony_ciefct_xport_attach(struct efct_xport *xport);
16962306a36Sopenharmony_ciint
17062306a36Sopenharmony_ciefct_xport_initialize(struct efct_xport *xport);
17162306a36Sopenharmony_civoid
17262306a36Sopenharmony_ciefct_xport_detach(struct efct_xport *xport);
17362306a36Sopenharmony_ciint
17462306a36Sopenharmony_ciefct_xport_control(struct efct_xport *xport, enum efct_xport_ctrl cmd, ...);
17562306a36Sopenharmony_ciint
17662306a36Sopenharmony_ciefct_xport_status(struct efct_xport *xport, enum efct_xport_status cmd,
17762306a36Sopenharmony_ci		  union efct_xport_stats_u *result);
17862306a36Sopenharmony_civoid
17962306a36Sopenharmony_ciefct_xport_free(struct efct_xport *xport);
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_cistruct scsi_transport_template *efct_attach_fc_transport(void);
18262306a36Sopenharmony_cistruct scsi_transport_template *efct_attach_vport_fc_transport(void);
18362306a36Sopenharmony_civoid
18462306a36Sopenharmony_ciefct_release_fc_transport(struct scsi_transport_template *transport_template);
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci#endif /* __EFCT_XPORT_H__ */
187