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 10 enum 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 19 enum 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 29 struct 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 76 struct 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 94 struct 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 100 union efct_xport_stats_u { 101 u32 value; 102 struct efct_xport_host_statistics stats; 103 }; 104 105 struct 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 113 struct 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 161 struct efct_rport_data { 162 struct efc_node *node; 163 }; 164 165 struct efct_xport * 166 efct_xport_alloc(struct efct *efct); 167 int 168 efct_xport_attach(struct efct_xport *xport); 169 int 170 efct_xport_initialize(struct efct_xport *xport); 171 void 172 efct_xport_detach(struct efct_xport *xport); 173 int 174 efct_xport_control(struct efct_xport *xport, enum efct_xport_ctrl cmd, ...); 175 int 176 efct_xport_status(struct efct_xport *xport, enum efct_xport_status cmd, 177 union efct_xport_stats_u *result); 178 void 179 efct_xport_free(struct efct_xport *xport); 180 181 struct scsi_transport_template *efct_attach_fc_transport(void); 182 struct scsi_transport_template *efct_attach_vport_fc_transport(void); 183 void 184 efct_release_fc_transport(struct scsi_transport_template *transport_template); 185 186 #endif /* __EFCT_XPORT_H__ */ 187