fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * CDDL HEADER START
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * The contents of this file are subject to the terms of the
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Common Development and Distribution License (the "License").
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * You may not use this file except in compliance with the License.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * You can obtain a copy of the license at
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * http://www.opensource.org/licenses/cddl1.txt.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * See the License for the specific language governing permissions
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * and limitations under the License.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * When distributing Covered Code, include this CDDL HEADER in each
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * If applicable, add the following below this CDDL HEADER, with the
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner]
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * CDDL HEADER END
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Use is subject to license terms.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#include <emlxs.h>
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef SFCT_SUPPORT
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn ForteEMLXS_MSG_DEF(EMLXS_FCT_C);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_fct_memseg_init(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t emlxs_fct_cmd_acquire(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd_t *fct_cmd, uint16_t fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t emlxs_fct_cmd_accept(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd_t *fct_cmd, uint16_t fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_fct_cmd_release(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t fct_state);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic emlxs_buf_t *emlxs_fct_cmd_init(emlxs_port_t *port,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore fct_cmd_t *fct_cmd, uint16_t fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_fct_cmd_done(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_fct_cmd_post(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t fct_state);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t emlxs_fct_flogi_xchg(struct fct_local_port *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte struct fct_flogi_xchg *fx);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_get_link_info(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_link_info_t *link);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_deregister_remote_port(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_remote_port_t *port_handle);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_send_cmd(fct_cmd_t *fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_send_fcp_data(fct_cmd_t *fct_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte stmf_data_buf_t *dbuf, uint32_t ioflags);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic fct_status_t emlxs_fct_send_cmd_rsp(fct_cmd_t *fct_cmd, uint32_t flags);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic fct_status_t emlxs_fct_abort(fct_local_port_t *fct_port,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd_t *cmd, uint32_t flags);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void emlxs_fct_ctl(fct_local_port_t *fct_port, int cmd, void *arg);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_register_remote_port(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_remote_port_t *port_handle, fct_cmd_t *plogi);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_send_els_cmd(fct_cmd_t *fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_send_ct_cmd(fct_cmd_t *fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_send_fcp_status(fct_cmd_t *fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_send_els_rsp(fct_cmd_t *fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void emlxs_fct_pkt_comp(fc_packet_t *pkt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_fct_populate_hba_details(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port_attrs_t *port_attrs);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t emlxs_fct_port_info(uint32_t cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_local_port_t *fct_port, void *arg, uint8_t *buffer, uint32_t *size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_dmem_init(emlxs_port_t *port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void emlxs_fct_dmem_fini(emlxs_port_t *port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic stmf_data_buf_t *emlxs_fct_dbuf_alloc(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t size, uint32_t *pminsize, uint32_t flags);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void emlxs_fct_dbuf_free(fct_dbuf_store_t *fds, stmf_data_buf_t *dbuf);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathanstatic int emlxs_fct_dbuf_dma_sync(emlxs_hba_t *hba, stmf_data_buf_t *dbuf,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan uint_t sync_type);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic emlxs_buf_t *emlxs_fct_pkt_init(emlxs_port_t *port,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd_t *fct_cmd, fc_packet_t *pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_fct_unsol_flush_thread(emlxs_hba_t *hba, void *arg1,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld void *arg2);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void emlxs_fct_unsol_flush(emlxs_port_t *port);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_fct_process_unsol_flogi(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp, IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_fct_process_unsol_plogi(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp, IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathanstatic uint32_t emlxs_fct_pkt_abort_txq(emlxs_port_t *port,
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_buf_t *cmd_sbp);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_send_qfull_reply(emlxs_port_t *port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_node_t *ndlp, uint16_t xid, uint32_t class, emlxs_fcp_cmd_t *fcp_cmd);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_IO_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanuint8_t *emlxs_iotrace = 0; /* global for mdb */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanint emlxs_iotrace_cnt = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * FCT_CMD (cmd_sbp->fct_state)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * STATE LOCK STATUS OWNER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * -----------------------------------------------------------------------------
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_ABORT_DONE Lock Destroyed COMSTAR
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_IO_DONE Lock Destroyed COMSTAR
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_CMD_POSTED Lock Released COMSTAR
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_OWNED Lock Released COMSTAR
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_CMD_WAITQ Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_RSP_PENDING Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_REQ_PENDING Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_REG_PENDING Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_DATA_PENDING Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_STATUS_PENDING Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_CLOSE_PENDING Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_ABORT_PENDING Lock Released DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_FCP_CMD_RECEIVED Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_ELS_CMD_RECEIVED Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_SEND_CMD_RSP Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_SEND_ELS_RSP Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_SEND_ELS_REQ Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_SEND_CT_REQ Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_REG_COMPLETE Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_SEND_FCP_DATA Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_SEND_FCP_STATUS Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_PKT_COMPLETE Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_PKT_FCPRSP_COMPLETE Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_PKT_ELSRSP_COMPLETE Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_PKT_ELSCMD_COMPLETE Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_PKT_CTCMD_COMPLETE Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_REQ_COMPLETE Transistional, lock held DRIVER
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * COMSTAR OWNED DRIVER OWNED
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * ------------- ---------------------------------------------------
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * ------- > @ Accept---- >Release @ Acquire--- >+
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * |
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * < ------- @ Post/Done< ----Acquire @ Release< ---+
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * @ :Indicates COMSTAR use of emlxs_fct_abort()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Abort requests set the EMLXS_FCT_ABORT_INP flag.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Accept :Indicates use of emlxs_fct_cmd_accept()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Acquire :Indicates use of emlxs_fct_cmd_acquire()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Post :Indicates use of emlxs_fct_cmd_post()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Done :Indicates use of emlxs_fct_cmd_done()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanvoid
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_io_trace(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint32_t data)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan{
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_iotrace_t *iop = port->iotrace;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint16_t iotrace_cnt;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint16_t iotrace_index;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int i;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!iop) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_enter(&port->iotrace_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iotrace_cnt = port->iotrace_cnt;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iotrace_index = port->iotrace_index;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan switch (data) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New entry */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_ELS_CMD_RECEIVED:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_FCP_CMD_RECEIVED:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_SEND_ELS_REQ:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_SEND_CT_REQ:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < iotrace_cnt; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((iop->fct_cmd == fct_cmd) &&
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (iop->trc[0] != (uint8_t)(0)))
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan break;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (i < iotrace_cnt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New entry already exists */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&port->iotrace_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: New entry already exists: fct_cmd: %p",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop = port->iotrace + iotrace_index;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < iotrace_cnt; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (iop->trc[0] == (uint8_t)(0))
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan break;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (iop == (port->iotrace + iotrace_cnt))
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop = port->iotrace;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (i >= iotrace_cnt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* No new slots available */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&port->iotrace_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: No new slots: fct_cmd: %p data: %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd, data);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port->iotrace_index++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (port->iotrace_index >= iotrace_cnt)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port->iotrace_index = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bzero((uint8_t *)iop, sizeof (emlxs_iotrace_t));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->fct_cmd = fct_cmd;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->xri = fct_cmd->cmd_rxid;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->marker = 0xff;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->trc[0] = 2;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->trc[1] = data;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&port->iotrace_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < iotrace_cnt; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((iop->fct_cmd == fct_cmd) &&
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (iop->trc[0] != (uint8_t)(0)))
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan break;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (i >= iotrace_cnt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Cannot find existing slot for fct_cmd */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&port->iotrace_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((data != EMLXS_FCT_REG_PENDING) &&
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (data != EMLXS_FCT_REG_COMPLETE)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: Missing slot: fct_cmd: %p data: %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd, data);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (iop->trc[0] >= MAX_IO_TRACE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* trc overrun for fct_cmd */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&port->iotrace_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: trc overrun slot: fct_cmd: %p data: %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd, data);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (iop->xri != fct_cmd->cmd_rxid) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* xri mismatch for fct_cmd */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&port->iotrace_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: xri mismatch %x != %x: fct_cmd: %p data: %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->xri, fct_cmd->cmd_rxid, fct_cmd, data);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->trc[iop->trc[0]] = data;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((data == EMLXS_FCT_IO_DONE) || (data == EMLXS_FCT_ABORT_DONE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* IOCB ULPCOMMAND is saved after EMLXS_FCT_IOCB_ISSUED */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iop->trc[iop->trc[0]-1] == EMLXS_FCT_IOCB_ISSUED) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->trc[0]++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->trc[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iop->trc[0]++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&port->iotrace_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_io_trace() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_IO_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef MODSYM_SUPPORT
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e51761e09da808a4941f77a1197220eb1d664423Sukumar Swaminathanextern int
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_modopen()
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte int err;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&emlxs_device.lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_modsym.fct_modopen) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&emlxs_device.lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_modsym.fct_modopen++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Comstar (fct) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.mod_fct = ddi_modopen("drv/fct", KRTLD_MODE_FIRST, &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!emlxs_modsym.mod_fct) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN, "?%s: ddi_modopen drv/fct failed: err %d",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME, err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Comstar (stmf) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.mod_stmf =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ddi_modopen("drv/stmf", KRTLD_MODE_FIRST, &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!emlxs_modsym.mod_stmf) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN, "?%s: ddi_modopen drv/stmf failed: err %d",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME, err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_alloc is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_alloc = (void *(*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_alloc", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_alloc == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_alloc not present", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_free is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_free = (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_free", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_free == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_free not present", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_scsi_task_alloc is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_scsi_task_alloc =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void *(*)(void *, uint16_t, uint32_t, uint8_t *,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint16_t, uint16_t))ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_scsi_task_alloc", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_scsi_task_alloc == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_scsi_task_alloc not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_register_local_port is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_register_local_port =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (int (*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_register_local_port", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_register_local_port == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_register_local_port not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_deregister_local_port is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_deregister_local_port =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_deregister_local_port", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_deregister_local_port == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_deregister_local_port not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_handle_event is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_handle_event =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct, "fct_handle_event",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_handle_event == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_handle_event not present",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_post_rcvd_cmd is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_post_rcvd_cmd =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct, "fct_post_rcvd_cmd",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_post_rcvd_cmd == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_post_rcvd_cmd not present",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_alloc is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_ctl = (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_ctl", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_ctl == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_ctl not present", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check if the fct fct_queue_cmd_for_termination is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_queue_cmd_for_termination =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_queue_cmd_for_termination", &err);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((void *)emlxs_modsym.fct_queue_cmd_for_termination == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmn_err(CE_WARN,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_queue_cmd_for_termination not present",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan goto failed;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_send_response_done is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_send_response_done =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_send_response_done", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_send_response_done == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_send_response_done not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_send_cmd_done is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_send_cmd_done =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct, "fct_send_cmd_done",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_send_cmd_done == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_send_cmd_done not present",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_scsi_xfer_data_done is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_scsi_data_xfer_done =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_scsi_data_xfer_done", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_scsi_data_xfer_done == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_scsi_data_xfer_done not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_port_shutdown is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_port_shutdown =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_status_t(*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_port_shutdown", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_port_shutdown == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_port_shutdown not present",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_port_initialize is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_port_initialize =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_status_t(*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_port_initialize", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_port_initialize == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_port_initialize not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan err = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check if the fct fct_cmd_fca_aborted is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_cmd_fca_aborted =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_cmd_fca_aborted", &err);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((void *)emlxs_modsym.fct_cmd_fca_aborted == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmn_err(CE_WARN,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_cmd_fca_aborted not present",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan goto failed;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_handle_rcvd_flogi is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_handle_rcvd_flogi =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_status_t(*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_handle_rcvd_flogi", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_handle_rcvd_flogi == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_handle_rcvd_flogi not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Comstar (stmf) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the stmf stmf_alloc is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.stmf_alloc =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void *(*)())ddi_modsym(emlxs_modsym.mod_stmf, "stmf_alloc",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.stmf_alloc == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/stmf: stmf_alloc not present", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the stmf stmf_free is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.stmf_free = (void (*)())ddi_modsym(emlxs_modsym.mod_stmf,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_free", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.stmf_free == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/stmf: stmf_free not present", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the stmf stmf_deregister_port_provider is present */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.stmf_deregister_port_provider =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_stmf,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_deregister_port_provider", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.stmf_deregister_port_provider == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/stmf: stmf_deregister_port_provider not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte err = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the stmf stmf_register_port_provider is present */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.stmf_register_port_provider =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (int (*)())ddi_modsym(emlxs_modsym.mod_stmf,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_register_port_provider", &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.stmf_register_port_provider == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/stmf: stmf_register_port_provider not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&emlxs_device.lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortefailed:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&emlxs_device.lock);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_modclose();
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_modopen() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_modclose()
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&emlxs_device.lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_modsym.fct_modopen == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&emlxs_device.lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_modsym.fct_modopen--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_modsym.fct_modopen) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&emlxs_device.lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_modsym.mod_fct) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) ddi_modclose(emlxs_modsym.mod_fct);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.mod_fct = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_modsym.mod_stmf) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) ddi_modclose(emlxs_modsym.mod_stmf);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.mod_stmf = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_alloc = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_free = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_scsi_task_alloc = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_register_local_port = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_deregister_local_port = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_handle_event = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_ctl = NULL;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_queue_cmd_for_termination = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_send_response_done = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_send_cmd_done = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_scsi_data_xfer_done = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_port_shutdown = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_port_initialize = NULL;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_cmd_fca_aborted = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.fct_handle_rcvd_flogi = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.stmf_alloc = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.stmf_free = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.stmf_deregister_port_provider = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.stmf_register_port_provider = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&emlxs_device.lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_modclose() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* MODSYM_SUPPORT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan/*
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan * This routine is called to handle an unsol FLOGI exchange
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan * fx save
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan * 0 1 Process or save port->fx
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan * 0 0 Process or reject port->fx
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan * 1 1 Process port->fx, Process or save fx
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan * 1 0 Process or reject port->fx, Process or reject fx
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic void
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathanemlxs_fct_handle_unsol_flogi(emlxs_port_t *port, fct_flogi_xchg_t *fx,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan uint32_t save)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan{
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_hba_t *hba = HBA;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_status_t status;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan IOCBQ iocbq;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fct_flogi_xchg_t fxchg;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathanbegin:
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if there is an old saved FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (port->fx.fx_op) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Get it now */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bcopy(&port->fx, &fxchg, sizeof (fct_flogi_xchg_t));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (fx) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Save new FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bcopy(fx, &port->fx, sizeof (fct_flogi_xchg_t));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Reject old stale FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx = &fxchg;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan goto reject_it;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan } else {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bzero(&port->fx, sizeof (fct_flogi_xchg_t));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx = &fxchg;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan }
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan } else if (!fx) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Nothing to do, just return */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan return;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan }
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* We have a valid FLOGI here */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* There is no saved FLOGI at this point either */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if COMSTAR is ready to accept it */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (port->fct_flags & FCT_STATE_LINK_UP_ACKED) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bzero((uint8_t *)&iocbq, sizeof (IOCBQ));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.un.elsreq.remoteID = fx->fx_sid;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.un.elsreq.myID = fx->fx_did;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.ULPCONTEXT = (uint16_t)fx->rsvd2;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx->rsvd2 = 0; /* Clear the reserved field now */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan status = MODSYM(fct_handle_rcvd_flogi) (port->fct_port, fx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_API_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "fct_handle_rcvd_flogi %p: status=%x",
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_port, status);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (status == FCT_SUCCESS) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (fx->fx_op == ELS_OP_ACC) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_els_reply(port, &iocbq,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ELS_CMD_ACC, ELS_CMD_FLOGI, 0, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan } else { /* ELS_OP_LSRJT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_els_reply(port, &iocbq,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan ELS_CMD_LS_RJT, ELS_CMD_FLOGI,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx->fx_rjt_reason, fx->fx_rjt_expl);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } else {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "FLOGI: sid=%x xid=%x. "
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "fct_handle_rcvd_flogi failed. Rejecting.",
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx->fx_sid, iocbq.iocb.ULPCONTEXT);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan (void) emlxs_els_reply(port, &iocbq,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan ELS_CMD_LS_RJT, ELS_CMD_FLOGI,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (save) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Save FLOGI for later */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bcopy(fx, &port->fx, sizeof (fct_flogi_xchg_t));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathanreject_it:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (port->fct_flags & FCT_STATE_LINK_UP) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "FLOGI: sid=%x xid=%x. Stale. Rejecting.",
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx->fx_sid, fx->rsvd2);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bzero((uint8_t *)&iocbq, sizeof (IOCBQ));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.un.elsreq.remoteID = fx->fx_sid;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.un.elsreq.myID = fx->fx_did;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.ULPCONTEXT = fx->rsvd2;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan (void) emlxs_els_reply(port, &iocbq,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan ELS_CMD_LS_RJT, ELS_CMD_FLOGI,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* If we have an FLOGI saved, try sending it now */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (port->fx.fx_op) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx = NULL;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan goto begin;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan } else {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "FLOGI: sid=%x xid=%x. Link down. "
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "Dropping.",
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx->fx_sid, fx->rsvd2);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan} /* emlxs_fct_handle_unsol_flogi() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* ARGSUSED */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_unsol_flush_thread(emlxs_hba_t *hba, void *arg1, void *arg2)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = (emlxs_port_t *)arg1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_fct_unsol_flush(port);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_unsol_flush_thread() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* This is called at port online and offline */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_unsol_flush(emlxs_port_t *port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd_t *fct_cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan uint32_t cmd_code;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!port->fct_port) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* First handle any pending FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_handle_unsol_flogi(port, NULL, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((port->fct_flags & FCT_STATE_LINK_UP_ACKED) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(port->fct_flags & FCT_STATE_FLOGI_CMPL)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Wait queue */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_enter(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = port->fct_wait_head;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_wait_head = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_wait_tail = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /*
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * Next process any outstanding ELS commands. It doesn't
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * matter if the Link is up or not, always post them to FCT.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (cmd_sbp) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte next = cmd_sbp->next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd = cmd_sbp->fct_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan cmd_code = (fct_cmd->cmd_oxid << ELS_CMD_SHIFT);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_unsol_flush: %s: sid=%x xid=%x "
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "Unable to reacquire fct_cmd.",
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_elscmd_xlate(cmd_code),
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fct_cmd->cmd_rxid, fct_cmd->cmd_rportid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan continue;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Posting %s: sid=%x xid=%x %p",
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_elscmd_xlate(cmd_code),
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fct_cmd->cmd_rportid, fct_cmd->cmd_rxid,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_post_rcvd_cmd:2 %p:%p portid x%x", fct_cmd, cmd_sbp,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd->cmd_lportid);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_post_rcvd_cmd) (fct_cmd, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } /* while () */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_unsol_flush() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteint
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_is_digit(uint8_t chr)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((chr >= '0') && (chr <= '9')) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_is_digit */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/*
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Convert an ASCII decimal numeric string to integer.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Negation character '-' is not handled.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_str_atoi(uint8_t *string)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t num = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte int i = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (string[i]) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!emlxs_is_digit(string[i])) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (num);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte num = num * 10 + (string[i++] - '0');
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (num);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_str_atoi() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_init(emlxs_hba_t *hba)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = &PPORT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if COMSTAR is present */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (((void *)MODSYM(stmf_alloc) == NULL) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ((void *)MODSYM(fct_alloc) == NULL)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_attach_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Comstar not present.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_init() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_attach(emlxs_hba_t *hba)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = &PPORT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t vpi;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->flag & EMLXS_TGT_ENABLED)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Bind the physical port */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_bind_port(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Bind virtual ports */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (hba->flag & FC_NPIV_ENABLED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (vpi = 1; vpi <= hba->vpi_high; vpi++) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port = &VPORT(vpi);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->flag & EMLXS_PORT_ENABLED)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte continue;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_bind_port(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_attach() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_detach(emlxs_hba_t *hba)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t i;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *vport;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < MAX_VPORTS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vport = &VPORT(i);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(vport->flag & EMLXS_PORT_ENABLED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_fct_unbind_port(vport);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_IO_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_destroy(&port->iotrace_mtx);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->iotrace) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld kmem_free(port->iotrace,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (port->iotrace_cnt * sizeof (emlxs_iotrace_t)));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->iotrace = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld}
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_IO_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_detach() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_unbind_port(emlxs_port_t *port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte char node_name[32];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->flag & EMLXS_TGT_BOUND)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_unbind_port: port=%d", port->vpi);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Destroy & flush all port nodes, if they exist */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->node_count) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) EMLXS_SLI_UNREG_NODE(port, NULL, NULL, NULL, NULL);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->flag &= ~EMLXS_TGT_BOUND;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->flag &= ~EMLXS_TGT_ENABLED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte hba->num_of_ports--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->fct_port) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_link_down(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_unsol_flush(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_deregister_local_port %p", port->fct_port);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_deregister_local_port) (port->fct_port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->fct_port->port_fds) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_free:3 %p", port->fct_port->port_fds);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_free) (port->fct_port->port_fds);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_port->port_fds = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_free:4 %p", port->fct_port);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_free) (port->fct_port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_port = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->port_provider) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "stmf_deregister_port_provider:1 %p",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_deregister_port_provider) (port->port_provider);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_free:1 %p", port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_free) (port->port_provider);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->port_provider = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->fct_memseg) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_dmem_fini(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(node_name, sizeof (node_name), "%d,%d:SFCT",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->ddiinst, port->vpi);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) ddi_remove_minor_node(hba->dip, node_name);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_unbind_port() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_bind_port(emlxs_port_t *port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_local_port_t *fct_port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t flag = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_config_t *cfg = &CFG;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_dbuf_store_t *fds;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte char node_name[32];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *bptr;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->flag & EMLXS_TGT_ENABLED)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->flag & EMLXS_TGT_BOUND) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: port=%d", port->vpi);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Perform generic port initialization */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_init(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->vpi == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port->cfd_name, sizeof (port->cfd_name),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s%d", DRIVER_NAME, hba->ddiinst);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port->cfd_name, sizeof (port->cfd_name),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s%d.%d", DRIVER_NAME, hba->ddiinst, port->vpi);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_fct_dmem_init(port) != FCT_SUCCESS) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate fct memory.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte flag |= 0x00000001;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port->port_provider =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (stmf_port_provider_t *)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_alloc) (STMF_STRUCT_PORT_PROVIDER, 0, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_alloc port_provider %p", port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->port_provider == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate port provider.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte flag |= 0x00000002;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->port_provider->pp_portif_rev = PORTIF_REV_1;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->port_provider->pp_name = port->cfd_name;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->port_provider->pp_provider_private = port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_register_port_provider %p", port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* register port provider with framework */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (MODSYM(stmf_register_port_provider) (port->port_provider) !=
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan STMF_SUCCESS) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to register port provider.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte flag |= 0x00000004;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port->fct_port =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_local_port_t *)MODSYM(fct_alloc) (FCT_STRUCT_LOCAL_PORT, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_alloc fct_port %p", port->fct_port);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->fct_port == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate fct port.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte flag |= 0x00000008;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port->fct_port->port_fds =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_dbuf_store_t *)MODSYM(fct_alloc) (FCT_STRUCT_DBUF_STORE, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_alloc port_fds %p", port->fct_port->port_fds);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->fct_port->port_fds == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate dbuf store.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte flag |= 0x00000010;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(node_name, sizeof (node_name), "%d,%d:SFCT",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->ddiinst, port->vpi);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (ddi_create_minor_node(hba->dip, node_name, S_IFCHR, hba->ddiinst,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan NULL, 0) == DDI_FAILURE) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Unable to create SFCT device node.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte flag |= 0x00000020;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Intialize */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port = port->fct_port;
162fafd3d0764eb6022fe01ce970de8775eda209allan fct_port->port_fca_version = FCT_FCA_MODREV_1;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_fca_private = port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_fca_abort_timeout = 30 * 1000; /* 30 seconds */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)&port->wwpn, (uint8_t *)fct_port->port_pwwn, 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)&port->wwnn, (uint8_t *)fct_port->port_nwwn, 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bptr = (uint8_t *)&port->wwnn;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(fct_port->port_nwwn_str, FC_WWN_BUFLEN,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%02x%02x%02x%02x%02x%02x%02x%02x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bptr[0], bptr[1], bptr[2], bptr[3],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bptr[4], bptr[5], bptr[6], bptr[7]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bptr = (uint8_t *)&port->wwpn;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(fct_port->port_pwwn_str, FC_WWN_BUFLEN,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%02x%02x%02x%02x%02x%02x%02x%02x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bptr[0], bptr[1], bptr[2], bptr[3],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bptr[4], bptr[5], bptr[6], bptr[7]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_sym_node_name = port->snn;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_sym_port_name = port->spn;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_hard_address = cfg[CFG_ASSIGN_ALPA].current;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_default_alias = port->cfd_name;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_pp = port->port_provider;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_port->port_max_logins = hba->max_nodes + EMLXS_FCT_NUM_ELS_ONLY;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan if (cfg[CFG_FCT_QDEPTH].current &&
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan (cfg[CFG_FCT_QDEPTH].current < hba->io_throttle)) {
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan fct_port->port_max_xchges = cfg[CFG_FCT_QDEPTH].current;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_max_xchges = hba->io_throttle;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_fca_fcp_cmd_size = sizeof (emlxs_buf_t);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_fca_rp_private_size = sizeof (uintptr_t);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_fca_sol_els_private_size = sizeof (emlxs_buf_t);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_fca_sol_ct_private_size = sizeof (emlxs_buf_t);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_get_link_info = emlxs_fct_get_link_info;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_register_remote_port = emlxs_fct_register_remote_port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_deregister_remote_port =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_deregister_remote_port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_send_cmd = emlxs_fct_send_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_xfer_scsi_data = emlxs_fct_send_fcp_data;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_send_cmd_response = emlxs_fct_send_cmd_rsp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_abort_cmd = emlxs_fct_abort;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_ctl = emlxs_fct_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_port->port_flogi_xchg = emlxs_fct_flogi_xchg;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_port->port_populate_hba_details = emlxs_fct_populate_hba_details;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_port->port_info = emlxs_fct_port_info;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fds = port->fct_port->port_fds;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fds->fds_fca_private = port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fds->fds_alloc_data_buf = emlxs_fct_dbuf_alloc;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fds->fds_free_data_buf = emlxs_fct_dbuf_free;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Scatter gather list support */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* fds->fds_setup_dbuf = ; */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* fds->fds_teardown_dbuf = ; */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* fds->fds_max_sgl_xfer_len = ; */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* fds->fds_copy_threshold = ; */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_register_local_port %p", fct_port);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* register this local port with the fct module */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (MODSYM(fct_register_local_port) (fct_port) != FCT_SUCCESS) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to register fct port.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failed;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Set the bound flag */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->flag |= EMLXS_TGT_BOUND;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte hba->num_of_ports++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortefailed:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (flag & 0x20) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) ddi_remove_minor_node(hba->dip, node_name);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (flag & 0x10) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_free:5 %p", port->fct_port->port_fds);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_free) (port->fct_port->port_fds);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_port->port_fds = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (flag & 0x8) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_free:6 %p", port->fct_port);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_free) (port->fct_port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_port = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (flag & 0x4) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "stmf_deregister_port_provider:2 %p",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_deregister_port_provider) (port->port_provider);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (flag & 0x2) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_free:2 %p", port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_free) (port->port_provider);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->port_provider = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (flag & 0x1) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_dmem_fini(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->flag &= ~EMLXS_TGT_ENABLED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Target mode disabled.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_bind_port() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_port_info(uint32_t cmd, fct_local_port_t *fct_port, void *arg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *buffer, uint32_t *size)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval = FCT_SUCCESS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_port_link_status_t *link_status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX *mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (cmd) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FC_TGT_PORT_RLS:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(buffer, *size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((*size) < sizeof (fct_port_link_status_t)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "FC_TGT_PORT_RLS: Buffer too small. %d < %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *size, sizeof (fct_port_link_status_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_FAILURE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((mbq = (MAILBOXQ *)emlxs_mem_get(hba, MEM_MBOX)) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "FC_TGT_PORT_RLS: Unable to allocate mailbox.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_ALLOC_FAILURE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb = (MAILBOX *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_read_lnk_stat(hba, mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan != MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "FC_TGT_PORT_RLS: Unable to send request.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_BUSY;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status = (fct_port_link_status_t *)buffer;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->LinkFailureCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdLnk.linkFailureCnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->LossOfSyncCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdLnk.lossSyncCnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->LossOfSignalsCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdLnk.lossSignalCnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->PrimitiveSeqProtocolErrorCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdLnk.primSeqErrCnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->InvalidTransmissionWordCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdLnk.invalidXmitWord;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->InvalidCRCCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdLnk.crcCnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_port_info: Invalid request. cmd=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_FAILURE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_port_info() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_populate_hba_details(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port_attrs_t *port_attrs)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_vpd_t *vpd = &VPD;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->manufacturer, "Emulex",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->manufacturer)-1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->serial_number, vpd->serial_num,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->serial_number)-1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->model, hba->model_info.model,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->model)-1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->model_description,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->model_info.model_desc,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->model_description)-1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port_attrs->hardware_version,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->hardware_version)-1),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%x", vpd->biuRev);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port_attrs->driver_version,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->driver_version)-1),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s (%s)", emlxs_version,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_revision);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->option_rom_version, vpd->fcode_version,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->option_rom_version)-1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port_attrs->firmware_version,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->firmware_version)-1),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s (%s)", vpd->fw_version,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte vpd->fw_label);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->driver_name, DRIVER_NAME,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (port_attrs->driver_name)-1));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port_attrs->vendor_specific_id =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((hba->model_info.device_id << 16) | PCI_VENDOR_ID_EMULEX);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan port_attrs->supported_cos = LE_SWAP32(FC_NS_CLASS3);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port_attrs->max_frame_size = FF_FRAME_SIZE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (vpd->link_speed & LMT_16GB_CAPABLE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port_attrs->supported_speed |= PORT_SPEED_16G;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (vpd->link_speed & LMT_10GB_CAPABLE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_10G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (vpd->link_speed & LMT_8GB_CAPABLE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_8G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (vpd->link_speed & LMT_4GB_CAPABLE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_4G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (vpd->link_speed & LMT_2GB_CAPABLE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_2G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (vpd->link_speed & LMT_1GB_CAPABLE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_1G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: manufacturer = %s", port_attrs->manufacturer);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: serial_num = %s", port_attrs->serial_number);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: model = %s", port_attrs->model);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: model_description = %s",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port_attrs->model_description);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: hardware_version = %s",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->hardware_version);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: driver_version = %s", port_attrs->driver_version);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: option_rom_version = %s",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port_attrs->option_rom_version);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: firmware_version = %s",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->firmware_version);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: driver_name = %s", port_attrs->driver_name);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: vendor_specific_id = 0x%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port_attrs->vendor_specific_id);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: supported_cos = 0x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_cos);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: supported_speed = 0x%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port_attrs->supported_speed);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: max_frame_size = 0x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->max_frame_size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_populate_hba_details() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_ctl(fct_local_port_t *fct_port, int cmd, void *arg)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte stmf_change_status_t st;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte st.st_completion_status = FCT_SUCCESS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte st.st_additional_info = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte switch (cmd) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_PORT_ONLINE:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* If the HBA is offline, we cannot bring the tgtport online */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (hba->flag & (FC_OFFLINE_MODE | FC_OFFLINING_MODE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte st.st_completion_status = FCT_FAILURE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_ctl) (fct_port->port_lport,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte FCT_CMD_PORT_ONLINE_COMPLETE, &st);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->fct_flags & FCT_STATE_PORT_ONLINE) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte st.st_completion_status = STMF_ALREADY;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: ONLINE chk");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE --> ONLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags |= FCT_STATE_NOT_ACKED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags |= FCT_STATE_PORT_ONLINE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((port->vpi == 0) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (port->mode == MODE_TARGET) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->state <= FC_LINK_DOWN)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Try to bring the link up */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_reset_link(hba, 1, 1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: ONLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_ctl) (fct_port->port_lport,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte FCT_CMD_PORT_ONLINE_COMPLETE, &st);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_PORT_OFFLINE:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte st.st_completion_status = STMF_ALREADY;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE chk");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: ONLINE --> OFFLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Take link down and flush */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_link_down(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fct_unsol_flush(port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Declare this port offline now */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags |= FCT_STATE_NOT_ACKED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags &= ~FCT_STATE_PORT_ONLINE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((port->vpi == 0) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (port->mode == MODE_TARGET) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(port->flag & EMLXS_INI_ENABLED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Take link down and hold it down */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_reset_link(hba, 0, 1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_ctl) (fct_port->port_lport,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte FCT_CMD_PORT_OFFLINE_COMPLETE, &st);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_ACK_PORT_OFFLINE_COMPLETE:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags &= ~FCT_STATE_NOT_ACKED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE ack");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_ACK_PORT_ONLINE_COMPLETE:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags &= ~FCT_STATE_NOT_ACKED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: ONLINE ack");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FCT_CMD_FORCE_LIP:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->mode == MODE_INITIATOR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_ctl: FCT_CMD_FORCE_LIP.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (hba->fw_flag & FW_UPDATE_NEEDED) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_ctl: FCT_CMD_FORCE_LIP -> "
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "FCT_CMD_RESET");
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->fw_flag |= FW_UPDATE_KERNEL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Reset the adapter */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_reset(port, FC_FCA_RESET);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore } else {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_ctl: FCT_CMD_FORCE_LIP");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Reset the link */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_reset(port, FC_FCA_LINK_RESET);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_ctl() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern int
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_port_shutdown(emlxs_port_t *port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_local_port_t *fct_port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int i;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port = port->fct_port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!fct_port) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
3be114ed300cd3c74d686e19db5d0638cec49ad4Sukumar Swaminathan
3be114ed300cd3c74d686e19db5d0638cec49ad4Sukumar Swaminathan port->fct_flags |= FCT_STATE_NOT_ACKED;
3be114ed300cd3c74d686e19db5d0638cec49ad4Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg, "fct_port_shutdown");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_port_shutdown) (fct_port, STMF_RFLAG_STAY_OFFLINED,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld DRIVER_NAME" shutdown");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (port->fct_flags & FCT_STATE_NOT_ACKED) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte i++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (i > 300) { /* 30 seconds */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_port_shutdown failed to ACK");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte delay(drv_usectohz(100000)); /* 100 msec */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte}
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern int
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_port_initialize(emlxs_port_t *port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_local_port_t *fct_port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int i;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port = port->fct_port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!fct_port) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
3be114ed300cd3c74d686e19db5d0638cec49ad4Sukumar Swaminathan
3be114ed300cd3c74d686e19db5d0638cec49ad4Sukumar Swaminathan port->fct_flags |= FCT_STATE_NOT_ACKED;
3be114ed300cd3c74d686e19db5d0638cec49ad4Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_port_initialize");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_port_initialize) (fct_port, STMF_RFLAG_STAY_OFFLINED,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld DRIVER_NAME" initialize");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (port->fct_flags & FCT_STATE_NOT_ACKED) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte i++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (i > 300) { /* 30 seconds */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_port_initialize failed to ACK");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte delay(drv_usectohz(100000)); /* 100 msec */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte}
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_cmd(fct_cmd_t *fct_cmd)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port = (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd %p:%p x%x", fct_cmd,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_fca_private, fct_cmd->cmd_type);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte switch (fct_cmd->cmd_type) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_SOL_ELS:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (emlxs_fct_send_els_cmd(fct_cmd));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_SOL_CT:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (emlxs_fct_send_ct_cmd(fct_cmd));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte default:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd: Invalid cmd type found. type=%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_type);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_FAILURE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_cmd() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_cmd_rsp(fct_cmd_t *fct_cmd, uint32_t ioflags)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_buf_t *cmd_sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_status_t rval;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCB *iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t status;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port = (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_accept(port, fct_cmd, EMLXS_FCT_SEND_CMD_RSP);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_rsp: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to accept fct_cmd. type=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = &cmd_sbp->iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->sbp = cmd_sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan status = iocb->ULPSTATUS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_rsp %p:%p x%x, %x, %x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_cmd->cmd_type, iocb->ULPCT, status);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte switch (fct_cmd->cmd_type) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_FCP_XCHG:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (ioflags & FCT_IOF_FORCE_FCA_DONE) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failure;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((iocb->ULPCT == 0x1) && (status == 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Firmware already sent out resp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_SEND_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld TGTPORTSTAT.FctOutstandingIO--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FCT_API_TRACE
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "fct_send_response_done:4 %p: x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_cmd->cmd_comp_status);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MODSYM(fct_send_response_done) (fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_comp_status, FCT_IOF_FCA_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan rval = emlxs_fct_send_fcp_status(fct_cmd);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rval == FCT_NOT_FOUND) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failure;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_RCVD_ELS:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (ioflags & FCT_IOF_FORCE_FCA_DONE) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto failure;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_send_els_rsp(fct_cmd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte default:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (ioflags & FCT_IOF_FORCE_FCA_DONE) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_handle = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_rsp: Invalid cmd type found. type=%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_type);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_FAILURE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortefailure:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_rsp: "
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to handle FCT_IOF_FORCE_FCA_DONE. type=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd->cmd_type);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_FAILURE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_cmd_rsp() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_flogi_xchg(struct fct_local_port *fct_port, struct fct_flogi_xchg *fx)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_packet_t *pkt = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ELS_PKT *els;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval = FCT_SUCCESS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: Sending FLOGI: %p", fct_port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#else
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: Sending FLOGI.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (hba->state <= FC_LINK_DOWN) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. Link down.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_FAILURE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use this entry point as the link up acknowledgment */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_flags |= FCT_STATE_LINK_UP_ACKED;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up acked.");
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* First handle any pending FLOGI's */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_fct_handle_unsol_flogi(port, NULL, 0);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte size = sizeof (SERV_PARM) + 4;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, size, size, 0, KM_NOSLEEP))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable allocate packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_FAILURE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Make this a polled IO */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_flags &= ~FC_TRAN_INTR;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_flags |= FC_TRAN_NO_INTR;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_comp = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_type = FC_PKT_EXCHANGE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_timeout = fx->fx_sec_timeout;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(fx->fx_did);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.r_ctl =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan R_CTL_EXTENDED_SVC | R_CTL_SOLICITED_CONTROL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(fx->fx_sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.type = FC_TYPE_EXTENDED_LS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.f_ctl = F_CTL_FIRST_SEQ | F_CTL_SEQ_INITIATIVE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_id = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.df_ctl = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ox_id = 0xffff;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.rx_id = 0xffff;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ro = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the command */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Service paramters will be added automatically later by the driver */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte els = (ELS_PKT *)pkt->pkt_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte els->elsCode = 0x04; /* FLOGI */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to send packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_FAILURE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((pkt->pkt_state != FC_PKT_SUCCESS) &&
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (pkt->pkt_state != FC_PKT_LS_RJT)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (pkt->pkt_state == FC_PKT_TIMEOUT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_TIMEOUT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if ((pkt->pkt_state == FC_PKT_LOCAL_RJT) &&
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (pkt->pkt_reason == FC_REASON_FCAL_OPN_FAIL)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_NOT_FOUND;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = FCT_FAILURE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. state=%x reason=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "rval=%llx", pkt->pkt_state, pkt->pkt_reason, rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (pkt->pkt_state == FC_PKT_LS_RJT) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fx->fx_op = ELS_OP_LSRJT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fx->fx_rjt_reason = pkt->pkt_reason;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fx->fx_rjt_expl = pkt->pkt_expln;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else { /* FC_PKT_SUCCESS */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fx->fx_op = ELS_OP_ACC;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fx->fx_sid = FABRIC_DID;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fx->fx_did = port->did;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan els = (ELS_PKT *)pkt->pkt_resp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((caddr_t)&els->un.logi.nodeName,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (caddr_t)fx->fx_nwwn, 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((caddr_t)&els->un.logi.portName,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (caddr_t)fx->fx_pwwn, 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fx->fx_fport = els->un.logi.cmn.fPort;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathandone:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_pkt_free(pkt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rval == FCT_SUCCESS) || (rval == FCT_NOT_FOUND)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FCT_STATE_FLOGI_CMPL. rval=%s",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((rval == FCT_SUCCESS)? "FCT_SUCCESS":"FCT_NOT_FOUND"));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_flags |= FCT_STATE_FLOGI_CMPL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Flush all unsolicited commands
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Must use separate thread since
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * this thread must complete first
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_thread_spawn(hba, emlxs_fct_unsol_flush_thread,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void *)port, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_flogi_xchg() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* This is called right after we report that link has come online */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_get_link_info(fct_local_port_t *fct_port, fct_link_info_t *link)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_get_link_info %p: FCT: flg x%x HBA: ste x%x flg x%x topo x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_port, port->fct_flags, hba->state, hba->flag, hba->topology);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_enter(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->mode == MODE_INITIATOR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld link->port_topology = PORT_TOPOLOGY_UNKNOWN;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld link->port_speed = PORT_SPEED_UNKNOWN;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld link->portid = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (FCT_SUCCESS);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(port->fct_flags & FCT_STATE_LINK_UP) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (hba->state < FC_LINK_UP) || (hba->flag & FC_LOOPBACK_MODE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_topology = PORT_TOPOLOGY_UNKNOWN;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_speed = PORT_SPEED_UNKNOWN;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->portid = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (hba->topology == TOPOLOGY_LOOP) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_topology = PORT_TOPOLOGY_PRIVATE_LOOP;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_topology = PORT_TOPOLOGY_PT_TO_PT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte switch (hba->linkspeed) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case LA_1GHZ_LINK:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_speed = PORT_SPEED_1G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case LA_2GHZ_LINK:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_speed = PORT_SPEED_2G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case LA_4GHZ_LINK:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_speed = PORT_SPEED_4G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case LA_8GHZ_LINK:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_speed = PORT_SPEED_8G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case LA_10GHZ_LINK:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_speed = PORT_SPEED_10G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case LA_16GHZ_LINK:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld link->port_speed = PORT_SPEED_16G;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte default:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_speed = PORT_SPEED_UNKNOWN;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->portid = port->did;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_no_fct_flogi = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_fca_flogi_done = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_fct_flogi_done = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_get_link_info() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_register_remote_port(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_remote_port_t *remote_port, fct_cmd_t *fct_cmd)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte clock_t timeout;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte int32_t pkt_ret;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els_t *els;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte SERV_PARM *sp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_node_t *ndlp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte SERV_PARM sparam;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t *iptr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t hdl;
3be114ed300cd3c74d686e19db5d0638cec49ad4Sukumar Swaminathan uint64_t addr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port %p", fct_port);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_REG_PENDING);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = &hba->chan[hba->channel_els];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_ELS_CMD;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_accept(port, fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_REG_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to accept fct_cmd. lid=%x rid=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_lportid, fct_cmd->cmd_rportid);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cmd_sbp->fct_flags &= ~EMLXS_FCT_REGISTERED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->node = emlxs_node_find_did(port, fct_cmd->cmd_rportid, 1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for unsolicited PLOGI */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cmd_sbp->fct_flags & EMLXS_FCT_PLOGI_RECEIVED) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte els = (fct_els_t *)fct_cmd->cmd_specific;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sp = (SERV_PARM *)((caddr_t)els->els_req_payload +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (uint32_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else { /* Solicited PLOGI */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sp = &sparam;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((caddr_t)&port->sparam, (caddr_t)sp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (SERV_PARM));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Create temporary WWN's from fct_cmd address
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * This simply allows us to get an RPI from the
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * adapter until we get real service params.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * The PLOGI ACC reply will trigger a REG_LOGIN
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * update later
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld addr = (uint64_t)((unsigned long)fct_cmd);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iptr = (uint32_t *)&sp->portName;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iptr[0] = PADDR_HI(addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iptr[1] = PADDR_LO(addr);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iptr = (uint32_t *)&sp->nodeName;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iptr[0] = PADDR_HI(addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iptr[1] = PADDR_LO(addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->flag & FC_PT_TO_PT) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->did = fct_cmd->cmd_lportid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->rdid = fct_cmd->cmd_rportid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * We already received the remote port's
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * parameters in the FLOGI exchange
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(cmd_sbp->fct_flags & EMLXS_FCT_PLOGI_RECEIVED)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sp = &sparam;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((caddr_t)&port->fabric_sparam, (caddr_t)sp,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sizeof (SERV_PARM));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Since this is a PLOGI, not a FLOGI, we need
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * to fix up word2 of the CSP accordingly.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sp->cmn.w2.r_a_tov = port->sparam.cmn.w2.r_a_tov;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: Register lid=%x rid=%x. (%x,%x,%p)",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_lportid, fct_cmd->cmd_rportid, cmd_sbp->fct_state,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->flag, fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_fct_cmd_release(port, fct_cmd, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create a new node */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (EMLXS_SLI_REG_DID(port, fct_cmd->cmd_rportid, sp, cmd_sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld NULL, NULL) != 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Reg login failed. lid=%x rid=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_lportid, fct_cmd->cmd_rportid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Wait for completion */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PKT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld timeout = emlxs_timeout(hba, 30);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt_ret = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld while ((pkt_ret != -1) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (cmd_sbp->fct_state == EMLXS_FCT_REG_PENDING) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(cmd_sbp->fct_flags & EMLXS_FCT_REGISTERED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt_ret = cv_timedwait(&EMLXS_PKT_CV,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &EMLXS_PKT_LOCK, timeout);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PKT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reacquire ownership of the fct_cmd */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval2 = emlxs_fct_cmd_acquire(port, fct_cmd,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_FCT_REG_COMPLETE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rval2) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to reacquire fct_cmd. lid=%x rid=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_lportid, fct_cmd->cmd_rportid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (rval2);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Prepare response */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ndlp = (emlxs_node_t *)cmd_sbp->node;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (ndlp) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cmd_sbp->fct_flags |= EMLXS_FCT_REGISTERED;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *((emlxs_node_t **)remote_port->rp_fca_private) =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->node;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdl = ndlp->nlp_Rpi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hdl == FABRIC_RPI) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (fct_cmd->cmd_rportid == SCR_DID) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* The SCR handle is hardcoded */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld remote_port->rp_handle = hba->max_nodes;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_els_only_bmap |= 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 1; i < EMLXS_FCT_NUM_ELS_ONLY; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->fct_els_only_bmap & (1 << i))
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Bit is not set, so use this
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * for the handle
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld remote_port->rp_handle =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->max_nodes + i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_els_only_bmap |= (1 << i);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (i >= EMLXS_FCT_NUM_ELS_ONLY) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld remote_port->rp_handle =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FCT_HANDLE_NONE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdl = emlxs_sli4_rpi_to_index(hba, hdl);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld remote_port->rp_handle = hdl;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: lid=%x rid=%x hdl=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_lportid, fct_cmd->cmd_rportid,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld remote_port->rp_handle);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctPortRegister++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *((emlxs_node_t **)remote_port->rp_fca_private) = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: failed. lid=%x rid=%x hdl=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_lportid, fct_cmd->cmd_rportid,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld remote_port->rp_handle);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte remote_port->rp_handle = FCT_HANDLE_NONE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctFailedPortRegister++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_FAILURE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_register_remote_port() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_deregister_remote_port(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_remote_port_t *remote_port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_node_t *ndlp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_deregister_remote_port: did=%x hdl=%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte remote_port->rp_id, remote_port->rp_handle);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#else
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_deregister_remote_port: did=%x hdl=%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte remote_port->rp_id, remote_port->rp_handle);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (remote_port->rp_handle >= hba->max_nodes) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i = remote_port->rp_handle - hba->max_nodes;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((i < EMLXS_FCT_NUM_ELS_ONLY) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (port->fct_els_only_bmap & (1 << i))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_els_only_bmap &= ~(1 << i);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore ndlp = *((emlxs_node_t **)remote_port->rp_fca_private);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *((emlxs_node_t **)remote_port->rp_fca_private) = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (ndlp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) EMLXS_SLI_UNREG_NODE(port, ndlp, NULL,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore NULL, NULL);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctPortDeregister++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_deregister_remote_port() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_unsol_req(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MATCHMAP *mp, uint32_t size)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCB *iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd_t *fct_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fcp_cmd_t *fcp_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_node_t *ndlp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t cnt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t tm;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t hdl;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte scsi_task_t *fct_task;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint8_t lun[8];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t sid = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ndlp = emlxs_node_find_rpi(port, iocb->ULPIOTAG);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!ndlp) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP rcvd: Unknown RPI. rpi=%d rxid=%x. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPIOTAG, iocb->ULPCONTEXT);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto dropped;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sid = ndlp->nlp_DID;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_cmd = (emlxs_fcp_cmd_t *)mp->virt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!port->fct_port) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP rcvd: Target unbound. rpi=%d rxid=%x. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPIOTAG, iocb->ULPCONTEXT);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_send_logo(port, sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto dropped;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP rcvd: Target offline. rpi=%d rxid=%x. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPIOTAG, iocb->ULPCONTEXT);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_send_logo(port, sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto dropped;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Get lun id */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((void *)&fcp_cmd->fcpLunMsl, lun, 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (TGTPORTSTAT.FctOutstandingIO >= port->fct_port->port_max_xchges) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctOverQDepth++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdl = ndlp->nlp_Rpi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdl = emlxs_sli4_rpi_to_index(hba, hdl);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MODSYM(fct_scsi_task_alloc) (port->fct_port, hdl, sid, lun, 16, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_cmd == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "FCP rcvd: sid=%x xid=%x. "
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to allocate scsi task. Returning QFULL.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sid, iocb->ULPCONTEXT);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_fct_send_qfull_reply(port, ndlp, iocb->ULPCONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCLASS, fcp_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto dropped;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Initialize fct_cmd */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_rportid = sid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_lportid = port->did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_rp_handle = hdl;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_port = port->fct_port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_FCP_CMD_RECEIVED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_scsi_task_alloc %p:%p FCP rcvd: "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "cmd=%x sid=%x rxid=%x oxid=%x lun=%02x%02x dl=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fcp_cmd->fcpCdb[0], sid, iocb->ULPCONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.oxid, lun[0], lun[1],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld LE_SWAP32(fcp_cmd->fcpDl));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Initialize cmd_sbp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->class = iocb->ULPCLASS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->lun = (lun[0] << 8) | lun[1];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_FCP_CMD;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->ticks = hba->timer_tics + (2 * hba->fc_ratov);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* xrip was setup / passed in from the SLI layer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->xrip = iocbq->sbp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->node = iocbq->node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->sbp = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_oxid = cmd_sbp->xrip->rx_id;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_rxid = cmd_sbp->xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP rcvd: oxid=%x rxid=%x iotag=%d %p ",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_oxid, fct_cmd->cmd_rxid, cmd_sbp->xrip->iotag,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->fc_table[cmd_sbp->xrip->iotag]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_oxid = iocb->unsli3.ext_rcv.oxid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!fct_cmd->cmd_oxid) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_oxid = 0xFFFF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_rxid = iocb->ULPCONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_task = (scsi_task_t *)fct_cmd->cmd_specific;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set task_flags */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan switch (fcp_cmd->fcpCntl1) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case SIMPLE_Q:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_flags = TF_ATTR_SIMPLE_QUEUE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case HEAD_OF_Q:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_flags = TF_ATTR_HEAD_OF_QUEUE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case ORDERED_Q:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_flags = TF_ATTR_ORDERED_QUEUE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case ACA_Q:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_flags = TF_ATTR_ACA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case UNTAGGED:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_flags = TF_ATTR_UNTAGGED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cnt = LE_SWAP32(fcp_cmd->fcpDl);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte switch (fcp_cmd->fcpCntl3) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case 0:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctIOCmdCnt++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case 1:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_BUMP_WRIOCTR(port, cnt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctWriteBytes += cnt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_flags |= TF_WRITE_DATA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case 2:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_BUMP_RDIOCTR(port, cnt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctReadBytes += cnt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_flags |= TF_READ_DATA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_priority = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* task_mgmt_function */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte tm = fcp_cmd->fcpCntl2;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (tm) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (tm & BIT_1) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_ABORT_TASK_SET;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if (tm & BIT_2) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_CLEAR_TASK_SET;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if (tm & BIT_4) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_LUN_RESET;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if (tm & BIT_5) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_TARGET_COLD_RESET;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if (tm & BIT_6) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_CLEAR_ACA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_ABORT_TASK;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Parallel buffers support - future */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_max_nbufs = 1;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_additional_flags = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_cur_nbufs = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_csn_size = 8;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_cmd_seq_no = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_expected_xfer_length = cnt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((void *)&fcp_cmd->fcpCdb, fct_task->task_cdb, 16);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctCmdReceived++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctOutstandingIO++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_API_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_post_rcvd_cmd:3 %p:%p portid x%x, %d outio %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_cmd->cmd_lportid,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_task->task_expected_xfer_length,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld TGTPORTSTAT.FctOutstandingIO);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_post_rcvd_cmd) (fct_cmd, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortedropped:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctRcvDropped++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_unsol_req() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_fcp_data(fct_cmd_t *fct_cmd, stmf_data_buf_t *dbuf,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t ioflags)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte scsi_task_t *fct_task;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCBQ *iocbq;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_node_t *ndlp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int channel;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int channelno;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan fct_status_t rval = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_accept(port, fct_cmd, EMLXS_FCT_SEND_FCP_DATA);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_data: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to accept fct_cmd. did=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_rportid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FCT_API_TRACE
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task = (scsi_task_t *)fct_cmd->cmd_specific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ndlp = *(emlxs_node_t **)fct_cmd->cmd_rp->rp_fca_private;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->node = ndlp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_buf = dbuf;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan channelno = ((CHANNEL *)cmd_sbp->channel)->channelno;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan channel = channelno;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocbq = &cmd_sbp->iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->sbp = cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_data %p:%p flgs=%x ioflags=%x dl=%d,%d,%d,%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, dbuf->db_flags, ioflags,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_task->task_cmd_xfer_length,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task->task_nbytes_transferred, dbuf->db_data_size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task->task_expected_xfer_length);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Setup for I/O prep routine */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->iocb.ULPCOMMAND = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_PREP_FCT_IOCB(port, cmd_sbp, channel) != IOERR_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_BUSY);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_FCP_DATA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (dbuf->db_flags & DB_SEND_STATUS_GOOD) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_flags |= EMLXS_FCT_SEND_STATUS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (dbuf->db_flags & DB_DIRECTION_TO_RPORT) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fct_dbuf_dma_sync(hba, dbuf, DDI_DMA_SYNC_FORDEV)) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, cmd_sbp, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan return (FCT_BUSY);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_DATA_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_SLI_ISSUE_IOCB_CMD(hba, cmd_sbp->channel, iocbq);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_fcp_data() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be released before exiting */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_fcp_status(fct_cmd_t *fct_cmd)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte scsi_task_t *fct_task;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fc_packet_t *pkt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_buf_t *sbp = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fcp_rsp *fcp_rsp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_node_t *ndlp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t size;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task = (scsi_task_t *)fct_cmd->cmd_specific;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ndlp = *(emlxs_node_t **)fct_cmd->cmd_rp->rp_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte did = fct_cmd->cmd_rportid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Initialize cmd_sbp */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, EMLXS_FCT_SEND_FCP_STATUS);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->node = ndlp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte size = 24;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_sense_length) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte size += fct_task->task_sense_length;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_status %p:%p stat=%d resid=%d size=%d rx=%x ox=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_task->task_scsi_status,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_task->task_resid, size, fct_cmd->cmd_rxid, fct_cmd->cmd_oxid);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, size, 0, 0, KM_NOSLEEP))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_status: Unable to allocate packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (FCT_BUSY);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_FCP_STATUS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp = emlxs_fct_pkt_init(port, fct_cmd, pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_pkt = pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_type = FC_PKT_OUTBOUND;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_timeout =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_timeout = (pkt->pkt_timeout > 60)? 60: pkt->pkt_timeout;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_comp = emlxs_fct_pkt_comp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.r_ctl = R_CTL_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(port->did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.type = FC_TYPE_SCSI_FCP;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.f_ctl =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_id = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.df_ctl = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ox_id = fct_cmd->cmd_oxid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.rx_id = fct_cmd->cmd_rxid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ro = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the status payload */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp = (emlxs_fcp_rsp *)pkt->pkt_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_resid) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_status_ctrl & TASK_SCTRL_OVER) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctScsiResidOver++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus2 |= RESID_OVER;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspResId = LE_SWAP32(fct_task->task_resid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if (fct_task->task_status_ctrl & TASK_SCTRL_UNDER) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctScsiResidUnder++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus2 |= RESID_UNDER;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspResId = LE_SWAP32(fct_task->task_resid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_scsi_status) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_scsi_status == SCSI_STAT_QUE_FULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctScsiQfullErr++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctScsiStatusErr++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Make sure residual reported on non-SCSI_GOOD READ status */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((fct_task->task_flags & TF_READ_DATA) &&
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (fcp_rsp->rspResId == 0)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus2 |= RESID_UNDER;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fcp_rsp->rspResId =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_task->task_expected_xfer_length;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_sense_length) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctScsiSenseErr++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus2 |= SNS_LEN_VALID;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspSnsLen = LE_SWAP32(fct_task->task_sense_length);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)fct_task->task_sense_data,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (uint8_t *)&fcp_rsp->rspInfo0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_task->task_sense_length);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus3 = fct_task->task_scsi_status;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspRspLen = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "RESP", (uint32_t *)fcp_rsp, 36, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_STATUS_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_status: Unable to send packet.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_status: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to acquire fct_cmd.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (FCT_BUSY);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_fcp_status() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_send_qfull_reply(emlxs_port_t *port, emlxs_node_t *ndlp,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint16_t xid, uint32_t class, emlxs_fcp_cmd_t *fcp_cmd)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fc_packet_t *pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_fcp_rsp *fcp_rsp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp = &hba->chan[hba->CHANNEL_FCT];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint8_t lun[8];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((void *)&fcp_cmd->fcpLunMsl, lun, 8);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte size = 24;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, size, 0, 0, KM_NOSLEEP))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_qfull_reply: Unable to allocate packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_FAILURE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp = PKT2PRIV(pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->node = ndlp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->channel = cp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->did = ndlp->nlp_DID;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->lun = (lun[0] << 8) | lun[1];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->class = class;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_type = FC_PKT_OUTBOUND;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_timeout =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(ndlp->nlp_DID);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.r_ctl = R_CTL_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(port->did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.type = FC_TYPE_SCSI_FCP;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.f_ctl =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_id = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.df_ctl = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ox_id = 0xFFFF;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.rx_id = xid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ro = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_qfull_reply: Sending QFULL: x%x lun x%x: %d %d",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte xid, sbp->lun, TGTPORTSTAT.FctOutstandingIO,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_port->port_max_xchges);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the status payload */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp = (emlxs_fcp_rsp *)pkt->pkt_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctScsiQfullErr++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus3 = SCSI_STAT_QUE_FULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus2 |= RESID_UNDER;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspResId = LE_SWAP32(fcp_cmd->fcpDl);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_qfull_reply: Unable to send packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_pkt_free(pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_FAILURE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_qfull_reply() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_fcp_event(emlxs_hba_t *hba, CHANNEL *cp, IOCBQ *iocbq)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = &PPORT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCB *iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t status;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd_t *fct_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte stmf_data_buf_t *dbuf;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte scsi_task_t *fct_task;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fc_packet_t *pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t fct_flags;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stmf_data_buf_t *fct_buf;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocb = &iocbq->iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp = (emlxs_buf_t *)iocbq->sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctEvent++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!sbp) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* completion with missing xmit command */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctStray++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* emlxs_stray_fcp_completion_msg */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP event cmd=%x status=%x error=%x iotag=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND, iocb->ULPSTATUS,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.grsp.perr.statLocalError, iocb->ULPIOTAG);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctCompleted++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port = sbp->iocbq.port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd = sbp->fct_cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan status = iocb->ULPSTATUS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_handle_fcp_event: %p:%p cmd=%x status=%x, %x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, sbp, iocb->ULPCOMMAND, status, iocb->ULPCT);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_cmd == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* For driver generated QFULL response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (((iocb->ULPCOMMAND == CMD_FCP_TRSP_CX) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (iocb->ULPCOMMAND == CMD_FCP_TRSP64_CX)) && sbp->pkt) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_pkt_free(sbp->pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, EMLXS_FCT_REQ_COMPLETE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_handle_fcp_event: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to reacquire fct_cmd. type=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt = cmd_sbp->fct_pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_pkt = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dbuf = sbp->fct_buf;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd->cmd_comp_status = FCT_SUCCESS;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (status) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathanemlxs_dma_error:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /*
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * The error indicates this IO should be terminated
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * immediately.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_SEND_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_comp_status = FCT_FAILURE;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_API_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_queue_cmd_for_termination:1 %p: x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fct_cmd, fct_cmd->cmd_comp_status);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_queue_cmd_for_termination) (fct_cmd,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan FCT_ABTS_RECEIVED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan goto done;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (iocb->ULPCOMMAND) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /*
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * FCP Data completion
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case CMD_FCP_TSEND_CX:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case CMD_FCP_TSEND64_CX:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case CMD_FCP_TRECEIVE_CX:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case CMD_FCP_TRECEIVE64_CX:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (dbuf->db_flags & DB_DIRECTION_FROM_RPORT) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fct_dbuf_dma_sync(hba, dbuf,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan DDI_DMA_SYNC_FORCPU)) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan goto emlxs_dma_error;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((cmd_sbp->fct_flags & EMLXS_FCT_SEND_STATUS) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (iocb->ULPCT != 1)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dbuf->db_flags |= DB_STATUS_GOOD_SENT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (scsi_task_t *)fct_cmd->cmd_specific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task->task_scsi_status = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_fct_send_fcp_status(fct_cmd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else if ((cmd_sbp->fct_flags &
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_SEND_STATUS) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (iocb->ULPCT == 1)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Auto-resp has been sent out by firmware */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* We can assume this is really a FC_TRSP_CX */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dbuf->db_flags |= DB_STATUS_GOOD_SENT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (scsi_task_t *)fct_cmd->cmd_specific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task->task_scsi_status = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_SEND_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto auto_resp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_flags &= ~EMLXS_FCT_SEND_STATUS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_scsi_data_xfer_done:1 %p %p", fct_cmd, dbuf);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_scsi_data_xfer_done) (fct_cmd, dbuf, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* FCP Status completion */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case CMD_FCP_TRSP_CX:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case CMD_FCP_TRSP64_CX:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanauto_resp:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy these before calling emlxs_fct_cmd_done */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_flags = cmd_sbp->fct_flags;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_buf = cmd_sbp->fct_buf;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan TGTPORTSTAT.FctOutstandingIO--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_flags & EMLXS_FCT_SEND_STATUS) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_scsi_data_xfer_done:2 %p %p outio %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, fct_buf, TGTPORTSTAT.FctOutstandingIO);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_scsi_data_xfer_done) (fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_buf, FCT_IOF_FCA_DONE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_response_done:1 %p: x%x outio %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, fct_cmd->cmd_comp_status,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld TGTPORTSTAT.FctOutstandingIO);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_send_response_done) (fct_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_comp_status, FCT_IOF_FCA_DONE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctStray++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctCompleted--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid iocb: cmd=0x%x", iocb->ULPCOMMAND);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (pkt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_pkt_complete(sbp, status,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocb->un.grsp.perr.statLocalError, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } /* switch(iocb->ULPCOMMAND) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathandone:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (pkt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_pkt_free(pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (status == IOSTAT_SUCCESS) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctCmplGood++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctCmplError++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_fcp_event() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ARGSUSED */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanextern int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_abort(emlxs_hba_t *hba, CHANNEL *cp, IOCBQ *iocbq)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan{
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_port_t *port = &PPORT;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan IOCB *iocb;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_buf_t *sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fc_packet_t *pkt;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocb = &iocbq->iocb;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan sbp = (emlxs_buf_t *)iocbq->sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan TGTPORTSTAT.FctEvent++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!sbp) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* completion with missing xmit command */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan TGTPORTSTAT.FctStray++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* emlxs_stray_fcp_completion_msg */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ABORT event cmd=%x status=%x error=%x iotag=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND, iocb->ULPSTATUS,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.grsp.perr.statLocalError, iocb->ULPIOTAG);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt = PRIV2PKT(sbp);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_API_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_handle_abort: %p:%p xri=%d cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->fct_cmd, sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCONTEXT, iocb->ULPCOMMAND, iocb->ULPSTATUS);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld XRIobj_t *xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, NULL, sbp->xrip, 1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_find_xri(port, iocb->ULPCONTEXT);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip || xrip->state == XRI_STATE_FREE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto exit;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->fc_table[xrip->iotag]) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->fc_table[xrip->iotag] != STALE_PACKET)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Cmd not aborted, retrying: xri=%d iotag=%d sbp=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->iotag, hba->fc_table[xrip->iotag]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Abort retry */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Abort retry failed xri=%x", xrip->XRI);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldexit:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (pkt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_pkt_free(pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_abort() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_unsol_els(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MATCHMAP *mp, uint32_t size)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCB *iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t cmd_code;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd_t *fct_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els_t *els;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t sid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t padding;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint8_t *bp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t rval;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte HBASTATS.ElsCmdReceived++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bp = mp->virt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_code = (*(uint32_t *)bp) & ELS_CMD_MASK;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocb = &iocbq->iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sid = iocb->un.elsreq.remoteID;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!port->fct_port) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->flag & FC_ONLINE_MODE)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x. Adapter offline. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_elscmd_xlate(cmd_code), sid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (cmd_code) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ELS_CMD_LOGO:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ELS_CMD_PRLO:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x. Target unbound. Accepting...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_elscmd_xlate(cmd_code), sid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_els_reply(port, iocbq, ELS_CMD_ACC,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ELS_CMD_LOGO, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x. Target unbound. Rejecting...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_elscmd_xlate(cmd_code), sid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_code, LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "%s: sid=%x. Target offline. Rejecting...",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_elscmd_xlate(cmd_code), sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT, cmd_code,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x cnt=%d. Target rcv. ",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_elscmd_xlate(cmd_code), sid, size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Process the request */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte switch (cmd_code) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case ELS_CMD_FLOGI:
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan rval = emlxs_fct_process_unsol_flogi(port, cp, iocbq, mp, size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!rval) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ELS_PKT *els_pkt = (ELS_PKT *)bp;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fct_flogi_xchg_t fx;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bzero((uint8_t *)&fx, sizeof (fct_flogi_xchg_t));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Save the FLOGI exchange information */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx.rsvd2 = iocb->ULPCONTEXT;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bcopy((caddr_t)&els_pkt->un.logi.nodeName,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan (caddr_t)fx.fx_nwwn, 8);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bcopy((caddr_t)&els_pkt->un.logi.portName,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan (caddr_t)fx.fx_pwwn, 8);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx.fx_sid = sid;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx.fx_did = iocb->un.elsreq.myID;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx.fx_fport = els_pkt->un.logi.cmn.fPort;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx.fx_op = ELS_OP_FLOGI;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_handle_unsol_flogi(port, &fx, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case ELS_CMD_PLOGI:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan rval =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_process_unsol_plogi(port, cp, iocbq, mp, size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte default:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "%s: sid=0x%x", emlxs_elscmd_xlate(cmd_code), sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte rval = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (rval) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte padding = (8 - (size & 7)) & 7;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd = (fct_cmd_t *)MODSYM(fct_alloc) (FCT_STRUCT_CMD_RCVD_ELS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (size + padding + GET_STRUCT_SIZE(emlxs_buf_t)),
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan AF_FORCE_NOSLEEP);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t *ptr = (uint32_t *)bp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_alloc %p: ELS rcvd: rxid=%x payload: x%x x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, iocb->ULPCONTEXT, *ptr, *(ptr + 1));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_cmd == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "%s: sid=%x. Out of memory. Rejecting...",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_elscmd_xlate(cmd_code), sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT, cmd_code,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte LSRJT_LOGICAL_BSY, LSEXP_OUT_OF_RESOURCE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Initialize fct_cmd */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_oxid = (cmd_code >> ELS_CMD_SHIFT) & 0xff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_rxid = iocb->ULPCONTEXT;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_rportid = sid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_lportid = port->did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_rp_handle = FCT_HANDLE_NONE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_port = port->fct_port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_ELS_CMD_RECEIVED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Initialize cmd_sbp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->class = iocb->ULPCLASS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_ELS_CMD;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_PLOGI_RECEIVED;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)iocb, (uint8_t *)&cmd_sbp->iocbq,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sizeof (emlxs_iocb_t));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte els = (fct_els_t *)fct_cmd->cmd_specific;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore els->els_req_size = (uint16_t)size;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan els->els_req_payload =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan GET_BYTE_OFFSET(fct_cmd->cmd_fca_private,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte GET_STRUCT_SIZE(emlxs_buf_t));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy(bp, els->els_req_payload, size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if Offline */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan#ifdef FCT_API_TRACE
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "fct_post_rcvd_cmd:4 %p: portid x%x", fct_cmd,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fct_cmd->cmd_lportid);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan#endif /* FCT_API_TRACE */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan MODSYM(fct_post_rcvd_cmd) (fct_cmd, 0);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan goto done;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan }
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Online */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if Link up is acked */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->fct_flags & FCT_STATE_LINK_UP_ACKED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto defer;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((cmd_code != ELS_CMD_FLOGI) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(port->fct_flags & FCT_STATE_FLOGI_CMPL)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto defer;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Post it to COMSTAR */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* mutex_exit(&cmd_sbp->fct_mtx); */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_post_rcvd_cmd:1 %p: portid x%x", fct_cmd,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_lportid);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan#endif /* FCT_API_TRACE */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MODSYM(fct_post_rcvd_cmd) (fct_cmd, 0);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfelddefer:
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Defer processing of fct_cmd till later (after link up ack). */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x. Defer Processing x%x.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_elscmd_xlate(cmd_code), sid, port->fct_flags);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_CMD_WAITQ);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Add cmd_sbp to queue tail */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (port->fct_wait_tail) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_wait_tail->next = cmd_sbp;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan }
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_wait_tail = cmd_sbp;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (!port->fct_wait_head) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_wait_head = cmd_sbp;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan }
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortedone:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_unsol_els() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_process_unsol_flogi(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MATCHMAP *mp, uint32_t size)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCB *iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte char buffer[64];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte buffer[0] = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocb = &iocbq->iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Perform processing of FLOGI payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_process_unsol_flogi(port, iocbq, mp, size, buffer,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (buffer))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan "FLOGI: sid=0x%x xid=%x %s",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan iocb->un.elsreq.remoteID, iocb->ULPIOTAG, buffer);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_process_unsol_flogi() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_process_unsol_plogi(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MATCHMAP *mp, uint32_t size)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCB *iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte char buffer[64];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte buffer[0] = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocb = &iocbq->iocb;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Perform processing of PLOGI payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_process_unsol_plogi(port, iocbq, mp, size, buffer,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (buffer))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan "PLOGI: sid=0x%x xid=%x %s",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan iocb->un.elsreq.remoteID, iocb->ULPIOTAG, buffer);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_process_unsol_plogi() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic emlxs_buf_t *
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_pkt_init(emlxs_port_t *port, fct_cmd_t *fct_cmd,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fc_packet_t *pkt)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp = PKT2PRIV(pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->fct_cmd = cmd_sbp->fct_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->node = cmd_sbp->node;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->channel = cmd_sbp->channel;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->did = cmd_sbp->did;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->lun = cmd_sbp->lun;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->class = cmd_sbp->class;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->fct_type = cmd_sbp->fct_type;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->fct_state = cmd_sbp->fct_state;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->xrip = cmd_sbp->xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->iotag = cmd_sbp->iotag;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (sbp);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_pkt_init() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* Mutex will be acquired */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic emlxs_buf_t *
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_fct_cmd_init(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint16_t fct_state)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bzero((void *)cmd_sbp, sizeof (emlxs_buf_t));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_init(&cmd_sbp->fct_mtx, NULL, MUTEX_DRIVER,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore DDI_INTR_PRI(hba->intr_arg));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_init(&cmd_sbp->mtx, NULL, MUTEX_DRIVER,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore DDI_INTR_PRI(hba->intr_arg));
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_enter(&cmd_sbp->fct_mtx);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->pkt_flags = PACKET_VALID;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->port = port;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_cmd = fct_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->node = (fct_cmd->cmd_rp) ?
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *(emlxs_node_t **)fct_cmd->cmd_rp->rp_fca_private : NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->iocbq.sbp = cmd_sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->iocbq.port = port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->did = fct_cmd->cmd_rportid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Flags fct_cmd as inuse */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((fct_cmd->cmd_oxid == 0) && (fct_cmd->cmd_rxid == 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_oxid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_rxid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_state) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (cmd_sbp);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_init() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called after receiving fct_cmd from COMSTAR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_accept(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint16_t fct_state)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_accept: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_accept:2 "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cmd_sbp->fct_flags & EMLXS_FCT_ABORT_INP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_accept: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Aborted fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_ABORT_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MODSYM(fct_cmd_fca_aborted) (fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan FCT_ABORT_SUCCESS, FCT_IOF_FCA_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&cmd_sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(cmd_sbp->pkt_flags & PACKET_ULP_OWNED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_accept: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Busy fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_BUSY);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->pkt_flags &= ~PACKET_ULP_OWNED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_state) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_accept() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called after receiving fct_cmd from driver */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_acquire(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t fct_state)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((fct_cmd->cmd_oxid == 0) && (fct_cmd->cmd_rxid == 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_acquire: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Bad fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_acquire: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((cmd_sbp->pkt_flags & PACKET_ULP_OWNED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_acquire: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Returned fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((fct_cmd->cmd_oxid == 0) && (fct_cmd->cmd_rxid == 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_acquire:2 "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Bad fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_acquire:2 "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((cmd_sbp->pkt_flags & PACKET_ULP_OWNED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_acquire:2 "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Returned fct_cmd found! fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cmd_sbp->fct_flags & EMLXS_FCT_ABORT_INP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd_acquire: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Aborting cmd. fct_cmd=%p state=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_cmd->cmd_type == FCT_CMD_FCP_XCHG) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan TGTPORTSTAT.FctOutstandingIO--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_comp_status = FCT_FAILURE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_ABORT_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MODSYM(fct_cmd_fca_aborted) (fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan FCT_ABORT_SUCCESS, FCT_IOF_FCA_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_state) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_acquire() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be released before exiting */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called before transitionally sending fct_cmd to driver */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_release(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t fct_state)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_state) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_release() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be released before exiting */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called before posting fct_cmd back to COMSTAR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_post(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t fct_state)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_packet_t *pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt = cmd_sbp->fct_pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_pkt = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&cmd_sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->pkt_flags |= PACKET_ULP_OWNED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_state) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_pkt_free(pkt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_post() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called before completing fct_cmd back to COMSTAR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_done(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint16_t fct_state)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_packet_t *pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Flags fct_cmd is no longer used */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_oxid = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_rxid = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (cmd_sbp->iotag != 0) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Pkt still registered! channel=%p iotag=%d sbp=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel, cmd_sbp->iotag, cmd_sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cmd_sbp->channel) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, cmd_sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->xrip, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_unregister_pkt(cmd_sbp->channel,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->iotag, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt = cmd_sbp->fct_pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_pkt = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_state) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&cmd_sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->pkt_flags |= PACKET_ULP_OWNED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->pkt_flags &= ~PACKET_VALID;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cmd_sbp->mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_destroy(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_destroy(&cmd_sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_pkt_free(pkt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_done() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_pkt_comp(fc_packet_t *pkt)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FMA_SUPPORT
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_hba_t *hba;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FMA_SUPPORT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd_t *fct_cmd;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els_t *fct_els;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_sol_ct_t *fct_ct;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp = PKT2PRIV(pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port = sbp->port;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FMA_SUPPORT
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan hba = HBA;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FMA_SUPPORT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd = sbp->fct_cmd;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, EMLXS_FCT_PKT_COMPLETE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to reacquire fct_cmd.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_pkt = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan switch (fct_cmd->cmd_type) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case FCT_CMD_FCP_XCHG:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((pkt->pkt_reason == FC_REASON_ABORTED) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (pkt->pkt_reason == FC_REASON_XCHG_DROPPED) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (pkt->pkt_reason == FC_REASON_OFFLINE)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /*
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * The error indicates this IO should be terminated
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * immediately.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_SEND_STATUS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#ifdef FCT_API_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_queue_cmd_for_termination:2 %p:%p x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_cmd->cmd_comp_status);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_queue_cmd_for_termination) (fct_cmd,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan FCT_ABTS_RECEIVED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_FCT_PKT_FCPRSP_COMPLETE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_response_done:2 %p:%p x%x outio %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_cmd->cmd_comp_status,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld TGTPORTSTAT.FctOutstandingIO);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#else
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: fct_send_response_done. dbuf=%p",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte sbp->fct_buf);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan TGTPORTSTAT.FctOutstandingIO--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_send_response_done) (fct_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_comp_status, FCT_IOF_FCA_DONE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_RCVD_ELS:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_FCT_PKT_ELSRSP_COMPLETE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_response_done:3 %p:%p x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_cmd->cmd_comp_status);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_send_response_done) (fct_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_comp_status, FCT_IOF_FCA_DONE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_SOL_ELS:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_FCT_PKT_ELSCMD_COMPLETE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els = (fct_els_t *)fct_cmd->cmd_specific;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_els->els_resp_payload) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(pkt->pkt_resp_dma, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_rsplen, DDI_DMA_SYNC_FORKERNEL);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)pkt->pkt_resp,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (uint8_t *)fct_els->els_resp_payload,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els->els_resp_size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_done:1 %p:%p x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_cmd->cmd_comp_status);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, pkt->pkt_resp_dma)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan pkt->pkt_resp_dma);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_FAILURE,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan FCT_IOF_FCA_DONE);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan break;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_SUCCESS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan FCT_IOF_FCA_DONE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte case FCT_CMD_SOL_CT:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_FCT_PKT_CTCMD_COMPLETE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_ct = (fct_sol_ct_t *)fct_cmd->cmd_specific;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_ct->ct_resp_payload) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(pkt->pkt_resp_dma, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_rsplen, DDI_DMA_SYNC_FORKERNEL);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)pkt->pkt_resp,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (uint8_t *)fct_ct->ct_resp_payload,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_ct->ct_resp_size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_done:2 %p:%p x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, cmd_sbp, fct_cmd->cmd_comp_status);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, pkt->pkt_resp_dma)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan pkt->pkt_resp_dma);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_FAILURE,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan FCT_IOF_FCA_DONE);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan break;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_SUCCESS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan FCT_IOF_FCA_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte default:
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: Invalid cmd type found. type=%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_type);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_pkt_free(pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_pkt_comp() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic void
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_abort_pkt_comp(fc_packet_t *pkt)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_buf_t *sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan IOCBQ *iocbq;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan IOCB *iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan sbp = PKT2PRIV(pkt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port = sbp->port;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocbq = &sbp->iocbq;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocb = &iocbq->iocb;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort_pkt_comp: %p: xri=%d cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->fct_cmd, sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCONTEXT, iocb->ULPCOMMAND, iocb->ULPSTATUS);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_pkt_free(pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_abort_pkt_comp() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT (INDIRECT) */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic fct_status_t
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_send_els_cmd(fct_cmd_t *fct_cmd)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan{
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_port_t *port =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t sid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els_t *fct_els;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fc_packet_t *pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte did = fct_cmd->cmd_rportid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sid = fct_cmd->cmd_lportid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els = (fct_els_t *)fct_cmd->cmd_specific;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, fct_els->els_req_size,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els->els_resp_size, 0, KM_NOSLEEP))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_cmd: Unable to allocate packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_BUSY);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_SEND_ELS_REQ);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = &hba->chan[hba->channel_els];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_ELS_REQ;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) emlxs_fct_pkt_init(port, fct_cmd, pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_pkt = pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_type = FC_PKT_EXCHANGE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_timeout =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_timeout = (pkt->pkt_timeout > 60)? 60: pkt->pkt_timeout;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_comp = emlxs_fct_pkt_comp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_cmd: pkt_timeout=%d ratov=%d",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_timeout, hba->fc_ratov);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.r_ctl = R_CTL_ELS_REQ;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.type = FC_TYPE_EXTENDED_LS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.f_ctl =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_FIRST_SEQ | F_CTL_END_SEQ | F_CTL_SEQ_INITIATIVE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_id = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.df_ctl = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ox_id = 0xFFFF;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.rx_id = 0xFFFF;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ro = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Copy the cmd payload */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)fct_els->els_req_payload, (uint8_t *)pkt->pkt_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els->els_req_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_REQ_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_cmd: Unable to send packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_cmd: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to reacquire fct_cmd.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_BUSY);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_els_cmd() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be released before exiting */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_els_rsp(fct_cmd_t *fct_cmd)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t sid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els_t *fct_els;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fc_packet_t *pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els = (fct_els_t *)fct_cmd->cmd_specific;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte did = fct_cmd->cmd_rportid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sid = fct_cmd->cmd_lportid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(pkt = emlxs_pkt_alloc(port, fct_els->els_resp_size, 0, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan KM_NOSLEEP))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_rsp: Unable to allocate packet.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_FAILURE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, EMLXS_FCT_SEND_ELS_RSP);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_ELS_RSP;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) emlxs_fct_pkt_init(port, fct_cmd, pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_pkt = pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_type = FC_PKT_OUTBOUND;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_timeout =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_timeout = (pkt->pkt_timeout > 60)? 60: pkt->pkt_timeout;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_comp = emlxs_fct_pkt_comp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.r_ctl = R_CTL_ELS_RSP;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(sid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.type = FC_TYPE_EXTENDED_LS;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.f_ctl =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_id = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.df_ctl = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ox_id = fct_cmd->cmd_oxid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.rx_id = fct_cmd->cmd_rxid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ro = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Copy the resp payload to pkt_cmd buffer */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)fct_els->els_resp_payload, (uint8_t *)pkt->pkt_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_els->els_resp_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_RSP_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_rsp: Unable to send packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_rsp: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to reacquire fct_cmd.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_FAILURE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_els_rsp() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT (INDIRECT) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_ct_cmd(fct_cmd_t *fct_cmd)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t did;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_sol_ct_t *fct_ct;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fc_packet_t *pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_status_t rval;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte did = fct_cmd->cmd_rportid;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_ct = (fct_sol_ct_t *)fct_cmd->cmd_specific;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, fct_ct->ct_req_size,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_ct->ct_resp_size, 0, KM_NOSLEEP))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_ct_cmd: Unable to allocate packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_BUSY);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_SEND_CT_REQ);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = &hba->chan[hba->channel_ct];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp->fct_type = EMLXS_FCT_CT_REQ;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) emlxs_fct_pkt_init(port, fct_cmd, pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_pkt = pkt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_tran_type = FC_PKT_EXCHANGE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_timeout =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_timeout = (pkt->pkt_timeout > 60)? 60: pkt->pkt_timeout;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_comp = emlxs_fct_pkt_comp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.r_ctl = R_CTL_UNSOL_CONTROL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(port->did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.type = FC_TYPE_FC_SERVICES;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.f_ctl =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_FIRST_SEQ | F_CTL_END_SEQ | F_CTL_SEQ_INITIATIVE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_id = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.df_ctl = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.seq_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ox_id = 0xFFFF;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.rx_id = 0xFFFF;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte pkt->pkt_cmd_fhdr.ro = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Copy the cmd payload */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)fct_ct->ct_req_payload, (uint8_t *)pkt->pkt_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_ct->ct_req_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_REQ_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_ct_cmd: Unable to send packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_ct_cmd: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to reacquire fct_cmd.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_BUSY);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_ct_cmd() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathanstatic uint32_t
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_pkt_abort_txq(emlxs_port_t *port, emlxs_buf_t *cmd_sbp)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte NODELIST *nlp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fc_packet_t *pkt;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_buf_t *sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_buf_t *iocb_sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t channelno;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCBQ *iocbq;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCBQ *next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte IOCBQ *prev;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t found;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t pkt_flags;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check the transmit queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_TX_CHANNEL_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* The IOCB could point to a cmd_sbp (no packet) or a sbp (packet) */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt = cmd_sbp->fct_pkt;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (pkt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan sbp = PKT2PRIV(pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (sbp == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan goto done;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocb_sbp = sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocbq = &sbp->iocbq;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt_flags = sbp->pkt_flags;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } else {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan sbp = NULL;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocb_sbp = cmd_sbp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan iocbq = &cmd_sbp->iocbq;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt_flags = cmd_sbp->pkt_flags;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan nlp = (NODELIST *)cmd_sbp->node;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = (CHANNEL *)cmd_sbp->channel;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan channelno = (cp) ? cp->channelno : 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (pkt_flags & PACKET_IN_TXQ) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Find it on the queue */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte found = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (iocbq->flag & IOCB_PRIORITY) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Search the priority queue */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte prev = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next = (IOCBQ *)nlp->nlp_ptx[channelno].q_first;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (next) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (next == iocbq) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Remove it */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (prev) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte prev->next = iocbq->next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (nlp->nlp_ptx[channelno].q_last ==
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp->nlp_ptx[channelno].q_last =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)prev;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (nlp->nlp_ptx[channelno].q_first ==
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp->nlp_ptx[channelno].
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q_first =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)iocbq->next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp->nlp_ptx[channelno].q_cnt--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocbq->next = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte found = 1;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte prev = next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte next = next->next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Search the normal queue */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte prev = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next = (IOCBQ *)nlp->nlp_tx[channelno].q_first;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (next) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (next == iocbq) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Remove it */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (prev) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte prev->next = iocbq->next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (nlp->nlp_tx[channelno].q_last ==
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp->nlp_tx[channelno].q_last =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)prev;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (nlp->nlp_tx[channelno].q_first ==
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp->nlp_tx[channelno].q_first =
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void *)iocbq->next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp->nlp_tx[channelno].q_cnt--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte iocbq->next = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte found = 1;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte prev = next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte next = (IOCBQ *)next->next;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!found) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte goto done;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if node still needs servicing */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((nlp->nlp_ptx[channelno].q_first) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (nlp->nlp_tx[channelno].q_first &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan !(nlp->nlp_flag[channelno] & NLP_CLOSED))) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /*
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * If this is the base node, don't shift the pointers
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* We want to drain the base node before moving on */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!nlp->nlp_base) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Shift channel queue pointers to next node */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_last = (void *)nlp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_first = nlp->nlp_next[channelno];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Remove node from channel queue */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* If this is the last node on list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cp->nodeq.q_last == (void *)nlp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_last = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_first = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Remove node from head */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_first = nlp->nlp_next[channelno];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((NODELIST *)cp->nodeq.q_last)->
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp_next[channelno] = cp->nodeq.q_first;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_cnt--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Clear node */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp->nlp_next[channelno] = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The IOCB points to iocb_sbp (no packet) or a sbp (packet) */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, iocb_sbp, iocb_sbp->xrip, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_unregister_pkt(cp, iocb_sbp->iotag, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_TX_CHANNEL_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (pkt) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_pkt_free(pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_pkt = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathandone:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_TX_CHANNEL_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_pkt_abort_txq() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* FCT_NOT_FOUND & FCT_ABORT_SUCCESS indicates IO is done */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* FCT_SUCCESS indicates abort will occur asyncronously */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic fct_status_t
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_abort(fct_local_port_t *fct_port, fct_cmd_t *fct_cmd,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t flags)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan{
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_hba_t *hba = HBA;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_buf_t *cmd_sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *prev;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan fc_packet_t *pkt;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_buf_t *sbp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan kmutex_t *fct_mtx;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t fct_state;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_mtx = &cmd_sbp->fct_mtx;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathantop:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Sanity check */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((fct_cmd->cmd_oxid == 0) && (fct_cmd->cmd_rxid == 0)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Bad fct_cmd=%p.", fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (FCT_NOT_FOUND);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Pkt invalid. cmd_sbp=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (FCT_NOT_FOUND);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mutex_tryenter(fct_mtx) == 0) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /*
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * This code path handles a race condition if
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * an IO completes, in emlxs_fct_handle_fcp_event(),
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * and we get an abort at the same time.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan delay(drv_usectohz(100000)); /* 100 msec */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan goto top;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* At this point, we have entered the mutex */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Sanity check */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((fct_cmd->cmd_oxid == 0) && (fct_cmd->cmd_rxid == 0)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Bad fct_cmd=%p.", fct_cmd);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(fct_mtx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan return (FCT_NOT_FOUND);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Pkt invalid. cmd_sbp=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_NOT_FOUND);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: hbastate=%x. "
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan "xid=%x,%x cmd_sbp=%p fctstate=%d flags=%x,%x,%x",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan hba->state, fct_cmd->cmd_oxid, fct_cmd->cmd_rxid, cmd_sbp,
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan cmd_sbp->fct_state, flags, cmd_sbp->fct_flags, cmd_sbp->pkt_flags);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (cmd_sbp->fct_flags & EMLXS_FCT_ABORT_INP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_SLI_ISSUE_IOCB_CMD(hba, cmd_sbp->channel, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* If Abort is already in progress */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_ABORT_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (flags & FCT_IOF_FORCE_FCA_DONE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_handle = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan TGTPORTSTAT.FctAbortSent++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (cmd_sbp->fct_state) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* These are currently owned by COMSTAR. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* They were last processed by emlxs_fct_cmd_post() */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan /* We have NO exchange resources associated with this IO. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_FCT_OWNED:
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan goto abort_done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* These are on the unsol waitQ in the driver */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_FCT_CMD_WAITQ:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Find and remove it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp2 = port->fct_wait_head;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan prev = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (cmd_sbp2) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cmd_sbp2 == cmd_sbp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Remove it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (prev) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan prev->next = cmd_sbp2->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (port->fct_wait_head == cmd_sbp2) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan port->fct_wait_head = cmd_sbp2->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (port->fct_wait_tail == cmd_sbp2) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan port->fct_wait_tail = prev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp2->next = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan prev = cmd_sbp2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp2 = cmd_sbp2->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan /*FALLTHROUGH*/
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan /* These are currently owned by COMSTAR. */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan /* They were last processed by emlxs_fct_cmd_post() */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan /* We have residual exchange resources associated with this IO */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan case EMLXS_FCT_CMD_POSTED:
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan switch (fct_cmd->cmd_type) {
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan case FCT_CMD_FCP_XCHG: /* Unsol */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan TGTPORTSTAT.FctOutstandingIO--;
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_abort_fct_exchange(hba, port, fct_cmd->cmd_rxid);
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan break;
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan case FCT_CMD_RCVD_ELS: /* Unsol */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_abort_els_exchange(hba, port, fct_cmd->cmd_rxid);
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan break;
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan }
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan goto abort_done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* These are active in the driver */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* They were last processed by emlxs_fct_cmd_release() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_RSP_PENDING:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_REQ_PENDING:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_REG_PENDING:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_DATA_PENDING:
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan case EMLXS_FCT_STATUS_PENDING:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Abort anything pending */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (emlxs_fct_pkt_abort_txq(port, cmd_sbp)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (fct_cmd->cmd_type == FCT_CMD_FCP_XCHG) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan TGTPORTSTAT.FctOutstandingIO--;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan goto abort_done;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If we're not online, then all IO will be flushed anyway */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(hba->flag & FC_ONLINE_MODE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Not online. fct_cmd=%p.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The cmd will be aborted on the */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* next emlxs_fct_cmd_acquire */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* because EMLXS_FCT_ABORT_INP is set. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Try to send abort request */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(pkt = emlxs_pkt_alloc(port, 0, 0, 0, KM_NOSLEEP))) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Unable to allocate packet. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "fct_cmd=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The cmd will be aborted on the */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* next emlxs_fct_cmd_acquire anyway */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* because EMLXS_FCT_ABORT_INP is set. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan sbp = emlxs_fct_pkt_init(port, fct_cmd, pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_tran_type = FC_PKT_OUTBOUND;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_timeout =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_comp = emlxs_fct_abort_pkt_comp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(fct_cmd->cmd_rportid);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.r_ctl = R_CTL_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(port->did);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.type = FC_TYPE_BASIC_LS;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.f_ctl =
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.seq_id = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.df_ctl = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.seq_cnt = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.ox_id = fct_cmd->cmd_oxid;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.rx_id = fct_cmd->cmd_rxid;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.ro = 0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make sure xrip is setup */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!sbp->xrip || sbp->xrip->state == XRI_STATE_FREE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to acquire xri. (xid:%x,%x)",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_oxid, fct_cmd->cmd_rxid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_pkt_free(pkt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (FCT_NOT_FOUND);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_cmd = fct_cmd;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->abort_attempts++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now disassociate the sbp / pkt from the fct_cmd */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan sbp->fct_cmd = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->state >= FC_LINK_UP) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: ABORT: %p xid:%x,%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, fct_cmd->cmd_oxid, fct_cmd->cmd_rxid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_state = EMLXS_FCT_ABORT_PENDING;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: CLOSE: %p xid:%x,%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd, fct_cmd->cmd_oxid, fct_cmd->cmd_rxid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_state = EMLXS_FCT_CLOSE_PENDING;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Unable to send abort packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_pkt_free(pkt);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The cmd will be aborted on the */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* next emlxs_fct_cmd_acquire anyway */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* because EMLXS_FCT_ABORT_INP is set. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Unexpected fct_state. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd=%p state=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, cmd_sbp->fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The cmd will be aborted on the */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* next emlxs_fct_cmd_acquire anyway */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* because EMLXS_FCT_ABORT_INP is set. */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* switch */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathanabort_done:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_ABORT_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FCT_ABORT_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_abort() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_link_up(emlxs_port_t *port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up port %p fct flags x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_port, port->fct_flags);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->fct_port &&
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (port->fct_flags & FCT_STATE_PORT_ONLINE) &&
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte !(port->fct_flags & FCT_STATE_LINK_UP)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up event.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_flags &= ~FCT_STATE_LINK_UP_ACKED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_flags &= ~FCT_STATE_FLOGI_CMPL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags |= FCT_STATE_LINK_UP;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_handle_event LINK_UP");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_handle_event) (port->fct_port, FCT_EVENT_LINK_UP,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->vpi == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up event. FCT port offline (%x). "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Disable link.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_flags);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Take link down and hold it down */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_reset_link(hba, 0, 1);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up event. FCT port offline (%x).",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_flags);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_link_up() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteextern void
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_link_down(emlxs_port_t *port)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_hba_t *hba = HBA;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_down port %p fct flags x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_port, port->fct_flags);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (port->fct_port &&
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (port->fct_flags & FCT_STATE_PORT_ONLINE) &&
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (port->fct_flags & FCT_STATE_LINK_UP)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_down event.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_flags &= ~FCT_STATE_LINK_UP_ACKED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_flags &= ~FCT_STATE_FLOGI_CMPL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->fct_flags &= ~FCT_STATE_LINK_UP;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_handle_event LINK_DOWN");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_handle_event) (port->fct_port, FCT_EVENT_LINK_DOWN,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan 0, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mutex_exit(&EMLXS_PORT_LOCK);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_link_down() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldvoid
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_abort_fct_exchange(emlxs_hba_t *hba, emlxs_port_t *port, uint32_t rxid)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CHANNEL *cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCBQ *iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCB *iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rxid == 0 || rxid == 0xFFFF) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Aborting FCT exchange: xid=%x", rxid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_unreserve_xri(port, rxid, 1) == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* We have no way to abort unsolicited exchanges */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* that we have not responded to at this time */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* So we will return for now */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp = &hba->chan[hba->channel_fcp];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_FCTAB_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create the abort IOCB */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->state >= FC_LINK_UP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = emlxs_create_abort_xri_cx(port, NULL, rxid, cp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CLASS3, ABORT_TYPE_ABTS);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = emlxs_create_close_xri_cx(port, NULL, rxid, cp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_FCTAB_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (iocbq) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb = &iocbq->iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Aborting FCT exchange: xid=%x iotag=%d", rxid,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPIOTAG);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_SLI_ISSUE_IOCB_CMD(hba, cp, iocbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_abort_fct_exchange() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_stmf_alloc(emlxs_hba_t *hba, MATCHMAP *mp)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stmf_data_buf_t *db;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mp->tag < MEM_FCTSEG) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db = MODSYM(stmf_alloc) (STMF_STRUCT_DATA_BUF, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "stmf_alloc:%p iotag=%d phys %p virt %p sz %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db, mp->tag, mp->phys, mp->virt, mp->size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (db == NULL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "emlxs_fct_stmf_alloc: alloc failed.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db->db_port_private = (void*)mp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db->db_sglist[0].seg_addr = mp->virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db->db_sglist[0].seg_length = mp->size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db->db_buf_size = mp->size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db->db_sglist_length = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp->fct_private = (void*)db;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_stmf_alloc() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* ARGSUSED */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_stmf_free(emlxs_hba_t *hba, MATCHMAP *mp)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stmf_data_buf_t *db;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mp->tag < MEM_FCTSEG) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db = (stmf_data_buf_t *)mp->fct_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp->fct_private = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (db == NULL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "stmf_free:%p iotag=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db, mp->tag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MODSYM(stmf_free) (db);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_stmf_free() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_memseg_init(emlxs_hba_t *hba)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld char **arrayp = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t cnt = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld char buf[32];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t rval;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint8_t *datap;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int fct_memseg_cnt = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int numblks;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int memsize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_memseg_t *fct_memseg = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t fct_memseg_size = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_memseg_t *current;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_memseg_t *next;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_memseg_t *seg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_memseg = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_memseg_cnt = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for the per adapter setting */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf, sizeof (buf), "%s%d-fct-bufpool", DRIVER_NAME,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->ddiinst);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = ddi_prop_lookup_string_array(DDI_DEV_T_ANY, hba->dip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (DDI_PROP_DONTPASS), buf, &arrayp, &cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rval != DDI_PROP_SUCCESS) || !cnt || !arrayp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for the global setting */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld arrayp = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = ddi_prop_lookup_string_array(DDI_DEV_T_ANY, hba->dip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (DDI_PROP_DONTPASS), "fct-bufpool", &arrayp, &cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rval != DDI_PROP_SUCCESS) || !cnt || !arrayp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto default_config;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_size = cnt * sizeof (emlxs_memseg_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg = kmem_zalloc(fct_memseg_size, KM_SLEEP);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!fct_memseg) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to alloc fct_memseg. cnt=%d. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Trying default config.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto default_config;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < cnt; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld datap = (uint8_t *)arrayp[i];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (datap == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld while (*datap == ' ') { /* Skip spaces */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld datap++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld memsize = emlxs_str_atoi(datap);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld while ((*datap != ':') && (*datap != 0)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld datap++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (*datap == ':') { /* Skip past delimeter */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld datap++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld while (*datap == ' ') { /* Skip spaces */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld datap++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = emlxs_str_atoi(datap);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for a bad entry */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!memsize || !numblks) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct-bufpool: Entry %d:%d. Invalid.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld memsize, numblks);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[fct_memseg_cnt].fc_memsize = memsize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[fct_memseg_cnt].fc_numblks = numblks;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_cnt++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct-bufpool: Entry:%d %d:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_cnt, memsize, numblks);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!fct_memseg_cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld kmem_free(fct_memseg, fct_memseg_size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_size = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfelddefault_config:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* If buffer list is empty, setup defaults */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!fct_memseg) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_size = 8 * sizeof (emlxs_memseg_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg = kmem_zalloc(fct_memseg_size, KM_SLEEP);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!fct_memseg) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to alloc default port buffer pool. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_memseg_cnt=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_2K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 2 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_2K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_4K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 4 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_4K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_8K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 8 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_8K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_16K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 16 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_16K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_32K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 32 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_32K;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_64K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 64 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_64K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_128K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 128 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_128K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld numblks = FCT_BUF_COUNT_256K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (numblks) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i].fc_memsize = 256 * 1024;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_256K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_cnt = i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_memseg = kmem_zalloc((fct_memseg_cnt *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (emlxs_memseg_t)), KM_SLEEP);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!port->fct_memseg) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to alloc port buffer pool. fct_memseg_cnt=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld kmem_free(fct_memseg, fct_memseg_size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize port bucket list */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_memseg_cnt = fct_memseg_cnt;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Sort the entries smallest to largest */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = port->fct_memseg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < fct_memseg_cnt; i++, seg++) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find next smallest buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld current = fct_memseg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld next = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (j = 0; j < fct_memseg_cnt; j++, current++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (current->fc_memsize == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (next == NULL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld next = current;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (current->fc_memsize < next->fc_memsize) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld next = current;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Save next entry */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_memsize = next->fc_memsize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_numblks = next->fc_numblks;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld next->fc_memsize = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld next->fc_numblks = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld kmem_free(fct_memseg, fct_memseg_size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Complete the initialization */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = port->fct_memseg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < port->fct_memseg_cnt; i++, seg++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* seg->fc_memsize = ; Already setup */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* seg->fc_numblks = ; Already setup */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(seg->fc_label, sizeof (seg->fc_label),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCT_DMEM_%d", seg->fc_memsize);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_memtag = MEM_FCTSEG + i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_memflag = FC_MBUF_DMA | FC_MBUF_SNGLSG;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_memalign = 32;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_hi_water = 0xFFFF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_lo_water = seg->fc_numblks;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_numblks = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_step = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_memseg_init() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldfct_status_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_dmem_init(emlxs_port_t *port)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_memseg_t *seg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int32_t i;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initialize the fct memseg list */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_fct_memseg_init(hba);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!port->fct_memseg || !port->fct_memseg_cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dmem_init: fct_memseg list is empty.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (FCT_FAILURE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create the DMA buffer pools */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = port->fct_memseg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < port->fct_memseg_cnt; i++, seg++) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_mem_pool_create(hba, seg);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (seg->fc_numblks < seg->fc_lo_water) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mem_alloc_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: count=%d size=%d flags=%x lo=%d hi=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_label, seg->fc_numblks,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_memsize, seg->fc_memflag, seg->fc_lo_water,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_hi_water);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (FCT_SUCCESS);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_dmem_init */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldvoid
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_dmem_fini(emlxs_port_t *port)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_memseg_t *seg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!port->fct_memseg || !port->fct_memseg_cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dmem_fini: fct_memseg list is empty.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Destroy the dmem buffer pools */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = port->fct_memseg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < port->fct_memseg_cnt; i++, seg++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_mem_pool_destroy(hba, seg);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Clear the segment space */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld kmem_free(port->fct_memseg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (port->fct_memseg_cnt * sizeof (emlxs_memseg_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_memseg = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_memseg_cnt = 0;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_dmem_fini */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/*ARGSUSED*/
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic stmf_data_buf_t *
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_dbuf_alloc(fct_local_port_t *fct_port, uint32_t size,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte uint32_t *pminsize, uint32_t flags)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_memseg_t *seg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stmf_data_buf_t *db;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MATCHMAP *mp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t minsize = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!port->fct_memseg || !port->fct_memseg_cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check if our largest buffer is too small */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = &port->fct_memseg[port->fct_memseg_cnt-1];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (size > seg->fc_memsize) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto partial_alloc;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find smallest available buffer >= size */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = port->fct_memseg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < port->fct_memseg_cnt; i++, seg++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (seg->fc_memsize < size) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte continue;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp = (MATCHMAP*)emlxs_mem_pool_get(hba, seg);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto success;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = &port->fct_memseg[port->fct_memseg_cnt-1];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldpartial_alloc:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find largest available buffer >= *pminsize */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = port->fct_memseg_cnt-1; i >= 0; i--, seg--) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (seg->fc_memsize < *pminsize) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld minsize = seg->fc_memsize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp = (MATCHMAP*)emlxs_mem_pool_get(hba, seg);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto success;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldfailed:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *pminsize = minsize;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte TGTPORTSTAT.FctNoBuffer++;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_alloc:Failed. size=%d minsize=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld size, *pminsize);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte return (NULL);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldsuccess:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Setup the data buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db = (stmf_data_buf_t *)mp->fct_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db->db_data_size = min(size, mp->size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_alloc:%p iotag=%d size=%d,%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db, mp->tag, size, mp->size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (db);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_dbuf_alloc() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/*ARGSUSED*/
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_dbuf_free(fct_dbuf_store_t *fds, stmf_data_buf_t *db)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = (emlxs_port_t *)fds->fds_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MATCHMAP *mp = (MATCHMAP *)db->db_port_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!mp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_free:%p NULL mp found!",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_free:%p iotag=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db, mp->tag);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mem_pool_put(hba, mp->segment, (void *)mp);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_dbuf_free() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathanstatic int
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_dbuf_dma_sync(emlxs_hba_t *hba, stmf_data_buf_t *db,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan uint_t sync_type)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte{
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MATCHMAP *mp = (MATCHMAP *)db->db_port_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!mp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_dma_sync:%p NULL mp found!",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_API_TRACE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld char buf[16];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_dma_sync:%p iotag=%d size=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db, mp->tag, db->db_data_size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf, sizeof (buf), "TAG%d:", mp->tag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, buf, (uint32_t *)db->db_sglist[0].seg_addr,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 36, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld}
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MPDATA_SYNC(mp->dma_handle, 0, db->db_data_size, sync_type);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_fm_check_dma_handle(hba, mp->dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_dma_sync:%p iotag=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db, mp->tag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_dbuf_dma_sync() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* SFCT_SUPPORT */