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 * The following notice accompanied the original version of this file:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * BSD LICENSE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Copyright(c) 2007 Intel Corporation. All rights reserved.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * All rights reserved.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Redistribution and use in source and binary forms, with or without
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * modification, are permitted provided that the following conditions
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * are met:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * * Redistributions of source code must retain the above copyright
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * notice, this list of conditions and the following disclaimer.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * * Redistributions in binary form must reproduce the above copyright
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * notice, this list of conditions and the following disclaimer in
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * the documentation and/or other materials provided with the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * distribution.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * * Neither the name of Intel Corporation nor the names of its
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * contributors may be used to endorse or promote products derived
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * from this software without specific prior written permission.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * This file defines interfaces between fcoe and fcoet 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 header 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_eth.h"
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * function forward declaration
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fcoet_exchange_t *fcoet_create_unsol_exchange(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_sol_fcp_data(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_unsol_fcp_cmd(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_unsol_els_req(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_sol_els_rsp(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_unsol_abts_req(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_sol_abts_acc(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_sol_abts_rjt(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_unsol_ct_req(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_sol_ct_rsp(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_sol_flogi_rsp(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_sol_fcp_data_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_fcp_status_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_unsol_els_rsp_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_sol_els_req_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_unsol_bls_acc_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_unsol_bls_rjt_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_sol_bls_req_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_send_sol_ct_req_done(fcoe_frame_t *frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_process_unsol_flogi_req(fcoet_exchange_t *xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * rx_frame & release_sol_frame
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * There should be no same OXID/RXID in on-going exchanges.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * RXID -> unsol_rxid_hash
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * OXID -> sol_oxid_hash
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_rx_frame(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t rctl = FRM_R_CTL(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (rctl) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x01:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Solicited data
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_sol_fcp_data(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_sol_fcp_data failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x06:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Unsolicited fcp_cmnd
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_unsol_fcp_cmd(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_unsol_fcp_cmd failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x22:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * unsolicited ELS req
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_unsol_els_req(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_unsol_els_req failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x23:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * solicited ELS rsp
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_sol_els_rsp(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_sol_els_rsp failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x81:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * unsolicted ABTS req
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_unsol_abts_req(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_unsol_abts_req failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x84:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * solicited ABTS acc response
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_sol_abts_acc(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_sol_abts_acc failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x85:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * solcited ABTS rjt response
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_sol_abts_rjt(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_sol_abts_rjt failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x02:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * unsolicited CT req
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_unsol_ct_req(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_sol_ct_rsp failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x03:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * sol ct rsp
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_process_sol_ct_rsp(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_rx_frame",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fcoet_process_sol_ct_rsp failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Unsupported frame
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang PRT_FRM_HDR("Unsupported unsol frame: ", frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Release the frame in the end
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_eport->eport_free_netb(frm->frm_netb);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_eport->eport_release_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * For solicited frames, after FCoE has sent it out, it will call this
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * to notify client(FCoEI/FCoET) about its completion.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_release_sol_frame(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = FRM2TFM(frm)->tfm_xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * From now, we should not access both frm_hdr and frm_payload. Its
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * mblk could have been released by MAC driver.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (FRM2TFM(frm)->tfm_rctl) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x01:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch && xch->xch_flags & XCH_FLAG_FCT_CALLED_ABORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_sol_fcp_data_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x05:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x07:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch && xch->xch_flags & XCH_FLAG_FCT_CALLED_ABORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_fcp_status_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x23:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch && xch->xch_flags & XCH_FLAG_FCT_CALLED_ABORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_unsol_els_rsp_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x22:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_sol_els_req_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x84:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_unsol_bls_acc_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x85:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_unsol_bls_rjt_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x81:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_sol_bls_req_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x02:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_sol_ct_req_done(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x03:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Unsupported frame
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang PRT_FRM_HDR("Unsupported sol frame: ", frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We should release the frame
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2SS(frm)->ss_eport->eport_release_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_port_event(fcoe_port_t *eport, uint32_t event)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss = EPORT2SS(eport);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (event) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCOE_NOTIFY_EPORT_LINK_UP:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (eport->eport_mtu >= FCOE_MIN_MTU_SIZE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_fcp_data_payload_size =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_DEFAULT_FCP_DATA_PAYLOAD_SIZE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_fcp_data_payload_size =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_MIN_FCP_DATA_PAYLOAD_SIZE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_port_event", "LINK UP notified");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state = SFS_FLOGI_INIT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_signal(&ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case FCOE_NOTIFY_EPORT_LINK_DOWN:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_handle_event(ss->ss_port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCT_EVENT_LINK_DOWN, 0, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* Need clear up all other things */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_port_event", "LINK DOWN notified");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state = SFS_WAIT_LINKUP;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * For unsolicited exchanges, FCoET is only responsible for allocation of
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * req_payload. FCT will allocate resp_payload after the exchange is
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * passed on.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fcoet_exchange_t *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_create_unsol_exchange(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t r_ctl;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int cdb_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch, *xch_tmp;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_t *cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_fcp_cmnd_t *ffc;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t task_expected_len = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang r_ctl = FRM_R_CTL(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (r_ctl) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x22:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCoET's unsolicited ELS
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd = (fct_cmd_t *)fct_alloc(FCT_STRUCT_CMD_RCVD_ELS,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang GET_STRUCT_SIZE(fcoet_exchange_t) +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload_size, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (cmd == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_EXT_LOG(0, "can't get cmd");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case 0x06:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCoET's unsolicited SCSI cmd
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cdb_size = 16; /* need improve later */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd = fct_scsi_task_alloc(FRM2SS(frm)->ss_port, FCT_HANDLE_NONE,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM_S_ID(frm), frm->frm_payload, cdb_size,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang STMF_TASK_EXT_NONE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (cmd == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_EXT_LOG(0, "can't get fcp cmd");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ffc = (fcoe_fcp_cmnd_t *)frm->frm_payload;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task_expected_len = FCOE_B2V_4(ffc->ffc_fcp_dl);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_EXT_LOG(0, "unsupported R_CTL: %x", r_ctl);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * xch initialization
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch = CMD2XCH(cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_oxid = FRM_OXID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss = FRM2SS(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_cmd = cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_current_seq = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_left_data_size = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (task_expected_len) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_dbuf_num =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (task_expected_len + FCOET_MAX_DBUF_LEN - 1) /
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_MAX_DBUF_LEN;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_dbufs =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang kmem_zalloc(xch->xch_dbuf_num * sizeof (stmf_data_buf_t *),
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang KM_SLEEP);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_start_time = ddi_get_lbolt();
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang do {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_rxid = atomic_add_16_nv(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang &xch->xch_ss->ss_next_unsol_rxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_rxid == 0xFFFF) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_rxid = atomic_add_16_nv(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang &xch->xch_ss->ss_next_unsol_rxid, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } while (mod_hash_find(FRM2SS(frm)->ss_unsol_rxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)xch->xch_rxid,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_val_t)&xch_tmp) == 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_sequence_no = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ref = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) mod_hash_insert(xch->xch_ss->ss_unsol_rxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)xch->xch_rxid, (mod_hash_val_t)xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags |= XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * cmd initialization
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_port = FRM2SS(frm)->ss_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_rp_handle = FCT_HANDLE_NONE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_rportid = FRM_S_ID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_lportid = FRM_D_ID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_oxid = xch->xch_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_rxid = xch->xch_rxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangint
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_clear_unsol_exchange(fcoet_exchange_t *xch)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_val_t val = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (mod_hash_remove(xch->xch_ss->ss_unsol_rxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)xch->xch_rxid, &val) == 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_dbuf_num) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang kmem_free((void*)xch->xch_dbufs,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_dbuf_num * sizeof (void *));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_dbufs = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_dbuf_num = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(xch->xch_flags & XCH_FLAG_IN_HASH_TABLE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT((fcoet_exchange_t *)val == xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags &= ~XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_clear_unsol_exchange", "xch %p already cleared from "
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "hash table", xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_clear_sol_exchange(fcoet_exchange_t *xch)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_val_t val = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_flags & XCH_FLAG_IN_HASH_TABLE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) mod_hash_remove(xch->xch_ss->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)xch->xch_oxid, &val);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT((fcoet_exchange_t *)val == xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags &= ~XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_sol_fcp_data(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t fc_st;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t iof;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t unsol_rxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int sge_idx;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_data_buf_t *dbuf;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int data_offset;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang unsol_rxid = FRM_RXID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (mod_hash_find_cb(FRM2SS(frm)->ss_unsol_rxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)unsol_rxid,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_val_t)&xch, fcoet_modhash_find_cb) != 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * we will always have a buf waiting there
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang data_offset = FRM_PARAM(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf = xch->xch_dbufs[data_offset/FCOET_MAX_DBUF_LEN];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(dbuf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss = xch->xch_ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_idx = (data_offset % FCOET_MAX_DBUF_LEN)/
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_fcp_data_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(((sge_idx < FCOET_GET_SEG_NUM(dbuf) - 1) &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (frm->frm_payload_size == ss->ss_fcp_data_payload_size)) ||
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((sge_idx == FCOET_GET_SEG_NUM(dbuf) - 1) &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (frm->frm_payload_size % ss->ss_fcp_data_payload_size ==
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_data_size % ss->ss_fcp_data_payload_size)));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(frm->frm_payload, dbuf->db_sglist[sge_idx].seg_addr,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload_size);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang atomic_add_16(&dbuf->db_sglist_length, 1);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_left_data_size -= frm->frm_payload_size;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if ((xch->xch_left_data_size <= 0) ||
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang dbuf->db_sglist_length >= FCOET_GET_SEG_NUM(dbuf)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fc_st = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang iof = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_xfer_status = fc_st;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_flags |= DB_DONT_REUSE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_scsi_data_xfer_done(xch->xch_cmd, dbuf, iof);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_unsol_fcp_cmd(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_fcp_cmnd_t *ffc;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t tm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang scsi_task_t *task;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch = fcoet_create_unsol_exchange(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_fcp_cmd", "can't get exchange");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ffc = (fcoe_fcp_cmnd_t *)frm->frm_payload;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task = XCH2TASK(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_csn_size = 8;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_max_nbufs = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_cmd_seq_no = FCOE_B2V_1(ffc->ffc_ref_num);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_flags = FCOE_B2V_1(ffc->ffc_attribute) & 0x07;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_flags |=
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (FCOE_B2V_1(ffc->ffc_addlen_rdwr) & 0x03) << 5;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_expected_xfer_length = FCOE_B2V_4(ffc->ffc_fcp_dl);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang tm = FCOE_B2V_1(ffc->ffc_management_flags);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (tm) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (tm & BIT_1) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_mgmt_function = TM_ABORT_TASK_SET;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (tm & BIT_2) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_mgmt_function = TM_CLEAR_TASK_SET;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (tm & BIT_4) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_mgmt_function = TM_LUN_RESET;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (tm & BIT_5) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_mgmt_function = TM_TARGET_COLD_RESET;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (tm & BIT_6) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_mgmt_function = TM_CLEAR_ACA;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang task->task_mgmt_function = TM_ABORT_TASK;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(ffc->ffc_cdb, task->task_cdb, 16);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_post_rcvd_cmd(xch->xch_cmd, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It must be from link
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * req_payload has been allocated when create_unsol_exchange
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_unsol_els_req(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret = FCOE_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch = fcoet_create_unsol_exchange(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(FRM_IS_LAST_FRAME(frm));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * For the reason of keeping symmetric, we do copy here as in
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * process_sol_els instead of in create_unsol_exchange.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * req_payload depends on how to allocate buf in create_unsol_exchange
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang XCH2ELS(xch)->els_req_alloc_size = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang XCH2ELS(xch)->els_req_size = frm->frm_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang XCH2ELS(xch)->els_req_payload =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang GET_BYTE_OFFSET(xch, GET_STRUCT_SIZE(fcoet_exchange_t));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(frm->frm_payload, XCH2ELS(xch)->els_req_payload,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang XCH2ELS(xch)->els_req_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (XCH2ELS(xch)->els_req_payload[0] != ELS_OP_FLOGI) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Ensure LINK_UP event has been handled, or PLOIG has
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * been processed by FCT, or else it will be discarded.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It need more consideration later ???
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((XCH2ELS(xch)->els_req_payload[0] == ELS_OP_PLOGI) &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (xch->xch_ss->ss_flags & SS_FLAG_DELAY_PLOGI)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang delay(STMF_SEC2TICK(1)/2);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((XCH2ELS(xch)->els_req_payload[0] == ELS_OP_PRLI) &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (xch->xch_ss->ss_flags & SS_FLAG_DELAY_PLOGI)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_and_32(&xch->xch_ss->ss_flags,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ~SS_FLAG_DELAY_PLOGI);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang delay(STMF_SEC2TICK(1)/3);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_post_rcvd_cmd(xch->xch_cmd, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We always handle FLOGI internally
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Save dst mac address from FLOGI request to restore later
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy((char *)frm->frm_hdr-22,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_eport->eport_efh_dst, ETHERADDRL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = fcoet_process_unsol_flogi_req(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It must be from link, but could be incomplete because of network problems
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_sol_els_rsp(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t actual_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t fc_st;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t iof;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t sol_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_els_t *els = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret = FCOE_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sol_oxid = FRM_OXID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (mod_hash_find_cb(FRM2SS(frm)->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)sol_oxid,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_val_t *)&xch, fcoet_modhash_find_cb) != 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch != FRM2SS(frm)->ss_sol_flogi) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_clear_sol_exchange(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang els = CMD2ELS(xch->xch_cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(FRM_IS_LAST_FRAME(frm));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang actual_size = els->els_resp_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (actual_size > frm->frm_payload_size) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang actual_size = frm->frm_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang els->els_resp_size = (uint16_t)actual_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(frm->frm_payload, els->els_resp_payload, actual_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_ss->ss_sol_flogi == xch) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We handle FLOGI internally
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = fcoet_process_sol_flogi_rsp(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fc_st = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang iof = FCT_IOF_FCA_DONE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_send_cmd_done(xch->xch_cmd, fc_st, iof);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It's still in the context of being aborted exchange, but FCT can't support
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * this scheme, so there are two fct_cmd_t that are bound with one exchange.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_unsol_abts_req(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_t *cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t unsol_rxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_abts_req", "ABTS: %x/%x",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM_OXID(frm), FRM_RXID(frm));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang unsol_rxid = FRM_RXID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (mod_hash_find_cb(FRM2SS(frm)->ss_unsol_rxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)unsol_rxid,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_val_t *)&xch, fcoet_modhash_find_cb) != 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_abts_req",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "can't find aborted exchange");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!FRM_IS_LAST_FRAME(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_abts_req",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "not supported this kind frame");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd = (fct_cmd_t *)fct_alloc(FCT_STRUCT_CMD_RCVD_ABTS, 0, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (cmd == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_abts_req",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "can't alloc fct_cmd_t");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags |= XCH_FLAG_INI_ASKED_ABORT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_fca_private = xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_port = xch->xch_cmd->cmd_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_rp_handle = xch->xch_cmd->cmd_rp_handle;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_rportid = xch->xch_cmd->cmd_rportid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_lportid = xch->xch_cmd->cmd_lportid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_oxid = xch->xch_cmd->cmd_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cmd->cmd_rxid = xch->xch_cmd->cmd_rxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_post_rcvd_cmd(cmd, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_abts_req",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "abts now: xch/%p, frm/%p - time/%p",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch, frm, ddi_get_lbolt());
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_sol_abts_acc(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t sol_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sol_oxid = FRM_OXID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (mod_hash_remove(FRM2SS(frm)->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)sol_oxid,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_val_t *)&xch) != 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * So far ABTS for FLOGI might be removed from ss_sol_oxid_hash
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * in fcoet_watch_handle_sol_flogi, Will improve it later
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags &= ~XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!FRM_IS_LAST_FRAME(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_sol_abts_acc",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "not supported this kind frame");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_sol_abts_acc",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "ABTS received but there is nothing to do");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_sol_abts_rjt(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t sol_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sol_oxid = FRM_OXID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (mod_hash_remove(FRM2SS(frm)->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)sol_oxid,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_val_t *)&xch) != 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * So far ABTS for FLOGI might be removed from ss_sol_oxid_hash
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * in fcoet_watch_handle_sol_flogi, Will improve it later
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags &= ~XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!FRM_IS_LAST_FRAME(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_sol_abts_rjt",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "not supported this kind frame");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_sol_abts_rjt",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "ABTS_RJT received rjt reason %x but there is nothing to do",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[1]);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_unsol_ct_req(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * If you want to implement virtual name server, or FC/ETH
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * gateway, you can do it here
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!FRM_IS_LAST_FRAME(frm)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_ct_req",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "not supported this kind frame");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_ct_req",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "No support for unsolicited CT request");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_sol_ct_rsp(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t actual_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t fc_st;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t iof;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_sol_ct_t *ct = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint16_t sol_oxid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sol_oxid = FRM_OXID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (mod_hash_remove(FRM2SS(frm)->ss_sol_oxid_hash,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_key_t)(intptr_t)sol_oxid,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (mod_hash_val_t *)&xch) != 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_flags &= ~XCH_FLAG_IN_HASH_TABLE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_init_tfm(frm, xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(FRM_IS_LAST_FRAME(frm));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang actual_size = CMD2ELS(xch->xch_cmd)->els_resp_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (actual_size > frm->frm_payload_size) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang actual_size = frm->frm_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ct = CMD2CT(xch->xch_cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ct->ct_resp_size = (uint16_t)actual_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(frm->frm_payload,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang CMD2CT(xch->xch_cmd)->ct_resp_payload, actual_size);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fc_st = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang iof = FCT_IOF_FCA_DONE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_send_cmd_done(xch->xch_cmd, fc_st, iof);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_fcp_data_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = FRM2TFM(frm)->tfm_xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_data_buf_t *dbuf;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int dbuf_index;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t iof;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf_index = FRM2TFM(frm)->tfm_buf_idx;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_left_data_size -= frm->frm_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf = xch->xch_dbufs[dbuf_index];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT((dbuf) && (dbuf->db_flags & DB_DIRECTION_TO_RPORT));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We decrease db_sglist_length only for READ-type commands.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * For INQUIRY, resid could be non-zero, then db_sglist_length will
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * be useful.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_sglist_length--;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((xch->xch_left_data_size <= 0) || (!dbuf->db_sglist_length)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang iof = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_xfer_status = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_flags |= DB_DONT_REUSE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (dbuf->db_flags & DB_SEND_STATUS_GOOD) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_send_status(xch->xch_cmd) != FCT_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_scsi_data_xfer_done(xch->xch_cmd, dbuf, iof);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_fcp_status_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = FRM2TFM(frm)->tfm_xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t fc_st = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t iof = FCT_IOF_FCA_DONE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_flags & XCH_FLAG_FCT_CALLED_ABORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_clear_unsol_exchange(xch) == FCOE_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_send_response_done(xch->xch_cmd, fc_st, iof);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* Already cleared from hash table by abort */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Solicited frames callback area
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_unsol_els_rsp_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = FRM2TFM(frm)->tfm_xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_status_t fc_st;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t iof;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_EXT_LOG("fcoet_send_unsol_els_rsp_done",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "frm/oxid/els: %p/%x/%x",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm, FRM_OXID(frm), XCH2ELS(xch)->els_req_payload[0]);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_flags & XCH_FLAG_FCT_CALLED_ABORT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_clear_unsol_exchange(xch) == FCOE_FAILURE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_RELE_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (XCH2ELS(xch)->els_req_payload[0] != ELS_OP_FLOGI) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fc_st = FCT_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang iof = FCT_IOF_FCA_DONE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_send_response_done(xch->xch_cmd, fc_st, iof);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We need update ss_link_info and flags.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&xch->xch_ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.portid =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_cmd->cmd_lportid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_topology =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang PORT_TOPOLOGY_PT_TO_PT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm->frm_eport->eport_link_speed == FCOE_PORT_SPEED_1G) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_speed = PORT_SPEED_1G;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else if (frm->frm_eport->eport_link_speed ==
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_PORT_SPEED_10G) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_speed = PORT_SPEED_10G;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_no_fct_flogi = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_fca_flogi_done = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_fct_flogi_done = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(XCH2ELS(xch)->els_req_payload + 20,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_rpwwn, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(XCH2ELS(xch)->els_req_payload + 28,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_rnwwn, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&xch->xch_ss->ss_flags,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SS_FLAG_UNSOL_FLOGI_DONE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&xch->xch_ss->ss_flags,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang SS_FLAG_REPORT_TO_FCT);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_sol_flogi_state = SFS_FLOGI_ACC;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&xch->xch_ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(xch->xch_cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_els_req_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCT have released relevant fct_cmd_t and fcoet_exchange_t now, so it's not
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * needed to notify FCT anything. Just do nothing.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_unsol_bls_acc_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_send_unsol_bls_acc_done",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "Unsolicited BA_ACC sent out and released ");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_unsol_bls_rjt_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_send_unsol_bls_rjt_done",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "Unsolicited BA_RJT sent out and released");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_bls_req_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_send_sol_bls_req_done",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "Soclited ABTS was sent out and released");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_send_sol_ct_req_done(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_send_sol_ct_req_done",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "CT request was sent out and released");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCoET can only interpret solicited and unsolicited FLOGI, all the other
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * ELS/CT/FCP should be passed up to FCT.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_unsol_flogi_req(fcoet_exchange_t *xch)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&xch->xch_ss->ss_flags, SS_FLAG_DELAY_PLOGI);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * In spec, common service parameter should indicate if it's from
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * N-port or F-port, but the initial intel implementation is not
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * spec-compliant, so we use eport_flags to workaround the problem
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!(xch->xch_ss->ss_eport->eport_flags & EPORT_FLAG_IS_DIRECT_P2P)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * The topology is switch P2P, so there's no need to respond
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * to this FLOGI
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_unsol_flogi_req",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "skip FLOGI, since we are in switch topology");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Send ACC according to the spec.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FLOGI_ACC_PAYLOAD_SIZE + FCFH_SIZE, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (frm == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
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(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(xch->xch_oxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_RXID(xch->xch_rxid, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FFM_S_ID(0xFFFFFE, frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * ACC
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[0] = 0x02;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Common Svc Parameters
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[4] = 0x20;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[5] = 0x20;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[7] = 0x0A;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[10] = 0x05;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[11] = 0xAC;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(xch->xch_ss->ss_eport->eport_portwwn, frm->frm_payload + 20, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(xch->xch_ss->ss_eport->eport_nodewwn, frm->frm_payload + 28, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Class3 Svc Parameters
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_payload[68] = 0x88;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Send FLOGI ACC out
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * After this, we should never use the exchange, because it could
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * have been released. Please pay attention to other similiar cases.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_eport->eport_tx_frame(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_process_sol_flogi_rsp(fcoe_frame_t *frm)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret = FCOE_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = FRM2TFM(frm)->tfm_xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_els_t *els = CMD2ELS(xch->xch_cmd);
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu fcoet_soft_state_t *ss = FRM2SS(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (els->els_resp_payload[0] == ELS_OP_ACC) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We need always update ss_link_info and flags for solicited
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FLOGI, because someone has assigned address for you. The
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * initial intel implementation will always assign address for
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * you even you are in back-to-back mode (direct P2P).
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu mutex_enter(&ss->ss_watch_mutex);
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu if (ss->ss_flags & SS_FLAG_PORT_DISABLED ||
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu (ss->ss_sol_flogi_state != SFS_FLOGI_INIT &&
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu ss->ss_sol_flogi_state != SFS_FLOGI_CHECK_TIMEOUT &&
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu ss->ss_sol_flogi_state != SFS_ABTS_INIT)) {
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu /*
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu * The status is not correct, this response may be
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu * obsolete.
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu */
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu mutex_exit(&ss->ss_watch_mutex);
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu FCOET_LOG("fcoet_process_sol_flogi_rsp",
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu "FLOGI response is obsolete");
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu return (FCOE_FAILURE);
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xch->xch_flags & XCH_FLAG_NONFCP_REQ_SENT) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_cmd->cmd_lportid = FRM_D_ID(frm);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.portid =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_cmd->cmd_lportid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Check the bit 28 in 3rd word of the payload
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * in common service parameters to know the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * remote port is F_PORT or N_PORT
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (els->els_resp_payload[8] & 0x10) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t src_addr[ETHERADDRL];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_eport->eport_flags &=
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ~EPORT_FLAG_IS_DIRECT_P2P;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_SET_DEFAULT_OUI(src_addr);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(frm->frm_hdr->hdr_d_id, src_addr + 3, 3);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy((char *)frm->frm_hdr-22,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_eport->eport_efh_dst,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ETHERADDRL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_eport->eport_set_mac_address(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang frm->frm_eport, src_addr, B_TRUE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_topology =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang PORT_TOPOLOGY_FABRIC_PT_TO_PT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_topology =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang PORT_TOPOLOGY_PT_TO_PT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_speed = PORT_SPEED_10G;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_no_fct_flogi = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_fca_flogi_done = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_link_info.port_fct_flogi_done = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xch->xch_ss->ss_sol_flogi_state = SFS_FLOGI_ACC;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_signal(&xch->xch_ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_sol_flogi_rsp",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "FLOGI is accecpted");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_sol_flogi_rsp",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "FLOGI xch_flags/%x", xch->xch_flags);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = FCOE_FAILURE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
1826d2a29c290066fad1e2e22d57722d54e6d475Kelly Hu mutex_exit(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_process_sol_flogi_rsp", "FLOGI is rejected");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = FCOE_FAILURE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}