2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER START
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * The contents of this file are subject to the terms of the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Common Development and Distribution License (the "License").
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You may not use this file except in compliance with the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * or http://www.opensolaris.org/os/licensing.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * See the License for the specific language governing permissions
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * and limitations under the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * When distributing Covered Code, include this CDDL HEADER in each
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * If applicable, add the following below this CDDL HEADER, with the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * fields enclosed by brackets "[]" replaced with your own identifying
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * information: Portions Copyright [yyyy] [name of copyright owner]
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER END
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifndef _FCOET_H
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define _FCOET_H
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/stmf_defines.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifdef __cplusplus
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangextern "C" {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifdef _KERNEL
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
87dcbdbdce8044d5199e015edd8fb347d16ee0b5Kevin Yu#define FCOET_VERSION "v20091123-1.02"
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_NAME "COMSTAR FCoET "
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_MOD_NAME FCOET_NAME FCOET_VERSION
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#define FCOET_TASKQ_NAME_LEN 32
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOET logging
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangextern int fcoet_use_ext_log;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Caution: 1) LOG will be available in debug/non-debug mode
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * 2) Anything which can potentially flood the log should be under
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * extended logging, and use FCOET_EXT_LOG.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * 3) Don't use FCOET_EXT_LOG in performance-critical code path, such
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * as normal SCSI I/O code path. It could hurt system performance.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * 4) Use kmdb to change focet_use_ext_log in the fly to adjust
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * tracing
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_EXT_LOG(log_ident, ...) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_use_ext_log) { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_trace(log_ident, __VA_ARGS__); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_LOG(log_ident, ...) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_trace(log_ident, __VA_ARGS__)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * define common-used constants
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_MAX_LOGINS 2048
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_MAX_XCHGES 2048
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_SOL_HASH_SIZE 128
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_UNSOL_HASH_SIZE 2048
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef enum fcoet_sol_flogi_state {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SFS_WAIT_LINKUP = 0,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SFS_FLOGI_INIT,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SFS_FLOGI_CHECK_TIMEOUT,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SFS_ABTS_INIT,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SFS_CLEAR_FLOGI,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SFS_FLOGI_ACC,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SFS_FLOGI_DONE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoet_sol_flogi_state_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * define data structures
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstruct fcoet_exchange;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoet_soft_state {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * basic information
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dev_info_t *ss_dip;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ss_instance;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ss_flags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_local_port_t *ss_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_port_t *ss_eport;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang char ss_alias[32];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ss_fcp_data_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * support degregister remote port
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ss_rportid_in_dereg;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ss_rport_dereg_state;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * oxid/rxid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_t *ss_sol_oxid_hash;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_t *ss_unsol_rxid_hash;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t ss_next_sol_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t ss_next_unsol_rxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ss_sol_oxid_hash_empty;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ss_unsol_rxid_hash_empty;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * watch thread related stuff
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_taskq_t *ss_watchdog_taskq;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang kcondvar_t ss_watch_cv;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang kmutex_t ss_watch_mutex;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint64_t ss_watch_count;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_t ss_abort_xchg_list;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * topology discovery
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang struct fcoet_exchange *ss_sol_flogi;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_sol_flogi_state_t ss_sol_flogi_state;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_link_info_t ss_link_info;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * ioctl related stuff
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ss_ioctl_flags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang kmutex_t ss_ioctl_mutex;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * special stuff
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ss_change_state_flags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ss_state:7,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss_state_not_acked:1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoet_soft_state_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_UNSOL_FLOGI_DONE 0x0001
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_REPORT_TO_FCT 0x0002
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_PORT_DISABLED 0x0004
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_STOP_WATCH 0x0008
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_TERMINATE_WATCHDOG 0x0010
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_WATCHDOG_RUNNING 0x0020
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_DOG_WAITING 0x0040
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define SS_FLAG_DELAY_PLOGI 0x0080
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Sequence and frame are transient objects, so their definition is simple.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Sequence.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * we will not use sequence in current implementation
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoet_sequence {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_t seq_frame_list;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang struct fcoet_exchange *seq_exchange;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoet_sequence_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Frame
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoet_frame {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_node_t tfm_seq_node;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *tfm_fcoe_frame;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang struct fcoet_exchange *tfm_xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang struct fcoet_sequence *tfm_seq;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t tfm_rctl;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t tfm_buf_idx;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoet_frame_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOET_MAX_DBUF_LEN should better be consistent with sbd_scsi.c. Since
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * sbd_scsi.c use 128k as the max dbuf size, we'd better define this between
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * 32k - 128k.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_MAX_DBUF_LEN 0x20000 /* 128 * 1024 */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * exchange - cmd alias
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoet_exchange {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * it is only used for ss_abort_xchg_list
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_node_t xch_abort_node;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We don't believe oxid/rxid in fct_cmd_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t xch_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t xch_rxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t xch_flags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *xch_ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_t *xch_cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_sequence_t *xch_current_seq;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang clock_t xch_start_time;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_data_buf_t **xch_dbufs;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t xch_dbuf_num;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t xch_sequence_no;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t xch_ref;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int xch_left_data_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoet_exchange_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Add the reference to avoid such situation:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * 1, Frame received, then abort happen (maybe because local port offline, or
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * remote port abort the cmd), cmd is aborted and then freed right after we
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * get the exchange from hash table in fcoet_rx_frame.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * 2, Frame sent out, then queued in fcoe for release. then abort happen, cmd
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * is aborted and then freed before fcoe_watchdog() call up to release the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * frame.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * These two situation should seldom happen. But just invoke this seems won't
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * downgrade the performance too much, so we keep it.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek#define FCOET_BUSY_XCHG(xch) atomic_inc_8(&(xch)->xch_ref)
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek#define FCOET_RELE_XCHG(xch) atomic_dec_8(&(xch)->xch_ref)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH_FLAG_NONFCP_REQ_SENT 0x0001
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH_FLAG_NONFCP_RESP_SENT 0x0002
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH_FLAG_FCP_CMD_RCVD 0x0004
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH_FLAG_INI_ASKED_ABORT 0x0008
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH_FLAG_FCT_CALLED_ABORT 0x0010
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH_FLAG_IN_HASH_TABLE 0x0020
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * IOCTL supporting stuff
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_IOCTL_FLAG_MASK 0xFF
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_IOCTL_FLAG_IDLE 0x00
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_IOCTL_FLAG_OPEN 0x01
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_IOCTL_FLAG_EXCL 0x02
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * define common-used conversion and calculation macros
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM2SS(x_frm) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((fcoet_soft_state_t *)(x_frm)->frm_eport->eport_client_private)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM2TFM(x_frm) ((fcoet_frame_t *)(x_frm)->frm_client_private)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define PORT2SS(x_port) ((fcoet_soft_state_t *)(x_port)->port_fca_private)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define EPORT2SS(x_port) ((fcoet_soft_state_t *)(x_port)->eport_client_private)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH2ELS(x_xch) ((fct_els_t *)x_xch->xch_cmd->cmd_specific)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH2CT(x_xch) ((fct_ct_t *)x_xch->xch_cmd->cmd_specific)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define XCH2TASK(x_xch) ((scsi_task_t *)x_xch->xch_cmd->cmd_specific)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define CMD2ELS(x_cmd) ((fct_els_t *)x_cmd->cmd_specific)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define CMD2CT(x_cmd) ((fct_sol_ct_t *)x_cmd->cmd_specific)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define CMD2TASK(x_cmd) ((scsi_task_t *)x_cmd->cmd_specific)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define CMD2XCH(x_cmd) ((fcoet_exchange_t *)x_cmd->cmd_fca_private)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define CMD2SS(x_cmd) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((fcoet_soft_state_t *)(x_cmd)->cmd_port->port_fca_private)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid fcoet_init_tfm(fcoe_frame_t *frm, fcoet_exchange_t *xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t fcoet_send_status(fct_cmd_t *cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid fcoet_modhash_find_cb(mod_hash_key_t, mod_hash_val_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * DBUF stuff
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_DB_SEG_NUM(x_db) (x_db->db_port_private)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_DB_NETB(x_db) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (((uintptr_t)FCOET_DB_SEG_NUM(x_db)) * \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sizeof (struct stmf_sglist_ent) + (uintptr_t)(x_db)->db_sglist)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_SET_SEG_NUM(x_db, x_num) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_DB_SEG_NUM(x_db) = (void *)(unsigned long)x_num; \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_GET_SEG_NUM(x_db) ((int)(unsigned long)FCOET_DB_SEG_NUM(x_db))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_SET_NETB(x_db, x_idx, x_netb) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((void **)FCOET_DB_NETB(x_db))[x_idx] = x_netb; \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOET_GET_NETB(x_db, x_idx) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (((void **)FCOET_DB_NETB(x_db))[x_idx])
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define PRT_FRM_HDR(x_p, x_f) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG(x_p, "rctl/%x, type/%x, fctl/%x, oxid/%x", \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_B2V_1((x_f)->frm_hdr->hdr_r_ctl), \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_B2V_1((x_f)->frm_hdr->hdr_type), \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_B2V_3((x_f)->frm_hdr->hdr_f_ctl), \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_B2V_4((x_f)->frm_hdr->hdr_oxid)); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif /* _KERNEL */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifdef __cplusplus
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif /* _FCOET_H */