2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER START
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * The contents of this file are subject to the terms of the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Common Development and Distribution License (the "License").
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You may not use this file except in compliance with the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * or http://www.opensolaris.org/os/licensing.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * See the License for the specific language governing permissions
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * and limitations under the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * When distributing Covered Code, include this CDDL HEADER in each
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * If applicable, add the following below this CDDL HEADER, with the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * fields enclosed by brackets "[]" replaced with your own identifying
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * information: Portions Copyright [yyyy] [name of copyright owner]
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER END
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
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 * 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"
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "fcoet_fc.h"
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * static function forward declaration
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_open(dev_t *devp, int flag, int otype, cred_t *credp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_close(dev_t dev, int flag, int otype, cred_t *credp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_ioctl(dev_t dev, int cmd, intptr_t data, int mode,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cred_t *credp, int *rval);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_attach_init(fcoet_soft_state_t *ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t fcoet_detach_uninit(fcoet_soft_state_t *ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void fcoet_watchdog(void *arg);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void fcoet_handle_sol_flogi(fcoet_soft_state_t *ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic stmf_data_buf_t *fcoet_dbuf_alloc(fct_local_port_t *port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t size, uint32_t *pminsize, uint32_t flags);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void fcoet_dbuf_free(fct_dbuf_store_t *fds, stmf_data_buf_t *dbuf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int fcoet_dbuf_init(fcoet_soft_state_t *ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void fcoet_dbuf_destroy(fcoet_soft_state_t *ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic uint_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_sol_oxid_hash_empty(mod_hash_key_t key, mod_hash_val_t *val, void *arg);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic uint_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_unsol_rxid_hash_empty(mod_hash_key_t key, mod_hash_val_t *val, void *arg);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Driver identificaton stuff
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic struct cb_ops fcoet_cb_ops = {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_open,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_close,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_ioctl,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nochpoll,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_prop_op,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang 0,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang D_MP | D_NEW
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang};
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic struct dev_ops fcoet_ops = {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang DEVO_REV,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang 0,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nulldev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nulldev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_attach,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_detach,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang nodev,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang &fcoet_cb_ops,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang NULL,
3b753e0506d00a3cd038199bce20003b3210a1b8Zhong Wang ddi_power,
3b753e0506d00a3cd038199bce20003b3210a1b8Zhong Wang ddi_quiesce_not_needed
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang};
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic struct modldrv modldrv = {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang &mod_driverops,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_MOD_NAME,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang &fcoet_ops,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang};
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic struct modlinkage modlinkage = {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang MODREV_1, &modldrv, NULL
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang};
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Driver's global variables
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic kmutex_t fcoet_mutex;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void *fcoet_state = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangint fcoet_use_ext_log = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic char fcoet_provider_name[] = "fcoet";
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic struct stmf_port_provider *fcoet_pp = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Common loadable module entry points _init, _fini, _info
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangint
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang_init(void)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = ddi_soft_state_init(&fcoet_state, sizeof (fcoet_soft_state_t), 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ret == 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_pp = (stmf_port_provider_t *)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_alloc(STMF_STRUCT_PORT_PROVIDER, 0, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_pp->pp_portif_rev = PORTIF_REV_1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_pp->pp_name = fcoet_provider_name;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (stmf_register_port_provider(fcoet_pp) != STMF_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_free(fcoet_pp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_soft_state_fini(&fcoet_state);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (EIO);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_init(&fcoet_mutex, 0, MUTEX_DRIVER, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = mod_install(&modlinkage);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ret) {
ef4cb712a006dbd6839858fde222aedff76e1bcbZhong Wang (void) stmf_deregister_port_provider(fcoet_pp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_free(fcoet_pp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_destroy(&fcoet_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_soft_state_fini(&fcoet_state);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("_init", "exit _init with %x", ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangint
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang_fini(void)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = mod_remove(&modlinkage);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ret == 0) {
ef4cb712a006dbd6839858fde222aedff76e1bcbZhong Wang (void) stmf_deregister_port_provider(fcoet_pp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_free(fcoet_pp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_destroy(&fcoet_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_soft_state_fini(&fcoet_state);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("_fini", "exit _fini with %x", ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangint
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang_info(struct modinfo *modinfop)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (mod_info(&modlinkage, modinfop));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Autoconfiguration entry points: attach, detach, getinfo
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret = DDI_FAILURE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int instance;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang instance = ddi_get_instance(dip);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach", "get instance %d", instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (cmd) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case DDI_ATTACH:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = ddi_soft_state_zalloc(fcoet_state, instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ret != DDI_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss = ddi_get_soft_state(fcoet_state, instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_instance = instance;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_dip = dip;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = fcoet_attach_init(ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ret != FCOE_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_soft_state_free(fcoet_state, instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = DDI_FAILURE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach", "end with-%x", ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case DDI_RESUME:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = DDI_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach", "unspported attach cmd-%x", cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret = DDI_FAILURE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int fcoe_ret;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int instance;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang instance = ddi_get_instance(dip);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss = ddi_get_soft_state(fcoet_state, instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (cmd) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case DDI_DETACH:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_ret = fcoet_detach_uninit(ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoe_ret == FCOE_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = DDI_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_detach", "fcoet_detach_uninit end with-%x",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case DDI_SUSPEND:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = DDI_SUCCESS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_detach", "unsupported detach cmd-%x", cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Device access entry points
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_open(dev_t *devp, int flag, int otype, cred_t *credp)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int instance;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (otype != OTYP_CHR) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (EINVAL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Since this is for debugging only, only allow root to issue ioctl now
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (drv_priv(credp)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (EPERM);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang instance = (int)getminor(*devp);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss = ddi_get_soft_state(fcoet_state, instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ENXIO);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_ioctl_flags & FCOET_IOCTL_FLAG_EXCL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It is already open for exclusive access.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * So shut the door on this caller.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (EBUSY);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (flag & FEXCL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_ioctl_flags & FCOET_IOCTL_FLAG_OPEN) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Exclusive operation not possible
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * as it is already opened
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (EBUSY);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_ioctl_flags |= FCOET_IOCTL_FLAG_EXCL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_ioctl_flags |= FCOET_IOCTL_FLAG_OPEN;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_close(dev_t dev, int flag, int otype, cred_t *credp)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int instance;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (otype != OTYP_CHR) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (EINVAL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang instance = (int)getminor(dev);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss = ddi_get_soft_state(fcoet_state, instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ENXIO);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((ss->ss_ioctl_flags & FCOET_IOCTL_FLAG_OPEN) == 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ENODEV);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It looks there's one hole here, maybe there could several concurrent
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * shareed open session, but we never check this case.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * But it will not hurt too much, disregard it now.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_ioctl_flags &= ~FCOET_IOCTL_FLAG_MASK;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_ioctl(dev_t dev, int cmd, intptr_t data, int mode,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cred_t *credp, int *rval)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (drv_priv(credp) != 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (EPERM);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss = ddi_get_soft_state(fcoet_state, (int32_t)getminor(dev));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ENXIO);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (cmd) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_ioctl", "ioctl-0x%02X", cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = ENOTTY;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *rval = ret;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (ret);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_attach_init(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_client_t client_fcoet;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_port_t *eport;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_local_port_t *port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_dbuf_store_t *fds;
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan char taskq_name[FCOET_TASKQ_NAME_LEN];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ret;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCoE (fcoe is fcoet's dependent driver)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * First we need register fcoet to FCoE as one client
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang client_fcoet.ect_eport_flags = EPORT_FLAG_TGT_MODE |
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang EPORT_FLAG_IS_DIRECT_P2P;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang client_fcoet.ect_max_fc_frame_size = 2136;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang client_fcoet.ect_private_frame_struct_size = sizeof (fcoet_frame_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang client_fcoet.ect_rx_frame = fcoet_rx_frame;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang client_fcoet.ect_port_event = fcoet_port_event;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang client_fcoet.ect_release_sol_frame = fcoet_release_sol_frame;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang client_fcoet.ect_client_port_struct = ss;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang client_fcoet.ect_fcoe_ver = FCOE_VER_NOW;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOET_LOG(__FUNCTION__, "version: %x %x", FCOE_VER_NOW, fcoe_ver_now);
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu ret = ddi_prop_get_int(DDI_DEV_T_ANY, ss->ss_dip,
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "mac_id", -1);
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu if (ret == -1) {
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu FCOET_LOG("fcoet_attach_init", "get mac_id failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (DDI_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu client_fcoet.ect_channelid = ret;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu FCOET_LOG("fcoet_attach_init", "channel_id is %d",
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu client_fcoet.ect_channelid);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * It's FCoE's responsiblity to initialize eport's all elements
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang eport = fcoe_register_client(&client_fcoet);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (eport == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto fail_register_client;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Now it's time to register local port to FCT
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fcoet_dbuf_init(ss) != FCOE_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto fail_init_dbuf;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fds = (fct_dbuf_store_t *)fct_alloc(FCT_STRUCT_DBUF_STORE, 0, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fds == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto fail_alloc_dbuf;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fds->fds_alloc_data_buf = fcoet_dbuf_alloc;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fds->fds_free_data_buf = fcoet_dbuf_free;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fds->fds_fca_private = (void *)ss;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port = (fct_local_port_t *)fct_alloc(FCT_STRUCT_LOCAL_PORT, 0, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (port == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto fail_alloc_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Do ss's initialization now
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) snprintf(ss->ss_alias, sizeof (ss->ss_alias), "fcoet%d",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ret = ddi_create_minor_node(ss->ss_dip, "admin",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang S_IFCHR, ss->ss_instance, DDI_NT_STMF_PP, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ret != DDI_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto fail_minor_node;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_state = FCT_STATE_OFFLINE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_state_not_acked = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_port = port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport = eport;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_SET_DEFAULT_FPORT_ADDR(eport->eport_efh_dst);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_rportid_in_dereg = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_rport_dereg_state = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_next_sol_oxid = 0xFFFF;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_next_unsol_rxid = 0xFFFF;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_oxid_hash = mod_hash_create_idhash(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "ss_sol_oxid_hash", FCOET_SOL_HASH_SIZE,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_null_valdtor);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_unsol_rxid_hash = mod_hash_create_idhash(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "ss_unsol_rxid_hash", FCOET_SOL_HASH_SIZE,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_null_valdtor);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_watch_count = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_init(&ss->ss_watch_mutex, 0, MUTEX_DRIVER, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_init(&ss->ss_watch_cv, NULL, CV_DRIVER, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_create(&ss->ss_abort_xchg_list, sizeof (fcoet_exchange_t),
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang offsetof(fcoet_exchange_t, xch_abort_node));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state = SFS_WAIT_LINKUP;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bzero(&ss->ss_link_info, sizeof (fct_link_info_t));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_ioctl_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_init(&ss->ss_ioctl_mutex, 0, MUTEX_DRIVER, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_change_state_flags = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Do port's initialization
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * port_fct_private and port_lport have been initialized by fct_alloc
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_fca_private = ss;
87dcbdbdce8044d5199e015edd8fb347d16ee0b5Kevin Yu port->port_fca_version = FCT_FCA_MODREV_1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(ss->ss_eport->eport_nodewwn, port->port_nwwn, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang bcopy(ss->ss_eport->eport_portwwn, port->port_pwwn, 8);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_default_alias = ss->ss_alias;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_sym_node_name = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_sym_port_name = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_pp = fcoet_pp;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_hard_address = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_max_logins = FCOET_MAX_LOGINS;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_max_xchges = FCOET_MAX_XCHGES;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_fca_fcp_cmd_size = sizeof (fcoet_exchange_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_fca_rp_private_size = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_fca_sol_els_private_size = sizeof (fcoet_exchange_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_fca_sol_ct_private_size = sizeof (fcoet_exchange_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_fca_abort_timeout = 5 * 1000; /* 5 seconds */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_fds = fds;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_get_link_info = fcoet_get_link_info;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_register_remote_port = fcoet_register_remote_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_deregister_remote_port = fcoet_deregister_remote_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_send_cmd = fcoet_send_cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_xfer_scsi_data = fcoet_xfer_scsi_data;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_send_cmd_response = fcoet_send_cmd_response;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_abort_cmd = fcoet_abort_cmd;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_ctl = fcoet_ctl;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_flogi_xchg = fcoet_do_flogi;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang port->port_populate_hba_details = fcoet_populate_hba_fru_details;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fct_register_local_port(port) != FCT_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto fail_register_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Start watchdog thread
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan (void) snprintf(taskq_name, sizeof (taskq_name),
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan "stmf_fct_fcoet_%d_taskq", ss->ss_instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((ss->ss_watchdog_taskq = ddi_taskq_create(NULL,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang taskq_name, 2, TASKQ_DEFAULTPRI, 0)) == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto fail_create_taskq;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_and_32(&ss->ss_flags, ~SS_FLAG_TERMINATE_WATCHDOG);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (void) ddi_taskq_dispatch(ss->ss_watchdog_taskq,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_watchdog, ss, DDI_SLEEP);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang while ((ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) == 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang delay(10);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_report_dev(ss->ss_dip);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (DDI_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfail_create_taskq:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&ss->ss_flags, SS_FLAG_TERMINATE_WATCHDOG);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_broadcast(&ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang while (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang delay(10);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_taskq_destroy(ss->ss_watchdog_taskq);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach_init", "fail_register_port");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfail_register_port:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_destroy(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_destroy(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_destroy(&ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_destroy_hash(ss->ss_sol_oxid_hash);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_destroy_hash(ss->ss_unsol_rxid_hash);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_destroy(&ss->ss_abort_xchg_list);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach_init", "fail_create_taskq");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfail_minor_node:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(port);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach_init", "fail_minor_node");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfail_alloc_port:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(fds);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach_init", "fail_alloc_port");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfail_alloc_dbuf:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_dbuf_destroy(ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach_init", "fail_alloc_dbuf");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfail_init_dbuf:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_deregister_client(ss->ss_eport);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach_init", "fail_init_dbuf");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfail_register_client:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_attach_init", "fail_register_client");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (DDI_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic fct_status_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_detach_uninit(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((ss->ss_state != FCT_STATE_OFFLINE) ||
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_state_not_acked) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Avoid modunload before running fcinfo remove-target-port
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_eport != NULL &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_flags & EPORT_FLAG_MAC_IN_USE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_port == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_oxid_hash_empty = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_unsol_rxid_hash_empty = 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_walk(ss->ss_sol_oxid_hash, fcoet_sol_oxid_hash_empty, ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_walk(ss->ss_unsol_rxid_hash, fcoet_unsol_rxid_hash_empty, ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((!ss->ss_sol_oxid_hash_empty) || (!ss->ss_unsol_rxid_hash_empty)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We need offline the port manually, before we want to detach it
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * or it will not succeed.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (fct_deregister_local_port(ss->ss_port) != FCT_SUCCESS) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_detach_uninit",
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang "fct_deregister_local_port failed");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_FAILURE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Stop watchdog
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&ss->ss_flags, SS_FLAG_TERMINATE_WATCHDOG);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_broadcast(&ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang while (ss->ss_flags & SS_FLAG_WATCHDOG_RUNNING) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang delay(10);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_taskq_destroy(ss->ss_watchdog_taskq);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Release all resources
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_destroy(&ss->ss_ioctl_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_destroy(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang cv_destroy(&ss->ss_watch_cv);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_destroy_hash(ss->ss_sol_oxid_hash);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mod_hash_destroy_hash(ss->ss_unsol_rxid_hash);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_destroy(&ss->ss_abort_xchg_list);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(ss->ss_port->port_fds);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(ss->ss_port);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_port = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_dbuf_destroy(ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_eport != NULL &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_deregister_client != NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_deregister_client(ss->ss_eport);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_soft_state_free(fcoet_state, ss->ss_instance);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_watchdog(void *arg)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss = (fcoet_soft_state_t *)arg;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang clock_t tmp_delay = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xchg, *xchg_next;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_watchdog", "fcoet_soft_state is %p", ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&ss->ss_flags, SS_FLAG_WATCHDOG_RUNNING);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang tmp_delay = STMF_SEC2TICK(1)/2;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang while ((ss->ss_flags & SS_FLAG_TERMINATE_WATCHDOG) == 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_watch_count++;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_sol_flogi_state != SFS_FLOGI_DONE) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_handle_sol_flogi(ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang for (xchg = list_head(&ss->ss_abort_xchg_list); xchg; ) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xchg_next = list_next(&ss->ss_abort_xchg_list, xchg);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xchg->xch_ref == 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang list_remove(&ss->ss_abort_xchg_list, xchg);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /* xchg abort done */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (xchg->xch_dbuf_num) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang kmem_free((void*)xchg->xch_dbufs,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xchg->xch_dbuf_num *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sizeof (void *));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xchg->xch_dbufs = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xchg->xch_dbuf_num = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_cmd_fca_aborted(xchg->xch_cmd,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCT_ABORT_SUCCESS, FCT_IOF_FCA_DONE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_enter(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang xchg = xchg_next;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_or_32(&ss->ss_flags, SS_FLAG_DOG_WAITING);
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni (void) cv_reltimedwait(&ss->ss_watch_cv, &ss->ss_watch_mutex,
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni (clock_t)tmp_delay, TR_CLOCK_TICK);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_and_32(&ss->ss_flags, ~SS_FLAG_DOG_WAITING);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Ensure no ongoing FLOGI, before terminate the watchdog
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_sol_flogi) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_clear_sol_exchange(ss->ss_sol_flogi);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(ss->ss_sol_flogi->xch_cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang atomic_and_32(&ss->ss_flags, ~SS_FLAG_WATCHDOG_RUNNING);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang mutex_exit(&ss->ss_watch_mutex);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_handle_sol_flogi(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang clock_t twosec = STMF_SEC2TICK(2);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangcheck_state_again:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_flags & SS_FLAG_PORT_DISABLED) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state = SFS_WAIT_LINKUP;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang switch (ss->ss_sol_flogi_state) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case SFS_WAIT_LINKUP:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_sol_flogi) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_sol_flogi->xch_ref == 0) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_clear_sol_exchange(ss->ss_sol_flogi);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(ss->ss_sol_flogi->xch_cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case SFS_FLOGI_INIT:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_sol_flogi) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * wait for the response to finish
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state = SFS_CLEAR_FLOGI;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_send_sol_flogi(ss);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state++;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case SFS_FLOGI_CHECK_TIMEOUT:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if ((ss->ss_sol_flogi->xch_start_time + twosec) <
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ddi_get_lbolt()) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state++;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case SFS_ABTS_INIT:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_send_sol_abts(ss->ss_sol_flogi);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state++;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case SFS_CLEAR_FLOGI:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_sol_flogi) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (ss->ss_sol_flogi->xch_ref) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_clear_sol_exchange(ss->ss_sol_flogi);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(ss->ss_sol_flogi->xch_cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state = SFS_FLOGI_INIT;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto check_state_again;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case SFS_FLOGI_ACC:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi_state++;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang goto check_state_again;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang case SFS_FLOGI_DONE:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (!(ss->ss_flags & SS_FLAG_PORT_DISABLED) &&
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_clear_sol_exchange(ss->ss_sol_flogi);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_free(ss->ss_sol_flogi->xch_cmd);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_flogi = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We'd better to offline it first, and delay 0.1 seconds,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * before we say it's on again.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_handle_event(ss->ss_port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCT_EVENT_LINK_DOWN, 0, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang delay(STMF_SEC2TICK(1)/10);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fct_handle_event(ss->ss_port,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCT_EVENT_LINK_UP, 0, NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang default:
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang break;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic int
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_dbuf_init(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (FCOE_SUCCESS);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_dbuf_destroy(fcoet_soft_state_t *ss)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic stmf_data_buf_t *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_dbuf_alloc(fct_local_port_t *port, uint32_t size, uint32_t *pminsize,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t flags)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_data_buf_t *dbuf;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int add_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int sge_num;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int sge_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int idx;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int ii;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *netb;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *fc_buf;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (fcoet_soft_state_t *)port->port_fca_private;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (size > FCOET_MAX_DBUF_LEN) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (*pminsize > FCOET_MAX_DBUF_LEN) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang size = FCOET_MAX_DBUF_LEN;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_num = (size - 1) / ss->ss_fcp_data_payload_size + 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang add_size = (sge_num - 1) * sizeof (struct stmf_sglist_ent) +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_num * sizeof (mblk_t *);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf = stmf_alloc(STMF_STRUCT_DATA_BUF, add_size, 0);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (dbuf == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_buf_size = size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_data_size = size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_sglist_length = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_flags |= DB_DONT_REUSE;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_SET_SEG_NUM(dbuf, sge_num);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Initialize non-last sg entries
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang for (idx = 0; idx < sge_num - 1; idx++) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_size = ss->ss_fcp_data_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang netb = ss->ss_eport->eport_alloc_netb(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport, sizeof (fcoe_fc_frame_header_t) +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_size, &fc_buf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (netb == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang for (ii = 0; ii < idx; ii++) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_free_netb(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_GET_NETB(dbuf, ii));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_free(dbuf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoe_dbuf_alloc", "no netb");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_SET_NETB(dbuf, idx, netb);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_sglist[idx].seg_addr = fc_buf +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sizeof (fcoe_fc_frame_header_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_sglist[idx].seg_length = sge_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Initialize the last sg entry
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (size % ss->ss_fcp_data_payload_size) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_size = P2ROUNDUP(size % ss->ss_fcp_data_payload_size, 4);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang } else {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_size = ss->ss_fcp_data_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang netb = ss->ss_eport->eport_alloc_netb(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sizeof (fcoe_fc_frame_header_t) +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sge_size, &fc_buf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (netb == NULL) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang for (ii = 0; ii < idx; ii++) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_free_netb(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_GET_NETB(dbuf, ii));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_free(dbuf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoe_dbuf_alloc", "no netb");
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_SET_NETB(dbuf, idx, netb);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_sglist[idx].seg_addr = fc_buf +
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang sizeof (fcoe_fc_frame_header_t);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_sglist[idx].seg_length = sge_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Let COMSTAR know how many sg entries we will use
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang dbuf->db_sglist_length = idx + 1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (dbuf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic void
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_dbuf_free(fct_dbuf_store_t *fds, stmf_data_buf_t *dbuf)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int idx;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss =
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (fcoet_soft_state_t *)fds->fds_fca_private;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang for (idx = 0; idx < FCOET_GET_SEG_NUM(dbuf); idx++) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang if (FCOET_GET_NETB(dbuf, idx)) {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_eport->eport_free_netb(
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_GET_NETB(dbuf, idx));
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang stmf_free(dbuf);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * We should have initialized fcoe_frame_t before
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_init_tfm(fcoe_frame_t *frm, fcoet_exchange_t *xch)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_fcoe_frame = frm;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_xch = xch;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FRM2TFM(frm)->tfm_seq = NULL;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic uint_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_sol_oxid_hash_empty(mod_hash_key_t key, mod_hash_val_t *val, void *arg)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss = (fcoet_soft_state_t *)arg;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_oxid_hash_empty = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_sol_oxid_hash_empty", "one ongoing xch: %p", val);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (MH_WALK_CONTINUE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstatic uint_t
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_unsol_rxid_hash_empty(mod_hash_key_t key, mod_hash_val_t *val, void *arg)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_soft_state_t *ss = (fcoet_soft_state_t *)arg;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ss->ss_sol_oxid_hash_empty = 0;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_LOG("fcoet_unsol_rxid_hash_empty", "one ongoing xch: %p", val);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang return (MH_WALK_CONTINUE);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/* ARGSUSED */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangvoid
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangfcoet_modhash_find_cb(mod_hash_key_t key, mod_hash_val_t val)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang{
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ASSERT(val != NULL);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoet_exchange_t *xch = (fcoet_exchange_t *)val;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOET_BUSY_XCHG(xch);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}