fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * CDDL HEADER START
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.
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 * 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 * CDDL HEADER END
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Use is subject to license terms.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_fct_memseg_init(emlxs_hba_t *hba);
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,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic emlxs_buf_t *emlxs_fct_cmd_init(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_fct_cmd_done(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_fct_cmd_post(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic fct_status_t emlxs_fct_flogi_xchg(struct fct_local_port *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_get_link_info(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic fct_status_t emlxs_fct_deregister_remote_port(fct_local_port_t *fct_port,
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,
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,
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);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_fct_populate_hba_details(fct_local_port_t *fct_port,
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 Fortestatic fct_status_t emlxs_fct_dmem_init(emlxs_port_t *port);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Fortestatic void emlxs_fct_dmem_fini(emlxs_port_t *port);
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);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathanstatic int emlxs_fct_dbuf_dma_sync(emlxs_hba_t *hba, stmf_data_buf_t *dbuf,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanstatic emlxs_buf_t *emlxs_fct_pkt_init(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_fct_unsol_flush_thread(emlxs_hba_t *hba, void *arg1,
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,
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 Swaminathanuint8_t *emlxs_iotrace = 0; /* global for mdb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * FCT_CMD (cmd_sbp->fct_state)
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 * EMLXS_FCT_CMD_POSTED Lock Released COMSTAR
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * EMLXS_FCT_OWNED Lock Released COMSTAR
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 * 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 * COMSTAR OWNED DRIVER OWNED
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * ------------- ---------------------------------------------------
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * ------- > @ Accept---- >Release @ Acquire--- >+
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * < ------- @ Post/Done< ----Acquire @ Release< ---+
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * @ :Indicates COMSTAR use of emlxs_fct_abort()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Abort requests set the EMLXS_FCT_ABORT_INP flag.
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()
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_io_trace(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint32_t data)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New entry */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < iotrace_cnt; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New entry already exists */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: New entry already exists: fct_cmd: %p",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < iotrace_cnt; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (iop == (port->iotrace + iotrace_cnt))
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* No new slots available */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: No new slots: fct_cmd: %p data: %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bzero((uint8_t *)iop, sizeof (emlxs_iotrace_t));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < iotrace_cnt; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Cannot find existing slot for fct_cmd */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: Missing slot: fct_cmd: %p data: %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* trc overrun for fct_cmd */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IOTRACE: trc overrun slot: fct_cmd: %p data: %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* xri mismatch for fct_cmd */
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 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) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_io_trace() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_IO_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Comstar (fct) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.mod_fct = ddi_modopen("drv/fct", KRTLD_MODE_FIRST, &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN, "?%s: ddi_modopen drv/fct failed: err %d",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Comstar (stmf) */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ddi_modopen("drv/stmf", KRTLD_MODE_FIRST, &err);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmn_err(CE_WARN, "?%s: ddi_modopen drv/stmf failed: err %d",
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 "?%s: drv/fct: fct_alloc not present", DRIVER_NAME);
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 "?%s: drv/fct: fct_free not present", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_scsi_task_alloc is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void *(*)(void *, uint16_t, uint32_t, uint8_t *,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint16_t, uint16_t))ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_scsi_task_alloc == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_scsi_task_alloc not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_register_local_port is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (int (*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_register_local_port == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_register_local_port not present",
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,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_deregister_local_port == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_deregister_local_port not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_handle_event is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct, "fct_handle_event",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_handle_event == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_handle_event not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_post_rcvd_cmd is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct, "fct_post_rcvd_cmd",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_post_rcvd_cmd == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_post_rcvd_cmd not present",
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 "?%s: drv/fct: fct_ctl not present", DRIVER_NAME);
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 if ((void *)emlxs_modsym.fct_queue_cmd_for_termination == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_queue_cmd_for_termination not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_send_response_done is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_send_response_done == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_send_response_done not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_send_cmd_done is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct, "fct_send_cmd_done",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_send_cmd_done == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_send_cmd_done not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_scsi_xfer_data_done is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_scsi_data_xfer_done == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_scsi_data_xfer_done not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_port_shutdown is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_status_t(*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_port_shutdown == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_port_shutdown not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_port_initialize is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_status_t(*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_port_initialize == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_port_initialize not present",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check if the fct fct_cmd_fca_aborted is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_fct,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((void *)emlxs_modsym.fct_cmd_fca_aborted == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "?%s: drv/fct: fct_cmd_fca_aborted not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the fct fct_handle_rcvd_flogi is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_status_t(*)())ddi_modsym(emlxs_modsym.mod_fct,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.fct_handle_rcvd_flogi == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/fct: fct_handle_rcvd_flogi not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Comstar (stmf) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the stmf stmf_alloc is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void *(*)())ddi_modsym(emlxs_modsym.mod_stmf, "stmf_alloc",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/stmf: stmf_alloc not present", DRIVER_NAME);
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 "?%s: drv/stmf: stmf_free not present", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the stmf stmf_deregister_port_provider is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void (*)())ddi_modsym(emlxs_modsym.mod_stmf,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.stmf_deregister_port_provider == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/stmf: stmf_deregister_port_provider not present",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if the stmf stmf_register_port_provider is present */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (int (*)())ddi_modsym(emlxs_modsym.mod_stmf,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if ((void *)emlxs_modsym.stmf_register_port_provider == NULL) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "?%s: drv/stmf: stmf_register_port_provider not present",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_modopen() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_queue_cmd_for_termination = NULL;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_modsym.fct_cmd_fca_aborted = NULL;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_modsym.stmf_deregister_port_provider = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_modclose() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* MODSYM_SUPPORT */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan * This routine is called to handle an unsol FLOGI exchange
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 Swaminathanemlxs_fct_handle_unsol_flogi(emlxs_port_t *port, fct_flogi_xchg_t *fx,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if there is an old saved FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Get it now */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bcopy(&port->fx, &fxchg, sizeof (fct_flogi_xchg_t));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Save new FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bcopy(fx, &port->fx, sizeof (fct_flogi_xchg_t));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Reject old stale FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bzero(&port->fx, sizeof (fct_flogi_xchg_t));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan } else if (!fx) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Nothing to do, just return */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* We have a valid FLOGI here */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* There is no saved FLOGI at this point either */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if COMSTAR is ready to accept it */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (port->fct_flags & FCT_STATE_LINK_UP_ACKED) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bzero((uint8_t *)&iocbq, sizeof (IOCBQ));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.un.elsreq.remoteID = fx->fx_sid;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.ULPCONTEXT = (uint16_t)fx->rsvd2;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx->rsvd2 = 0; /* Clear the reserved field now */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan status = MODSYM(fct_handle_rcvd_flogi) (port->fct_port, fx);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "fct_handle_rcvd_flogi %p: status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan } else { /* ELS_OP_LSRJT */
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 /* Save FLOGI for later */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bcopy(fx, &port->fx, sizeof (fct_flogi_xchg_t));
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 bzero((uint8_t *)&iocbq, sizeof (IOCBQ));
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan iocbq.iocb.un.elsreq.remoteID = fx->fx_sid;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* If we have an FLOGI saved, try sending it now */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan "FLOGI: sid=%x xid=%x. Link down. "
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan} /* emlxs_fct_handle_unsol_flogi() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* ARGSUSED */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_unsol_flush_thread(emlxs_hba_t *hba, void *arg1, void *arg2)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_unsol_flush_thread() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* This is called at port online and offline */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* First handle any pending FLOGI */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_handle_unsol_flogi(port, NULL, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((port->fct_flags & FCT_STATE_LINK_UP_ACKED) &&
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Wait queue */
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.
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan cmd_code = (fct_cmd->cmd_oxid << ELS_CMD_SHIFT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
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 fct_cmd->cmd_rxid, fct_cmd->cmd_rportid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Posting %s: sid=%x xid=%x %p",
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fct_cmd->cmd_rportid, fct_cmd->cmd_rxid,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } /* while () */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_unsol_flush() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_is_digit */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Convert an ASCII decimal numeric string to integer.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Negation character '-' is not handled.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte while (string[i]) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_str_atoi() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if COMSTAR is present */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_attach_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Comstar not present.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_init() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Bind the physical port */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Bind virtual ports */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (vpi = 1; vpi <= hba->vpi_high; vpi++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_attach() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < MAX_VPORTS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (port->iotrace_cnt * sizeof (emlxs_iotrace_t)));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_IO_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_detach() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Destroy & flush all port nodes, if they exist */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) EMLXS_SLI_UNREG_NODE(port, NULL, NULL, NULL, NULL);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_deregister_local_port) (port->fct_port);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "stmf_deregister_port_provider:1 %p",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_deregister_port_provider) (port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(node_name, sizeof (node_name), "%d,%d:SFCT",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) ddi_remove_minor_node(hba->dip, node_name);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_unbind_port() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Perform generic port initialization */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port->cfd_name, sizeof (port->cfd_name),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port->cfd_name, sizeof (port->cfd_name),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s%d.%d", DRIVER_NAME, hba->ddiinst, port->vpi);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate fct memory.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_alloc) (STMF_STRUCT_PORT_PROVIDER, 0, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "stmf_alloc port_provider %p", port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate port provider.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port->port_provider->pp_portif_rev = PORTIF_REV_1;
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) !=
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to register port provider.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_local_port_t *)MODSYM(fct_alloc) (FCT_STRUCT_LOCAL_PORT, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate fct port.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (fct_dbuf_store_t *)MODSYM(fct_alloc) (FCT_STRUCT_DBUF_STORE, 0,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_alloc port_fds %p", port->fct_port->port_fds);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to allocate dbuf store.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(node_name, sizeof (node_name), "%d,%d:SFCT",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (ddi_create_minor_node(hba->dip, node_name, S_IFCHR, hba->ddiinst,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Unable to create SFCT device node.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Intialize */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_fca_abort_timeout = 30 * 1000; /* 30 seconds */
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);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(fct_port->port_nwwn_str, FC_WWN_BUFLEN,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%02x%02x%02x%02x%02x%02x%02x%02x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(fct_port->port_pwwn_str, FC_WWN_BUFLEN,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%02x%02x%02x%02x%02x%02x%02x%02x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_hard_address = cfg[CFG_ASSIGN_ALPA].current;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_port->port_max_logins = hba->max_nodes + EMLXS_FCT_NUM_ELS_ONLY;
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan (cfg[CFG_FCT_QDEPTH].current < hba->io_throttle)) {
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan fct_port->port_max_xchges = cfg[CFG_FCT_QDEPTH].current;
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_xfer_scsi_data = emlxs_fct_send_fcp_data;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_port->port_send_cmd_response = emlxs_fct_send_cmd_rsp;
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;
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 = ; */
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) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bind_port: Unable to register fct port.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Set the bound flag */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) ddi_remove_minor_node(hba->dip, node_name);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "stmf_deregister_port_provider:2 %p",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(stmf_deregister_port_provider) (port->port_provider);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Target mode disabled.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_bind_port() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_port_info(uint32_t cmd, fct_local_port_t *fct_port, void *arg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
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));
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 if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "FC_TGT_PORT_RLS: Unable to send request.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status = (fct_port_link_status_t *)buffer;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->PrimitiveSeqProtocolErrorCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan link_status->InvalidTransmissionWordCount =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_port_info: Invalid request. cmd=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_port_info() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_populate_hba_details(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->manufacturer, "Emulex",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->serial_number, vpd->serial_num,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->model, hba->model_info.model,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(port_attrs->model_description,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(port_attrs->hardware_version,
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 (void) strncpy(port_attrs->driver_name, DRIVER_NAME,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((hba->model_info.device_id << 16) | PCI_VENDOR_ID_EMULEX);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan port_attrs->supported_cos = LE_SWAP32(FC_NS_CLASS3);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port_attrs->supported_speed |= PORT_SPEED_16G;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_10G;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_8G;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_4G;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_2G;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan port_attrs->supported_speed |= PORT_SPEED_1G;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: manufacturer = %s", port_attrs->manufacturer);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: serial_num = %s", port_attrs->serial_number);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: model_description = %s",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: hardware_version = %s",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: driver_version = %s", port_attrs->driver_version);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: option_rom_version = %s",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: firmware_version = %s",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: driver_name = %s", port_attrs->driver_name);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: vendor_specific_id = 0x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: supported_cos = 0x%x",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "Port attr: supported_speed = 0x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Port attr: max_frame_size = 0x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_populate_hba_details() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_ctl(fct_local_port_t *fct_port, int cmd, void *arg)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
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 "STATE: ONLINE chk");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE --> ONLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Try to bring the link up */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: ONLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE chk");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: ONLINE --> OFFLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Take link down and flush */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Declare this port offline now */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Take link down and hold it down */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: OFFLINE ack");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "STATE: ONLINE ack");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_ctl: FCT_CMD_FORCE_LIP.");
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 /* Reset the adapter */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_ctl: FCT_CMD_FORCE_LIP");
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Reset the link */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_reset(port, FC_FCA_LINK_RESET);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_ctl() */
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,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_port_shutdown failed to ACK");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_port_initialize");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_port_initialize) (fct_port, STMF_RFLAG_STAY_OFFLINED,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_port_initialize failed to ACK");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port = (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_fca_private, fct_cmd->cmd_type);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd: Invalid cmd type found. type=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_cmd() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_cmd_rsp(fct_cmd_t *fct_cmd, uint32_t ioflags)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte port = (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_accept(port, fct_cmd, EMLXS_FCT_SEND_CMD_RSP);
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
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 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((iocb->ULPCT == 0x1) && (status == 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Firmware already sent out resp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_SEND_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "fct_send_response_done:4 %p: x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MODSYM(fct_send_response_done) (fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd->cmd_comp_status, FCT_IOF_FCA_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan rval = emlxs_fct_send_fcp_status(fct_cmd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_rsp: Invalid cmd type found. type=%x",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_rsp: "
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to handle FCT_IOF_FORCE_FCA_DONE. type=%x",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_cmd_rsp() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_flogi_xchg(struct fct_local_port *fct_port, struct fct_flogi_xchg *fx)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: Sending FLOGI: %p", fct_port);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: Sending FLOGI.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. Link down.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use this entry point as the link up acknowledgment */
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.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* First handle any pending FLOGI's */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, size, size, 0, KM_NOSLEEP))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable allocate packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Make this a polled IO */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(fx->fx_did);
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.f_ctl = F_CTL_FIRST_SEQ | F_CTL_SEQ_INITIATIVE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the command */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Service paramters will be added automatically later by the driver */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to send packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if ((pkt->pkt_state == FC_PKT_LOCAL_RJT) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_flogi_xchg: FLOGI failed. state=%x reason=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "rval=%llx", pkt->pkt_state, pkt->pkt_reason, rval);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else { /* FC_PKT_SUCCESS */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rval == FCT_SUCCESS) || (rval == FCT_NOT_FOUND)) {
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 * Flush all unsolicited commands
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Must use separate thread since
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * this thread must complete first
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_thread_spawn(hba, emlxs_fct_unsol_flush_thread,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_flogi_xchg() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* This is called right after we report that link has come online */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_get_link_info(fct_local_port_t *fct_port, fct_link_info_t *link)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
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);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (hba->state < FC_LINK_UP) || (hba->flag & FC_LOOPBACK_MODE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte link->port_topology = PORT_TOPOLOGY_PRIVATE_LOOP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_get_link_info() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
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 emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = &hba->chan[hba->channel_els];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_accept(port, fct_cmd,
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",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
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);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for unsolicited PLOGI */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cmd_sbp->fct_flags & EMLXS_FCT_PLOGI_RECEIVED) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sp = (SERV_PARM *)((caddr_t)els->els_req_payload +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else { /* Solicited PLOGI */
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 * We already received the remote port's
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * parameters in the FLOGI exchange
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(cmd_sbp->fct_flags & EMLXS_FCT_PLOGI_RECEIVED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((caddr_t)&port->fabric_sparam, (caddr_t)sp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Since this is a PLOGI, not a FLOGI, we need
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * to fix up word2 of the CSP accordingly.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sp->cmn.w2.r_a_tov = port->sparam.cmn.w2.r_a_tov;
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 /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create a new node */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (EMLXS_SLI_REG_DID(port, fct_cmd->cmd_rportid, sp, cmd_sbp,
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 /* Wait for completion */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (cmd_sbp->fct_state == EMLXS_FCT_REG_PENDING) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(cmd_sbp->fct_flags & EMLXS_FCT_REGISTERED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reacquire ownership of the fct_cmd */
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Prepare response */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *((emlxs_node_t **)remote_port->rp_fca_private) =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* The SCR handle is hardcoded */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 1; i < EMLXS_FCT_NUM_ELS_ONLY; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Bit is not set, so use this
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * for the handle
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: lid=%x rid=%x hdl=%x",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *((emlxs_node_t **)remote_port->rp_fca_private) = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_register_remote_port: failed. lid=%x rid=%x hdl=%x",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_register_remote_port() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_deregister_remote_port(fct_local_port_t *fct_port,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_deregister_remote_port: did=%x hdl=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_deregister_remote_port: did=%x hdl=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (remote_port->rp_handle >= hba->max_nodes) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore ndlp = *((emlxs_node_t **)remote_port->rp_fca_private);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *((emlxs_node_t **)remote_port->rp_fca_private) = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) EMLXS_SLI_UNREG_NODE(port, ndlp, NULL,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_deregister_remote_port() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_unsol_req(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ndlp = emlxs_node_find_rpi(port, iocb->ULPIOTAG);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP rcvd: Unknown RPI. rpi=%d rxid=%x. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP rcvd: Target unbound. rpi=%d rxid=%x. Dropping...",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP rcvd: Target offline. rpi=%d rxid=%x. Dropping...",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Get lun id */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (TGTPORTSTAT.FctOutstandingIO >= port->fct_port->port_max_xchges) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MODSYM(fct_scsi_task_alloc) (port->fct_port, hdl, sid, lun, 16, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "FCP rcvd: sid=%x xid=%x. "
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to allocate scsi task. Returning QFULL.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_fct_send_qfull_reply(port, ndlp, iocb->ULPCONTEXT,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Initialize fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_FCP_CMD_RECEIVED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
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#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Initialize cmd_sbp */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->ticks = hba->timer_tics + (2 * hba->fc_ratov);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* xrip was setup / passed in from the SLI layer */
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#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd->cmd_oxid = iocb->unsli3.ext_rcv.oxid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_task = (scsi_task_t *)fct_cmd->cmd_specific;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set task_flags */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* task_mgmt_function */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_ABORT_TASK_SET;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_CLEAR_TASK_SET;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_task->task_mgmt_function = TM_TARGET_COLD_RESET;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Parallel buffers support - future */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((void *)&fcp_cmd->fcpCdb, fct_task->task_cdb, 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_unsol_req() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_send_fcp_data(fct_cmd_t *fct_cmd, stmf_data_buf_t *dbuf,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_accept(port, fct_cmd, EMLXS_FCT_SEND_FCP_DATA);
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
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;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan channelno = ((CHANNEL *)cmd_sbp->channel)->channelno;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_data %p:%p flgs=%x ioflags=%x dl=%d,%d,%d,%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_task->task_nbytes_transferred, dbuf->db_data_size,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Setup for I/O prep routine */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_PREP_FCT_IOCB(port, cmd_sbp, channel) != IOERR_SUCCESS) {
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_DATA_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_SLI_ISSUE_IOCB_CMD(hba, cmd_sbp->channel, iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_fcp_data() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be released before exiting */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ndlp = *(emlxs_node_t **)fct_cmd->cmd_rp->rp_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Initialize cmd_sbp */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, EMLXS_FCT_SEND_FCP_STATUS);
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 if (!(pkt = emlxs_pkt_alloc(port, size, 0, 0, KM_NOSLEEP))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_status: Unable to allocate packet.");
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp = emlxs_fct_pkt_init(port, fct_cmd, pkt);
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 /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(port->did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the status payload */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_status_ctrl & TASK_SCTRL_OVER) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspResId = LE_SWAP32(fct_task->task_resid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte } else if (fct_task->task_status_ctrl & TASK_SCTRL_UNDER) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspResId = LE_SWAP32(fct_task->task_resid);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (fct_task->task_scsi_status == SCSI_STAT_QUE_FULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Make sure residual reported on non-SCSI_GOOD READ status */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspSnsLen = LE_SWAP32(fct_task->task_sense_length);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fcp_rsp->rspStatus3 = fct_task->task_scsi_status;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "RESP", (uint32_t *)fcp_rsp, 36, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_STATUS_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_fcp_status: Unable to send packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_fcp_status() */
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)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp = &hba->chan[hba->CHANNEL_FCT];
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, size, 0, 0, KM_NOSLEEP))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_qfull_reply: Unable to allocate packet.");
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(ndlp->nlp_DID);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(port->did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_qfull_reply: Sending QFULL: x%x lun x%x: %d %d",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the status payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fcp_rsp->rspResId = LE_SWAP32(fcp_cmd->fcpDl);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_qfull_reply: Unable to send packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_qfull_reply() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_fcp_event(emlxs_hba_t *hba, CHANNEL *cp, IOCBQ *iocbq)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* completion with missing xmit command */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* emlxs_stray_fcp_completion_msg */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP event cmd=%x status=%x error=%x iotag=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.grsp.perr.statLocalError, iocb->ULPIOTAG);
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 */
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) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, EMLXS_FCT_REQ_COMPLETE);
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * The error indicates this IO should be terminated
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * immediately.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_SEND_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "fct_queue_cmd_for_termination:1 %p: x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_queue_cmd_for_termination) (fct_cmd,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * FCP Data completion
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (dbuf->db_flags & DB_DIRECTION_FROM_RPORT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((cmd_sbp->fct_flags & EMLXS_FCT_SEND_STATUS) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_fct_send_fcp_status(fct_cmd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Auto-resp has been sent out by firmware */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* We can assume this is really a FC_TRSP_CX */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_SEND_STATUS;
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_scsi_data_xfer_done:1 %p %p", fct_cmd, dbuf);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte MODSYM(fct_scsi_data_xfer_done) (fct_cmd, dbuf, 0);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* FCP Status completion */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy these before calling emlxs_fct_cmd_done */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fct_flags & EMLXS_FCT_SEND_STATUS) {
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 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_response_done:1 %p: x%x outio %d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid iocb: cmd=0x%x", iocb->ULPCOMMAND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } /* switch(iocb->ULPCOMMAND) */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_fcp_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_abort(emlxs_hba_t *hba, CHANNEL *cp, IOCBQ *iocbq)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* completion with missing xmit command */
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->un.grsp.perr.statLocalError, iocb->ULPIOTAG);
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 iocb->ULPCONTEXT, iocb->ULPCOMMAND, iocb->ULPSTATUS);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
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 (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 /* Abort retry */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_abort() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_handle_unsol_els(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x. Adapter offline. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x. Target unbound. Accepting...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_els_reply(port, iocbq, ELS_CMD_ACC,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x. Target unbound. Rejecting...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_code, LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "%s: sid=%x. Target offline. Rejecting...",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT, cmd_code,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: sid=%x cnt=%d. Target rcv. ",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Process the request */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan rval = emlxs_fct_process_unsol_flogi(port, cp, iocbq, mp, size);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan bzero((uint8_t *)&fx, sizeof (fct_flogi_xchg_t));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Save the FLOGI exchange information */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bcopy((caddr_t)&els_pkt->un.logi.nodeName,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bcopy((caddr_t)&els_pkt->un.logi.portName,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan fx.fx_fport = els_pkt->un.logi.cmn.fPort;
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_handle_unsol_flogi(port, &fx, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_process_unsol_plogi(port, cp, iocbq, mp, size);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "%s: sid=0x%x", emlxs_elscmd_xlate(cmd_code), sid);
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)),
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_alloc %p: ELS rcvd: rxid=%x payload: x%x x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd, iocb->ULPCONTEXT, *ptr, *(ptr + 1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "%s: sid=%x. Out of memory. Rejecting...",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT, cmd_code,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Initialize fct_cmd */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte fct_cmd->cmd_oxid = (cmd_code >> ELS_CMD_SHIFT) & 0xff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_ELS_CMD_RECEIVED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Initialize cmd_sbp */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_PLOGI_RECEIVED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)iocb, (uint8_t *)&cmd_sbp->iocbq,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan GET_BYTE_OFFSET(fct_cmd->cmd_fca_private,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if Offline */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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#endif /* FCT_API_TRACE */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Check if Link up is acked */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->fct_flags & FCT_STATE_LINK_UP_ACKED)) {
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); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_post_rcvd_cmd:1 %p: portid x%x", fct_cmd,
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan#endif /* FCT_API_TRACE */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Defer processing of fct_cmd till later (after link up ack). */
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);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_CMD_WAITQ);
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan /* Add cmd_sbp to queue tail */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_handle_unsol_els() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_process_unsol_flogi(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Perform processing of FLOGI payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_process_unsol_flogi(port, iocbq, mp, size, buffer,
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);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_process_unsol_flogi() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_process_unsol_plogi(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Perform processing of PLOGI payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_process_unsol_plogi(port, iocbq, mp, size, buffer,
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);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_process_unsol_plogi() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* ARGSUSED */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_pkt_init(emlxs_port_t *port, fct_cmd_t *fct_cmd,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_pkt_init() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte/* Mutex will be acquired */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_fct_cmd_init(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint16_t fct_state)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mutex_init(&cmd_sbp->fct_mtx, NULL, MUTEX_DRIVER,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_init(&cmd_sbp->mtx, NULL, MUTEX_DRIVER,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte *(emlxs_node_t **)fct_cmd->cmd_rp->rp_fca_private : NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Flags fct_cmd as inuse */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((fct_cmd->cmd_oxid == 0) && (fct_cmd->cmd_rxid == 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_init() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called after receiving fct_cmd from COMSTAR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_accept(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint16_t fct_state)
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
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 if (!(cmd_sbp->pkt_flags & PACKET_VALID)) {
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 if (cmd_sbp->fct_flags & EMLXS_FCT_ABORT_INP) {
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 emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_ABORT_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(cmd_sbp->pkt_flags & PACKET_ULP_OWNED)) {
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 cmd_sbp->pkt_flags &= ~PACKET_ULP_OWNED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_accept() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called after receiving fct_cmd from driver */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_acquire(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
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 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 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 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:2 "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Bad fct_cmd found! fct_cmd=%p state=%x",
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 if ((cmd_sbp->pkt_flags & PACKET_ULP_OWNED)) {
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 if (cmd_sbp->fct_flags & EMLXS_FCT_ABORT_INP) {
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 if (fct_cmd->cmd_type == FCT_CMD_FCP_XCHG) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_ABORT_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_acquire() */
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 Swaminathanemlxs_fct_cmd_release(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_release() */
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 Swaminathanemlxs_fct_cmd_post(emlxs_port_t *port, fct_cmd_t *fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_post() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Called before completing fct_cmd back to COMSTAR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_fct_cmd_done(emlxs_port_t *port, fct_cmd_t *fct_cmd, uint16_t fct_state)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Flags fct_cmd is no longer used */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Pkt still registered! channel=%p iotag=%d sbp=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel, cmd_sbp->iotag, cmd_sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_unregister_pkt(cmd_sbp->channel,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_cmd_done() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FMA_SUPPORT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, EMLXS_FCT_PKT_COMPLETE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to reacquire fct_cmd.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_IO_INP;
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 * The error indicates this IO should be terminated
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * immediately.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_sbp->fct_flags &= ~EMLXS_FCT_SEND_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_queue_cmd_for_termination:2 %p:%p x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_queue_cmd_for_termination) (fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_response_done:2 %p:%p x%x outio %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: fct_send_response_done. dbuf=%p",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_response_done:3 %p:%p x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_rsplen, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_done:1 %p:%p x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, pkt->pkt_resp_dma)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_FAILURE,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_SUCCESS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_rsplen, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_cmd_done:2 %p:%p x%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, pkt->pkt_resp_dma)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_FAILURE,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_send_cmd_done) (fct_cmd, FCT_SUCCESS,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_pkt_comp: Invalid cmd type found. type=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_done(port, fct_cmd, EMLXS_FCT_IO_DONE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_pkt_comp() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_abort_pkt_comp(fc_packet_t *pkt)
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 iocb->ULPCONTEXT, iocb->ULPCOMMAND, iocb->ULPSTATUS);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_abort_pkt_comp() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT (INDIRECT) */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_send_els_cmd(fct_cmd_t *fct_cmd)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, fct_els->els_req_size,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_cmd: Unable to allocate packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_SEND_ELS_REQ);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = &hba->chan[hba->channel_els];
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;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_cmd: pkt_timeout=%d ratov=%d",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_FIRST_SEQ | F_CTL_END_SEQ | F_CTL_SEQ_INITIATIVE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Copy the cmd payload */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)fct_els->els_req_payload, (uint8_t *)pkt->pkt_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_REQ_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_cmd: Unable to send packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_els_cmd() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be released before exiting */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(pkt = emlxs_pkt_alloc(port, fct_els->els_resp_size, 0, 0,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_rsp: Unable to allocate packet.");
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, EMLXS_FCT_SEND_ELS_RSP);
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 /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
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,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_RSP_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_els_rsp: Unable to send packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_CMD_POSTED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_els_rsp() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT (INDIRECT) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (emlxs_port_t *)fct_cmd->cmd_port->port_fca_private;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (!(pkt = emlxs_pkt_alloc(port, fct_ct->ct_req_size,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_ct_cmd: Unable to allocate packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = emlxs_fct_cmd_init(port, fct_cmd, EMLXS_FCT_SEND_CT_REQ);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->channel = &hba->chan[hba->channel_ct];
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 /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(port->did);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte F_CTL_FIRST_SEQ | F_CTL_END_SEQ | F_CTL_SEQ_INITIATIVE;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Copy the cmd payload */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte bcopy((uint8_t *)fct_ct->ct_req_payload, (uint8_t *)pkt->pkt_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, EMLXS_FCT_REQ_PENDING);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_send_ct_cmd: Unable to send packet.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reacquire ownership of the fct_cmd */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_fct_cmd_acquire(port, fct_cmd, 0);
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 /* mutex_enter(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_post(port, fct_cmd, EMLXS_FCT_OWNED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_send_ct_cmd() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* cmd_sbp->fct_mtx must be held to enter */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_fct_pkt_abort_txq(emlxs_port_t *port, emlxs_buf_t *cmd_sbp)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check the transmit queue */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* The IOCB could point to a cmd_sbp (no packet) or a sbp (packet) */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Find it on the queue */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Search the priority queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next = (IOCBQ *)nlp->nlp_ptx[channelno].q_first;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Remove it */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Search the normal queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next = (IOCBQ *)nlp->nlp_tx[channelno].q_first;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Remove it */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if node still needs servicing */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((nlp->nlp_ptx[channelno].q_first) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan !(nlp->nlp_flag[channelno] & NLP_CLOSED))) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * If this is the base node, don't shift the pointers
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* We want to drain the base node before moving on */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Shift channel queue pointers to next node */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_first = nlp->nlp_next[channelno];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Remove node from channel queue */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* If this is the last node on list */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Remove node from head */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->nodeq.q_first = nlp->nlp_next[channelno];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp_next[channelno] = cp->nodeq.q_first;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Clear node */
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 (void) emlxs_unregister_pkt(cp, iocb_sbp->iotag, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_pkt_abort_txq() */
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 Swaminathanemlxs_fct_abort(fct_local_port_t *fct_port, fct_cmd_t *fct_cmd,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
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,
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",
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.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan delay(drv_usectohz(100000)); /* 100 msec */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* At this point, we have entered the mutex */
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,
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",
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 if (cmd_sbp->fct_flags & EMLXS_FCT_ABORT_INP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_SLI_ISSUE_IOCB_CMD(hba, cmd_sbp->channel, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* If Abort is already in progress */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_sbp->fct_flags |= EMLXS_FCT_ABORT_INP;
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 /* These are on the unsol waitQ in the driver */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Find and remove it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Remove it */
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan /*FALLTHROUGH*/
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 emlxs_abort_fct_exchange(hba, port, fct_cmd->cmd_rxid);
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan emlxs_abort_els_exchange(hba, port, fct_cmd->cmd_rxid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* These are active in the driver */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* They were last processed by emlxs_fct_cmd_release() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Abort anything pending */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (emlxs_fct_pkt_abort_txq(port, cmd_sbp)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (fct_cmd->cmd_type == FCT_CMD_FCP_XCHG) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If we're not online, then all IO will be flushed anyway */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Not online. fct_cmd=%p.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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 /* 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 emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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 sbp = emlxs_fct_pkt_init(port, fct_cmd, pkt);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ((2 * hba->fc_ratov) < 30) ? 30 : (2 * hba->fc_ratov);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_comp = emlxs_fct_abort_pkt_comp;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Build the fc header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.d_id = LE_SWAP24_LO(fct_cmd->cmd_rportid);
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 (F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.ox_id = fct_cmd->cmd_oxid;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pkt->pkt_cmd_fhdr.rx_id = fct_cmd->cmd_rxid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make sure xrip is setup */
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)",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now disassociate the sbp / pkt from the fct_cmd */
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);
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);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, fct_state);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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.");
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_abort: Unexpected fct_state. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_cmd=%p state=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_cmd_release(port, fct_cmd, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
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 } /* switch */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* mutex_exit(&cmd_sbp->fct_mtx); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_abort() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up port %p fct flags x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up event.");
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_flags &= ~FCT_STATE_LINK_UP_ACKED;
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,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (!(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up event. FCT port offline (%x). "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Disable link.",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Take link down and hold it down */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_up event. FCT port offline (%x).",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_link_up() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_down port %p fct flags x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_link_down event.");
e2ca2865a6870e9c6cbef6becbcc68cafde64537Sukumar Swaminathan port->fct_flags &= ~FCT_STATE_LINK_UP_ACKED;
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "fct_handle_event LINK_DOWN");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan MODSYM(fct_handle_event) (port->fct_port, FCT_EVENT_LINK_DOWN,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_link_down() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_abort_fct_exchange(emlxs_hba_t *hba, emlxs_port_t *port, uint32_t rxid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
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 /* Create the abort IOCB */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = emlxs_create_abort_xri_cx(port, NULL, rxid, cp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = emlxs_create_close_xri_cx(port, NULL, rxid, cp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Aborting FCT exchange: xid=%x iotag=%d", rxid,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_abort_fct_exchange() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_stmf_alloc(emlxs_hba_t *hba, MATCHMAP *mp)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld db = MODSYM(stmf_alloc) (STMF_STRUCT_DATA_BUF, 0, 0);
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#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "emlxs_fct_stmf_alloc: alloc failed.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_stmf_alloc() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/* ARGSUSED */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_stmf_free(emlxs_hba_t *hba, MATCHMAP *mp)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "stmf_free:%p iotag=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_stmf_free() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for the per adapter setting */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf, sizeof (buf), "%s%d-fct-bufpool", DRIVER_NAME,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = ddi_prop_lookup_string_array(DDI_DEV_T_ANY, hba->dip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rval != DDI_PROP_SUCCESS) || !cnt || !arrayp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for the global setting */
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 if ((rval != DDI_PROP_SUCCESS) || !cnt || !arrayp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_size = cnt * sizeof (emlxs_memseg_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg = kmem_zalloc(fct_memseg_size, KM_SLEEP);
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 for (i = 0; i < cnt; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (*datap == ':') { /* Skip past delimeter */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for a bad entry */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct-bufpool: Entry %d:%d. Invalid.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[fct_memseg_cnt].fc_memsize = memsize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[fct_memseg_cnt].fc_numblks = numblks;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct-bufpool: Entry:%d %d:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* If buffer list is empty, setup defaults */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg_size = 8 * sizeof (emlxs_memseg_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg = kmem_zalloc(fct_memseg_size, KM_SLEEP);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to alloc default port buffer pool. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_memseg_cnt=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_2K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_4K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_8K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_16K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_32K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_64K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_128K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_memseg[i++].fc_numblks = FCT_BUF_COUNT_256K;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld port->fct_memseg = kmem_zalloc((fct_memseg_cnt *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to alloc port buffer pool. fct_memseg_cnt=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize port bucket list */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Sort the entries smallest to largest */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < fct_memseg_cnt; i++, seg++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find next smallest buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (j = 0; j < fct_memseg_cnt; j++, current++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (current->fc_memsize < next->fc_memsize) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Save next entry */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Complete the initialization */
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 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(seg->fc_label, sizeof (seg->fc_label),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg->fc_memflag = FC_MBUF_DMA | FC_MBUF_SNGLSG;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_memseg_init() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initialize the fct memseg list */
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 /* Create the DMA buffer pools */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < port->fct_memseg_cnt; i++, seg++) {
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_memsize, seg->fc_memflag, seg->fc_lo_water,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_dmem_init */
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 /* Destroy the dmem buffer pools */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < port->fct_memseg_cnt; i++, seg++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Clear the segment space */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (port->fct_memseg_cnt * sizeof (emlxs_memseg_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_fct_dmem_fini */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteemlxs_fct_dbuf_alloc(fct_local_port_t *fct_port, uint32_t size,
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte emlxs_port_t *port = (emlxs_port_t *)fct_port->port_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!port->fct_memseg || !port->fct_memseg_cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check if our largest buffer is too small */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = &port->fct_memseg[port->fct_memseg_cnt-1];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find smallest available buffer >= size */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < port->fct_memseg_cnt; i++, seg++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp = (MATCHMAP*)emlxs_mem_pool_get(hba, seg);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seg = &port->fct_memseg[port->fct_memseg_cnt-1];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find largest available buffer >= *pminsize */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = port->fct_memseg_cnt-1; i >= 0; i--, seg--) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp = (MATCHMAP*)emlxs_mem_pool_get(hba, seg);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_alloc:Failed. size=%d minsize=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Setup the data buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_alloc:%p iotag=%d size=%d,%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_API_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_dbuf_alloc() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* COMSTAR ENTER POINT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_dbuf_free(fct_dbuf_store_t *fds, stmf_data_buf_t *db)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = (emlxs_port_t *)fds->fds_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MATCHMAP *mp = (MATCHMAP *)db->db_port_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_free:%p NULL mp found!",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_free:%p iotag=%d",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mem_pool_put(hba, mp->segment, (void *)mp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_dbuf_free() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_fct_dbuf_dma_sync(emlxs_hba_t *hba, stmf_data_buf_t *db,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MATCHMAP *mp = (MATCHMAP *)db->db_port_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_dma_sync:%p NULL mp found!",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_api_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_dma_sync:%p iotag=%d size=%d",
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#endif /* FCT_API_TRACE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MPDATA_SYNC(mp->dma_handle, 0, db->db_data_size, sync_type);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_fm_check_dma_handle(hba, mp->dma_handle)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_dbuf_dma_sync:%p iotag=%d",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fct_dbuf_dma_sync() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* SFCT_SUPPORT */