2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER START
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * The contents of this file are subject to the terms of the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Common Development and Distribution License (the "License").
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You may not use this file except in compliance with the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * or http://www.opensolaris.org/os/licensing.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * See the License for the specific language governing permissions
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * and limitations under the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * When distributing Covered Code, include this CDDL HEADER in each
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * If applicable, add the following below this CDDL HEADER, with the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * fields enclosed by brackets "[]" replaced with your own identifying
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * information: Portions Copyright [yyyy] [name of copyright owner]
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER END
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * This file defines interfaces between fcoe and fct driver.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Driver kernel header files
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/conf.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/ddi.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/stat.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/pci.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/sunddi.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/modctl.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/file.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/cred.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/byteorder.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/atomic.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/modhash.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/scsi/scsi.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/ethernet.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * COMSTAR header files
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/stmf_defines.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/fct_defines.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/stmf.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/portif.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/fct.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCoE hader files
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#include <sys/fcoe/fcoe_common.h>
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Driver's own header files
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "fcoet.h"
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "fcoet_fc.h"
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "fcoet_eth.h"
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * function forward declaration
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_fill_plogi_req(fct_local_port_t *port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_remote_port_t *rp, fct_cmd_t *login);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_fill_plogi_resp(fct_local_port_t *port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_remote_port_t *rp, fct_cmd_t *login);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_send_sol_els(fct_cmd_t *cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_send_sol_ct(fct_cmd_t *cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_send_good_status(fct_cmd_t *cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_send_els_response(fct_cmd_t *cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_send_abts_response(fct_cmd_t *cmd, uint32_t flags);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_logo_fabric(fcoet_soft_state_t *ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Return the lower link information
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_get_link_info(fct_local_port_t *port, fct_link_info_t *li)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(&PORT2SS(port)->ss_link_info, li, sizeof (fct_link_info_t));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCT will call this, when it wants to send PLOGI or has received PLOGI.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_register_remote_port(fct_local_port_t *port, fct_remote_port_t *rp,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_t *login)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t handle;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t ret;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (rp->rp_id) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0xFFFFFC:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang handle = 0x7FC;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0xFFFFFD:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang handle = 0x7FD;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0xFFFFFE:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang handle = 0x7FE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0xFFFFFF:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang handle = 0x7FF;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * For not well-known address, we let FCT to select one.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang handle = FCT_HANDLE_NONE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang rp->rp_handle = handle;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (login->cmd_type == FCT_CMD_SOL_ELS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = fcoet_fill_plogi_req(port, rp, login);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = fcoet_fill_plogi_resp(port, rp, login);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCT will call this to say "FCoET can release resources with this RP now."
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_deregister_remote_port(fct_local_port_t *port, fct_remote_port_t *rp)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *this_ss = PORT2SS(port);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_rport_dereg_state = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_rportid_in_dereg = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_cmd(fct_cmd_t *cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (cmd->cmd_type == FCT_CMD_SOL_ELS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (fcoet_send_sol_els(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (cmd->cmd_type == FCT_CMD_SOL_CT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (fcoet_send_sol_ct(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * SCSI response phase
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * ELS_ACC/ELS_RJT
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_cmd_response(fct_cmd_t *cmd, uint32_t ioflags)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan char info[FCT_INFO_LEN];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (cmd->cmd_type == FCT_CMD_FCP_XCHG) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ioflags & FCT_IOF_FORCE_FCA_DONE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto send_cmd_rsp_error;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (fcoet_send_status(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (cmd->cmd_type == FCT_CMD_RCVD_ELS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ioflags & FCT_IOF_FORCE_FCA_DONE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto send_cmd_rsp_error;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (fcoet_send_els_response(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ioflags & FCT_IOF_FORCE_FCA_DONE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_handle = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (cmd->cmd_type == FCT_CMD_RCVD_ABTS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (fcoet_send_abts_response(cmd, 0));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangsend_cmd_rsp_error:
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan (void) snprintf(info, sizeof (info), "fcoet_send_cmd_response: can not "
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan "handle FCT_IOF_FORCE_FCA_DONE for cmd %p, ioflags-%x", (void *)cmd,
ef4cb712a006dbd6839858fde222aedff76e1bcbZhong Wang ioflags);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) fct_port_shutdown(CMD2SS(cmd)->ss_port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang STMF_RFLAG_FATAL_ERROR | STMF_RFLAG_RESET, info);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It's for read/write (xfer_rdy)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_xfer_scsi_data(fct_cmd_t *cmd, stmf_data_buf_t *dbuf, uint32_t ioflags)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int idx;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int frm_num;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int data_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int left_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int offset;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = CMD2XCH(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(!xch->xch_dbufs[dbuf->db_relative_offset/FCOET_MAX_DBUF_LEN]);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_dbufs[dbuf->db_relative_offset/FCOET_MAX_DBUF_LEN] = dbuf;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang left_size = (int)dbuf->db_data_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (dbuf->db_relative_offset == 0)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_left_data_size =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang XCH2TASK(xch)->task_expected_xfer_length;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao if (dbuf->db_flags & DB_DIRECTION_FROM_RPORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * If it's write type command, we need send xfer_rdy now
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We may need to consider bidirectional command later
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang dbuf->db_sglist_length = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport, sizeof (fcoe_fcp_xfer_rdy_t) +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x05, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x05;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x08, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x890000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(cmd->cmd_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(cmd->cmd_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_4(dbuf->db_relative_offset, frm->frm_payload);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_4(dbuf->db_data_size, frm->frm_payload + 4);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It's time to transfer READ data to remote side
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm_num = (dbuf->db_data_size + CMD2SS(cmd)->ss_fcp_data_payload_size -
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang 1) / CMD2SS(cmd)->ss_fcp_data_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang offset = dbuf->db_relative_offset;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang for (idx = 0; idx < frm_num; idx++) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (idx == (frm_num -1)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang data_size = P2ROUNDUP(left_size, 4);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang data_size = CMD2SS(cmd)->ss_fcp_data_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport, data_size + FCFH_SIZE,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_GET_NETB(dbuf, idx));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * lock the xchg to avoid being released (by abort)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * after sent out and before release
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_BUSY_XCHG(CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x01, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x01;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_buf_idx =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_relative_offset/FCOET_MAX_DBUF_LEN;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x08, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (idx != frm_num - 1) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x800008, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
fd465b4e41bdb67839694896094c37db076314a2Kevin Yu FFM_F_CTL(0x880008 | (data_size - left_size), frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(cmd->cmd_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(cmd->cmd_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_SEQ_CNT(xch->xch_sequence_no, frm);
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_8(&xch->xch_sequence_no);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_PARAM(offset, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang offset += data_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang left_size -= data_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Disassociate netbs which will be freed by NIC driver
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_SET_NETB(dbuf, idx, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_abort_cmd(struct fct_local_port *port, fct_cmd_t *cmd, uint32_t flags)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *this_ss = PORT2SS(port);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t fct_ret = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_abort_cmd", "cmd=%p, xch=%p, cmd_specific=%p",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd, cmd->cmd_fca_private, cmd->cmd_specific);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (cmd->cmd_type) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_CMD_RCVD_ABTS:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Sometimes unsolicited ABTS request will be received twice
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * and the first ABTS is not done yet, so the second ABTS
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * will be passed down here, in this case we will do
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * nothing and abts response is not needed to be sent
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * fct_ret = fcoet_send_abts_response(cmd, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_CMD_FCP_XCHG:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_CMD_RCVD_ELS:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (CMD2XCH(cmd)->xch_flags & XCH_FLAG_FCT_CALLED_ABORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2XCH(cmd)->xch_flags |= XCH_FLAG_FCT_CALLED_ABORT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) fcoet_clear_unsol_exchange(CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!(flags & FCT_IOF_FORCE_FCA_DONE)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&this_ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2XCH(cmd)->xch_start_time = ddi_get_lbolt();
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_insert_tail(&this_ss->ss_abort_xchg_list,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_signal(&this_ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&this_ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_CMD_SOL_ELS:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_CMD_SOL_CT:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (CMD2XCH(cmd)->xch_flags & XCH_FLAG_FCT_CALLED_ABORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2XCH(cmd)->xch_flags |= XCH_FLAG_FCT_CALLED_ABORT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_clear_sol_exchange(CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!(flags & FCT_IOF_FORCE_FCA_DONE)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&this_ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2XCH(cmd)->xch_start_time = ddi_get_lbolt();
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_signal(&this_ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_insert_tail(&this_ss->ss_abort_xchg_list,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&this_ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((flags & FCT_IOF_FORCE_FCA_DONE) &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (cmd->cmd_type != FCT_CMD_FCP_XCHG)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_handle = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (fct_ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_do_flogi(fct_local_port_t *port, fct_flogi_xchg_t *fx)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmn_err(CE_WARN, "FLOGI requested (not supported)");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_flogi(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_t *cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_els_t *els;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCT will initialize fct_cmd_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Initialize fcoet_exchange
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd = (fct_cmd_t *)fct_alloc(FCT_STRUCT_CMD_SOL_ELS,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sizeof (fcoet_exchange_t), 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch = CMD2XCH(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang els = CMD2ELS(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_oxid = atomic_add_16_nv(&ss->ss_next_sol_oxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_oxid == 0xFFFF) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_oxid =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_add_16_nv(&ss->ss_next_sol_oxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_rxid = 0xFFFF;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss = ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_cmd = cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_current_seq = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_start_time = ddi_get_lbolt();
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Keep it to compare with response
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi = xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang els->els_resp_alloc_size = 116;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang els->els_resp_size = 116;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang els->els_resp_payload = (uint8_t *)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang kmem_zalloc(els->els_resp_size, KM_SLEEP);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) mod_hash_insert(xch->xch_ss->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(uintptr_t)xch->xch_oxid, (mod_hash_val_t)xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags |= XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&ss->ss_flags, SS_FLAG_DELAY_PLOGI);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCoE will initialize fcoe_frame_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = ss->ss_eport->eport_alloc_frame(ss->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FLOGI_REQ_PAYLOAD_SIZE + FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x22, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x22;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x01, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x290000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(xch->xch_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(xch->xch_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(0xfffffe, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[0] = ELS_OP_FLOGI;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* Common Service Parameters */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[4] = 0x20;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[5] = 0x08;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[6] = 0x0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[7] = 0x03;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* N_PORT */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[8] = 0x88;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[9] = 0x00;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[10] = 0x08;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[11] = 0x0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[12] = 0x0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[13] = 0xff;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[14] = 0x0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[15] = 0x03;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[16] = 0x0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[17] = 0x0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[18] = 0x07;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[19] = 0xd0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* PWWN and NWWN */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[20] = 0x0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(ss->ss_eport->eport_portwwn, frm->frm_payload+20, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(ss->ss_eport->eport_nodewwn, frm->frm_payload+28, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* Class 3 Service Parameters */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[68] = 0x88;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[74] = 0x08;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[77] = 0xff;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags |= XCH_FLAG_NONFCP_REQ_SENT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * This is for solicited FLOGI only
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_abts(fcoet_exchange_t *xch)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss = xch->xch_ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCoE will initialize fcoe_frame_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * ABTS has no payload
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = ss->ss_eport->eport_alloc_frame(ss->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x81, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x81;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x090000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(xch->xch_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(xch->xch_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(0xfffffe, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_SEQ_CNT(xch->xch_sequence_no, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_start_time = ddi_get_lbolt();
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_ctl(struct fct_local_port *port, int cmd, void *arg)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_change_status_t st;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_state_change_info_t *ssci = (stmf_state_change_info_t *)arg;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *this_ss = PORT2SS(port);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_completion_status = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_additional_info = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (cmd) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_CMD_PORT_ONLINE:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (this_ss->ss_state == FCT_STATE_ONLINE)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_completion_status = STMF_ALREADY;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang else if (this_ss->ss_state != FCT_STATE_OFFLINE)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_completion_status = FCT_FAILURE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (st.st_completion_status == FCT_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state = FCT_STATE_ONLINING;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state_not_acked = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_completion_status = fcoet_enable_port(this_ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (st.st_completion_status != STMF_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state = FCT_STATE_OFFLINE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state_not_acked = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state = FCT_STATE_ONLINE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_ctl(port->port_lport, FCT_CMD_PORT_ONLINE_COMPLETE, &st);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_change_state_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_CMD_PORT_OFFLINE:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (this_ss->ss_state == FCT_STATE_OFFLINE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_completion_status = STMF_ALREADY;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (this_ss->ss_state != FCT_STATE_ONLINE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_completion_status = FCT_FAILURE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (st.st_completion_status == FCT_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state = FCT_STATE_OFFLINING;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state_not_acked = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_change_state_flags = ssci->st_rflags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang st.st_completion_status = fcoet_disable_port(this_ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (st.st_completion_status != STMF_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state = FCT_STATE_ONLINE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state_not_acked = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state = FCT_STATE_OFFLINE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu /*
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu * Notify the watchdog to do clear work
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu */
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu mutex_enter(&this_ss->ss_watch_mutex);
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu cv_signal(&this_ss->ss_watch_cv);
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu mutex_exit(&this_ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_ctl(port->port_lport, FCT_CMD_PORT_OFFLINE_COMPLETE, &st);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_ACK_PORT_ONLINE_COMPLETE:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state_not_acked = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCT_ACK_PORT_OFFLINE_COMPLETE:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_state_not_acked = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (this_ss->ss_change_state_flags & STMF_RFLAG_RESET) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fct_port_initialize(port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_change_state_flags,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_ctl FCT_ACK_PORT_OFFLINE_COMPLETE "
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "with RLFLAG_RESET") != FCT_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmn_err(CE_WARN, "fcoet_ctl: "
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fct_port_initialize %s failed",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang this_ss->ss_alias);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_ctl: fct_port_initialize "
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "%s failed", this_ss->ss_alias);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_ctl", "Unsupported cmd %x", cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Filling the hba attributes
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_populate_hba_fru_details(struct fct_local_port *port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang struct fct_port_attrs *port_attrs)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) snprintf(port_attrs->manufacturer, FCHBA_MANUFACTURER_LEN,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "Sun Microsystems, Inc.");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) snprintf(port_attrs->driver_name, FCHBA_DRIVER_NAME_LEN,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "%s", FCOET_NAME);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) snprintf(port_attrs->driver_version, FCHBA_DRIVER_VERSION_LEN,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "%s", FCOET_VERSION);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) strcpy(port_attrs->serial_number, "N/A");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) strcpy(port_attrs->hardware_version, "N/A");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) strcpy(port_attrs->model, "FCoE Virtual FC HBA");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) strcpy(port_attrs->model_description, "N/A");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) strcpy(port_attrs->firmware_version, "N/A");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) strcpy(port_attrs->option_rom_version, "N/A");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port_attrs->vendor_specific_id = 0xFC0E;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port_attrs->max_frame_size = 2136;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port_attrs->supported_cos = 0x10000000;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* Specified a fix speed here, need to change it in the future */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port_attrs->supported_speed = PORT_SPEED_1G | PORT_SPEED_10G;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_els(fct_cmd_t *cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch = CMD2XCH(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss = CMD2SS(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_cmd = cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_current_seq = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_left_data_size = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_sequence_no = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_start_time = ddi_get_lbolt();
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_rxid = 0xFFFF;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_oxid = atomic_add_16_nv(&xch->xch_ss->ss_next_sol_oxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_oxid == 0xFFFF) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_oxid =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_add_16_nv(&xch->xch_ss->ss_next_sol_oxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(CMD2SS(cmd)->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2ELS(cmd)->els_req_size + FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) mod_hash_insert(FRM2SS(frm)->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(uintptr_t)xch->xch_oxid, (mod_hash_val_t)xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags |= XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(CMD2ELS(cmd)->els_req_payload, frm->frm_payload,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x22, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x22;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x01, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x290000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(xch->xch_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(xch->xch_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_ct(fct_cmd_t *cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch = CMD2XCH(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss = CMD2SS(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_cmd = cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_current_seq = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_left_data_size = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_sequence_no = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_start_time = ddi_get_lbolt();
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_rxid = 0xFFFF;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_oxid = atomic_add_16_nv(&xch->xch_ss->ss_next_sol_oxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_oxid == 0xFFFF) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_oxid =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_add_16_nv(&xch->xch_ss->ss_next_sol_oxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(CMD2SS(cmd)->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2ELS(cmd)->els_req_size + FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) mod_hash_insert(FRM2SS(frm)->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(uintptr_t)xch->xch_oxid, (mod_hash_val_t)xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags |= XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(CMD2ELS(cmd)->els_req_payload, frm->frm_payload,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x2, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x2;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x20, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x290000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(xch->xch_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(xch->xch_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_status(fct_cmd_t *cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang scsi_task_t *task = CMD2TASK(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_fcp_rsp_t *ffr;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int raw_frame_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Fast channel for good status phase
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (task->task_scsi_status == STATUS_GOOD && !task->task_resid) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (fcoet_send_good_status(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang raw_frame_size = FCFH_SIZE + sizeof (fcoe_fcp_rsp_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (task->task_scsi_status == STATUS_CHECK) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang raw_frame_size += task->task_sense_length;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang raw_frame_size = P2ROUNDUP(raw_frame_size, 4);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(CMD2SS(cmd)->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang raw_frame_size, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * lock the xchg to avoid being released (by abort)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * after sent out and before release
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_BUSY_XCHG(CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * If there's sense data, copy it first
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((task->task_scsi_status == STATUS_CHECK) &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_sense_length) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(task->task_sense_data, frm->frm_payload +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sizeof (fcoe_fcp_rsp_t), task->task_sense_length);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Fill fcp_rsp
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ffr = (fcoe_fcp_rsp_t *)frm->frm_payload;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_4(0, ffr->ffr_retry_delay_timer);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_1(0, ffr->ffr_flags);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (task->task_scsi_status == STATUS_CHECK || task->task_resid) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (task->task_scsi_status == STATUS_CHECK) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ffr->ffr_flags[0] |= BIT_1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (task->task_status_ctrl == TASK_SCTRL_OVER) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ffr->ffr_flags[0] |= BIT_2;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (task->task_status_ctrl == TASK_SCTRL_UNDER) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ffr->ffr_flags[0] |= BIT_3;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_1(task->task_scsi_status, ffr->ffr_scsi_status);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_4(task->task_resid, ffr->ffr_resid);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_4(task->task_sense_length, ffr->ffr_sns_len);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_4(0, ffr->ffr_rsp_len);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Fill fc frame header
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x07, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x07;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x08, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x990000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(cmd->cmd_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(cmd->cmd_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_SEQ_ID(0x01, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_els_response(fct_cmd_t *cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(CMD2SS(cmd)->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2ELS(cmd)->els_resp_size + FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * lock the xchg to avoid being released (by abort)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * after sent out and before release
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_BUSY_XCHG(CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(CMD2ELS(cmd)->els_resp_payload, frm->frm_payload,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x23, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x23;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x01, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x980000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(cmd->cmd_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(cmd->cmd_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_abts_response(fct_cmd_t *cmd, uint32_t flags)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_rcvd_abts_t *abts = (fct_rcvd_abts_t *)cmd->cmd_specific;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * The relevant fcoet_exchange has been released
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_fca_private = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(CMD2SS(cmd)->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang 12 + FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(abts->abts_resp_payload, frm->frm_payload,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(abts->abts_resp_rctl, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = abts->abts_resp_rctl;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x00, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x980000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(cmd->cmd_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(cmd->cmd_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * enable/disable port is simple compared to physical FC HBAs
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_enable_port(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_EXT_LOG(ss->ss_alias, "port is being enabled-%p", ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* Call fcoe function to online the port */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_ONLINE, 0) ==
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_FAILURE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((ss->ss_flags & SS_FLAG_PORT_DISABLED) == SS_FLAG_PORT_DISABLED) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_and_32(&ss->ss_flags, ~SS_FLAG_PORT_DISABLED);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_disable_port(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t status;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_EXT_LOG(ss->ss_alias, "port is being disabled-%p", ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* Call fcoe function to offline the port */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang status = fcoet_logo_fabric(ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_OFFLINE, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&ss->ss_flags, SS_FLAG_PORT_DISABLED);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (status);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_logo_fabric(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t req_payload_size = 16;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t xch_oxid, xch_rxid = 0xFFFF;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = ss->ss_eport->eport_alloc_frame(ss->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang req_payload_size + FCFH_SIZE, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek xch_oxid = atomic_inc_16_nv(&ss->ss_next_sol_oxid);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch_oxid == 0xFFFF) {
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek xch_oxid = atomic_inc_16_nv(&ss->ss_next_sol_oxid);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x22, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x22;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x01, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x290000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(xch_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(xch_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(ss->ss_link_info.portid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(0xfffffe, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_1(0x5, frm->frm_payload);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_V2B_3(ss->ss_link_info.portid, frm->frm_payload + 5);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(ss->ss_eport->eport_portwwn, frm->frm_payload + 8, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Called by: fcoet_register_remote_port
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_fill_plogi_req(fct_local_port_t *port, fct_remote_port_t *rp,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_t *login)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *p;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p = ((fct_els_t *)login->cmd_specific)->els_req_payload;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[0] = ELS_OP_PLOGI;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[4] = 0x20;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[5] = 0x20;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[7] = 3;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[8] = 0x88;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[10] = 8;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[13] = 0xff; p[15] = 0x1f;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[18] = 7; p[19] = 0xd0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(port->port_pwwn, p + 20, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(port->port_nwwn, p + 28, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[68] = 0x80;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[74] = 8;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[77] = 0xff;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[81] = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Called by: fcoet_register_remote_port
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_fill_plogi_resp(fct_local_port_t *port, fct_remote_port_t *rp,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_t *login)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *p;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * ACC
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p = ((fct_els_t *)login->cmd_specific)->els_req_payload;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[0] = ELS_OP_ACC;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[4] = 0x20;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[5] = 0x20;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[7] = 0x0A;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[10] = 0x05;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[11] = 0xAC;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(port->port_pwwn, p + 20, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(port->port_nwwn, p + 28, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang p[68] = 0x88;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_good_status(fct_cmd_t *cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int raw_frame_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang raw_frame_size = FCFH_SIZE + sizeof (fcoe_fcp_rsp_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = CMD2SS(cmd)->ss_eport->eport_alloc_frame(CMD2SS(cmd)->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang raw_frame_size, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(frm->frm_payload, frm->frm_payload_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * lock the xchg to avoid being released (by abort)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * after sent out and before release
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_BUSY_XCHG(CMD2XCH(cmd));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Fill fc frame header
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_R_CTL(0x07, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_rctl = 0x07;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_TYPE(0x08, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_F_CTL(0x990000, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_OXID(cmd->cmd_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(cmd->cmd_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(cmd->cmd_lportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_D_ID(cmd->cmd_rportid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_SEQ_ID(0x01, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2SS(cmd)->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCT_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}