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/*
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This file defines interfaces between FCOE and LEADVILLE
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Driver kernel header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/conf.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/ddi.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/stat.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/pci.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/sunddi.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/modctl.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/file.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/cred.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/byteorder.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/atomic.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/scsi/scsi.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/mac_client.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/modhash.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * LEADVILLE header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/fibre-channel/fc.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/fibre-channel/impl/fc_fcaif.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * COMSTAR head files (BIT_* macro)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/stmf_defines.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FCOE header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <sys/fcoe/fcoe_common.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Driver's own header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#include <fcoei.h>
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * forward declaration of static functions
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_port_enabled(void *arg);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_populate_hba_fru_details(fcoei_soft_state_t *ss,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_fca_port_info_t *port_info);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_ct_req(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_fcp_cmd(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_els_req(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_els_resp(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logi_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_prli_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logo_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_scr_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_adisc_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_linit_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_rls_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_rnid_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_acc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_rjt_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logi_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_prli_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logo_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_adisc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_logo_peer(void *arg);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fpkt_comp(fc_packet_t *fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic uint32_t
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_xch_abort(mod_hash_key_t key, mod_hash_val_t *val, void *arg);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Bind LV port instance with fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * dip = dev info of fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * port_info = fcoei specific parameters about LV port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * bind_info = LV specific parameters about fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * The pointer to fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Unpon the completion of this call, the port must be offline.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_port_enabled could trigger it to online
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_bind_port(dev_info_t *dip, fc_fca_port_info_t *port_info,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_fca_bind_info_t *bind_info)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * get state info based on the dip
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss = (fcoei_soft_state_t *)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ddi_get_soft_state(fcoei_state, ddi_get_instance(dip));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (!ss) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "ss is NULL");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * make sure this port isn't bound
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (ss->ss_flags & SS_FLAG_LV_BOUND) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_info->pi_error = FC_ALREADY;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "ss has been bound");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (bind_info->port_num) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * make sure request is in bounds
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_info->pi_error = FC_OUTOFBOUNDS;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "port_num is not 0");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * stash the ss_bind_info supplied by the FC Transport
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bind_info, &ss->ss_bind_info, sizeof (fc_fca_bind_info_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_port = bind_info->port_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * RNID parameter
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_info->pi_rnid_params.status = FC_FAILURE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * populate T11 FC-HBA details
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_populate_hba_fru_details(ss, port_info);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * set port's current state, and it is always offline before binding
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * We hack pi_port_state to tell LV if it's NODMA_FCA
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_info->pi_port_state = FC_STATE_FCA_IS_NODMA;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * copy login param
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&ss->ss_els_logi, &port_info->pi_login_params,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang sizeof (la_els_logi_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Mark it as bound
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang atomic_or_32(&ss->ss_flags, SS_FLAG_LV_BOUND);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Let fcoe to report the link status
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_port_enabled((void *)ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "Exit fcoei_bind_port: %p", ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_unbind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Un-bind the fcoei port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Clear binding flag
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_unbind_port(void *fca_handle)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang atomic_and_32(&ss->ss_flags, ~SS_FLAG_LV_BOUND);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_OFFLINE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "Exit fcoei_unbind_port: %p", ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_init_pkt
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize fcoei related part of fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = The pointer to fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * sleep = This call can sleep or not
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Initialization completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Link the exchange elements with proper objects
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_init_pkt(void *fca_handle, fc_packet_t *fpkt, int sleep)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch = FPKT2XCH(fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(sleep + 1);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ss = ss;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_fpkt = fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_flags = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_un_init_pkt
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Uninitialize fcoei related part of fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = The pointer to fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Uninitialize successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Very simple, just return successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_un_init_pkt(void *fca_handle, fc_packet_t *fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(fca_handle && fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_cap
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Export FCA hardware and software capability.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cap = pointer to the capability string
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ptr = buffer pointer for returning capability
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_ERROR - no such capability
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_FOUND - the capability was returned and cannot be set
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_UNSOL_BUF is one important capability, it will affect the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * implementation of fcoei_ub_alloc/free.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_get_cap(void * fca_handle, char *cap, void *ptr)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t *rptr = (uint32_t *)ptr;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int rval = FC_CAP_FOUND;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(fca_handle);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "cap: %s", cap);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (strcmp(cap, FC_NODE_WWN) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&ss->ss_els_logi.node_ww_name.raw_wwn[0], ptr, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_LOGIN_PARAMS) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy((void *)&ss->ss_els_logi, ptr, sizeof (la_els_logi_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_UNSOL_BUF) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *rptr = (uint32_t)0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_NOSTREAM_ON_UNALIGN_BUF) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *rptr = (uint32_t)FC_ALLOW_STREAMING;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_PAYLOAD_SIZE) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *rptr = (uint32_t)2136;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_POST_RESET_BEHAVIOR) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *rptr = FC_RESET_RETURN_ALL;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_FCP_DMA) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *rptr = FC_NO_DVMA_SPACE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_CAP_ERROR;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not supported");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (rval);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_set_cap
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allow the FC Transport to set FCA capabilities if possible
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cap = pointer to the capabilities string.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ptr = buffer pointer for capability.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_ERROR - no such capability
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Currently, all capabilities can't be changed.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_set_cap(void * fca_handle, char *cap, void *ptr)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "cap: %s, %p, %p", cap, fca_handle, ptr);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_CAP_ERROR);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_getmap
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Get lilp map
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * mapbuf = the buffer to store lilp map
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - Can't get the lilp map
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei can't work in loop topology, so it should never get called
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_getmap(void * fca_handle, fc_lilpmap_t *mapbuf)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not: %p-%p", fca_handle, mapbuf);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_FAILURE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_ub_alloc
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Pre-allocate unsolicited buffers at the request of LV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * tokens = token array for each buffer.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * size = number of tokens
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * count = the acutual number of allocated unsolicited buffers
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * type = unsolicited buffer type
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The requested buffers have been freeed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_cap will set UNSOL_BUF to 0, so it should never get called.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_ub_alloc(void * fca_handle, uint64_t tokens[], uint32_t size,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t *count, uint32_t type)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not: %p-%p-%x-%p-%x", fca_handle, tokens,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang size, count, type);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_ub_free
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Free the pre-allocated unsolicited buffers at the request of LV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * count = number of buffers.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * tokens = token array for each buffer.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The requested buffers have been freeed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_cap will set UNSOL_BUF to 0, so it should never get called.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_ub_free(void * fca_handle, uint32_t count, uint64_t tokens[])
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_EXT_LOG(__FUNCTION__, "not: %p-%x-%p", fca_handle, count, tokens);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_ub_release
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Release unsolicited buffers from FC Transport to FCA for future use
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * count = number of buffers.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * tokens = token array for each buffer.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The requested buffers have been released.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - The requested buffers have not been released.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * It will always succeed. It has nothing to do with fcoei_ub_alloc/free.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_ub_release(void * fca_handle, uint32_t count, uint64_t tokens[])
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_unsol_buf_t *ub = *((fc_unsol_buf_t **)tokens);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (count != 1) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "count is not 1: %p", fca_handle);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_FAILURE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(ub->ub_buffer, ub->ub_bufsize);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(ub, sizeof (fc_unsol_buf_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_EXT_LOG(__FUNCTION__, "ub is freeed");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_abort
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Direct FCA driver to abort an outstanding exchange associated with a
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * specified fc_packet_t struct
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt - A pointer to the fc_packet_t for the exchange to be aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * flags - Set to KM_SLEEP if the function may sleep, or KM_NOSLEEP if
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * the function may not sleep.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_ABORTED - The specified exchange was successfully aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_ABORTING - The specified exchange is being aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_ABORT_FAILED - The specified exchange could not be aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_TRANSPORT_ERROR - A transport error occurred while attempting to
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * abort the specified exchange.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_BADEXCHANGE - The specified exchange does not exist.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * After the exchange is aborted, the FCA driver must update the relevant
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fields in the fc_packet_t struct as per normal exchange completion and
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * call the pkt_comp function to return the fc_packet_t struct to the FC
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Transport.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * When an exchange is successfully aborted, the FCA driver must set the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pkt_reason field in the fc_packet_t to FC_REASON_ABORTED and the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pkt_state field in the fc_packet_t to FC_PKT_LOCAL_RJT before returning
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * the fc_packet_t to the FC Transport.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Unfortunately, LV doesn't conform to the spec. It will take all these
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * legal return value as failure to abort.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_abort(void * fca_handle, fc_packet_t *fpkt, int flags)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not: %p-%p-%x", fca_handle, fpkt, flags);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_reset
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Reset link or hardware
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cmd = reset type command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Reset has completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - Reset has failed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_reset(void * fca_handle, uint32_t cmd)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int rval = FC_SUCCESS;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_event_t *ae;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (cmd) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FC_FCA_LINK_RESET:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (ss->ss_link_state != FC_STATE_ONLINE) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not online now: ss-%p", ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_FAILURE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This is linkreset phase I
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_logo_peer(ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang delay(FCOE_SEC2TICK(1) / 10);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_OFFLINE, 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_port_event(ss->ss_eport, FCOE_NOTIFY_EPORT_LINK_DOWN);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Perpare linkreset phase II
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ae = kmem_zalloc(sizeof (*ae), KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ae->ae_type = AE_EVENT_RESET;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ae->ae_obj = ss;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mutex_enter(&ss->ss_watchdog_mutex);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_insert_tail(&ss->ss_event_list, ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mutex_exit(&ss->ss_watchdog_mutex);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FC_FCA_RESET:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FC_FCA_CORE:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FC_FCA_RESET_CORE:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_FAILURE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "cmd-%x not supported", cmd);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (rval);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_port_manage
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Perform various port management operations at the request of LV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pm = the pointer to the struct specifying the port management operation
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The request completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - The request did not complete successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_port_manage(void * fca_handle, fc_fca_pm_t *pm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int rval = FC_FAILURE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (fca_handle == NULL || pm == NULL) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (rval);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "code0x%x, %p", pm->pm_cmd_code, fca_handle);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (pm->pm_cmd_code) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FC_PORT_GET_NODE_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (pm->pm_data_len < sizeof (fc_rnid_t)) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_NOMEM;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_rnid.port_id = ss->ss_p2p_info.fca_d_id;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy((void *)&ss->ss_rnid,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang pm->pm_data_buf, sizeof (fc_rnid_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_SUCCESS;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FC_PORT_SET_NODE_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (pm->pm_data_len < sizeof (fc_rnid_t)) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_NOMEM;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(pm->pm_data_buf,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void *)&ss->ss_rnid, sizeof (fc_rnid_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_SUCCESS;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "unsupported cmd-%x", pm->pm_cmd_code);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang rval = FC_INVALID_REQUEST;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (rval);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_device
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Get fcoei remote port with FCID of d_id
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * d_id = 24-bit FCID of remote port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * The pointer to fcoei remote port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei has no remote port device
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_get_device(void *fca_handle, fc_portid_t d_id)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_EXT_LOG(__FUNCTION__, "not supported: %p-%x", fca_handle, d_id);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_notify
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Notify the change of target device
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cmd = detailed cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Notification completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * It's only needed to support non-COMSTAR FC target, so it should
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * never get called.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_notify(void *fca_handle, uint32_t cmd)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not supported: %p-%x", fca_handle, cmd);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_transport
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Submit FCP/CT requests
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt - LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_transport(void *fca_handle, fc_packet_t *fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch = FPKT2XCH(fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint16_t pkt_tran_flags = fpkt->pkt_tran_flags;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_start_tick = ddi_get_lbolt();
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_end_tick = xch->xch_start_tick +
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_SEC2TICK(fpkt->pkt_timeout);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ae.ae_type = AE_EVENT_EXCHANGE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ae.ae_obj = xch;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (pkt_tran_flags & FC_TRAN_NO_INTR) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "AaA polling: %p-%p", fpkt, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang sema_init(&xch->xch_sema, 0, NULL, SEMA_DRIVER, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mutex_enter(&ss->ss_watchdog_mutex);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_insert_tail(&ss->ss_event_list, &xch->xch_ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (ss->ss_flags & SS_FLAG_WATCHDOG_IDLE) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang cv_signal(&ss->ss_watchdog_cv);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mutex_exit(&ss->ss_watchdog_mutex);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (pkt_tran_flags & FC_TRAN_NO_INTR) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "BaB polling: %p-%p", fpkt, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang sema_p(&xch->xch_sema);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang sema_destroy(&xch->xch_sema);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "after polling: %p-%p", fpkt, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_els_send
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Submit ELS request or response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic int
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_els_send(void *fca_handle, fc_packet_t *fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch = FPKT2XCH(fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (fpkt->pkt_tran_flags & FC_TRAN_NO_INTR) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "ELS poll mode is not supported");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_BADPACKET);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_start_tick = ddi_get_lbolt();
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_end_tick = xch->xch_start_tick +
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_SEC2TICK(fpkt->pkt_timeout);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ae.ae_type = AE_EVENT_EXCHANGE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ae.ae_obj = xch;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * LV could release ub after this call, so we must save the ub type
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * for later use
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (fpkt->pkt_cmd_fhdr.r_ctl == R_CTL_ELS_RSP) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ((uint8_t *)&fpkt->pkt_fca_rsvd1)[0] =
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ((fc_unsol_buf_t *)fpkt->pkt_ub_resp_token)->ub_buffer[0];
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mutex_enter(&ss->ss_watchdog_mutex);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_insert_tail(&ss->ss_event_list, &xch->xch_ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (ss->ss_flags & SS_FLAG_WATCHDOG_IDLE) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang cv_signal(&ss->ss_watchdog_cv);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mutex_exit(&ss->ss_watchdog_mutex);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (FC_SUCCESS);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_populate_hba_fru_details
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill detailed information about HBA
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ss - fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * port_info = fc_fca_port_info_t that need be updated
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_populate_hba_fru_details(fcoei_soft_state_t *ss,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_fca_port_info_t *port_info)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fca_port_attrs_t *port_attrs = &(port_info->pi_attrs);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int instance;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(ss != NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) snprintf(port_attrs->manufacturer, FCHBA_MANUFACTURER_LEN,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang "Sun Microsystems, Inc.");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) snprintf(port_attrs->driver_name, FCHBA_DRIVER_NAME_LEN,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang "%s", FCOEI_NAME_VERSION);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) snprintf(port_attrs->driver_version, FCHBA_DRIVER_VERSION_LEN,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang "%s", FCOEI_VERSION);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->serial_number, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->hardware_version, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->model, "FCoE Virtual FC HBA");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->model_description, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->firmware_version, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->option_rom_version, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->vendor_specific_id = 0xFC0E;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->max_frame_size = FCOE_MAX_FC_FRAME_SIZE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->supported_cos = 0x10000000;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->supported_speed = FC_HBA_PORTSPEED_1GBIT |
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_HBA_PORTSPEED_10GBIT;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang instance = ddi_get_instance(ss->ss_dip);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->hba_fru_details.high =
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (short)((instance & 0xffff0000) >> 16);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->hba_fru_details.low =
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (short)(instance & 0x0000ffff);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_port_enabled
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Notify fcoe that the port has been enabled
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg = the related soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Only after this, fcoe will report the link status to us
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_port_enabled(void *arg)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)arg;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_ONLINE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_ct_req
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill and submit CT request
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch - the exchange that will be initiated
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_initiate_ct_req(fcoei_exchange_t *xch)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_packet_t *fpkt = xch->xch_fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_ct_header_t *ct = (fc_ct_header_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint8_t *bp = (uint8_t *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_frame_t *frm;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int idx;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang uint32_t cmd_len = fpkt->pkt_cmdlen;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Ensure it's 4-byte aligned
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang cmd_len = P2ROUNDUP(cmd_len, 4);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allocate CT request frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang cmd_len + FCFH_SIZE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (frm == NULL) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "failed to alloc: %p", xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bzero(frm->frm_payload, cmd_len);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_cnt = xch->xch_ss->ss_sol_cnt;
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(xch->xch_cnt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_R_CTL(fpkt->pkt_cmd_fhdr.r_ctl, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_D_ID(fpkt->pkt_cmd_fhdr.d_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_S_ID(fpkt->pkt_cmd_fhdr.s_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_TYPE(fpkt->pkt_cmd_fhdr.type, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_F_CTL(fpkt->pkt_cmd_fhdr.f_ctl, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_OXID(xch->xch_oxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_RXID(xch->xch_rxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_init_ifm(frm, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CT header (FC payload)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(ct->ct_rev, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(ct->ct_inid, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 4;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(ct->ct_fcstype, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 5;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(ct->ct_fcssubtype, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 6;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(ct->ct_options, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 8;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(ct->ct_cmdrsp, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 10;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(ct->ct_aiusize, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 13;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(ct->ct_reason, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 14;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(ct->ct_expln, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 15;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(ct->ct_vendor, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CT payload (FC payload)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (ct->ct_fcstype) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FCSTYPE_DIRECTORY:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (ct->ct_cmdrsp) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GA_NXT:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GPN_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GNN_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GCS_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GFT_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GSPN_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GPT_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GID_FT:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GID_PT:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_DA_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_GID_PN:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bp + offset, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RNN_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RPN_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 20;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bp + offset, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RSPN_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 20;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bp + offset, FPLD + offset, bp[20] + 1);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RSNN_NN:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bp + offset, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 24;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bp + offset, FPLD + offset, bp[24] + 1);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RFT_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fp use bcopy to copy fp_fc4_types,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * we need to swap order for each integer
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 20;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang for (idx = 0; idx < 8; idx++) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += 4;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RCS_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RPT_ID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 20;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case NS_RIP_NN:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bp + offset, FPLD + offset, 24);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, frm, FC_PKT_FAILURE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_REASON_CMD_UNSUPPORTED);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break; /* FCSTYPE_DIRECTORY */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case FCSTYPE_MGMTSERVICE:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (ct->ct_cmdrsp) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case MS_GIEL:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang "MS_GIEL ct_fcstype %x, ct_cmdrsp: %x",
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ct->ct_fcstype, ct->ct_cmdrsp);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, frm, FC_PKT_FAILURE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_REASON_CMD_UNSUPPORTED);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break; /* FCSTYPE_MGMTSERVICE */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, frm, FC_PKT_FAILURE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_REASON_CMD_UNSUPPORTED);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ss->ss_eport->eport_tx_frame(frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_fcp_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Submit FCP command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch - the exchange to be submitted
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_initiate_fcp_cmd(fcoei_exchange_t *xch)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_packet_t *fpkt = xch->xch_fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_frame_t *frm;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcp_cmd_t *fcp_cmd_iu = (fcp_cmd_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT((fpkt->pkt_cmdlen % 4) == 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmdlen + FCFH_SIZE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (!frm) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_init_ifm(frm, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bzero(frm->frm_payload, fpkt->pkt_cmdlen);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This will affect timing check
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_cnt = xch->xch_ss->ss_sol_cnt;
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(xch->xch_cnt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Set exchange residual bytes
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_resid = (int)fpkt->pkt_datalen;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill FCP command IU
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcp_ent_addr
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(fcp_cmd_iu->fcp_ent_addr.ent_addr_0,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += 2;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(fcp_cmd_iu->fcp_ent_addr.ent_addr_1,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += 2;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(fcp_cmd_iu->fcp_ent_addr.ent_addr_2,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += 2;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(fcp_cmd_iu->fcp_ent_addr.ent_addr_3,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcp_cntl
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = offsetof(fcp_cmd_t, fcp_cntl);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload[offset] = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += 1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload[offset] = fcp_cmd_iu->fcp_cntl.cntl_qtype & 0x07;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += 1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload[offset] =
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_kill_tsk << 7) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_clr_aca << 6) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_reset_tgt << 5) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_reset_lun << 4) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_clr_tsk << 2) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_abort_tsk << 1);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += 1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload[offset] =
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_read_data << 1) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_cmd_iu->fcp_cntl.cntl_write_data);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcp_cdb
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = offsetof(fcp_cmd_t, fcp_cdb);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(fcp_cmd_iu->fcp_cdb, frm->frm_payload + offset, FCP_CDB_SIZE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcp_data_len
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset += FCP_CDB_SIZE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(fcp_cmd_iu->fcp_data_len, frm->frm_payload + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC frame header
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2IFM(frm)->ifm_rctl = fpkt->pkt_cmd_fhdr.r_ctl;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_R_CTL(fpkt->pkt_cmd_fhdr.r_ctl, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_D_ID(fpkt->pkt_cmd_fhdr.d_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_S_ID(fpkt->pkt_cmd_fhdr.s_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_TYPE(fpkt->pkt_cmd_fhdr.type, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_F_CTL(0x290000, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_OXID(xch->xch_oxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_RXID(xch->xch_rxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ss->ss_eport->eport_tx_frame(frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_els_req
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initiate ELS request
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch = the exchange that will be initiated
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_initiate_els_req(fcoei_exchange_t *xch)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_packet_t *fpkt = xch->xch_fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_frame_t *frm;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT((fpkt->pkt_cmdlen % 4) == 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmdlen + FCFH_SIZE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (!frm) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_init_ifm(frm, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bzero(frm->frm_payload, fpkt->pkt_cmdlen);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This will affect timing check
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_cnt = xch->xch_ss->ss_sol_cnt;
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(xch->xch_cnt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (els_code->ls_code) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_FLOGI:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * For FLOGI, we expect response within E_D_TOV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_start_tick = ddi_get_lbolt();
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_end_tick = xch->xch_start_tick +
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_SEC2TICK(2);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ss->ss_flags &= ~SS_FLAG_FLOGI_FAILED;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /* FALLTHROUGH */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_PLOGI:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_logi_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_PRLI:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_prli_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_SCR:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_scr_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_LINIT:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_linit_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_ADISC:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_adisc_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_LOGO:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * For LOGO, we expect response within E_D_TOV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_start_tick = ddi_get_lbolt();
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_end_tick = xch->xch_start_tick +
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_SEC2TICK(2);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_logo_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_RLS:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_rls_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_RNID:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_rnid_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, frm, FC_PKT_FAILURE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_REASON_CMD_UNSUPPORTED);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * set ifm_rtcl
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2IFM(frm)->ifm_rctl = fpkt->pkt_cmd_fhdr.r_ctl;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FCPH
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_R_CTL(fpkt->pkt_cmd_fhdr.r_ctl, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_D_ID(fpkt->pkt_cmd_fhdr.d_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_S_ID(fpkt->pkt_cmd_fhdr.s_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_TYPE(fpkt->pkt_cmd_fhdr.type, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_F_CTL(0x290000, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_OXID(xch->xch_oxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_RXID(xch->xch_rxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ss->ss_eport->eport_tx_frame(frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_els_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Originate ELS response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch = the associated exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_initiate_els_resp(fcoei_exchange_t *xch)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_packet_t *fpkt = xch->xch_fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_frame_t *frm;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT((fpkt->pkt_cmdlen % 4) == 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmdlen + FCFH_SIZE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (!frm) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_init_ifm(frm, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bzero(frm->frm_payload, fpkt->pkt_cmdlen);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This will affect timing check
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_cnt = xch->xch_ss->ss_unsol_cnt;
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(xch->xch_cnt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Set ifm_rctl
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2IFM(frm)->ifm_rctl = fpkt->pkt_cmd_fhdr.r_ctl;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FCPH
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_R_CTL(fpkt->pkt_cmd_fhdr.r_ctl, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_D_ID(fpkt->pkt_cmd_fhdr.d_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_S_ID(fpkt->pkt_cmd_fhdr.s_id, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_TYPE(fpkt->pkt_cmd_fhdr.type, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_F_CTL(0x980000, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_OXID(xch->xch_oxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FFM_RXID(xch->xch_rxid, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (((uint8_t *)&fpkt->pkt_fca_rsvd1)[0]) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_FLOGI:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_logi_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_PLOGI:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (FRM2SS(frm)->ss_eport->eport_flags &
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang EPORT_FLAG_IS_DIRECT_P2P) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2SS(frm)->ss_p2p_info.fca_d_id = FRM_S_ID(frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2SS(frm)->ss_p2p_info.d_id = FRM_D_ID(frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_logi_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_PRLI:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_prli_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_ADISC:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_adisc_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_LOGO:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_logo_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case LA_ELS_RSCN:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_acc_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, frm, FC_PKT_FAILURE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_REASON_CMD_UNSUPPORTED);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ss->ss_eport->eport_tx_frame(frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logi_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill SCR (state change register) command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logi_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_logi_t *els_logi = (la_els_logi_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill ls_code
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_logi->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill common service parameters
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 4;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.fcph_version, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 6;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.btob_credit, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 8;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.cmn_features, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 10;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.rx_bufsize, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 12;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.conc_sequences, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 14;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.relative_offset, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(els_logi->common_service.e_d_tov, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * port/node wwn
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 20;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_logi->nport_ww_name, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 28;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_logi->node_ww_name, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * class_3
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 68;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.class_opt, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 70;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.initiator_ctl, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 72;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.recipient_ctl, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 74;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.rcv_size, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 76;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.conc_sequences, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 78;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.n_port_e_to_e_credit, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 80;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.open_seq_per_xchng, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * needn't touch other fields
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_prli_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill PRLI command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing PRLI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_prli_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_prli_t *els_prli = (la_els_prli_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang struct fcp_prli *fcp_spp =
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (struct fcp_prli *)(void *)els_prli->service_params;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill basic PRLI fields
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_prli->ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_prli->page_length, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 2;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_prli->payload_length, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill FCP service parameters page
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 4;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(fcp_spp->type, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * PRLI flags, only 3 bits are valid
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 6;
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe FCOE_V2B_2(((fcp_spp->orig_process_assoc_valid << 15) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->resp_process_assoc_valid << 14) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->establish_image_pair << 13)), FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * process associator
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 8;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(fcp_spp->orig_process_associator, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 12;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(fcp_spp->resp_process_associator, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC-4 type
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe FCOE_V2B_4((fcp_spp->retry << 8) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->confirmed_compl_allowed << 7) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->data_overlay_allowed << 6) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->initiator_fn << 5) | (fcp_spp->target_fn << 4) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->read_xfer_rdy_disabled << 1) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->write_xfer_rdy_disabled), FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_scr_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill SCR (state change register) command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing SCR command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_scr_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_scr_req_t *els_scr = (fc_scr_req_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_scr->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 7;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_scr->scr_func, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_adisc_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ADISC command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing ADISC command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_adisc_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_adisc_t *els_adisc = (la_els_adisc_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_adisc->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 5;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->hard_addr.hard_addr, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 8;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_adisc->port_wwn, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_adisc->node_wwn, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 25;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->nport_id.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_linit_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill LINIT command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LINIT command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_linit_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(fpkt && frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logo_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill LOGO command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGO command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logo_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_logo_t *els_logo = (la_els_logo_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_logo->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 5;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_logo->nport_id.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 8;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_logo->nport_ww_name, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_rls_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_rls_t *els_rls = (la_els_rls_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rls->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 5;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_rls->rls_portid.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_rnid_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_rnid_t *els_rnid = (la_els_rnid_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rnid->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 4;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_rnid->data_format, FPLD + offset, 1);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_acc_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ELS ACC response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing ELS ACC response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_acc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_code->ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_code->mbz, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_rjt_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ELS RJT response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containg ELS RJT response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_rjt_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_rjt_t *els_rjt = (la_els_rjt_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0; /* reset ls code */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rjt->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 5; /* reason code */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rjt->action, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 6; /* reason explanation */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rjt->reason, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 7; /* vendor unique */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rjt->vu, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_adisc_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ADISC response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing ADISC response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_adisc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_adisc_t *els_adisc = (la_els_adisc_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang int offset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (els_adisc->ls_code.ls_code == LA_ELS_RJT) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_rjt_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_adisc->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 5;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->hard_addr.hard_addr, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 8;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_adisc->port_wwn, FPLD + offset, FC_WWN_SIZE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 16;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_adisc->node_wwn, FPLD + offset, FC_WWN_SIZE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang offset = 25;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->nport_id.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logi_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill FLOGI/PLOGI response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logi_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (els_code->ls_code == LA_ELS_RJT) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_rjt_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_logi_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_prli_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill PRLI response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing PRLI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_prli_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (els_code->ls_code == LA_ELS_RJT) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_rjt_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_prli_cmd(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logo_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill LOGO response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGO response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logo_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (els_code->ls_code == LA_ELS_RJT) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_rjt_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fill_els_acc_resp(fpkt, frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_logo_peer
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Send LOGO to the peer to emulate link offline event
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_logo_peer(void *arg)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)arg;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_packet_t *fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_logo_t *els_logo;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allocate space for exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch = kmem_zalloc(sizeof (*xch), KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allocate space for fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt = kmem_zalloc(sizeof (fc_packet_t), KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmdlen = 20;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd = kmem_zalloc(fpkt->pkt_cmdlen, KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_rsplen = 20;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_resp = kmem_zalloc(fpkt->pkt_rsplen, KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Link them together
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_fca_private = xch;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) fcoei_init_pkt(ss, fpkt, 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize FC frame header
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (ss->ss_eport->eport_flags & EPORT_FLAG_IS_DIRECT_P2P) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd_fhdr.d_id = ss->ss_p2p_info.d_id;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd_fhdr.d_id = 0xFFFFFE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd_fhdr.s_id = ss->ss_p2p_info.fca_d_id;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd_fhdr.r_ctl = R_CTL_ELS_REQ;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd_fhdr.type = FC_TYPE_EXTENDED_LS;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd_fhdr.f_ctl = 0x290000;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_timeout = 1;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize LOGO payload
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang els_logo = (la_els_logo_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang els_logo->ls_code.ls_code = LA_ELS_LOGO;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang els_logo->nport_id.port_id = ss->ss_p2p_info.fca_d_id;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(ss->ss_eport->eport_portwwn, &els_logo->nport_ww_name, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Set the completion function
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_comp = fcoei_fpkt_comp;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (fcoei_transport(ss, fpkt) != FC_SUCCESS) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "fcoei_transport LOGO failed");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_fpkt_comp(fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fpkt_comp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * internal exchange completion
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt - fc_packet_t to be completed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fpkt_comp(fc_packet_t *fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch = FPKT2XCH(fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "internal exchange is completed: %p", xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) fcoei_un_init_pkt(xch->xch_ss, xch->xch_fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(xch->xch_fpkt->pkt_cmd, xch->xch_fpkt->pkt_cmdlen);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(xch->xch_fpkt->pkt_resp, xch->xch_fpkt->pkt_rsplen);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(xch->xch_fpkt, sizeof (fc_packet_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(xch, sizeof (fcoei_exchange_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_xch_abort
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Prepare to abort the exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * key = oxid/rxid of the exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * val = the exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg = the soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * MH_WALK_CONTINUE = continue to walk
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic uint32_t
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_xch_abort(mod_hash_key_t key, mod_hash_val_t *val, void *arg)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch = (fcoei_exchange_t *)val;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(arg == xch->xch_ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(CMHK(key) != 0xFFFF);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_flags |= XCH_FLAG_ABORT;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_fpkt->pkt_state = FC_PKT_LOCAL_RJT;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_fpkt->pkt_reason = FC_REASON_OFFLINE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_insert_tail(&xch->xch_ss->ss_comp_xch_list, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return (MH_WALK_CONTINUE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_init_fcatran_vectors
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize fc_fca_tran vectors that are defined in this file
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcatran - fc_fca_tran of the soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_init_fcatran_vectors(fc_fca_tran_t *fcatran)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_bind_port = fcoei_bind_port;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_unbind_port = fcoei_unbind_port;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_init_pkt = fcoei_init_pkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_un_init_pkt = fcoei_un_init_pkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_els_send = fcoei_els_send;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_get_cap = fcoei_get_cap;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_set_cap = fcoei_set_cap;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_getmap = fcoei_getmap;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_transport = fcoei_transport;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_ub_alloc = fcoei_ub_alloc;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_ub_free = fcoei_ub_free;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_ub_release = fcoei_ub_release;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_abort = fcoei_abort;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_reset = fcoei_reset;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_port_manage = fcoei_port_manage;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_get_device = fcoei_get_device;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcatran->fca_notify = fcoei_notify;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_process_event_reset
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * link reset phase II
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_process_event_reset(fcoei_event_t *ae)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)ae->ae_obj;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ASSERT(!MUTEX_HELD(&ss->ss_watchdog_mutex));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(ae, sizeof (*ae));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mod_hash_walk(ss->ss_sol_oxid_hash, fcoei_xch_abort, ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mod_hash_walk(ss->ss_unsol_rxid_hash, fcoei_xch_abort, ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_handle_comp_xch_list(ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Notify LV that the link is up now
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_ONLINE, 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_process_event_exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Process exchange in the single thread context
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Input:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ae = the exchange event
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Returns:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Comments:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * N/A
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangvoid
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_process_event_exchange(fcoei_event_t *ae)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch = (fcoei_exchange_t *)ae->ae_obj;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch_tmp;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_packet_t *fpkt = xch->xch_fpkt;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * These 4 elements need reset, pkt_state & pkt_reason will be set
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_action = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_expln = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_data_resid = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_resp_resid = 0;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * port state sanity checking
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if ((xch->xch_ss->ss_link_state != FC_STATE_ONLINE) ||
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang xch->xch_ss->ss_port_event_counter) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * LV will retry it after one second
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, NULL, FC_PKT_PORT_OFFLINE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_REASON_OFFLINE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang return;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang switch (fpkt->pkt_cmd_fhdr.r_ctl) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case R_CTL_COMMAND:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_INIT_SOL_ID_HASH(xch, xch_tmp);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_initiate_fcp_cmd(xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case R_CTL_ELS_REQ:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_INIT_SOL_ID_HASH(xch, xch_tmp);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_initiate_els_req(xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case R_CTL_UNSOL_CONTROL:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_INIT_SOL_ID_HASH(xch, xch_tmp);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_initiate_ct_req(xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang case R_CTL_ELS_RSP:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Caution: in leadville, it still uses pkt_cmd_fhdr
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * oxid & rxid have been decided when we get unsolicited frames.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pkt_cmd_fhdr has contained the right oxid and rxid now.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_INIT_UNSOL_ID_HASH(xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_initiate_els_resp(xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang default:
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, NULL, FC_PKT_FAILURE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FC_REASON_CMD_UNSUPPORTED);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang }
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang}