187 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term4 * “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_QUIESCED27};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 resources134 * lock: xport->io_pending_lock135 * link: efct_io_s->io_pending_link136 */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);167int168efct_xport_attach(struct efct_xport *xport);169int170efct_xport_initialize(struct efct_xport *xport);171void172efct_xport_detach(struct efct_xport *xport);173int174efct_xport_control(struct efct_xport *xport, enum efct_xport_ctrl cmd, ...);175int176efct_xport_status(struct efct_xport *xport, enum efct_xport_status cmd,177 union efct_xport_stats_u *result);178void179efct_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);183void184efct_release_fc_transport(struct scsi_transport_template *transport_template);185 186#endif /* __EFCT_XPORT_H__ */187