freebsd-nq/sys/dev/ocs_fc/ocs_xport.h
Kenneth D. Merry ef270ab1b6 Bring in the Broadcom/Emulex Fibre Channel driver, ocs_fc(4).
The ocs_fc(4) driver supports the following hardware:

Emulex 16/8G FC GEN 5 HBAS
	LPe15004 FC Host Bus Adapters
	LPe160XX FC Host Bus Adapters

Emulex 32/16G FC GEN 6 HBAS
	LPe3100X FC Host Bus Adapters
	LPe3200X FC Host Bus Adapters

The driver supports target and initiator mode, and also supports FC-Tape.

Note that the driver only currently works on little endian platforms.  It
is only included in the module build for amd64 and i386, and in GENERIC
on amd64 only.

Submitted by:	Ram Kishore Vegesna <ram.vegesna@broadcom.com>
Reviewed by:	mav
MFC after:	5 days
Relnotes:	yes
Sponsored by:	Broadcom
Differential Revision:	https://reviews.freebsd.org/D11423
2018-03-30 15:28:25 +00:00

214 lines
6.8 KiB
C

/*-
* Copyright (c) 2017 Broadcom. All rights reserved.
* The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
/**
* @file
*
*/
#if !defined(__OCS_XPORT_H__)
#define __OCS_XPORT_H__
/**
* @brief FCFI lookup/pending frames
*/
typedef struct ocs_xport_fcfi_s {
ocs_lock_t pend_frames_lock;
ocs_list_t pend_frames;
uint32_t hold_frames:1; /*<< hold pending frames */
uint32_t pend_frames_processed; /*<< count of pending frames that were processed */
} ocs_xport_fcfi_t;
/**
* @brief Structure to hold the information related to an RQ processing thread used
* to increase 40G performance.
*/
typedef struct ocs_xport_rq_thread_info_s {
ocs_t *ocs;
uint8_t thread_started;
ocs_thread_t thread;
ocs_cbuf_t * seq_cbuf;
char thread_name[64];
} ocs_xport_rq_thread_info_t;
typedef enum {
OCS_XPORT_PORT_ONLINE=1,
OCS_XPORT_PORT_OFFLINE,
OCS_XPORT_SHUTDOWN,
OCS_XPORT_POST_NODE_EVENT,
OCS_XPORT_WWNN_SET,
OCS_XPORT_WWPN_SET,
} ocs_xport_ctrl_e;
typedef enum {
OCS_XPORT_PORT_STATUS,
OCS_XPORT_CONFIG_PORT_STATUS,
OCS_XPORT_LINK_SPEED,
OCS_XPORT_IS_SUPPORTED_LINK_SPEED,
OCS_XPORT_LINK_STATISTICS,
OCS_XPORT_LINK_STAT_RESET,
OCS_XPORT_IS_QUIESCED
} ocs_xport_status_e;
typedef struct ocs_xport_link_stats_s {
uint32_t rec:1,
gec:1,
w02of:1,
w03of:1,
w04of:1,
w05of:1,
w06of:1,
w07of:1,
w08of:1,
w09of:1,
w10of:1,
w11of:1,
w12of:1,
w13of:1,
w14of:1,
w15of:1,
w16of:1,
w17of:1,
w18of:1,
w19of:1,
w20of:1,
w21of:1,
resv0:8,
clrc:1,
clof:1;
uint32_t link_failure_error_count;
uint32_t loss_of_sync_error_count;
uint32_t loss_of_signal_error_count;
uint32_t primitive_sequence_error_count;
uint32_t invalid_transmission_word_error_count;
uint32_t crc_error_count;
uint32_t primitive_sequence_event_timeout_count;
uint32_t elastic_buffer_overrun_error_count;
uint32_t arbitration_fc_al_timout_count;
uint32_t advertised_receive_bufftor_to_buffer_credit;
uint32_t current_receive_buffer_to_buffer_credit;
uint32_t advertised_transmit_buffer_to_buffer_credit;
uint32_t current_transmit_buffer_to_buffer_credit;
uint32_t received_eofa_count;
uint32_t received_eofdti_count;
uint32_t received_eofni_count;
uint32_t received_soff_count;
uint32_t received_dropped_no_aer_count;
uint32_t received_dropped_no_available_rpi_resources_count;
uint32_t received_dropped_no_available_xri_resources_count;
} ocs_xport_link_stats_t;
typedef struct ocs_xport_host_stats_s {
uint32_t cc:1,
:31;
uint32_t transmit_kbyte_count;
uint32_t receive_kbyte_count;
uint32_t transmit_frame_count;
uint32_t receive_frame_count;
uint32_t transmit_sequence_count;
uint32_t receive_sequence_count;
uint32_t total_exchanges_originator;
uint32_t total_exchanges_responder;
uint32_t receive_p_bsy_count;
uint32_t receive_f_bsy_count;
uint32_t dropped_frames_due_to_no_rq_buffer_count;
uint32_t empty_rq_timeout_count;
uint32_t dropped_frames_due_to_no_xri_count;
uint32_t empty_xri_pool_count;
} ocs_xport_host_stats_t;
typedef struct ocs_xport_host_statistics_s {
ocs_sem_t semaphore;
ocs_xport_link_stats_t link_stats;
ocs_xport_host_stats_t host_stats;
} ocs_xport_host_statistics_t;
typedef union ocs_xport {
uint32_t value;
ocs_xport_host_statistics_t stats;
} ocs_xport_stats_t;
/**
* @brief Transport private values
*/
struct ocs_xport_s {
ocs_t *ocs;
uint64_t req_wwpn; /*<< wwpn requested by user for primary sport */
uint64_t req_wwnn; /*<< wwnn requested by user for primary sport */
ocs_xport_fcfi_t fcfi[SLI4_MAX_FCFI];
/* Nodes */
uint32_t nodes_count; /**< number of allocated nodes */
ocs_node_t **nodes; /**< array of pointers to nodes */
ocs_list_t nodes_free_list; /**< linked list of free nodes */
/* Io pool and counts */
ocs_io_pool_t *io_pool; /**< pointer to IO pool */
ocs_atomic_t io_alloc_failed_count; /**< used to track how often IO pool is empty */
ocs_lock_t io_pending_lock; /**< lock for io_pending_list */
ocs_list_t io_pending_list; /**< list of IOs waiting for HW resources
** lock: xport->io_pending_lock
** link: ocs_io_t->io_pending_link
*/
ocs_atomic_t io_total_alloc; /**< count of totals IOS allocated */
ocs_atomic_t io_total_free; /**< count of totals IOS free'd */
ocs_atomic_t io_total_pending; /**< count of totals IOS that were pended */
ocs_atomic_t io_active_count; /**< count of active IOS */
ocs_atomic_t io_pending_count; /**< count of pending IOS */
ocs_atomic_t io_pending_recursing; /**< non-zero if ocs_scsi_check_pending is executing */
/* vport */
ocs_list_t vport_list; /**< list of VPORTS (NPIV) */
/* Port */
uint32_t configured_link_state; /**< requested link state */
/* RQ processing threads */
uint32_t num_rq_threads;
ocs_xport_rq_thread_info_t *rq_thread_info;
ocs_timer_t stats_timer; /**< Timer for Statistics */
ocs_xport_stats_t fc_xport_stats;
};
extern ocs_xport_t *ocs_xport_alloc(ocs_t *ocs);
extern int32_t ocs_xport_attach(ocs_xport_t *xport);
extern int32_t ocs_xport_initialize(ocs_xport_t *xport);
extern int32_t ocs_xport_detach(ocs_xport_t *xport);
extern int32_t ocs_xport_control(ocs_xport_t *xport, ocs_xport_ctrl_e cmd, ...);
extern int32_t ocs_xport_status(ocs_xport_t *xport, ocs_xport_status_e cmd, ocs_xport_stats_t *result);
extern void ocs_xport_free(ocs_xport_t *xport);
#endif