162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2021 Broadcom. All Rights Reserved. The term 462306a36Sopenharmony_ci * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#if !defined(__EFCT_XPORT_H__) 862306a36Sopenharmony_ci#define __EFCT_XPORT_H__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cienum efct_xport_ctrl { 1162306a36Sopenharmony_ci EFCT_XPORT_PORT_ONLINE = 1, 1262306a36Sopenharmony_ci EFCT_XPORT_PORT_OFFLINE, 1362306a36Sopenharmony_ci EFCT_XPORT_SHUTDOWN, 1462306a36Sopenharmony_ci EFCT_XPORT_POST_NODE_EVENT, 1562306a36Sopenharmony_ci EFCT_XPORT_WWNN_SET, 1662306a36Sopenharmony_ci EFCT_XPORT_WWPN_SET, 1762306a36Sopenharmony_ci}; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cienum efct_xport_status { 2062306a36Sopenharmony_ci EFCT_XPORT_PORT_STATUS, 2162306a36Sopenharmony_ci EFCT_XPORT_CONFIG_PORT_STATUS, 2262306a36Sopenharmony_ci EFCT_XPORT_LINK_SPEED, 2362306a36Sopenharmony_ci EFCT_XPORT_IS_SUPPORTED_LINK_SPEED, 2462306a36Sopenharmony_ci EFCT_XPORT_LINK_STATISTICS, 2562306a36Sopenharmony_ci EFCT_XPORT_LINK_STAT_RESET, 2662306a36Sopenharmony_ci EFCT_XPORT_IS_QUIESCED 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistruct efct_xport_link_stats { 3062306a36Sopenharmony_ci bool rec; 3162306a36Sopenharmony_ci bool gec; 3262306a36Sopenharmony_ci bool w02of; 3362306a36Sopenharmony_ci bool w03of; 3462306a36Sopenharmony_ci bool w04of; 3562306a36Sopenharmony_ci bool w05of; 3662306a36Sopenharmony_ci bool w06of; 3762306a36Sopenharmony_ci bool w07of; 3862306a36Sopenharmony_ci bool w08of; 3962306a36Sopenharmony_ci bool w09of; 4062306a36Sopenharmony_ci bool w10of; 4162306a36Sopenharmony_ci bool w11of; 4262306a36Sopenharmony_ci bool w12of; 4362306a36Sopenharmony_ci bool w13of; 4462306a36Sopenharmony_ci bool w14of; 4562306a36Sopenharmony_ci bool w15of; 4662306a36Sopenharmony_ci bool w16of; 4762306a36Sopenharmony_ci bool w17of; 4862306a36Sopenharmony_ci bool w18of; 4962306a36Sopenharmony_ci bool w19of; 5062306a36Sopenharmony_ci bool w20of; 5162306a36Sopenharmony_ci bool w21of; 5262306a36Sopenharmony_ci bool clrc; 5362306a36Sopenharmony_ci bool clof1; 5462306a36Sopenharmony_ci u32 link_failure_error_count; 5562306a36Sopenharmony_ci u32 loss_of_sync_error_count; 5662306a36Sopenharmony_ci u32 loss_of_signal_error_count; 5762306a36Sopenharmony_ci u32 primitive_sequence_error_count; 5862306a36Sopenharmony_ci u32 invalid_transmission_word_error_count; 5962306a36Sopenharmony_ci u32 crc_error_count; 6062306a36Sopenharmony_ci u32 primitive_sequence_event_timeout_count; 6162306a36Sopenharmony_ci u32 elastic_buffer_overrun_error_count; 6262306a36Sopenharmony_ci u32 arbitration_fc_al_timeout_count; 6362306a36Sopenharmony_ci u32 advertised_receive_bufftor_to_buffer_credit; 6462306a36Sopenharmony_ci u32 current_receive_buffer_to_buffer_credit; 6562306a36Sopenharmony_ci u32 advertised_transmit_buffer_to_buffer_credit; 6662306a36Sopenharmony_ci u32 current_transmit_buffer_to_buffer_credit; 6762306a36Sopenharmony_ci u32 received_eofa_count; 6862306a36Sopenharmony_ci u32 received_eofdti_count; 6962306a36Sopenharmony_ci u32 received_eofni_count; 7062306a36Sopenharmony_ci u32 received_soff_count; 7162306a36Sopenharmony_ci u32 received_dropped_no_aer_count; 7262306a36Sopenharmony_ci u32 received_dropped_no_available_rpi_resources_count; 7362306a36Sopenharmony_ci u32 received_dropped_no_available_xri_resources_count; 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct efct_xport_host_stats { 7762306a36Sopenharmony_ci bool cc; 7862306a36Sopenharmony_ci u32 transmit_kbyte_count; 7962306a36Sopenharmony_ci u32 receive_kbyte_count; 8062306a36Sopenharmony_ci u32 transmit_frame_count; 8162306a36Sopenharmony_ci u32 receive_frame_count; 8262306a36Sopenharmony_ci u32 transmit_sequence_count; 8362306a36Sopenharmony_ci u32 receive_sequence_count; 8462306a36Sopenharmony_ci u32 total_exchanges_originator; 8562306a36Sopenharmony_ci u32 total_exchanges_responder; 8662306a36Sopenharmony_ci u32 receive_p_bsy_count; 8762306a36Sopenharmony_ci u32 receive_f_bsy_count; 8862306a36Sopenharmony_ci u32 dropped_frames_due_to_no_rq_buffer_count; 8962306a36Sopenharmony_ci u32 empty_rq_timeout_count; 9062306a36Sopenharmony_ci u32 dropped_frames_due_to_no_xri_count; 9162306a36Sopenharmony_ci u32 empty_xri_pool_count; 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistruct efct_xport_host_statistics { 9562306a36Sopenharmony_ci struct completion done; 9662306a36Sopenharmony_ci struct efct_xport_link_stats link_stats; 9762306a36Sopenharmony_ci struct efct_xport_host_stats host_stats; 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ciunion efct_xport_stats_u { 10162306a36Sopenharmony_ci u32 value; 10262306a36Sopenharmony_ci struct efct_xport_host_statistics stats; 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistruct efct_xport_fcp_stats { 10662306a36Sopenharmony_ci u64 input_bytes; 10762306a36Sopenharmony_ci u64 output_bytes; 10862306a36Sopenharmony_ci u64 input_requests; 10962306a36Sopenharmony_ci u64 output_requests; 11062306a36Sopenharmony_ci u64 control_requests; 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistruct efct_xport { 11462306a36Sopenharmony_ci struct efct *efct; 11562306a36Sopenharmony_ci /* wwpn requested by user for primary nport */ 11662306a36Sopenharmony_ci u64 req_wwpn; 11762306a36Sopenharmony_ci /* wwnn requested by user for primary nport */ 11862306a36Sopenharmony_ci u64 req_wwnn; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci /* Nodes */ 12162306a36Sopenharmony_ci /* number of allocated nodes */ 12262306a36Sopenharmony_ci u32 nodes_count; 12362306a36Sopenharmony_ci /* used to track how often IO pool is empty */ 12462306a36Sopenharmony_ci atomic_t io_alloc_failed_count; 12562306a36Sopenharmony_ci /* array of pointers to nodes */ 12662306a36Sopenharmony_ci struct efc_node **nodes; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci /* Io pool and counts */ 12962306a36Sopenharmony_ci /* pointer to IO pool */ 13062306a36Sopenharmony_ci struct efct_io_pool *io_pool; 13162306a36Sopenharmony_ci /* lock for io_pending_list */ 13262306a36Sopenharmony_ci spinlock_t io_pending_lock; 13362306a36Sopenharmony_ci /* list of IOs waiting for HW resources 13462306a36Sopenharmony_ci * lock: xport->io_pending_lock 13562306a36Sopenharmony_ci * link: efct_io_s->io_pending_link 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_ci struct list_head io_pending_list; 13862306a36Sopenharmony_ci /* count of totals IOS allocated */ 13962306a36Sopenharmony_ci atomic_t io_total_alloc; 14062306a36Sopenharmony_ci /* count of totals IOS free'd */ 14162306a36Sopenharmony_ci atomic_t io_total_free; 14262306a36Sopenharmony_ci /* count of totals IOS that were pended */ 14362306a36Sopenharmony_ci atomic_t io_total_pending; 14462306a36Sopenharmony_ci /* count of active IOS */ 14562306a36Sopenharmony_ci atomic_t io_active_count; 14662306a36Sopenharmony_ci /* count of pending IOS */ 14762306a36Sopenharmony_ci atomic_t io_pending_count; 14862306a36Sopenharmony_ci /* non-zero if efct_scsi_check_pending is executing */ 14962306a36Sopenharmony_ci atomic_t io_pending_recursing; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci /* Port */ 15262306a36Sopenharmony_ci /* requested link state */ 15362306a36Sopenharmony_ci u32 configured_link_state; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci /* Timer for Statistics */ 15662306a36Sopenharmony_ci struct timer_list stats_timer; 15762306a36Sopenharmony_ci union efct_xport_stats_u fc_xport_stats; 15862306a36Sopenharmony_ci struct efct_xport_fcp_stats fcp_stats; 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistruct efct_rport_data { 16262306a36Sopenharmony_ci struct efc_node *node; 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistruct efct_xport * 16662306a36Sopenharmony_ciefct_xport_alloc(struct efct *efct); 16762306a36Sopenharmony_ciint 16862306a36Sopenharmony_ciefct_xport_attach(struct efct_xport *xport); 16962306a36Sopenharmony_ciint 17062306a36Sopenharmony_ciefct_xport_initialize(struct efct_xport *xport); 17162306a36Sopenharmony_civoid 17262306a36Sopenharmony_ciefct_xport_detach(struct efct_xport *xport); 17362306a36Sopenharmony_ciint 17462306a36Sopenharmony_ciefct_xport_control(struct efct_xport *xport, enum efct_xport_ctrl cmd, ...); 17562306a36Sopenharmony_ciint 17662306a36Sopenharmony_ciefct_xport_status(struct efct_xport *xport, enum efct_xport_status cmd, 17762306a36Sopenharmony_ci union efct_xport_stats_u *result); 17862306a36Sopenharmony_civoid 17962306a36Sopenharmony_ciefct_xport_free(struct efct_xport *xport); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistruct scsi_transport_template *efct_attach_fc_transport(void); 18262306a36Sopenharmony_cistruct scsi_transport_template *efct_attach_vport_fc_transport(void); 18362306a36Sopenharmony_civoid 18462306a36Sopenharmony_ciefct_release_fc_transport(struct scsi_transport_template *transport_template); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci#endif /* __EFCT_XPORT_H__ */ 187