1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
4 * ���Broadcom��� refers to Broadcom Inc. and/or its subsidiaries.
5 */
6
7#if !defined(__EFCT_XPORT_H__)
8#define __EFCT_XPORT_H__
9
10enum efct_xport_ctrl {
11	EFCT_XPORT_PORT_ONLINE = 1,
12	EFCT_XPORT_PORT_OFFLINE,
13	EFCT_XPORT_SHUTDOWN,
14	EFCT_XPORT_POST_NODE_EVENT,
15	EFCT_XPORT_WWNN_SET,
16	EFCT_XPORT_WWPN_SET,
17};
18
19enum efct_xport_status {
20	EFCT_XPORT_PORT_STATUS,
21	EFCT_XPORT_CONFIG_PORT_STATUS,
22	EFCT_XPORT_LINK_SPEED,
23	EFCT_XPORT_IS_SUPPORTED_LINK_SPEED,
24	EFCT_XPORT_LINK_STATISTICS,
25	EFCT_XPORT_LINK_STAT_RESET,
26	EFCT_XPORT_IS_QUIESCED
27};
28
29struct efct_xport_link_stats {
30	bool		rec;
31	bool		gec;
32	bool		w02of;
33	bool		w03of;
34	bool		w04of;
35	bool		w05of;
36	bool		w06of;
37	bool		w07of;
38	bool		w08of;
39	bool		w09of;
40	bool		w10of;
41	bool		w11of;
42	bool		w12of;
43	bool		w13of;
44	bool		w14of;
45	bool		w15of;
46	bool		w16of;
47	bool		w17of;
48	bool		w18of;
49	bool		w19of;
50	bool		w20of;
51	bool		w21of;
52	bool		clrc;
53	bool		clof1;
54	u32		link_failure_error_count;
55	u32		loss_of_sync_error_count;
56	u32		loss_of_signal_error_count;
57	u32		primitive_sequence_error_count;
58	u32		invalid_transmission_word_error_count;
59	u32		crc_error_count;
60	u32		primitive_sequence_event_timeout_count;
61	u32		elastic_buffer_overrun_error_count;
62	u32		arbitration_fc_al_timeout_count;
63	u32		advertised_receive_bufftor_to_buffer_credit;
64	u32		current_receive_buffer_to_buffer_credit;
65	u32		advertised_transmit_buffer_to_buffer_credit;
66	u32		current_transmit_buffer_to_buffer_credit;
67	u32		received_eofa_count;
68	u32		received_eofdti_count;
69	u32		received_eofni_count;
70	u32		received_soff_count;
71	u32		received_dropped_no_aer_count;
72	u32		received_dropped_no_available_rpi_resources_count;
73	u32		received_dropped_no_available_xri_resources_count;
74};
75
76struct efct_xport_host_stats {
77	bool		cc;
78	u32		transmit_kbyte_count;
79	u32		receive_kbyte_count;
80	u32		transmit_frame_count;
81	u32		receive_frame_count;
82	u32		transmit_sequence_count;
83	u32		receive_sequence_count;
84	u32		total_exchanges_originator;
85	u32		total_exchanges_responder;
86	u32		receive_p_bsy_count;
87	u32		receive_f_bsy_count;
88	u32		dropped_frames_due_to_no_rq_buffer_count;
89	u32		empty_rq_timeout_count;
90	u32		dropped_frames_due_to_no_xri_count;
91	u32		empty_xri_pool_count;
92};
93
94struct efct_xport_host_statistics {
95	struct completion		done;
96	struct efct_xport_link_stats	link_stats;
97	struct efct_xport_host_stats	host_stats;
98};
99
100union efct_xport_stats_u {
101	u32	value;
102	struct efct_xport_host_statistics stats;
103};
104
105struct efct_xport_fcp_stats {
106	u64		input_bytes;
107	u64		output_bytes;
108	u64		input_requests;
109	u64		output_requests;
110	u64		control_requests;
111};
112
113struct efct_xport {
114	struct efct		*efct;
115	/* wwpn requested by user for primary nport */
116	u64			req_wwpn;
117	/* wwnn requested by user for primary nport */
118	u64			req_wwnn;
119
120	/* Nodes */
121	/* number of allocated nodes */
122	u32			nodes_count;
123	/* used to track how often IO pool is empty */
124	atomic_t		io_alloc_failed_count;
125	/* array of pointers to nodes */
126	struct efc_node		**nodes;
127
128	/* Io pool and counts */
129	/* pointer to IO pool */
130	struct efct_io_pool	*io_pool;
131	/* lock for io_pending_list */
132	spinlock_t		io_pending_lock;
133	/* list of IOs waiting for HW resources
134	 *  lock: xport->io_pending_lock
135	 *  link: efct_io_s->io_pending_link
136	 */
137	struct list_head	io_pending_list;
138	/* count of totals IOS allocated */
139	atomic_t		io_total_alloc;
140	/* count of totals IOS free'd */
141	atomic_t		io_total_free;
142	/* count of totals IOS that were pended */
143	atomic_t		io_total_pending;
144	/* count of active IOS */
145	atomic_t		io_active_count;
146	/* count of pending IOS */
147	atomic_t		io_pending_count;
148	/* non-zero if efct_scsi_check_pending is executing */
149	atomic_t		io_pending_recursing;
150
151	/* Port */
152	/* requested link state */
153	u32			configured_link_state;
154
155	/* Timer for Statistics */
156	struct timer_list	stats_timer;
157	union efct_xport_stats_u fc_xport_stats;
158	struct efct_xport_fcp_stats fcp_stats;
159};
160
161struct efct_rport_data {
162	struct efc_node		*node;
163};
164
165struct efct_xport *
166efct_xport_alloc(struct efct *efct);
167int
168efct_xport_attach(struct efct_xport *xport);
169int
170efct_xport_initialize(struct efct_xport *xport);
171void
172efct_xport_detach(struct efct_xport *xport);
173int
174efct_xport_control(struct efct_xport *xport, enum efct_xport_ctrl cmd, ...);
175int
176efct_xport_status(struct efct_xport *xport, enum efct_xport_status cmd,
177		  union efct_xport_stats_u *result);
178void
179efct_xport_free(struct efct_xport *xport);
180
181struct scsi_transport_template *efct_attach_fc_transport(void);
182struct scsi_transport_template *efct_attach_vport_fc_transport(void);
183void
184efct_release_fc_transport(struct scsi_transport_template *transport_template);
185
186#endif /* __EFCT_XPORT_H__ */
187