7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CDDL HEADER START
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * The contents of this file are subject to the terms of the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Common Development and Distribution License (the "License").
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * You may not use this file except in compliance with the License.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * or http://www.opensolaris.org/os/licensing.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * See the License for the specific language governing permissions
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * and limitations under the License.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * When distributing Covered Code, include this CDDL HEADER in each
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * If applicable, add the following below this CDDL HEADER, with the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fields enclosed by brackets "[]" replaced with your own identifying
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * information: Portions Copyright [yyyy] [name of copyright owner]
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CDDL HEADER END
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Use is subject to license terms.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#ifndef _FCOEI_H
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define _FCOEI_H
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#ifdef __cplusplus
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangextern "C" {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#endif
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#ifdef _KERNEL
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FCOEI logging
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangextern int fcoei_use_ext_log;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangextern void *fcoei_state;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_EXT_LOG(log_ident, ...) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (fcoei_use_ext_log) { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_trace(log_ident, __VA_ARGS__); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_LOG(log_ident, ...) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_trace(log_ident, __VA_ARGS__)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * IOCTL supporting stuff
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_IOCTL_FLAG_MASK 0xFF
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_IOCTL_FLAG_IDLE 0x00
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_IOCTL_FLAG_OPEN 0x01
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_IOCTL_FLAG_EXCL 0x02
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * define common constants
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_MAX_OPEN_XCHS 2048
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_SOL_HASH_SIZE 2048
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_UNSOL_HASH_SIZE 128
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_VERSION "20090729-1.00"
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_NAME_VERSION "SunFC FCoEI v" FCOEI_VERSION
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * define RNID Management Info
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_RNID_HBA 0x7
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_RNID_IPV4 0x1
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_RNID_IPV6 0x2
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangtypedef enum event_type {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang AE_EVENT_NONE = 0,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang AE_EVENT_EXCHANGE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang AE_EVENT_SOL_FRAME,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang AE_EVENT_UNSOL_FRAME,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang AE_EVENT_PORT,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang AE_EVENT_ABORT,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang AE_EVENT_RESET,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang} event_type_e;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangtypedef struct fcoei_event {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_node_t ae_node;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang event_type_e ae_type;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * event specific
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint64_t ae_specific;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * event related object
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang void *ae_obj;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang} fcoei_event_t;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangtypedef struct fcoei_soft_state {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang dev_info_t *ss_dip;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_flags;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_fcp_data_payload_size;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_t ss_comp_xch_list;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * common data structure (fc_local_port_t) between leadville and fcoei
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang void *ss_port;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * common data structure between fcoei and fcoe module
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_port_t *ss_eport;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mod_hash_t *ss_sol_oxid_hash;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mod_hash_t *ss_unsol_rxid_hash;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t ss_next_sol_oxid;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t ss_next_unsol_rxid;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * We will use ss_taskq to dispatch watchdog and other tasks
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ddi_taskq_t *ss_taskq;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kcondvar_t ss_watchdog_cv;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmutex_t ss_watchdog_mutex;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * current port state, speed. see fctl.h
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t ss_link_state;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t ss_link_speed;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * # of unprocessed port/link change
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_port_event_counter;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_t ss_event_list;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * solicited and unsolicited exchanges timing checking
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_sol_cnt1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_sol_cnt2;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t *ss_sol_cnt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_unsol_cnt1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_unsol_cnt2;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t *ss_unsol_cnt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ioctl related stuff
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ss_ioctl_flags;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmutex_t ss_ioctl_mutex;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fp-defined routines that fcoei will call
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_fca_bind_info_t ss_bind_info;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei-defined plogi response that fp will use
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_logi_t ss_els_logi;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei-defined routines that fp will call
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_fca_tran_t ss_fca_tran;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Direct p2p information, and ss's fcid will be stored here
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_fca_p2p_info_t ss_p2p_info;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * RNID Management Information
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_rnid_t ss_rnid;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang} fcoei_soft_state_t;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_LV_NONE 0x0000
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_LV_BOUND 0x0001
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_PORT_DISABLED 0x0002
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_TERMINATE_WATCHDOG 0x0004
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_WATCHDOG_RUNNING 0x0008
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_WATCHDOG_IDLE 0x0010
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_TRIGGER_FP_ATTACH 0x0020
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define SS_FLAG_FLOGI_FAILED 0x0040
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_frame - corresponding data structure to fcoe_frame/fc_frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangtypedef struct fcoei_frame {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_event_t ifm_ae;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_frame_t *ifm_frm;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t ifm_flags;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang struct fcoei_exchange *ifm_xch;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * will be used after the relevant frame mblk was released by ETH layer
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint8_t ifm_rctl;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang} fcoei_frame_t;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define IFM_FLAG_NONE 0x0000
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define IFM_FLAG_FREE_NETB 0x0001
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_exchange - corresponding data structure to leadville fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangtypedef struct fcoei_exchange {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_node_t xch_comp_node;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_event_t xch_ae;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t xch_flags;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *xch_ss;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang clock_t xch_start_tick;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang clock_t xch_end_tick;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int xch_resid;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ksema_t xch_sema;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * current cnt for timing check, when the exchange is created
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t *xch_cnt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * leadville fc_packet will not maintain oxid/rxid,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * so fcoei exchange need do it
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t xch_oxid;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t xch_rxid;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * to link leadville's stuff
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_packet_t *xch_fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_unsol_buf_t *xch_ub;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang} fcoei_exchange_t;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define XCH_FLAG_NONE 0x00000000
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define XCH_FLAG_TMOUT 0x00000001
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define XCH_FLAG_ABORT 0x00000002
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define XCH_FLAG_IN_SOL_HASH 0x00000004
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define XCH_FLAG_IN_UNSOL_HASH 0x00000008
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangtypedef struct fcoei_walk_arg
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *wa_xch;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t wa_oxid;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang} fcoei_walk_arg_t;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Define conversion and calculation macros
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FRM2IFM(x_frm) ((fcoei_frame_t *)(x_frm)->frm_client_private)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FRM2SS(x_frm) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ((fcoei_soft_state_t *)(x_frm)->frm_eport->eport_client_private)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define PORT2SS(x_port) ((fcoei_soft_state_t *)(x_port)->port_fca_private)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define EPORT2SS(x_eport) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ((fcoei_soft_state_t *)(x_eport)->eport_client_private)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FPKT2XCH(x_fpkt) ((fcoei_exchange_t *)x_fpkt->pkt_fca_private)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FRM2FPKT(x_fpkt) (FRM2IFM(frm)->ifm_xch->xch_fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define HANDLE2SS(x_handle) ((fcoei_soft_state_t *)fca_handle)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FPLD frm->frm_payload
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_FRM2FHDR(x_frm, x_fhdr) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->r_ctl = FRM_R_CTL(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->d_id = FRM_D_ID(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->s_id = FRM_S_ID(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->type = FRM_TYPE(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->f_ctl = FRM_F_CTL(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->seq_id = FRM_SEQ_ID(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->df_ctl = FRM_DF_CTL(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->seq_cnt = FRM_SEQ_CNT(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->ox_id = FRM_OXID(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->rx_id = FRM_RXID(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (x_fhdr)->ro = FRM_PARAM(x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_PARTIAL_FHDR2FRM(x_fhdr, x_frm) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_R_CTL((x_fhdr)->r_ctl, x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_D_ID((x_fhdr)->d_id, x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_S_ID((x_fhdr)->s_id, x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_TYPE((x_fhdr)->type, x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_F_CTL((x_fhdr)->f_ctl, x_frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define PRT_FRM_HDR(x_p, x_f) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(x_p, "rctl/%x, fctl/%x, type/%x, oxid/%x", \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_B2V_1((x_f)->frm_hdr->hdr_r_ctl), \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_B2V_3((x_f)->frm_hdr->hdr_f_ctl), \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_B2V_1((x_f)->frm_hdr->hdr_type), \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_B2V_2((x_f)->frm_hdr->hdr_oxid)); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_INIT_SOL_ID_HASH(xch, xch_tmp) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang do { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (++xch->xch_ss->ss_next_sol_oxid == 0xFFFF) { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ++xch->xch_ss->ss_next_sol_oxid; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } while (mod_hash_find(xch->xch_ss->ss_sol_oxid_hash, \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (mod_hash_key_t)(intptr_t)xch->xch_ss->ss_next_sol_oxid, \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (mod_hash_val_t)&xch_tmp) == 0); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_oxid = xch->xch_ss->ss_next_sol_oxid; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_rxid = 0xFFFF; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) mod_hash_insert(xch->xch_ss->ss_sol_oxid_hash, \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FMHK(xch->xch_oxid), (mod_hash_val_t)xch); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_flags |= XCH_FLAG_IN_SOL_HASH; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_SET_UNSOL_FRM_RXID(frm, xch_tmp) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang do { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (++FRM2SS(frm)->ss_next_unsol_rxid == 0xFFFF) { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ++FRM2SS(frm)->ss_next_unsol_rxid; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } while (mod_hash_find(FRM2SS(frm)->ss_unsol_rxid_hash, \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (mod_hash_key_t)(intptr_t)FRM2SS(frm)->ss_next_unsol_rxid, \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (mod_hash_val_t)&xch_tmp) == 0); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_RXID(FRM2SS(frm)->ss_next_unsol_rxid, frm); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOEI_INIT_UNSOL_ID_HASH(xch) \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang { \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_oxid = fpkt->pkt_cmd_fhdr.ox_id; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_rxid = fpkt->pkt_cmd_fhdr.rx_id; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) mod_hash_insert(xch->xch_ss->ss_unsol_rxid_hash, \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FMHK(xch->xch_rxid), (mod_hash_val_t)xch); \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_flags |= XCH_FLAG_IN_UNSOL_HASH; \
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Common functions defined in fcoei.c
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_complete_xch(fcoei_exchange_t *xch, fcoe_frame_t *frm,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint8_t pkt_state, uint8_t pkt_reason);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_init_ifm(fcoe_frame_t *frm, fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_handle_comp_xch_list(fcoei_soft_state_t *ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Common functions defined in fcoei_lv.c
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_init_fcatran_vectors(fc_fca_tran_t *fcatran);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_process_event_exchange(fcoei_event_t *ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_process_event_reset(fcoei_event_t *ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Common functions defined in fcoei_eth.c
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_init_ect_vectors(fcoe_client_t *ect);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_process_unsol_frame(fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_handle_sol_frame_done(fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_process_event_port(fcoei_event_t *ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid fcoei_port_event(fcoe_port_t *eport, uint32_t event);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#endif /* _KERNEL */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#ifdef __cplusplus
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#endif
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#endif /* _FCOEI_H */