| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright (C) 2021 Broadcom. All Rights Reserved. The term |
| * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. |
| */ |
| |
| #if !defined(__EFCT_XPORT_H__) |
| #define __EFCT_XPORT_H__ |
| |
| enum efct_xport_ctrl { |
| EFCT_XPORT_PORT_ONLINE = 1, |
| EFCT_XPORT_PORT_OFFLINE, |
| EFCT_XPORT_SHUTDOWN, |
| EFCT_XPORT_POST_NODE_EVENT, |
| EFCT_XPORT_WWNN_SET, |
| EFCT_XPORT_WWPN_SET, |
| }; |
| |
| enum efct_xport_status { |
| EFCT_XPORT_PORT_STATUS, |
| EFCT_XPORT_CONFIG_PORT_STATUS, |
| EFCT_XPORT_LINK_SPEED, |
| EFCT_XPORT_IS_SUPPORTED_LINK_SPEED, |
| EFCT_XPORT_LINK_STATISTICS, |
| EFCT_XPORT_LINK_STAT_RESET, |
| EFCT_XPORT_IS_QUIESCED |
| }; |
| |
| struct efct_xport_link_stats { |
| bool rec; |
| bool gec; |
| bool w02of; |
| bool w03of; |
| bool w04of; |
| bool w05of; |
| bool w06of; |
| bool w07of; |
| bool w08of; |
| bool w09of; |
| bool w10of; |
| bool w11of; |
| bool w12of; |
| bool w13of; |
| bool w14of; |
| bool w15of; |
| bool w16of; |
| bool w17of; |
| bool w18of; |
| bool w19of; |
| bool w20of; |
| bool w21of; |
| bool clrc; |
| bool clof1; |
| u32 link_failure_error_count; |
| u32 loss_of_sync_error_count; |
| u32 loss_of_signal_error_count; |
| u32 primitive_sequence_error_count; |
| u32 invalid_transmission_word_error_count; |
| u32 crc_error_count; |
| u32 primitive_sequence_event_timeout_count; |
| u32 elastic_buffer_overrun_error_count; |
| u32 arbitration_fc_al_timeout_count; |
| u32 advertised_receive_bufftor_to_buffer_credit; |
| u32 current_receive_buffer_to_buffer_credit; |
| u32 advertised_transmit_buffer_to_buffer_credit; |
| u32 current_transmit_buffer_to_buffer_credit; |
| u32 received_eofa_count; |
| u32 received_eofdti_count; |
| u32 received_eofni_count; |
| u32 received_soff_count; |
| u32 received_dropped_no_aer_count; |
| u32 received_dropped_no_available_rpi_resources_count; |
| u32 received_dropped_no_available_xri_resources_count; |
| }; |
| |
| struct efct_xport_host_stats { |
| bool cc; |
| u32 transmit_kbyte_count; |
| u32 receive_kbyte_count; |
| u32 transmit_frame_count; |
| u32 receive_frame_count; |
| u32 transmit_sequence_count; |
| u32 receive_sequence_count; |
| u32 total_exchanges_originator; |
| u32 total_exchanges_responder; |
| u32 receive_p_bsy_count; |
| u32 receive_f_bsy_count; |
| u32 dropped_frames_due_to_no_rq_buffer_count; |
| u32 empty_rq_timeout_count; |
| u32 dropped_frames_due_to_no_xri_count; |
| u32 empty_xri_pool_count; |
| }; |
| |
| struct efct_xport_host_statistics { |
| struct completion done; |
| struct efct_xport_link_stats link_stats; |
| struct efct_xport_host_stats host_stats; |
| }; |
| |
| union efct_xport_stats_u { |
| u32 value; |
| struct efct_xport_host_statistics stats; |
| }; |
| |
| struct efct_xport_fcp_stats { |
| u64 input_bytes; |
| u64 output_bytes; |
| u64 input_requests; |
| u64 output_requests; |
| u64 control_requests; |
| }; |
| |
| struct efct_xport { |
| struct efct *efct; |
| /* wwpn requested by user for primary nport */ |
| u64 req_wwpn; |
| /* wwnn requested by user for primary nport */ |
| u64 req_wwnn; |
| |
| /* Nodes */ |
| /* number of allocated nodes */ |
| u32 nodes_count; |
| /* used to track how often IO pool is empty */ |
| atomic_t io_alloc_failed_count; |
| /* array of pointers to nodes */ |
| struct efc_node **nodes; |
| |
| /* Io pool and counts */ |
| /* pointer to IO pool */ |
| struct efct_io_pool *io_pool; |
| /* lock for io_pending_list */ |
| spinlock_t io_pending_lock; |
| /* list of IOs waiting for HW resources |
| * lock: xport->io_pending_lock |
| * link: efct_io_s->io_pending_link |
| */ |
| struct list_head io_pending_list; |
| /* count of totals IOS allocated */ |
| atomic_t io_total_alloc; |
| /* count of totals IOS free'd */ |
| atomic_t io_total_free; |
| /* count of totals IOS that were pended */ |
| atomic_t io_total_pending; |
| /* count of active IOS */ |
| atomic_t io_active_count; |
| /* count of pending IOS */ |
| atomic_t io_pending_count; |
| /* non-zero if efct_scsi_check_pending is executing */ |
| atomic_t io_pending_recursing; |
| |
| /* Port */ |
| /* requested link state */ |
| u32 configured_link_state; |
| |
| /* Timer for Statistics */ |
| struct timer_list stats_timer; |
| union efct_xport_stats_u fc_xport_stats; |
| struct efct_xport_fcp_stats fcp_stats; |
| }; |
| |
| struct efct_rport_data { |
| struct efc_node *node; |
| }; |
| |
| struct efct_xport * |
| efct_xport_alloc(struct efct *efct); |
| int |
| efct_xport_attach(struct efct_xport *xport); |
| int |
| efct_xport_initialize(struct efct_xport *xport); |
| void |
| efct_xport_detach(struct efct_xport *xport); |
| int |
| efct_xport_control(struct efct_xport *xport, enum efct_xport_ctrl cmd, ...); |
| int |
| efct_xport_status(struct efct_xport *xport, enum efct_xport_status cmd, |
| union efct_xport_stats_u *result); |
| void |
| efct_xport_free(struct efct_xport *xport); |
| |
| struct scsi_transport_template *efct_attach_fc_transport(void); |
| struct scsi_transport_template *efct_attach_vport_fc_transport(void); |
| void |
| efct_release_fc_transport(struct scsi_transport_template *transport_template); |
| |
| #endif /* __EFCT_XPORT_H__ */ |