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

source code of linux/drivers/scsi/elx/efct/efct_xport.h