/* 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__ */