825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * CDDL HEADER START
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * The contents of this file are subject to the terms of the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Common Development and Distribution License (the "License").
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * You may not use this file except in compliance with the License.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * You can obtain a copy of the license at
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * http://www.opensource.org/licenses/cddl1.txt.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * See the License for the specific language governing permissions
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * and limitations under the License.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * CDDL HEADER END
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Use is subject to license terms.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#include <emlxs.h>
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar SwaminathanEMLXS_MSG_DEF(EMLXS_SLI4_C);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic int emlxs_sli4_init_extents(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MAILBOXQ *mbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_read_status(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic int emlxs_init_bootstrap_mb(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_read_sema(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_read_mbdb(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_mbdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_wqdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_mqdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_rqdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_cqdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_create_queues(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_post_hdr_tmplates(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_post_sgl_pages(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amorestatic int emlxs_sli4_read_eq(emlxs_hba_t *hba, EQ_DESC_t *eq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_map_hdw(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_unmap_hdw(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int32_t emlxs_sli4_online(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_offline(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t reset_requested);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_hba_reset(emlxs_hba_t *hba, uint32_t restart,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t skip_post, uint32_t quiesce);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_hba_kill(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_hba_init(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_bde_setup(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *sbp);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_issue_iocb_cmd(emlxs_hba_t *hba,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore CHANNEL *cp, IOCBQ *iocb_cmd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_issue_mbox_cmd(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq, int32_t flg, uint32_t tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_issue_mbox_cmd4quiesce(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq, int32_t flg, uint32_t tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SFCT_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_fct_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp, int channel);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_fct_bde_setup(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_buf_t *sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_fcp_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *sbp, int ring);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_ip_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_els_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_ct_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *sbp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_poll_intr(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int32_t emlxs_sli4_intx_intr(char *arg);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef MSI_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_msi_intr(char *arg1, char *arg2);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* MSI_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_resource_free(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_resource_alloc(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern void emlxs_sli4_zero_queue_stat(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic XRIobj_t *emlxs_sli4_alloc_xri(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_buf_t *sbp, RPIobj_t *rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_enable_intr(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_disable_intr(emlxs_hba_t *hba, uint32_t att);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_timer(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_timer_check_mbox(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amorestatic void emlxs_sli4_poll_erratt(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern XRIobj_t *emlxs_sli4_reserve_xri(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld RPIobj_t *rpip, uint32_t type, uint16_t rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_check_hdw_ready(emlxs_hba_t *);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_reg_did(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t did, SERV_PARM *param,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_buf_t *sbp, fc_unsol_buf_t *ubp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCBQ *iocbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_unreg_node(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_node_t *node, emlxs_buf_t *sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fc_unsol_buf_t *ubp, IOCBQ *iocbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_handle_fc_link_att(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CQE_ASYNC_t *cqe);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_handle_fcoe_link_event(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CQE_ASYNC_t *cqe);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t emlxs_sli4_rqid_to_index(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t rqid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t emlxs_sli4_wqid_to_index(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t wqid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t emlxs_sli4_cqid_to_index(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t cqid);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Define SLI4 API functions */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli_api_t emlxs_sli4_api = {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_map_hdw,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_unmap_hdw,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_online,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_offline,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_hba_reset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_hba_kill,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_issue_iocb_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_issue_mbox_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SFCT_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_prep_fct_iocb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#else
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan NULL,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_prep_fcp_iocb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_prep_ip_iocb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_prep_els_iocb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_prep_ct_iocb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_poll_intr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_intx_intr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_msi_intr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_disable_intr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_timer,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_poll_erratt,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_reg_did,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_unreg_node
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan};
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* ************************************************************************** */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_set_default_params(emlxs_hba_t *hba)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((char *)&hba->sli.sli4.param, sizeof (sli_params_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.ProtocolType = 0x3; /* FC/FCoE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SliHint2 = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SliHint1 = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.IfType = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SliFamily = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.Revision = 0x4; /* SLI4 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.FT = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.EqeCntMethod = 0x1; /* Bit pattern */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.EqPageSize = 0x1; /* 4096 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.EqeSize = 0x1; /* 4 byte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.EqPageCnt = 8;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.EqeCntMask = 0x1F; /* 256-4096 elements */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.CqeCntMethod = 0x1; /* Bit pattern */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.CqPageSize = 0x1; /* 4096 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.CQV = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.CqeSize = 0x3; /* 16 byte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.CqPageCnt = 4;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.CqeCntMask = 0x70; /* 256-1024 elements */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MqeCntMethod = 0x1; /* Bit pattern */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MqPageSize = 0x1; /* 4096 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MQV = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MqPageCnt = 8;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MqeCntMask = 0x0F; /* 16-128 elements */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.WqeCntMethod = 0; /* Page Count */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.WqPageSize = 0x1; /* 4096 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.WQV = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.WqeSize = 0x5; /* 64 byte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.WqPageCnt = 4;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.WqeCntMask = 0x10; /* 256 elements */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RqeCntMethod = 0; /* Page Count */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RqPageSize = 0x1; /* 4096 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RQV = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RqeSize = 0x2; /* 8 byte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RqPageCnt = 8;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RqDbWin = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RqeCntMask = 0x100; /* 4096 elements */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.Loopback = 0xf; /* unsupported */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.PHWQ = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.PHON = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.TRIR = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.TRTY = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.TCCA = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MWQE = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.ASSI = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.TERP = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.TGT = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.AREG = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.FBRR = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SGLR = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.HDRR = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.EXT = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.FCOE = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SgeLength = (64 * 1024);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SglAlign = 0x7 /* 4096 */;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SglPageSize = 0x1; /* 4096 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SglPageCnt = 2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MinRqSize = 128;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.MaxRqSize = 2048;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RPIMax = 0x3ff;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.XRIMax = 0x3ff;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.VFIMax = 0xff;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.VPIMax = 0xff;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Default SLI4 parameters set.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_set_default_params() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * emlxs_sli4_online()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * This routine will start initialization of the SLI4 HBA.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_online(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_vpd_t *vpd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *mp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t j;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rval = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *vpd_data;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t sli_mode;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint8_t *outptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t fw_check;
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan uint32_t kern_update = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_firmware_t hba_fw;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_firmware_t *fw;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t ssvid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld char buf[64];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd = &VPD;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sli_mode = EMLXS_HBA_SLI4_MODE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli_mode = sli_mode;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the fw_check flag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fw_check = cfg[CFG_FW_CHECK].current;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan if ((fw_check & 0x04) ||
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan (hba->fw_flag & FW_UPDATE_KERNEL)) {
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan kern_update = 1;
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan }
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->mbox_queue_flag = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_edtov = FF_DEF_EDTOV;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_ratov = FF_DEF_RATOV;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_altov = FF_DEF_ALTOV;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_arbtov = FF_DEF_ARBTOV;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Networking not supported */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cfg[CFG_NETWORK_ON].current) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Networking is not supported in SLI4, turning it off");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cfg[CFG_NETWORK_ON].current = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->chan_count = hba->intr_count * cfg[CFG_NUM_WQ].current;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->chan_count > MAX_CHANNEL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Max channels exceeded, dropping num-wq from %d to 1",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cfg[CFG_NUM_WQ].current);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cfg[CFG_NUM_WQ].current = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->chan_count = hba->intr_count * cfg[CFG_NUM_WQ].current;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_fcp = 0; /* First channel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Default channel for everything else is the last channel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_ip = hba->chan_count - 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_els = hba->chan_count - 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_ct = hba->chan_count - 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_iotag = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_tx_count = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize the local dump region buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.dump_region, sizeof (MBUF_INFO));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.dump_region.size = EMLXS_DUMP_REGION_SIZE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.dump_region.flags = FC_MBUF_DMA | FC_MBUF_SNGLSG
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.dump_region.align = ddi_ptob(hba->dip, 1L);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_alloc(hba, &hba->sli.sli4.dump_region);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.dump_region.virt == NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to allocate dump region buffer.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (ENOMEM);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Get a buffer which will be used repeatedly for mailbox commands
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *) kmem_zalloc((sizeof (MAILBOXQ)), KM_SLEEP);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb = (MAILBOX4 *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanreset:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reset & Initialize the adapter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_hba_init(hba)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to init hba.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FMA_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((emlxs_fm_check_acc_handle(hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->pci_acc_handle) != DDI_FM_OK) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (emlxs_fm_check_acc_handle(hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.bar0_acc_handle) != DDI_FM_OK)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_invalid_access_handle_msg, NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default :
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((emlxs_fm_check_acc_handle(hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->pci_acc_handle) != DDI_FM_OK) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (emlxs_fm_check_acc_handle(hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.bar1_acc_handle) != DDI_FM_OK) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (emlxs_fm_check_acc_handle(hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.bar2_acc_handle) != DDI_FM_OK)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_invalid_access_handle_msg, NULL);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Setup and issue mailbox READ REV command
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->opFwRev = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->postKernRev = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli1FwRev = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli2FwRev = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli3FwRev = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli4FwRev = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->postKernName[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->opFwName[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli1FwName[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli2FwName[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli3FwName[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli4FwName[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->opFwLabel[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli1FwLabel[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli2FwLabel[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli3FwLabel[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli4FwLabel[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_INIT_REV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_sli4_params(hba, mbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to read parameters. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxCommand, mb->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set param defaults */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_set_default_params(hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Save parameters */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((char *)&mb->un.varSLIConfig.payload,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (char *)&hba->sli.sli4.param, sizeof (sli_params_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "SLI_PARMS",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)&hba->sli.sli4.param,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (sli_params_t), 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reuse mbq from previous mbox */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_port_name(hba, mbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to get port names. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxCommand, mb->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(hba->sli.sli4.port_name,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (hba->sli.sli4.port_name));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Save port names */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((char *)&mb->un.varSLIConfig.payload,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (char *)&hba->sli.sli4.port_name,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (hba->sli.sli4.port_name));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reuse mbq from previous mbox */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_read_rev(hba, mbq, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to read rev. Mailbox cmd=%x status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "RD_REV", (uint32_t *)mb, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->un.varRdRev4.sliLevel != 4) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid read rev Version for SLI4: 0x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdRev4.sliLevel);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (mb->un.varRdRev4.dcbxMode) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_DCBX_MODE_CIN: /* Mapped to nonFIP mode */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag &= ~FC_FIP_SUPPORTED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_DCBX_MODE_CEE: /* Mapped to FIP mode */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag |= FC_FIP_SUPPORTED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid read rev dcbx mode for SLI4: 0x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdRev4.dcbxMode);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set FC/FCoE mode */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mb->un.varRdRev4.FCoE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag |= EMLXS_SLI4_FCOE_MODE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag &= ~EMLXS_SLI4_FCOE_MODE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save information as VPD data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->rBit = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli4FwRev = (mb->un.varRdRev4.ULPFwId);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((char *)mb->un.varRdRev4.ULPFwName, vpd->sli4FwName, 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->opFwRev = (mb->un.varRdRev4.ULPFwId);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((char *)mb->un.varRdRev4.ULPFwName, vpd->opFwName, 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->postKernRev = (mb->un.varRdRev4.ARMFwId);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((char *)mb->un.varRdRev4.ARMFwName, vpd->postKernName, 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpd->biuRev = mb->un.varRdRev4.HwRev1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->fcphHigh = mb->un.varRdRev4.fcphHigh;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->fcphLow = mb->un.varRdRev4.fcphLow;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->feaLevelHigh = mb->un.varRdRev4.feaLevelHigh;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->feaLevelLow = mb->un.varRdRev4.feaLevelLow;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Decode FW labels */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.chip == EMLXS_LANCER_CHIP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy(vpd->postKernName, vpd->sli4FwName, 16);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_decode_label(vpd->sli4FwName, vpd->sli4FwName, 0,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (vpd->sli4FwName));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_decode_label(vpd->opFwName, vpd->opFwName, 0,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (vpd->opFwName));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_decode_label(vpd->postKernName, vpd->postKernName, 0,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (vpd->postKernName));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (hba->model_info.chip == EMLXS_BE2_CHIP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(vpd->sli4FwLabel, "be2.ufi",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (vpd->sli4FwLabel));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore } else if (hba->model_info.chip == EMLXS_BE3_CHIP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(vpd->sli4FwLabel, "be3.ufi",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (vpd->sli4FwLabel));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (hba->model_info.chip == EMLXS_LANCER_CHIP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(vpd->sli4FwLabel, "xe201.grp",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (vpd->sli4FwLabel));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(vpd->sli4FwLabel, "sli4.fw",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (vpd->sli4FwLabel));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "VPD ULP:%08x %s ARM:%08x %s f:%d %d %d %d : dcbx %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->opFwRev, vpd->opFwName, vpd->postKernRev, vpd->postKernName,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->fcphHigh, vpd->fcphLow, vpd->feaLevelHigh, vpd->feaLevelLow,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdRev4.dcbxMode);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* No key information is needed for SLI4 products */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get adapter VPD information */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->port_index = (uint32_t)-1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_dump_vpd(hba, mbq, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd_data = hba->sli.sli4.dump_region.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "No VPD found. status=%x", mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "VPD dumped. rsp_cnt=%d status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varDmp4.rsp_cnt, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->un.varDmp4.rsp_cnt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.dump_region.dma_handle,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 0, mb->un.varDmp4.rsp_cnt, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (hba->sli.sli4.dump_region.dma_handle) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.dump_region.dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_online: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.dump_region.
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan dma_handle);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rval = EIO;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan goto failed1;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd_data[0]) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_parse_vpd(hba, (uint8_t *)vpd_data,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varDmp4.rsp_cnt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If there is a VPD part number, and it does not
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * match the current default HBA model info,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * replace the default data with an entry that
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * does match.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * After emlxs_parse_vpd model holds the VPD value
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * for V2 and part_num hold the value for PN. These
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * 2 values are NOT necessarily the same.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((vpd->model[0] != 0) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (strcmp(&vpd->model[0], hba->model_info.model) != 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* First scan for a V2 match */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 1; i < emlxs_pci_model_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (strcmp(&vpd->model[0],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_pci_model[i].model) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(&emlxs_pci_model[i],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &hba->model_info,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (emlxs_model_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!rval && (vpd->part_num[0] != 0) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (strcmp(&vpd->part_num[0], hba->model_info.model) != 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Next scan for a PN match */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 1; i < emlxs_pci_model_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (strcmp(&vpd->part_num[0],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_pci_model[i].model) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy(&emlxs_pci_model[i],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &hba->model_info,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (emlxs_model_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* HP CNA port indices start at 1 instead of 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.chip & EMLXS_BE_CHIPS) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore ssvid = ddi_get16(hba->pci_acc_handle,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (uint16_t *)(hba->pci_addr + PCI_SSVID_REGISTER));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((ssvid == PCI_SSVID_HP) && (vpd->port_index > 0)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore vpd->port_index--;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Now lets update hba->model_info with the real
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * VPD data, if any.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Replace the default model description with vpd data
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->model_desc[0] != 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(hba->model_info.model_desc,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpd->model_desc,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (hba->model_info.model_desc)-1));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Replace the default model with vpd data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->model[0] != 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(hba->model_info.model, vpd->model,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (hba->model_info.model)-1));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Replace the default program types with vpd data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->prog_types[0] != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_parse_prog_types(hba, vpd->prog_types);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Since the adapter model may have changed with the vpd data
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * lets double check if adapter is not supported
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->model_info.flags & EMLXS_NOT_SUPPORTED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unsupported adapter found. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Id:%d Device id:0x%x SSDID:0x%x Model:%s",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.id, hba->model_info.device_id,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.ssdid, hba->model_info.model);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->boot_version, vpd->sli4FwName,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (vpd->boot_version)-1));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get fcode version property */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_get_fcode_version(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware: kern=%08x stub=%08x sli1=%08x", vpd->postKernRev,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->opFwRev, vpd->sli1FwRev);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware: sli2=%08x sli3=%08x sli4=%08x fl=%x", vpd->sli2FwRev,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli3FwRev, vpd->sli4FwRev, vpd->feaLevelHigh);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "BIOS: boot=%s fcode=%s", vpd->boot_version, vpd->fcode_version);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If firmware checking is enabled and the adapter model indicates
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * a firmware image, then perform firmware version check
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan hba->fw_flag = 0;
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan hba->fw_timer = 0;
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (((fw_check & 0x1) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->model_info.flags & EMLXS_ORACLE_BRANDED) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->model_info.fwid) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((fw_check & 0x2) && hba->model_info.fwid)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Find firmware image indicated by adapter model */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fw = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < emlxs_fw_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_fw_table[i].id == hba->model_info.fwid) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fw = &emlxs_fw_table[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If the image was found, then verify current firmware
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * versions of adapter
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fw) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Obtain current firmware version info */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.chip & EMLXS_BE_CHIPS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_be_read_fw_version(hba, &hba_fw);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba_fw.kern = vpd->postKernRev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba_fw.stub = vpd->opFwRev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba_fw.sli1 = vpd->sli1FwRev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba_fw.sli2 = vpd->sli2FwRev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba_fw.sli3 = vpd->sli3FwRev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba_fw.sli4 = vpd->sli4FwRev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan if (!kern_update &&
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan ((fw->kern && (hba_fw.kern != fw->kern)) ||
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan (fw->stub && (hba_fw.stub != fw->stub)))) {
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan hba->fw_flag |= FW_UPDATE_NEEDED;
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan } else if ((fw->kern && (hba_fw.kern != fw->kern)) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (fw->stub && (hba_fw.stub != fw->stub)) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (fw->sli1 && (hba_fw.sli1 != fw->sli1)) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (fw->sli2 && (hba_fw.sli2 != fw->sli2)) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (fw->sli3 && (hba_fw.sli3 != fw->sli3)) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (fw->sli4 && (hba_fw.sli4 != fw->sli4))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware update needed. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Updating. id=%d fw=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.id, hba->model_info.fwid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef MODFW_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Load the firmware image now
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If MODFW_SUPPORT is not defined, the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * firmware image will already be defined
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * in the emlxs_fw_table
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fw_load(hba, fw);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* MODFW_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fw->image && fw->size) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t rc;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rc = emlxs_fw_download(hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (char *)fw->image, fw->size, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rc != FC_SUCCESS) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (rc != EMLXS_REBOOT_REQUIRED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_init_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware update failed.");
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan hba->fw_flag |=
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan FW_UPDATE_NEEDED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef MODFW_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Unload the firmware image from
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * kernel memory
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fw_unload(hba, fw);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* MODFW_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fw_check = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto reset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->fw_flag |= FW_UPDATE_NEEDED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware image unavailable.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware update not needed.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * This means either the adapter database is not
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * correct or a firmware image is missing from the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * compile
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware image unavailable. id=%d fw=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.id, hba->model_info.fwid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_dump_fcoe(hba, mbq, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "No FCOE info found. status=%x", mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "FCOE info dumped. rsp_cnt=%d status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varDmp4.rsp_cnt, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_parse_fcoe(hba,
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan (uint8_t *)hba->sli.sli4.dump_region.virt,
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan mb->un.varDmp4.rsp_cnt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->flag & EMLXS_INI_ENABLED) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status |= SLI4_FEATURE_FCP_INITIATOR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->flag & EMLXS_TGT_ENABLED) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status |= SLI4_FEATURE_FCP_TARGET;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cfg[CFG_NPIV_ENABLE].current) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status |= SLI4_FEATURE_NPIV;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cfg[CFG_RQD_MODE].current) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status |= SLI4_FEATURE_RQD;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cfg[CFG_PERF_HINT].current) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.param.PHON) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status |= SLI4_FEATURE_PERF_HINT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_request_features(hba, mbq, status);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to REQUEST_FEATURES. Mailbox cmd=%x status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "REQ_FEATURE", (uint32_t *)mb, 6, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check to see if we get the features we requested */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status != mb->un.varReqFeatures.featuresEnabled) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Just report descrepencies, don't abort the attach */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld outptr = (uint8_t *)emlxs_request_feature_xlate(
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varReqFeatures.featuresRequested);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf, (char *)outptr, sizeof (buf));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "REQUEST_FEATURES: wanted:%s got:%s",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &buf[0], emlxs_request_feature_xlate(
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varReqFeatures.featuresEnabled));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((port->flag & EMLXS_INI_ENABLED) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(mb->un.varReqFeatures.featuresEnabled &
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLI4_FEATURE_FCP_INITIATOR)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Initiator mode not supported by adapter.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check if we can fall back to just target mode */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->pm_state == EMLXS_PM_IN_ATTACH) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (mb->un.varReqFeatures.featuresEnabled &
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLI4_FEATURE_FCP_TARGET) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (cfg[CFG_DTM_ENABLE].current == 1) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (cfg[CFG_TARGET_MODE].current == 1)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cfg[CFG_DTM_ENABLE].current = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Disabling dynamic target mode. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Enabling target mode only.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This will trigger the driver to reattach */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EAGAIN;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((port->flag & EMLXS_TGT_ENABLED) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(mb->un.varReqFeatures.featuresEnabled &
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLI4_FEATURE_FCP_TARGET)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Target mode not supported by adapter.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check if we can fall back to just initiator mode */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->pm_state == EMLXS_PM_IN_ATTACH) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (mb->un.varReqFeatures.featuresEnabled &
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLI4_FEATURE_FCP_INITIATOR) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (cfg[CFG_DTM_ENABLE].current == 1) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (cfg[CFG_TARGET_MODE].current == 0)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cfg[CFG_DTM_ENABLE].current = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Disabling dynamic target mode. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Enabling initiator mode only.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This will trigger the driver to reattach */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EAGAIN;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->un.varReqFeatures.featuresEnabled & SLI4_FEATURE_NPIV) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag |= FC_NPIV_ENABLED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mb->un.varReqFeatures.featuresEnabled & SLI4_FEATURE_PERF_HINT) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag |= EMLXS_SLI4_PHON;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.param.PHWQ) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag |= EMLXS_SLI4_PHWQ;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_read_config(hba, mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to READ_CONFIG. Mailbox cmd=%x status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "READ_CONFIG4", (uint32_t *)mb, 18, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set default extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRICount = mb->un.varRdConfig4.XRICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtCount = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtSize = hba->sli.sli4.XRICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIBase[0] = mb->un.varRdConfig4.XRIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPICount = mb->un.varRdConfig4.RPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtCount = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtSize = hba->sli.sli4.RPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIBase[0] = mb->un.varRdConfig4.RPIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPICount = mb->un.varRdConfig4.VPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtCount = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtSize = hba->sli.sli4.VPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIBase[0] = mb->un.varRdConfig4.VPIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFICount = mb->un.varRdConfig4.VFICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtCount = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtSize = hba->sli.sli4.VFICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIBase[0] = mb->un.varRdConfig4.VFIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.FCFICount = mb->un.varRdConfig4.FCFICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: xri:%d rpi:%d vpi:%d vfi:%d fcfi:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.FCFICount);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->sli.sli4.XRICount == 0) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.RPICount == 0) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.VPICount == 0) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.VFICount == 0) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.FCFICount == 0)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Invalid extent value(s) - xri:%d rpi:%d vpi:%d "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "vfi:%d fcfi:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFICount,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.FCFICount);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mb->un.varRdConfig4.extents) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_init_extents(hba, mbq)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to initialize extents.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: port_name:%c %c %c %c",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.port_name[0],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.port_name[1],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.port_name[2],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.port_name[3]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: ldv:%d link_type:%d link_number:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varRdConfig4.ldv,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varRdConfig4.link_type,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varRdConfig4.link_number);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mb->un.varRdConfig4.ldv) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.link_number = mb->un.varRdConfig4.link_number;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.link_number = (uint32_t)-1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.VPICount) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->vpi_max = min(hba->sli.sli4.VPICount, MAX_VPORTS) - 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the max node count */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cfg[CFG_NUM_NODES].current > 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->max_nodes =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan min(cfg[CFG_NUM_NODES].current,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.RPICount);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->max_nodes = hba->sli.sli4.RPICount;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the io throttle */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_throttle = hba->sli.sli4.XRICount - IO_THROTTLE_RESERVE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set max_iotag */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* We add 1 in case all XRI's are non-zero */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->max_iotag = hba->sli.sli4.XRICount + 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cfg[CFG_NUM_IOTAGS].current) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->max_iotag = min(hba->max_iotag,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint16_t)cfg[CFG_NUM_IOTAGS].current);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set out-of-range iotag base */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->fc_oor_iotag = hba->max_iotag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save the link speed capabilities */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore vpd->link_speed = (uint16_t)mb->un.varRdConfig4.lmt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_process_link_speed(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Allocate some memory for buffers
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_mem_alloc_buffer(hba) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to allocate memory buffers.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = ENOMEM;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_resource_alloc(hba)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to allocate resources.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = ENOMEM;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "XRIp", (uint32_t *)hba->sli.sli4.XRIp, 18, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_zero_queue_stat(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#if (EMLXS_MODREV >= EMLXS_MODREV5)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((cfg[CFG_NPIV_ENABLE].current) && (hba->flag & FC_NPIV_ENABLED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fca_tran->fca_num_npivports = hba->vpi_max;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* >= EMLXS_MODREV5 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_post_sgl_pages(hba, mbq)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to post sgl pages.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_post_hdr_tmplates(hba, mbq)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to post header templates.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Add our interrupt routine to kernel's interrupt chain & enable it
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If MSI is enabled this will cause Solaris to program the MSI address
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * and data registers in PCI config space
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_INTR_ADD(hba) != DDI_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to add interrupt(s).");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* This MUST be done after EMLXS_INTR_ADD */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_create_queues(hba, mbq)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to create queues.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_INIT_CFGPORT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get and save the current firmware version (based on sli_mode) */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_decode_firmware_rev(hba, vpd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_INIT_INITLINK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (SLI4_FC_MODE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reuse mbq from previous mbox */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_config_link(hba, mbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to configure link. Mailbox cmd=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxCommand, mb->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed3;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * We need to get login parameters for NID
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mb_read_sparam(hba, mbq);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mp = (MATCHMAP *)mbq->bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to read parameters. Mailbox cmd=%x status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free the buffer since we were polling */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_BUF, (void *)mp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If no serial number in VPD data, then use the WWPN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->serial_num[0] == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan outptr = (uint8_t *)&hba->wwpn.IEEE[0];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < 12; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan status = *outptr++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan j = ((status & 0xf0) >> 4);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (j <= 9) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->serial_num[i] =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (char)((uint8_t)'0' + (uint8_t)j);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->serial_num[i] =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (char)((uint8_t)'A' + (uint8_t)(j - 10));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan j = (status & 0xf);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (j <= 9) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->serial_num[i] =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (char)((uint8_t)'0' + (uint8_t)j);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->serial_num[i] =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (char)((uint8_t)'A' + (uint8_t)(j - 10));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Set port number and port index to zero
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * The WWN's are unique to each port and therefore port_num
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * must equal zero. This effects the hba_fru_details structure
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * in fca_bind_port()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->port_num[0] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->port_index = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: WWPN: port_index=0");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make final attempt to set a port index */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (vpd->port_index == (uint32_t)-1) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dev_info_t *p_dip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dev_info_t *c_dip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan p_dip = ddi_get_parent(hba->dip);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan c_dip = ddi_get_child(p_dip);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->port_index = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (c_dip && (hba->dip != c_dip)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan c_dip = ddi_get_next_sibling(c_dip);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (strcmp(ddi_get_name(c_dip), "ethernet") == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpd->port_index++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: Device tree: port_index=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpd->port_index);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->port_num[0] == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.channels == EMLXS_MULTI_CHANNEL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(vpd->port_num,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (vpd->port_num)-1),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%d", vpd->port_index);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->id[0] == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(vpd->id, (sizeof (vpd->id)-1),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.model_desc, vpd->port_index);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->manufacturer[0] == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->manufacturer, hba->model_info.manufacturer,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (vpd->manufacturer)-1));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->part_num[0] == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->part_num, hba->model_info.model,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (vpd->part_num)-1));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->model_desc[0] == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(vpd->model_desc, (sizeof (vpd->model_desc)-1),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.model_desc, vpd->port_index);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->model[0] == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->model, hba->model_info.model,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (vpd->model)-1));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vpd->prog_types[0] == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_build_prog_types(hba, vpd);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Create the symbolic names */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(hba->snn, (sizeof (hba->snn)-1),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Emulex %s FV%s DV%s %s",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.model, hba->vpd.fw_version, emlxs_version,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (char *)utsname.nodename);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(hba->spn, (sizeof (hba->spn)-1),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Emulex PPN-%01x%01x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->wwpn.nameType, hba->wwpn.IEEEextMsn, hba->wwpn.IEEEextLsb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->wwpn.IEEE[0], hba->wwpn.IEEE[1], hba->wwpn.IEEE[2],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->wwpn.IEEE[3], hba->wwpn.IEEE[4], hba->wwpn.IEEE[5]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_LINK_DOWN);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_enable_intr(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check persist-linkdown */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cfg[CFG_PERSIST_LINKDOWN].current) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_LINK_DOWN_PERSIST);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((port->mode == MODE_TARGET) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Setup and issue mailbox INITIALIZE LINK command
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * At this point, the interrupt will be generated by the HW
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_init_link(hba, mbq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cfg[CFG_TOPOLOGY].current, cfg[CFG_LINK_SPEED].current);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_NOWAIT, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rval != MBX_SUCCESS) && (rval != MBX_BUSY)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to initialize link. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxCommand, mb->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval = EIO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed3;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Wait for link to come up */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i = cfg[CFG_LINKUP_DELAY].current;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld while (i && (hba->state < FC_LINK_UP)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for hardware error */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->state == FC_ERROR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter error.", mb->mbxCommand,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BUSYWAIT_MS(1000);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfelddone:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * The leadville driver will now handle the FLOGI at the driver level
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan if (mbq) {
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan (void) kmem_free((uint8_t *)mbq, sizeof (MAILBOXQ));
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan mbq = NULL;
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan mb = NULL;
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanfailed3:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mp) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_BUF, (void *)mp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->intr_flags & EMLXS_MSI_ADDED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) EMLXS_INTR_REMOVE(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_resource_free(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanfailed2:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_free_buffer(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanfailed1:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) kmem_free((uint8_t *)mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.dump_region.virt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_free(hba, &hba->sli.sli4.dump_region);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rval == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = EIO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rval);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_online() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_offline(emlxs_hba_t *hba, uint32_t reset_requested)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reverse emlxs_sli4_online */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->flag & FC_INTERLOCKED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto killed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (reset_requested) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_sli4_hba_reset(hba, 0, 0, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Shutdown the adapter interface */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_hba_kill(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldkilled:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free SLI shared memory */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_resource_free(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free driver shared memory */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_free_buffer(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free the host dump region buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_free(hba, &hba->sli.sli4.dump_region);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_offline() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_map_hdw(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dev_info_t *dip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_device_acc_attr_t dev_attr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dip = (dev_info_t *)hba->dip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan dev_attr = emlxs_dev_acc_attr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Map in Hardware BAR pages that will be used for */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* communication with HBA. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.bar1_acc_handle == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_regs_map_setup(dip, PCI_BAR1_RINDEX,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (caddr_t *)&hba->sli.sli4.bar1_addr,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 0, 0, &dev_attr, &hba->sli.sli4.bar1_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status != DDI_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_attach_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "(PCI) ddi_regs_map_setup BAR1 failed. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "stat=%d mem=%p attr=%p hdl=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, &hba->sli.sli4.bar1_addr, &dev_attr,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &hba->sli.sli4.bar1_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.bar2_acc_handle == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_regs_map_setup(dip, PCI_BAR2_RINDEX,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (caddr_t *)&hba->sli.sli4.bar2_addr,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 0, 0, &dev_attr, &hba->sli.sli4.bar2_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status != DDI_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_attach_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ddi_regs_map_setup BAR2 failed. status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* offset from beginning of register space */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MPUEPSemaphore_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar1_addr +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CSR_MPU_EP_SEMAPHORE_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MBDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_MB_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.CQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_CQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_MQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.WQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_WQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_RQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.STATUS_reg_addr = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.CNTL_reg_addr = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_LO_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_HI_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.PHYSDEV_reg_addr = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Map in Hardware BAR pages that will be used for */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* communication with HBA. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.bar0_acc_handle == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_regs_map_setup(dip, PCI_BAR0_RINDEX,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (caddr_t *)&hba->sli.sli4.bar0_addr,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 0, 0, &dev_attr, &hba->sli.sli4.bar0_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status != DDI_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_attach_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "(PCI) ddi_regs_map_setup BAR0 failed. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "stat=%d mem=%p attr=%p hdl=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, &hba->sli.sli4.bar0_addr, &dev_attr,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &hba->sli.sli4.bar0_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* offset from beginning of register space */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MPUEPSemaphore_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLIPORT_SEMAPHORE_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MBDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_MB_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.CQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_CQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_MQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.WQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_WQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RQDB_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_RQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.STATUS_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLIPORT_STATUS_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.CNTL_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLIPORT_CONTROL_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLIPORT_ERROR1_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLIPORT_ERROR2_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.PHYSDEV_reg_addr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld PHYSDEV_CONTROL_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_1:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_3:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_attach_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Map hdw: Unsupported if_type %08x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli_intf & SLI_INTF_IF_TYPE_MASK));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto failed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.bootstrapmb.virt == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBUF_INFO *buf_info;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBUF_INFO bufinfo;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info = &bufinfo;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(buf_info, sizeof (MBUF_INFO));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->size = EMLXS_BOOTSTRAP_MB_SIZE + MBOX_EXTENSION_SIZE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->flags =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->align = ddi_ptob(dip, 1L);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_alloc(hba, buf_info);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (buf_info->virt == NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.bootstrapmb.virt = buf_info->virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bootstrapmb.phys = buf_info->phys;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bootstrapmb.size = EMLXS_BOOTSTRAP_MB_SIZE +
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBOX_EXTENSION_SIZE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bootstrapmb.data_handle = buf_info->data_handle;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bootstrapmb.dma_handle = buf_info->dma_handle;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((char *)hba->sli.sli4.bootstrapmb.virt,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_BOOTSTRAP_MB_SIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->chan_count = MAX_CHANNEL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanfailed:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_unmap_hdw(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (ENOMEM);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_map_hdw() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_unmap_hdw(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBUF_INFO bufinfo;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBUF_INFO *buf_info = &bufinfo;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.bar0_acc_handle) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_regs_map_free(&hba->sli.sli4.bar0_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.bar0_acc_handle = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.bar1_acc_handle) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_regs_map_free(&hba->sli.sli4.bar1_acc_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bar1_acc_handle = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.bar2_acc_handle) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_regs_map_free(&hba->sli.sli4.bar2_acc_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bar2_acc_handle = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.bootstrapmb.virt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(buf_info, sizeof (MBUF_INFO));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.bootstrapmb.phys) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->phys = hba->sli.sli4.bootstrapmb.phys;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->data_handle =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bootstrapmb.data_handle;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->dma_handle =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bootstrapmb.dma_handle;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->flags = FC_MBUF_DMA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore buf_info->virt = hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->size = hba->sli.sli4.bootstrapmb.size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mem_free(hba, buf_info);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.bootstrapmb.virt = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_unmap_hdw() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_check_hdw_ready(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t err1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t err2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Wait for reset completion */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (i < 30) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = emlxs_sli4_read_sema(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check to see if any errors occurred during init */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status & ARM_POST_FATAL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SEMA Error: status=%x", status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((status & ARM_UNRECOVERABLE_ERROR) ==
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ARM_UNRECOVERABLE_ERROR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unrecoverable Error: status=%x", status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((status & ARM_POST_MASK) == ARM_POST_READY) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* ARM Ready !! */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ARM Ready: status=%x", status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = emlxs_sli4_read_status(hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status & SLI_STATUS_READY) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(status & SLI_STATUS_ERROR)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* ARM Ready !! */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ARM Ready: status=%x", status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status & SLI_STATUS_RESET_NEEDED) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ARM Ready (Reset Needed): "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "status=%x err1=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "err2=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, err1, err2);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unrecoverable Error: status=%x err1=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "err2=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, err1, err2);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (2);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (3);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BUSYWAIT_MS(1000);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Timeout occurred */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status & SLI_STATUS_ERROR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Ready Timeout: Port Error: status=%x err1=%x err2=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, err1, err2);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Ready Timeout: status=%x err1=%x err2=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, err1, err2);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (3);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_check_hdw_ready() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_read_status(emlxs_hba_t *hba)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.STATUS_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_CHK_ACC_HANDLE(hba, hba->sli.sli4.bar0_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (status);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_read_status() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_read_sema(emlxs_hba_t *hba)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t status;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar1_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MPUEPSemaphore_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_CHK_ACC_HANDLE(hba, hba->sli.sli4.bar1_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MPUEPSemaphore_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_CHK_ACC_HANDLE(hba, hba->sli.sli4.bar0_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_read_sema() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_read_mbdb(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar2_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MBDB_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_CHK_ACC_HANDLE(hba, hba->sli.sli4.bar2_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MBDB_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_CHK_ACC_HANDLE(hba, hba->sli.sli4.bar0_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_read_mbdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_mbdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar2_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MBDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MBDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_mbdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_cqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar2_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.CQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.CQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_cqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_rqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar2_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_rqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_mqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar2_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.MQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_mqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_wqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar2_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.WQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.WQDB_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_wqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_check_bootstrap_ready(emlxs_hba_t *hba, uint32_t tmo)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t status = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t err1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t err2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Wait for reset completion, tmo is in 10ms ticks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (tmo) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = emlxs_sli4_read_mbdb(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check to see if any errors occurred during init */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (status & BMBX_READY) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "BMBX Ready: status=0x%x", status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BUSYWAIT_MS(10);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Timeout occurred */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Timeout waiting for BMailbox: status=%x err1=%x err2=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, err1, err2);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_check_bootstrap_ready() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_issue_bootstrap_mb(emlxs_hba_t *hba, uint32_t tmo)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *iptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t addr30;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * This routine assumes the bootstrap mbox is loaded
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * with the mailbox command to be executed.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * First, load the high 30 bits of bootstrap mailbox
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan addr30 = (uint32_t)((hba->sli.sli4.bootstrapmb.phys>>32) & 0xfffffffc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan addr30 |= BMBX_ADDR_HI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_mbdb(hba, addr30);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = emlxs_check_bootstrap_ready(hba, tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (tmo == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Load the low 30 bits of bootstrap mailbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan addr30 = (uint32_t)((hba->sli.sli4.bootstrapmb.phys>>2) & 0xfffffffc);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_mbdb(hba, addr30);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = emlxs_check_bootstrap_ready(hba, tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (tmo == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "BootstrapMB: %p Completed %08x %08x %08x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.bootstrapmb.virt,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *iptr, *(iptr+1), *(iptr+2));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_issue_bootstrap_mb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_init_bootstrap_mb(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FMA_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *iptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t tmo;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_check_hdw_ready(hba)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->flag & FC_BOOTSTRAPMB_INIT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0); /* Already initialized */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* NOTE: tmo is in 10ms ticks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = emlxs_check_bootstrap_ready(hba, 3000);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (tmo == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Issue FW_INITIALIZE command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Special words to initialize bootstrap mbox MUST be little endian */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *iptr = LE_SWAP32(FW_INITIALIZE_WORD0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *(iptr+1) = LE_SWAP32(FW_INITIALIZE_WORD1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_BSIZE, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "FW_INIT", (uint32_t *)iptr, 6, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!emlxs_issue_bootstrap_mb(hba, tmo)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, hba->sli.sli4.bootstrapmb.dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "init_bootstrap_mb: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.bootstrapmb.dma_handle);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan return (1);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag |= FC_BOOTSTRAPMB_INIT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_init_bootstrap_mb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_hba_init(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int rc;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *vport;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld VPIobj_t *vpip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Restart the adapter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_hba_reset(hba, 1, 0, 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < hba->chan_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->iopath = (void *)&hba->sli.sli4.wq[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize all the port objects */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->vpi_max = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < MAX_VPORTS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport = &VPORT(i);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->hba = hba;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->vpi = i;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpip = &vport->VPIobj;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpip->index = i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpip->VPI = i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpip->port = vport;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpip->state = VPI_STATE_OFFLINE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vport->vpip = vpip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the max node count */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->max_nodes == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cfg[CFG_NUM_NODES].current > 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->max_nodes = cfg[CFG_NUM_NODES].current;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->max_nodes = 4096;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = emlxs_init_bootstrap_mb(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cfgFCOE.FCMap[0] = FCOE_FCF_MAP0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cfgFCOE.FCMap[1] = FCOE_FCF_MAP1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cfgFCOE.FCMap[2] = FCOE_FCF_MAP2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->sli_intf & SLI_INTF_IF_TYPE_MASK) == SLI_INTF_IF_TYPE_0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Cache the UE MASK registers value for UE error detection */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ue_mask_lo = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_MASK_LO_OFFSET));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ue_mask_hi = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_MASK_HI_OFFSET));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_init() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_hba_reset(emlxs_hba_t *hba, uint32_t restart, uint32_t skip_post,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t quiesce)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *vport;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ mboxq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t value;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rc;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t channelno;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t status;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t err1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t err2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint8_t generate_event = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!cfg[CFG_RESET_ENABLE].current) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_reset_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Adapter reset disabled.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (quiesce == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_hba_kill(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Initalize Hardware that will be used to bring
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * SLI4 online.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rc = emlxs_init_bootstrap_mb(hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rc) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (rc);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *)&mboxq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_resetport(hba, &mboxq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (quiesce == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, &mboxq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MBX_POLL, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Timeout occurred */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Timeout: RESET");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Log a dump event - not supported */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd4quiesce(hba, &mboxq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MBX_POLL, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Log a dump event - not supported */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "resetPort", (uint32_t *)&mboxq, 12, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (quiesce == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_hba_kill(hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rc = emlxs_check_hdw_ready(hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rc > 1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter not ready for reset.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rc == 1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Don't generate an event if dump was forced */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((err1 != 0x2) || (err2 != 0x2)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld generate_event = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reset the port now */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld value = SLI_CNTL_INIT_PORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.CNTL_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reset the hba structure */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag &= FC_RESET_MASK;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (channelno = 0; channelno < hba->chan_count; channelno++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[channelno];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hba = hba;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->channelno = channelno;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_tx_count = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->iodone_count = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->topology = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->linkspeed = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->heartbeat_active = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->discovery_timer = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->linkup_timer = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->loopback_tics = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reset the port objects */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < MAX_VPORTS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport = &VPORT(i);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->flag &= EMLXS_PORT_RESET_MASK;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->did = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->prev_did = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->lip_type = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&vport->fabric_sparam, sizeof (SERV_PARM));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore bzero(&vport->prev_fabric_sparam, sizeof (SERV_PARM));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((caddr_t)&vport->node_base, sizeof (NODELIST));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->node_base.nlp_Rpi = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->node_base.nlp_DID = 0xffffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->node_base.nlp_list_next = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->node_base.nlp_list_prev = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->node_base.nlp_active = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->node_count = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vport->ub_count < EMLXS_UB_TOKEN_OFFSET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->ub_count = EMLXS_UB_TOKEN_OFFSET;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_check_hdw_ready(hba)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (generate_event) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = emlxs_sli4_read_status(hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status & SLI_STATUS_DUMP_IMAGE_PRESENT) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_log_dump_event(port, NULL, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_reset */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#define SGL_CMD 0
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#define SGL_RESP 1
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#define SGL_DATA 2
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#define SGL_LAST 0x80
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic ULP_SGE64 *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_pkt_to_sgl(emlxs_port_t *port, fc_packet_t *pkt, ULP_SGE64 *sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t sgl_type, uint32_t *pcnt)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef DEBUG_SGE
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_SGE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_dma_cookie_t *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint_t last;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int32_t sge_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint64_t sge_addr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int32_t len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint_t cookie_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ULP_SGE64 stage_sge;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan last = sgl_type & SGL_LAST;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sgl_type &= ~SGL_LAST;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#if (EMLXS_MODREV >= EMLXS_MODREV3)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (sgl_type) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case SGL_CMD:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = pkt->pkt_cmd_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cookie_cnt = pkt->pkt_cmd_cookie_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = (int32_t)pkt->pkt_cmdlen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case SGL_RESP:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = pkt->pkt_resp_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cookie_cnt = pkt->pkt_resp_cookie_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = (int32_t)pkt->pkt_rsplen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case SGL_DATA:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = pkt->pkt_data_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cookie_cnt = pkt->pkt_data_cookie_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = (int32_t)pkt->pkt_datalen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#else
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (sgl_type) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case SGL_CMD:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &pkt->pkt_cmd_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cookie_cnt = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = (int32_t)pkt->pkt_cmdlen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case SGL_RESP:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &pkt->pkt_resp_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cookie_cnt = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = (int32_t)pkt->pkt_rsplen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case SGL_DATA:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &pkt->pkt_data_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cookie_cnt = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = (int32_t)pkt->pkt_datalen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* >= EMLXS_MODREV3 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stage_sge.offset = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.type = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stage_sge.last = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cnt = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < cookie_cnt && size > 0; i++, cp++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge_size = cp->dmac_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge_addr = cp->dmac_laddress;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (sge_size && size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy staged SGE before we build next one */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (uint8_t *)sge, sizeof (ULP_SGE64));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan len = MIN(EMLXS_MAX_SGE_SIZE, sge_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan len = MIN(size, len);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stage_sge.addrHigh =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_HI(sge_addr);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stage_sge.addrLow =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_LO(sge_addr);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stage_sge.length = len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sgl_type == SGL_DATA) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stage_sge.offset = cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef DEBUG_SGE
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "SGE", (uint32_t *)&stage_sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_SGE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge_addr += len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge_size -= len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cnt += len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size -= len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (last) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan stage_sge.last = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (ULP_SGE64));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (pcnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *pcnt = cnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (sge);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_pkt_to_sgl */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanuint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_bde_setup(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_packet_t *pkt;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ULP_SGE64 *sge;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_wqe_t *wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_dma_cookie_t *cp_cmd;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_dma_cookie_t *cp_data;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint64_t sge_addr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t cmd_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t resp_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = (IOCBQ *) &sbp->iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe = &iocbq->wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt = PRIV2PKT(sbp);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip = sbp->xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sge = xrip->SGList.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#if (EMLXS_MODREV >= EMLXS_MODREV3)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp_cmd = pkt->pkt_cmd_cookie;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp_data = pkt->pkt_data_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#else
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp_cmd = &pkt->pkt_cmd_cookie;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp_data = &pkt->pkt_data_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* >= EMLXS_MODREV3 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = &sbp->iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq->flag & IOCB_FCP_CMD) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge, SGL_CMD, &cmd_cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (! sge) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* DATA payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_datalen != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan SGL_RESP, &resp_cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (! sge) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Data payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SGL_DATA | SGL_LAST, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (! sge) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldsgl_done:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.flag & EMLXS_SLI4_PHON) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_addr = cp_data->dmac_laddress;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.addrHigh = PADDR_HI(sge_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.addrLow = PADDR_LO(sge_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.tus.f.bdeSize =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp_data->dmac_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan SGL_RESP | SGL_LAST, &resp_cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (! sge) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.Payload.addrHigh =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_HI(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.Payload.addrLow =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_LO(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.Payload.tus.f.bdeSize = cmd_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.PayloadLength = cmd_cnt + resp_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan SGL_CMD | SGL_LAST, &cmd_cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (! sge) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan SGL_CMD, &cmd_cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (! sge) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan SGL_RESP | SGL_LAST, &resp_cnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (! sge) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.PayloadLength = cmd_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.Payload.addrHigh =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_HI(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.Payload.addrLow =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_LO(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.Payload.tus.f.bdeSize = cmd_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_bde_setup */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/*ARGSUSED*/
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_fct_bde_setup(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_wqe_t *wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ULP_SGE64 stage_sge;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ULP_SGE64 *sge;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCB *iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCBQ *iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MATCHMAP *mp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MATCHMAP *fct_mp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld XRIobj_t *xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint64_t sge_addr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t sge_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t cnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t *xrdy_vaddr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stmf_data_buf_t *dbuf;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = &sbp->iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb = &iocbq->iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe = &iocbq->wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = sbp->xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!sbp->fct_buf) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld size = sbp->fct_buf->db_data_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * The hardware will automaticlly round up
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * to multiple of 4.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * if (size & 3) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * size = (size + 3) & 0xfffffffc;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_mp = (MATCHMAP *)sbp->fct_buf->db_port_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->fct_buf->db_sglist_length != 1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bde_setup: Only 1 sglist entry supported: %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->fct_buf->db_sglist_length);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = xrip->SGList.virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (iocb->ULPCOMMAND == CMD_FCP_TRECEIVE64_CX) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp = emlxs_mem_buf_alloc(hba, EMLXS_XFER_RDY_SIZE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!mp || !mp->virt || !mp->phys) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bde_setup: Cannot allocate XRDY memory");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Save the MATCHMAP info to free this memory later */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->bp = mp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Point to XRDY payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrdy_vaddr = (uint32_t *)(mp->virt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Fill in burstsize in payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *xrdy_vaddr++ = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *xrdy_vaddr++ = LE_SWAP32(size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *xrdy_vaddr = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* First 2 SGEs are XRDY and SKIP */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrHigh = PADDR_HI(mp->phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrLow = PADDR_LO(mp->phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.length = EMLXS_XFER_RDY_SIZE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.offset = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.type = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.last = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Words 0-3 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.addrHigh = stage_sge.addrHigh;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.addrLow = stage_sge.addrLow;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.tus.f.bdeSize = EMLXS_XFER_RDY_SIZE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.PayloadLength = EMLXS_XFER_RDY_SIZE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else { /* CMD_FCP_TSEND64_CX */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* First 2 SGEs are SKIP */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrHigh = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrLow = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.length = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.offset = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.type = EMLXS_SGE_TYPE_SKIP;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.last = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Words 0-3 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.addrHigh = PADDR_HI(fct_mp->phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.addrLow = PADDR_LO(fct_mp->phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* The BDE should match the contents of the first SGE payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld len = MIN(EMLXS_MAX_SGE_SIZE, size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.tus.f.bdeSize = len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* The PayloadLength should be set to 0 for TSEND64. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.PayloadLength = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld dbuf = sbp->fct_buf;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * TotalTransferCount equals to Relative Offset field (Word 4)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * in both TSEND64 and TRECEIVE64 WQE.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.TotalTransferCount = dbuf->db_relative_offset;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BE_SWAP32_BCOPY((uint8_t *)&stage_sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)sge, sizeof (ULP_SGE64));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrHigh = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrLow = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.length = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.offset = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.type = EMLXS_SGE_TYPE_SKIP;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.last = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BE_SWAP32_BCOPY((uint8_t *)&stage_sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)sge, sizeof (ULP_SGE64));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_size = size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_addr = fct_mp->phys;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Build SGEs */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld while (sge_size) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE before we build next one */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BE_SWAP32_BCOPY((uint8_t *)&stage_sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)sge, sizeof (ULP_SGE64));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld len = MIN(EMLXS_MAX_SGE_SIZE, sge_size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrHigh = PADDR_HI(sge_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrLow = PADDR_LO(sge_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.length = len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.offset = cnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.type = EMLXS_SGE_TYPE_DATA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_addr += len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_size -= len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt += len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.last = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.flag & EMLXS_SLI4_PHON) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.addrHigh = stage_sge.addrHigh;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.addrLow = stage_sge.addrLow;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.tus.f.bdeSize = stage_sge.length;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BE_SWAP32_BCOPY((uint8_t *)&stage_sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)sge, sizeof (ULP_SGE64));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_fct_bde_setup */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_issue_iocb_cmd(emlxs_hba_t *hba, CHANNEL *cp, IOCBQ *iocbq)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_buf_t *sbp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t channelno;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int32_t throttle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_wqe_t *wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_wqe_t *wqeslot;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld WQ_DESC_t *wq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t flag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t wqdb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t next_wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld off_t offset;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef NODE_THROTTLE_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int32_t node_throttle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld NODELIST *marked_node = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan channelno = cp->channelno;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wq = (WQ_DESC_t *)cp->iopath;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "ISSUE WQE channel: %x %p", channelno, wq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan throttle = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if FCP ring and adapter is not ready */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* We may use any ring for FCP_CMD */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq && (iocbq->flag & IOCB_FCP_CMD) && (hba->state != FC_READY)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(iocbq->flag & IOCB_SPECIAL) || !iocbq->port ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (((emlxs_port_t *)iocbq->port)->mode == MODE_INITIATOR)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_tx_put(iocbq, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Attempt to acquire CMD_RING lock */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (mutex_tryenter(&EMLXS_QUE_LOCK(channelno)) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((hba->io_count -
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_tx_count) > 10) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_tx_put(iocbq, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_QUE_LOCK(channelno));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* EMLXS_QUE_LOCK acquired */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Throttle check only applies to non special iocb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq && (!(iocbq->flag & IOCB_SPECIAL))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if HBA is full */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan throttle = hba->io_throttle - hba->io_active;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (throttle <= 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Hitting adapter throttle limit */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_tx_put(iocbq, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto busy;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check to see if we have room for this WQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next_wqe = wq->host_index + 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (next_wqe >= wq->max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next_wqe = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (next_wqe == wq->port_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_tx_put(iocbq, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto busy;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * We have a command ring slot available
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Make sure we have an iocb to send
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_TX_CHANNEL_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the ring already has iocb's waiting */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cp->nodeq.q_first != NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Put the current iocbq on the tx queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_tx_put(iocbq, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Attempt to replace it with the next iocbq
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * in the tx queue
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = emlxs_tx_get(cp, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_TX_CHANNEL_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = emlxs_tx_get(cp, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathansendit:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Process each iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (iocbq) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp = iocbq->sbp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef NODE_THROTTLE_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp && sbp->node && sbp->node->io_throttle) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld node_throttle = sbp->node->io_throttle -
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->node->io_active;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (node_throttle <= 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Node is busy */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Queue this iocb and get next iocb from */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* channel */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!marked_node) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld marked_node = sbp->node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_TX_CHANNEL_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_tx_put(iocbq, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cp->nodeq.q_first == marked_node) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_TX_CHANNEL_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto busy;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = emlxs_tx_get(cp, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_TX_CHANNEL_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld marked_node = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe = &iocbq->wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ISSUE QID %d WQE iotag:%x xri:%d", wq->qid,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->RequestTag, wqe->XRITag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If exchange removed after wqe was prep'ed, drop it */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!(sbp->xrip)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Xmit WQE iotag:%x xri:%d aborted",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->RequestTag, wqe->XRITag);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get next iocb from the tx queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = emlxs_tx_get(cp, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan continue;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->pkt_flags & PACKET_DELAY_REQUIRED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Perform delay */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((channelno == hba->channel_els) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan !(iocbq->flag & IOCB_FCP_CMD)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan drv_usecwait(100000);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan drv_usecwait(20000);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for ULP pkt request */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->node == NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set node to base node by default */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->node = (void *)&port->node_base;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->node = (void *)&port->node_base;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->pkt_flags |= PACKET_IN_CHIPQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(&hba->io_active);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef NODE_THROTTLE_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->node) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld atomic_inc_32(&sbp->node->io_active);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->xrip->flag |= EMLXS_XRI_PENDING_IO;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SFCT_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FCT_IO_TRACE
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->fct_cmd) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_io_trace(port, sbp->fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_IOCB_ISSUED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_io_trace(port, sbp->fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan icmd->ULPCOMMAND);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FCT_IO_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hbaSendCmd_sbp++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->channel = cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hbaSendCmd++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan flag = iocbq->flag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * At this point, we have a command ring slot available
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * and an iocb to send
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wq->release_depth--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (wq->release_depth == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wq->release_depth = WQE_RELEASE_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->WQEC = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.IocbIssued[channelno]++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wq->num_proc++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Send the iocb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqeslot = (emlxs_wqe_t *)wq->addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqeslot += wq->host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CQId = wq->cqid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.param.PHWQ) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld WQE_PHWQ_WQID(wqe, wq->qid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)wqe, (uint8_t *)wqeslot,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (emlxs_wqe_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef DEBUG_WQE
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "WQE", (uint32_t *)wqe, 18, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_WQE */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan wq->addr.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(wq->addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4096, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Ring the WQ Doorbell */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqdb = wq->qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqdb |= ((1 << 24) | (wq->host_index << 16));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * After this, the sbp / iocb / wqe should not be
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * accessed in the xmit path.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_wqdb(hba, wqdb);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wq->host_index = next_wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "WQ RING: %08x", wqdb);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!sbp) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_IOCB, (void *)iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq && (!(flag & IOCB_SPECIAL))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if HBA is full */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan throttle = hba->io_throttle - hba->io_active;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (throttle <= 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto busy;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check to see if we have room for another WQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next_wqe++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (next_wqe >= wq->max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan next_wqe = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (next_wqe == wq->port_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto busy;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the next iocb from the tx queue if there is one */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = emlxs_tx_get(cp, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_QUE_LOCK(channelno));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanbusy:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wq->num_busy++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (throttle <= 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan HBASTATS.IocbThrottled++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan HBASTATS.IocbRingFull[channelno]++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_QUE_LOCK(channelno));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_iocb_cmd() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_issue_mq(emlxs_port_t *port, MAILBOX4 *mqe, MAILBOX *mb,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint32_t tmo)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb4;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *iptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t mqdb;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *)mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb4 = (MAILBOX4 *)mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mp = (MATCHMAP *) mbq->nonembed;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->mbox_mqe = (void *)mqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mb->mbxCommand != MBX_SLI_CONFIG) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is an embedded mbox, everything should fit
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * into the mailbox area.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)mqe,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.mq.addr.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4096, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (mb->mbxCommand != MBX_HEARTBEAT) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX CMD", (uint32_t *)mqe,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore 18, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* SLI_CONFIG and non-embedded */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is not embedded, the MQ area
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * MUST contain a SGE pointer to a larger area for the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * non-embedded mailbox command.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * mp will point to the actual mailbox command which
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * should be copied into the non-embedded area.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb4->un.varSLIConfig.be.sge_cnt = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb4->un.varSLIConfig.be.payload_length = mp->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)&mb4->un.varSLIConfig.be.un_hdr.hdr_req;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *iptr++ = (uint32_t)PADDR_LO(mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *iptr++ = (uint32_t)PADDR_HI(mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *iptr = mp->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BUFFER(mp->virt, mp->size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)mqe,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.mq.addr.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.mq.addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4096, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX EXT", (uint32_t *)mqe, 12, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Extension Addr %p %p", mp->phys, (uint32_t *)(mp->virt));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "EXT AREA", (uint32_t *)mp->virt, 24, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Ring the MQ Doorbell */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mqdb = hba->sli.sli4.mq.qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mqdb |= ((1 << MQ_DB_POP_SHIFT) & MQ_DB_POP_MASK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (mb->mbxCommand != MBX_HEARTBEAT) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "MQ RING: %08x", mqdb);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_mqdb(hba, mqdb);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_mq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_issue_bootstrap(emlxs_hba_t *hba, MAILBOX *mb, uint32_t tmo)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOXQ *mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb4;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MATCHMAP *mp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *iptr;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan int nonembed = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *)mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb4 = (MAILBOX4 *)mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mp = (MATCHMAP *) mbq->nonembed;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->mbox_mqe = hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mb->mbxCommand != MBX_SLI_CONFIG) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is an embedded mbox, everything should fit
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * into the bootstrap mailbox area.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)iptr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE, DDI_DMA_SYNC_FORDEV);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX CMD", iptr, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is not embedded, the bootstrap mailbox area
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * MUST contain a SGE pointer to a larger area for the
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * non-embedded mailbox command.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * mp will point to the actual mailbox command which
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * should be copied into the non-embedded area.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan nonembed = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb4->un.varSLIConfig.be.sge_cnt = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb4->un.varSLIConfig.be.payload_length = mp->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)&mb4->un.varSLIConfig.be.un_hdr.hdr_req;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *iptr++ = (uint32_t)PADDR_LO(mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *iptr++ = (uint32_t)PADDR_HI(mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *iptr = mp->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BUFFER(mp->virt, mp->size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)iptr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_BOOTSTRAP_MB_SIZE + MBOX_EXTENSION_SIZE,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX EXT", iptr, 12, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Extension Addr %p %p", mp->phys,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (uint32_t *)((uint8_t *)mp->virt));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)((uint8_t *)mp->virt);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "EXT AREA", (uint32_t *)mp->virt, 24, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* NOTE: tmo is in 10ms ticks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!emlxs_issue_bootstrap_mb(hba, tmo)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_TIMEOUT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mb->mbxCommand != MBX_SLI_CONFIG) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)iptr, (uint8_t *)mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX CMP", iptr, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_BOOTSTRAP_MB_SIZE + MBOX_EXTENSION_SIZE,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BUFFER(mp->virt, mp->size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)iptr, (uint8_t *)mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX CMP", iptr, 12, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)((uint8_t *)mp->virt);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "EXT AREA", (uint32_t *)iptr, 24, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (nonembed && mp) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, mp->dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_issue_bootstrap: mp_hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mp->dma_handle);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan return (MBXERR_DMA_ERROR);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.bootstrapmb.dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_issue_bootstrap: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.bootstrapmb.dma_handle);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan return (MBXERR_DMA_ERROR);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_bootstrap() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_issue_mbox_cmd(emlxs_hba_t *hba, MAILBOXQ *mbq, int32_t flag,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t tmo)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_port_t *port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb4;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX *mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbox_rsp_hdr_t *hdr_rsp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *iptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rc;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t tmo_local;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!mbq->port) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mbq->port = &PPORT;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore port = (emlxs_port_t *)mbq->port;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb4 = (MAILBOX4 *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb = (MAILBOX *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_SUCCESS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = MBX_SUCCESS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check for minimum timeouts */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (mb->mbxCommand) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Mailbox commands that erase/write flash */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_DOWN_LOAD:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_UPDATE_CFG:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_LOAD_AREA:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_LOAD_EXP_ROM:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_WRITE_NV:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_FLASH_WR_ULA:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_DEL_LD_ENTRY:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_LOAD_SM:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case MBX_DUMP_MEMORY:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case MBX_WRITE_VPARMS:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case MBX_ACCESS_VDATA:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (tmo < 300) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = 300;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case MBX_SLI_CONFIG: {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mbox_req_hdr_t *hdr_req;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_req = (mbox_req_hdr_t *)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &mb4->un.varSLIConfig.be.un_hdr.hdr_req;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hdr_req->subsystem == IOCTL_SUBSYSTEM_COMMON) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hdr_req->opcode) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_WRITE_OBJ:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_READ_OBJ:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_READ_OBJ_LIST:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_DELETE_OBJ:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_SET_BOOT_CFG:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_GET_PROFILE_CFG:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_SET_PROFILE_CFG:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_GET_PROFILE_LIST:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_SET_ACTIVE_PROFILE:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_GET_PROFILE_CAPS:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_GET_MR_PROFILE_CAPS:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_SET_MR_PROFILE_CAPS:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_SET_FACTORY_PROFILE_CFG:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_SEND_ACTIVATION:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_RESET_LICENSES:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_SET_PHYSICAL_LINK_CFG_V1:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case COMMON_OPCODE_GET_VPD_DATA:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (tmo < 300) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld tmo = 300;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (tmo < 30) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld tmo = 30;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (hdr_req->subsystem == IOCTL_SUBSYSTEM_FCOE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hdr_req->opcode) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case FCOE_OPCODE_SET_FCLINK_SETTINGS:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (tmo < 300) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld tmo = 300;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (tmo < 30) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld tmo = 30;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (tmo < 30) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld tmo = 30;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Also: VENDOR_MANAGE_FFV (0x13, 0x02) (not currently used)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (tmo < 30) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = 30;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Convert tmo seconds to 10 millisecond tics */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo_local = tmo * 100;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Adjust wait flag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (flag != MBX_NOWAIT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.flag & EMLXS_SLI4_INTR_ENABLED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan flag = MBX_SLEEP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan flag = MBX_POLL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Must have interrupts enabled to perform MBX_NOWAIT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(hba->sli.sli4.flag & EMLXS_SLI4_INTR_ENABLED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_HARDWARE_ERROR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Interrupts disabled. %s failed.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_HARDWARE_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan /* Check for hardware error ; special case SLI_CONFIG */
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan if ((hba->flag & FC_HARDWARE_ERROR) &&
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan ! ((mb4->mbxCommand == MBX_SLI_CONFIG) &&
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan (mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode ==
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan COMMON_OPCODE_RESET))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_HARDWARE_ERROR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Hardware error reported. %s failed. status=%x mb=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_cmd_xlate(mb->mbxCommand), mb->mbxStatus, mb);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_HARDWARE_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->mbox_queue_flag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If we are not polling, then queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (flag == MBX_NOWAIT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Busy. %s: mb=%p NoWait.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_put(hba, mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan HBASTATS.MboxBusy++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_BUSY);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (hba->mbox_queue_flag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (tmo_local-- == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_mbox_event_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Timeout. %s: mb=%p tmo=%d Waiting.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Non-lethalStatus mailbox timeout */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Does not indicate a hardware error */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_TIMEOUT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_TIMEOUT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BUSYWAIT_MS(10);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for hardware error ; special case SLI_CONFIG */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->flag & FC_HARDWARE_ERROR) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ! ((mb4->mbxCommand == MBX_SLI_CONFIG) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode ==
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld COMMON_OPCODE_RESET))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxStatus = MBX_HARDWARE_ERROR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_mbox_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Hardware error reported. %s failed. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "status=%x mb=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_cmd_xlate(mb->mbxCommand),
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxStatus, mb);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (MBX_HARDWARE_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_init(hba, mbq, flag, tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (mb->mbxCommand == MBX_DOWN_LINK) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.flag |= EMLXS_SLI4_DOWN_LINK;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (flag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_NOWAIT:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_HEARTBEAT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_DOWN_LOAD
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Sending. %s: mb=%p NoWait. embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = hba->sli.sli4.mq.addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr += (hba->sli.sli4.mq.host_index * MAILBOX_CMD_SLI4_WSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.mq.host_index++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.mq.host_index >= hba->sli.sli4.mq.max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.mq.host_index = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq->bp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "BDE virt %p phys %p size x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((MATCHMAP *)mbq->bp)->virt,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((MATCHMAP *)mbq->bp)->phys,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((MATCHMAP *)mbq->bp)->size);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "DATA",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (uint32_t *)(((MATCHMAP *)mbq->bp)->virt), 30, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rc = emlxs_sli4_issue_mq(port, (MAILBOX4 *)iptr, mb, tmo_local);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_POLL:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_DOWN_LOAD
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Sending. %s: mb=%p Poll. embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = emlxs_sli4_issue_bootstrap(hba, mb, tmo_local);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc == MBX_TIMEOUT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Timeout. %s: mb=%p tmo=%x Poll. embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb, tmo,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag |= FC_MBOX_TIMEOUT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, NULL, MBX_TIMEOUT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_DOWN_LOAD
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Completed. %s: mb=%p status=%x Poll. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb, rc,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Process the result */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(mbq->flag & MBQ_PASSTHRU)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq->mbox_cmpl) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) (mbq->mbox_cmpl)(hba, mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, NULL, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mp = (MATCHMAP *)mbq->nonembed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_rsp = (mbox_rsp_hdr_t *)mp->virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hdr_rsp->status) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "%s: MBX_NONEMBED_ERROR: 0x%x, 0x%x",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mb_cmd_xlate(mb->mbxCommand),
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hdr_rsp->status, hdr_rsp->extra_status);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_NONEMBED_ERROR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = mb->mbxStatus;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Attempt to send pending mailboxes */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *)emlxs_mb_get(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Attempt to send pending mailboxes */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i = emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_NOWAIT, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((i != MBX_BUSY) && (i != MBX_SUCCESS)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_SLEEP:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_DOWN_LOAD
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Sending. %s: mb=%p Sleep. embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = hba->sli.sli4.mq.addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr += (hba->sli.sli4.mq.host_index * MAILBOX_CMD_SLI4_WSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.mq.host_index++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.mq.host_index >= hba->sli.sli4.mq.max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.mq.host_index = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rc = emlxs_sli4_issue_mq(port, (MAILBOX4 *)iptr, mb, tmo_local);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc != MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Wait for completion */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The driver clock is timing the mailbox. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_MBOX_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (!(mbq->flag & MBQ_COMPLETED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cv_wait(&EMLXS_MBOX_CV, &EMLXS_MBOX_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_MBOX_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mp = (MATCHMAP *)mbq->nonembed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_rsp = (mbox_rsp_hdr_t *)mp->virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hdr_rsp->status) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "%s: MBX_NONEMBED_ERROR: 0x%x, 0x%x",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mb_cmd_xlate(mb->mbxCommand),
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hdr_rsp->status, hdr_rsp->extra_status);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_NONEMBED_ERROR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = mb->mbxStatus;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc == MBX_TIMEOUT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Timeout. %s: mb=%p tmo=%x Sleep. embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb, tmo,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_DOWN_LOAD
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Completed. %s: mb=%p status=%x Sleep. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand), mb, rc,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (mb4->un.varSLIConfig.be.embedded)));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_mbox_cmd() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_issue_mbox_cmd4quiesce(emlxs_hba_t *hba, MAILBOXQ *mbq, int32_t flag,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t tmo)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX *mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbox_rsp_hdr_t *hdr_rsp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t rc;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t tmo_local;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb = (MAILBOX *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_SUCCESS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = MBX_SUCCESS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (tmo < 30) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = 30;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Convert tmo seconds to 10 millisecond tics */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo_local = tmo * 100;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan flag = MBX_POLL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check for hardware error */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->flag & FC_HARDWARE_ERROR) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_HARDWARE_ERROR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (MBX_HARDWARE_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_init(hba, mbq, flag, tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (flag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_POLL:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = emlxs_sli4_issue_bootstrap(hba, mb, tmo_local);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc == MBX_TIMEOUT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag |= FC_MBOX_TIMEOUT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, NULL, MBX_TIMEOUT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Process the result */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(mbq->flag & MBQ_PASSTHRU)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq->mbox_cmpl) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) (mbq->mbox_cmpl)(hba, mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, NULL, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mp = (MATCHMAP *)mbq->nonembed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_rsp = (mbox_rsp_hdr_t *)mp->virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hdr_rsp->status) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "%s: MBX_NONEMBED_ERROR: 0x%x, 0x%x",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mb_cmd_xlate(mb->mbxCommand),
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hdr_rsp->status, hdr_rsp->extra_status);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus = MBX_NONEMBED_ERROR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = mb->mbxStatus;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_mbox_cmd4quiesce() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SFCT_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_prep_fct_iocb(emlxs_port_t *port, emlxs_buf_t *cmd_sbp, int channel)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_config_t *cfg = &CFG;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd_t *fct_cmd;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stmf_data_buf_t *dbuf;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld scsi_task_t *fct_task;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_packet_t *pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_node_t *ndlp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCB *iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_wqe_t *wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ULP_SGE64 stage_sge;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ULP_SGE64 *sge;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld RPIobj_t *rpip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld int32_t sge_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint64_t sge_addr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t timeout;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_dma_cookie_t *cp_cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt = PRIV2PKT(cmd_sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp = (CHANNEL *)cmd_sbp->channel;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = &cmd_sbp->iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld did = cmd_sbp->did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (iocb->ULPCOMMAND == CMD_ABORT_XRI_CX) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ndlp = cmd_sbp->node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = EMLXS_NODE_TO_RPI(port, ndlp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use the fabric rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = port->vpip->fabric_rpip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Next allocate an Exchange for this command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_alloc_xri(port, cmd_sbp, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_SOL_BLS_TYPE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to allocate exchange. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "did=0x%x", did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (FC_TRAN_BUSY);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCT Abort Request: xri=%d iotag=%d sbp=%p rxid=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->iotag, cmd_sbp, pkt->pkt_cmd_fhdr.rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->xrip = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp->ulpSendCmd++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->port = (void *)port;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->node = (void *)ndlp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->channel = (void *)cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Don't give the abort priority, we want the IOCB
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * we are aborting to be processed first.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->flag |= IOCB_SPECIAL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe = &iocbq->wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *)wqe, sizeof (emlxs_wqe_t));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe = &iocbq->wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.Abort.Criteria = ABORT_XRI_TAG;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->RequestTag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->AbortTag = pkt->pkt_cmd_fhdr.rx_id;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Command = CMD_ABORT_XRI_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Class = CLASS3;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = 0xffff;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType = WQE_TYPE_ABORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->state >= FC_LINK_UP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.Abort.IA = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.Abort.IA = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set the pkt timer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->ticks = hba->timer_tics + pkt->pkt_timeout +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((pkt->pkt_timeout > 0xff) ? 0 : 10);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (IOERR_SUCCESS);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (iocb->ULPCOMMAND == CMD_FCP_TRSP64_CX) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld timeout = pkt->pkt_timeout;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ndlp = cmd_sbp->node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!ndlp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to find rpi. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOERR_INVALID_RPI, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp->ulpSendCmd++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->port = (void *)port;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->node = (void *)ndlp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->channel = (void *)cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe = &iocbq->wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *)wqe, sizeof (emlxs_wqe_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_register_xri(port, cmd_sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd_fhdr.rx_id, did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to register xri %x. did=0x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd_fhdr.rx_id, did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOERR_NO_XRI, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->iotag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->channel = cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#if (EMLXS_MODREV >= EMLXS_MODREV3)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp_cmd = pkt->pkt_cmd_cookie;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#else
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp_cmd = &pkt->pkt_cmd_cookie;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* >= EMLXS_MODREV3 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_size = pkt->pkt_cmdlen;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make size a multiple of 4 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sge_size & 3) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_size = (sge_size + 3) & 0xfffffffc;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge_addr = cp_cmd->dmac_laddress;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = xrip->SGList.virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrHigh = PADDR_HI(sge_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.addrLow = PADDR_LO(sge_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.length = sge_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.offset = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.type = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld stage_sge.last = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BE_SWAP32_BCOPY((uint8_t *)&stage_sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)sge, sizeof (ULP_SGE64));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Words 0-3 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.addrHigh = stage_sge.addrHigh;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.addrLow = stage_sge.addrLow;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.Payload.tus.f.bdeSize = sge_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.PayloadLength = sge_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 6 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = ndlp->nlp_Rpi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->XRITag = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 7 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Command = iocb->ULPCOMMAND;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Class = cmd_sbp->class;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_RPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Timer = ((timeout > 0xff) ? 0 : timeout);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 8 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->AbortTag = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 9 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->RequestTag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->OXId = (uint16_t)xrip->rx_id;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 10 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->flag & EMLXS_XRI_BUSY) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->XC = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.PHWQ)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->QOSd = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->DBDE = 1; /* Data type for BDE 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 11 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType = WQE_TYPE_TRSP;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set the pkt timer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->ticks = hba->timer_tics + timeout +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((timeout > 0xff) ? 0 : 10);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (pkt->pkt_cmdlen) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MPDATA_SYNC(pkt->pkt_cmd_dma, 0, pkt->pkt_cmdlen,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld DDI_DMA_SYNC_FORDEV);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (IOERR_SUCCESS);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_cmd = cmd_sbp->fct_cmd;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld did = fct_cmd->cmd_rportid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld dbuf = cmd_sbp->fct_buf;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_task = (scsi_task_t *)fct_cmd->cmd_specific;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ndlp = *(emlxs_node_t **)fct_cmd->cmd_rp->rp_fca_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!ndlp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to find rpi. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOERR_INVALID_RPI, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->port = (void *) port;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->node = (void *)ndlp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->channel = (void *) cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe = &iocbq->wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *)wqe, sizeof (emlxs_wqe_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = cmd_sbp->xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to find xri. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOERR_NO_XRI, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_register_xri(port, cmd_sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, ndlp->nlp_DID) == NULL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to register xri. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOERR_NO_XRI, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->iotag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->channel = cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cfg[CFG_TIMEOUT_ENABLE].current) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld timeout =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((2 * hba->fc_ratov) < 60) ? 60 : (2 * hba->fc_ratov);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld timeout = 0x80000000;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->ticks =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->timer_tics + timeout + ((timeout > 0xff) ? 0 : 10);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCT = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (fct_task->task_flags & TF_WRITE_DATA) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_FCP_TRECEIVE64_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType = WQE_TYPE_TRECEIVE; /* Word 11 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else { /* TF_READ_DATA */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_FCP_TSEND64_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType = WQE_TYPE_TSEND; /* Word 11 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((dbuf->db_data_size >=
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_task->task_expected_xfer_length)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* enable auto-rsp AP feature */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->AR = 0x1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCT = 0x1; /* for cmpl */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_sli4_fct_bde_setup(port, cmd_sbp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 6 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = ndlp->nlp_Rpi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->XRITag = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 7 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Command = iocb->ULPCOMMAND;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Class = cmd_sbp->class;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_RPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Timer = ((timeout > 0xff) ? 0 : timeout);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->PU = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 8 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->AbortTag = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 9 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->RequestTag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->OXId = (uint16_t)fct_cmd->cmd_oxid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 10 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->flag & EMLXS_XRI_BUSY) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->XC = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.PHWQ)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->QOSd = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->DBDE = 1; /* Data type for BDE 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 11 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 12 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdSpecific = dbuf->db_data_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (IOERR_SUCCESS);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_prep_fct_iocb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld/*ARGSUSED*/
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_prep_fcp_iocb(emlxs_port_t *port, emlxs_buf_t *sbp, int channel)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fc_packet_t *pkt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CHANNEL *cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld RPIobj_t *rpip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld XRIobj_t *xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_wqe_t *wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCBQ *iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCB *iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld NODELIST *node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld off_t offset;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt = PRIV2PKT(sbp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp = &hba->chan[channel];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = &sbp->iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->channel = (void *) cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->port = (void *) port;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe = &iocbq->wqe;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb = &iocbq->iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *)wqe, sizeof (emlxs_wqe_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *)iocb, sizeof (IOCB));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find target node object */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld node = (NODELIST *)iocbq->node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = EMLXS_NODE_TO_RPI(port, node);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to find rpi. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOERR_INVALID_RPI, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->channel = cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Next allocate an Exchange for this command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_alloc_xri(port, sbp, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_SOL_FCP_TYPE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to allocate exchange. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (FC_TRAN_BUSY);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->bmp = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iotag = sbp->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP: Prep xri=%d iotag=%d oxid=%x rpi=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->iotag, xrip->rx_id, rpip->RPI);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Indicate this is a FCP cmd */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->flag |= IOCB_FCP_CMD;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_bde_setup(port, sbp)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, xrip, 1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to setup SGE. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (FC_TRAN_BUSY);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* DEBUG */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FCP
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP: SGLaddr virt %p phys %p size %d", xrip->SGList.virt,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->SGList.phys, pkt->pkt_datalen);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "FCP: SGL", (uint32_t *)xrip->SGList.virt, 20, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FCP: CMD virt %p len %d:%d:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd, pkt->pkt_cmdlen, pkt->pkt_rsplen, pkt->pkt_datalen);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "FCP: CMD", (uint32_t *)pkt->pkt_cmd, 10, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FCP */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld offset = (off_t)((uint64_t)((unsigned long)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->SGList.virt) -
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint64_t)((unsigned long)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.slim2.virt));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MPDATA_SYNC(xrip->SGList.dma_handle, offset,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->SGList.size, DDI_DMA_SYNC_FORDEV);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* if device is FCP-2 device, set the following bit */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* that says to run the FC-TAPE protocol. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (node->nlp_fcp_info & NLP_FCP_2_DEVICE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ERP = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (pkt->pkt_datalen == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_FCP_ICMND64_CR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Command = CMD_FCP_ICMND64_CR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType = WQE_TYPE_FCP_DATA_IN;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (pkt->pkt_tran_type == FC_PKT_FCP_READ) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_FCP_IREAD64_CR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Command = CMD_FCP_IREAD64_CR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType = WQE_TYPE_FCP_DATA_IN;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->PU = PARM_XFER_CHECK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_FCP_IWRITE64_CR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Command = CMD_FCP_IWRITE64_CR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType = WQE_TYPE_FCP_DATA_OUT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.TotalTransferCount = pkt->pkt_datalen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.PHWQ)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->DBDE = 1; /* Data type for BDE 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->ContextTag = rpip->RPI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->ContextType = WQE_RPI_CONTEXT;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->XRITag = xrip->XRI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Timer =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((pkt->pkt_timeout > 0xff) ? 0 : pkt->pkt_timeout);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CCPE = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CCP = pkt->pkt_cmd_fhdr.rsvd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (FC_TRAN_CLASS(pkt->pkt_tran_flags)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FC_TRAN_CLASS2:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Class = CLASS2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FC_TRAN_CLASS3:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Class = CLASS3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->class = wqe->Class;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->RequestTag = iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_fcp_iocb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_prep_ip_iocb(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_TRAN_BUSY);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_ip_iocb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_prep_els_iocb(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_packet_t *pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCB *iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_wqe_t *wqe;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore FCFIobj_t *fcfp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld RPIobj_t *reserved_rpip = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore RPIobj_t *rpip = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t did;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ULP_SGE64 stage_sge;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ULP_SGE64 *sge;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_dma_cookie_t *cp_cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_dma_cookie_t *cp_resp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_node_t *node;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt = PRIV2PKT(sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = &sbp->iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe = &iocbq->wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)wqe, sizeof (emlxs_wqe_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)iocb, sizeof (IOCB));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[hba->channel_els];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initalize iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->port = (void *) port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->channel = (void *) cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->channel = cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->bmp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#if (EMLXS_MODREV >= EMLXS_MODREV3)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp_cmd = pkt->pkt_cmd_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp_resp = pkt->pkt_resp_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#else
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp_cmd = &pkt->pkt_cmd_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp_resp = &pkt->pkt_resp_cookie;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* >= EMLXS_MODREV3 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge = &stage_sge;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrHigh = PADDR_HI(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrLow = PADDR_LO(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->length = pkt->pkt_cmdlen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->offset = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge->type = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd = *((uint32_t *)pkt->pkt_cmd);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd &= ELS_CMD_MASK;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initalize iocb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* ELS Response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->xrip = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_register_xri(port, sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd_fhdr.rx_id, did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to find XRI. rxid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOERR_NO_XRI, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rpip = xrip->rpip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!rpip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* This means that we had a node registered */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* when the unsol request came in but the node */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* has since been unregistered. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to find RPI. rxid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOERR_INVALID_RPI, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ELS: Prep xri=%d iotag=%d oxid=%x rpi=%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->XRI, xrip->iotag, xrip->rx_id, rpip->RPI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_XMIT_ELS_RSP64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Command = CMD_XMIT_ELS_RSP64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType = WQE_TYPE_GEN;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.PHWQ)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->DBDE = 1; /* Data type for BDE 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsRsp.Payload.addrHigh = sge->addrHigh;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsRsp.Payload.addrLow = sge->addrLow;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsRsp.Payload.tus.f.bdeSize = pkt->pkt_cmdlen;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.ElsCmd.PayloadLength = pkt->pkt_cmdlen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsRsp.RemoteId = did;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->PU = 0x3;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->OXId = xrip->rx_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->last = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now sge is fully staged */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sge = xrip->SGList.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (ULP_SGE64));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rpip->RPI == FABRIC_RPI) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = port->vpip->VPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_VPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = rpip->RPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_RPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((cmd == ELS_CMD_ACC) && (sbp->ucmd == ELS_CMD_FLOGI)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.ElsCmd.SP = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.ElsCmd.LocalId = 0xFFFFFE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* ELS Request */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fcfp = port->vpip->vfip->fcfp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan node = (emlxs_node_t *)iocbq->node;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rpip = EMLXS_NODE_TO_RPI(port, node);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use the fabric rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = port->vpip->fabric_rpip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Next allocate an Exchange for this command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_alloc_xri(port, sbp, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_SOL_ELS_TYPE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Adapter Busy. Unable to allocate exchange. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "did=0x%x", did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_TRAN_BUSY);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ELS: Prep xri=%d iotag=%d rpi=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->iotag, rpip->RPI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_ELS_REQUEST64_CR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Command = CMD_ELS_REQUEST64_CR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType = WQE_TYPE_ELS;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.PHWQ)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->DBDE = 1; /* Data type for BDE 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsCmd.Payload.addrHigh = sge->addrHigh;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsCmd.Payload.addrLow = sge->addrLow;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsCmd.Payload.tus.f.bdeSize = pkt->pkt_cmdlen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.ElsCmd.RemoteId = did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Timer = ((pkt->pkt_timeout > 0xff) ? 0 : pkt->pkt_timeout);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* setup for rsp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.elsreq64.remoteID = (did == BCAST_DID) ? 0 : did;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPPU = 1; /* Wd4 is relative offset */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->last = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sge = xrip->SGList.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (ULP_SGE64));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsCmd.PayloadLength =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmdlen; /* Byte offset of rsp data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge = &stage_sge;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrHigh = PADDR_HI(cp_resp->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrLow = PADDR_LO(cp_resp->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->length = pkt->pkt_rsplen;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan sge->offset = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->last = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now sge is fully staged */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sge = xrip->SGList.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (ULP_SGE64));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef DEBUG_ELS
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ELS: SGLaddr virt %p phys %p",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->SGList.virt, xrip->SGList.phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ELS: PAYLOAD virt %p phys %p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd, cp_cmd->dmac_laddress);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "ELS: SGL", (uint32_t *)xrip->SGList.virt,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore 12, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_ELS */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (cmd) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ELS_CMD_FLOGI:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsCmd.SP = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->sli_intf & SLI_INTF_IF_TYPE_MASK) ==
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld SLI_INTF_IF_TYPE_0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = fcfp->FCFI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_FCFI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = port->vpip->VPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_VPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->flag & FC_FIP_SUPPORTED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType |= WQE_TYPE_MASK_FIP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->topology == TOPOLOGY_LOOP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.ElsCmd.LocalId = port->did;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ELSId = WQE_ELSID_FLOGI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ELS_CMD_FDISC:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.ElsCmd.SP = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = port->vpip->VPI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->ContextType = WQE_VPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->flag & FC_FIP_SUPPORTED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType |= WQE_TYPE_MASK_FIP;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ELSId = WQE_ELSID_FDISC;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ELS_CMD_LOGO:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((did == FABRIC_DID) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->flag & FC_FIP_SUPPORTED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType |= WQE_TYPE_MASK_FIP;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = port->vpip->VPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_VPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ELSId = WQE_ELSID_LOGO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ELS_CMD_PLOGI:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rpip->RPI == FABRIC_RPI) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->flag & FC_PT_TO_PT) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.ElsCmd.SP = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.ElsCmd.LocalId = port->did;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = port->vpip->VPI;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->ContextType = WQE_VPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = rpip->RPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_RPI_CONTEXT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ELSId = WQE_ELSID_PLOGI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rpip->RPI == FABRIC_RPI) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = port->vpip->VPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_VPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = rpip->RPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_RPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ELSId = WQE_ELSID_CMD;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This allows fct to abort the request */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->fct_cmd) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->fct_cmd->cmd_oxid = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->fct_cmd->cmd_rxid = 0xFFFF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (wqe->ContextType == WQE_VPI_CONTEXT) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld reserved_rpip = emlxs_rpi_reserve_notify(port, did, xrip);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!reserved_rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to alloc reserved RPI. rxid=%x. Rejecting.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd_fhdr.rx_id);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOERR_INVALID_RPI, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Store the reserved rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (wqe->Command == CMD_ELS_REQUEST64_CR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->OXId = reserved_rpip->RPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdSpecific = reserved_rpip->RPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld offset = (off_t)((uint64_t)((unsigned long)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->SGList.virt) -
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MPDATA_SYNC(xrip->SGList.dma_handle, offset,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->SGList.size, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CCPE = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CCP = pkt->pkt_cmd_fhdr.rsvd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (FC_TRAN_CLASS(pkt->pkt_tran_flags)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FC_TRAN_CLASS2:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Class = CLASS2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FC_TRAN_CLASS3:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Class = CLASS3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->class = wqe->Class;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->XRITag = xrip->XRI;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->RequestTag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_els_iocb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_prep_ct_iocb(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_packet_t *pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCB *iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_wqe_t *wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan NODELIST *node = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore RPIobj_t *rpip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t did;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt = PRIV2PKT(sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = &sbp->iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe = &iocbq->wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)wqe, sizeof (emlxs_wqe_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)iocb, sizeof (IOCB));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[hba->channel_ct];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->port = (void *) port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->channel = (void *) cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->bmp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->channel = cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initalize wqe */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CT Response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->xrip = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_register_xri(port, sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld pkt->pkt_cmd_fhdr.rx_id, did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to find XRI. rxid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOERR_NO_XRI, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rpip = xrip->rpip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!rpip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* This means that we had a node registered */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* when the unsol request came in but the node */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* has since been unregistered. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to find RPI. rxid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd_fhdr.rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOERR_INVALID_RPI, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CT: Prep xri=%d iotag=%d oxid=%x rpi=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->iotag, xrip->rx_id, rpip->RPI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_bde_setup(port, sbp)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Adapter Busy. Unable to setup SGE. did=0x%x", did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_TRAN_BUSY);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->model_info.chip & EMLXS_BE_CHIPS)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.XmitSeq.Rsvd0 = 0; /* Word3 now reserved */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.PHWQ)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->DBDE = 1; /* Data type for BDE 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_XMIT_SEQUENCE64_CR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType = WQE_TYPE_GEN;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Command = CMD_XMIT_SEQUENCE64_CR;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->LenLoc = 2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (((SLI_CT_REQUEST *) pkt->pkt_cmd)->CommandResponse.bits.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CmdRsp == (LE_SWAP16(SLI_CT_LOOPBACK))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.XmitSeq.xo = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.XmitSeq.xo = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_LAST_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.XmitSeq.ls = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_SEQ_INITIATIVE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.XmitSeq.si = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.XmitSeq.DFctl = pkt->pkt_cmd_fhdr.df_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.XmitSeq.Rctl = pkt->pkt_cmd_fhdr.r_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.XmitSeq.Type = pkt->pkt_cmd_fhdr.type;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->OXId = xrip->rx_id;
62379b581655b9c347d192fce07f06c575a54ea3Sukumar Swaminathan wqe->XC = 0; /* xri_tag is a new exchange */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdSpecific = wqe->un.GenReq.Payload.tus.f.bdeSize;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CT Request */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan node = (emlxs_node_t *)iocbq->node;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rpip = EMLXS_NODE_TO_RPI(port, node);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!rpip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to find rpi. did=0x%x rpi=%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore did, node->nlp_Rpi);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOERR_INVALID_RPI, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Next allocate an Exchange for this command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_alloc_xri(port, sbp, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_SOL_CT_TYPE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Adapter Busy. Unable to allocate exchange. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "did=0x%x", did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_TRAN_BUSY);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CT: Prep xri=%d iotag=%d oxid=%x rpi=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->iotag, xrip->rx_id, rpip->RPI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_bde_setup(port, sbp)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Adapter Busy. Unable to setup SGE. did=0x%x", did);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, xrip, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_TRAN_BUSY);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.PHWQ)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->DBDE = 1; /* Data type for BDE 0 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_GEN_REQUEST64_CR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType = WQE_TYPE_GEN;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Command = CMD_GEN_REQUEST64_CR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.la = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.DFctl = pkt->pkt_cmd_fhdr.df_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.Rctl = pkt->pkt_cmd_fhdr.r_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.Type = pkt->pkt_cmd_fhdr.type;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef DEBUG_CT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CT: SGLaddr virt %p phys %p", xrip->SGList.virt,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->SGList.phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CT: SGL", (uint32_t *)xrip->SGList.virt,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore 12, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CT: CMD virt %p len %d:%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmd, pkt->pkt_cmdlen, pkt->pkt_rsplen);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CT: DATA", (uint32_t *)pkt->pkt_cmd,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 20, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* DEBUG_CT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This allows fct to abort the request */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->fct_cmd) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->fct_cmd->cmd_oxid = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->fct_cmd->cmd_rxid = 0xFFFF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Setup for rsp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.genreq64.w5.hcsw.Rctl = pkt->pkt_cmd_fhdr.r_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.genreq64.w5.hcsw.Type = pkt->pkt_cmd_fhdr.type;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.genreq64.w5.hcsw.Dfctl = pkt->pkt_cmd_fhdr.df_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPPU = 1; /* Wd4 is relative offset */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->SGList.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MPDATA_SYNC(xrip->SGList.dma_handle, offset,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->SGList.size, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->ContextTag = rpip->RPI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->ContextType = WQE_RPI_CONTEXT;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->XRITag = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Timer = ((pkt->pkt_timeout > 0xff) ? 0 : pkt->pkt_timeout);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CCPE = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CCP = pkt->pkt_cmd_fhdr.rsvd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (FC_TRAN_CLASS(pkt->pkt_tran_flags)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FC_TRAN_CLASS2:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Class = CLASS2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case FC_TRAN_CLASS3:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Class = CLASS3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->class = wqe->Class;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore wqe->RequestTag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (FC_SUCCESS);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_ct_iocb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_read_eq(emlxs_hba_t *hba, EQ_DESC_t *eq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *ptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EQE_u eqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int rc = 0;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr = eq->addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr += eq->host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan eq->addr.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(eq->addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4096, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore eqe.word = *ptr;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore eqe.word = BE_SWAP32(eqe.word);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (eqe.word & EQE_VALID) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rc = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_read_eq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_poll_intr(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int rc = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan char arg[] = {0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7};
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check attention bits once and process if required */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->intr_count; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rc = emlxs_sli4_read_eq(hba, &hba->sli.sli4.eq[i]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rc == 1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rc != 1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_sli4_msi_intr((char *)hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (char *)(unsigned long)arg[i]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_poll_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_async_event(emlxs_hba_t *hba, CQE_ASYNC_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint8_t status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Save the event tag */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->link_event_tag == cqe->un.link.event_tag) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.LinkMultiEvent++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (hba->link_event_tag + 1 < cqe->un.link.event_tag) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.LinkMultiEvent++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->link_event_tag = cqe->un.link.event_tag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (cqe->event_code) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_CODE_FCOE_LINK_STATE:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.LinkEvent++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore switch (cqe->un.link.link_status) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ASYNC_EVENT_PHYS_LINK_UP:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Link Async Event: PHYS_LINK_UP. val=%d "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "type=%x event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->valid, cqe->event_type, HBASTATS.LinkEvent);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_LOGICAL_LINK_UP:
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Link Async Event: LOGICAL_LINK_UP. val=%d "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "type=%x event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->valid, cqe->event_type, HBASTATS.LinkEvent);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_handle_fcoe_link_event(hba, cqe);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_PHYS_LINK_DOWN:
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Link Async Event: PHYS_LINK_DOWN. val=%d "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "type=%x event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->valid, cqe->event_type, HBASTATS.LinkEvent);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_handle_fcoe_link_event(hba, cqe);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_LOGICAL_LINK_DOWN:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Link Async Event: LOGICAL_LINK_DOWN. val=%d "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "type=%x event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->valid, cqe->event_type, HBASTATS.LinkEvent);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_handle_fcoe_link_event(hba, cqe);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Link Async Event: Unknown link status=%d event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->un.link.link_status, HBASTATS.LinkEvent);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ASYNC_EVENT_CODE_FCOE_FIP:
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore switch (cqe->un.fcoe.evt_type) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ASYNC_EVENT_NEW_FCF_DISC:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: FCF_FOUND %d:%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index, cqe->un.fcoe.fcf_count);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_fcf_found_notify(port,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ASYNC_EVENT_FCF_TABLE_FULL:
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: FCFTAB_FULL %d:%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index, cqe->un.fcoe.fcf_count);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_fcf_full_notify(port);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ASYNC_EVENT_FCF_DEAD:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: FCF_LOST %d:%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index, cqe->un.fcoe.fcf_count);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_fcf_lost_notify(port,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ASYNC_EVENT_VIRT_LINK_CLEAR:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: CVL %d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_fcf_cvl_notify(port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_vpi_to_index(hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->un.fcoe.ref_index));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore break;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore case ASYNC_EVENT_FCF_MODIFIED:
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: FCF_CHANGED %d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_fcf_changed_notify(port,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cqe->un.fcoe.ref_index);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: Unknown event type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->un.fcoe.evt_type);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case ASYNC_EVENT_CODE_DCBX:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "DCBX Async Event: type=%d. Not supported.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->event_type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore case ASYNC_EVENT_CODE_GRP_5:
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Group 5 Async Event: type=%d.", cqe->event_type);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (cqe->event_type == ASYNC_EVENT_QOS_SPEED) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->qos_linkspeed = cqe->un.qos.qos_link_speed;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_CODE_FC_EVENT:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (cqe->event_type) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_FC_LINK_ATT:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.LinkEvent++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FC Async Event: Link Attention. event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.LinkEvent);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_handle_fc_link_att(hba, cqe);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_FC_SHARED_LINK_ATT:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.LinkEvent++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FC Async Event: Shared Link Attention. event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld HBASTATS.LinkEvent);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_handle_fc_link_att(hba, cqe);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FC Async Event: Unknown event. type=%d event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->event_type, HBASTATS.LinkEvent);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_CODE_PORT:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: type=%d", cqe->event_type);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cqe->event_type == ASYNC_EVENT_MISCONFIG_PORT) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *((uint32_t *)cqe->un.port.link_status) =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BE_SWAP32(*((uint32_t *)cqe->un.port.link_status));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->un.port.link_status[hba->sli.sli4.link_number];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (status) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 0 :
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 1 :
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Physical media not "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "detected");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmn_err(CE_WARN,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Optics faulted/incorrectly "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "installed/not installed - Reseat optics, "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "if issue not resolved, replace.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld DRIVER_NAME, hba->ddiinst);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 2 :
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Wrong physical "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "media detected");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmn_err(CE_WARN,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Optics of two types installed - "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Remove one optic or install matching"
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "pair of optics.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld DRIVER_NAME, hba->ddiinst);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 3 :
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Unsupported "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "physical media detected");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmn_err(CE_WARN,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Incompatible optics - Replace "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "with compatible optics for card to "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "function.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld DRIVER_NAME, hba->ddiinst);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default :
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Physical media "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "error, status=%x", status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmn_err(CE_WARN,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Misconfigured port: status=0x%x - "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Check optics on card.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld DRIVER_NAME, hba->ddiinst, status);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_CODE_VF:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VF Async Event: type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->event_type);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ASYNC_EVENT_CODE_MR:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "MR Async Event: type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->event_type);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unknown Async Event: code=%d type=%d.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->event_code, cqe->event_type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_async_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_mbox_event(emlxs_hba_t *hba, CQE_MBOX_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *mbox_bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *mbox_nonembed;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore MAILBOXQ *mbq = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *iptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int rc;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cqe->consumed && !cqe->completed) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. Entry consumed but not completed");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (hba->mbox_queue_flag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_stray_mbox_intr_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. No mailbox active.");
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_POLL:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Mark mailbox complete, this should wake up any polling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* threads. This can happen if interrupts are enabled while */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* a polled mailbox command is outstanding. If we don't set */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* MBQ_COMPLETED here, the polling thread may wait until */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* timeout error occurs */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_MBOX_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *)hba->mbox_mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore port = (emlxs_port_t *)mbq->port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. Completing Polled command.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq->flag |= MBQ_COMPLETED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_MBOX_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_SLEEP:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_NOWAIT:
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Check mbox_timer, it acts as a service flag too */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* The first to service the mbox queue will clear the timer */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (hba->mbox_timer) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->mbox_timer = 0;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_MBOX_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mbq = (MAILBOXQ *)hba->mbox_mbq;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_MBOX_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!mbq) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Mailbox event. No service required.");
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_PORT_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb = (MAILBOX4 *)mbq;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_completion_error_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. Invalid Mailbox flag (%x).",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->mbox_queue_flag);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Set port context */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore port = (emlxs_port_t *)mbq->port;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.mq.addr.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now that we are the owner, DMA Sync entire MQ if needed */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.mq.addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4096, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)hba->mbox_mqe, (uint8_t *)mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (mb->mbxCommand != MBX_HEARTBEAT) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. Mbox complete. status=%x cmd=%x",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mb->mbxStatus, mb->mbxCommand);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX CMP", (uint32_t *)hba->mbox_mqe,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore 12, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand == MBX_SLI_CONFIG) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Mbox sge_cnt: %d length: %d embed: %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varSLIConfig.be.sge_cnt,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varSLIConfig.be.payload_length,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varSLIConfig.be.embedded);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now sync the memory buffer if one was used */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq->bp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbox_bp = (MATCHMAP *)mbq->bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mbox_bp->dma_handle, 0, mbox_bp->size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, mbox_bp->dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_process_mbox_event: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mbox_bp->dma_handle);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mb->mbxStatus = MBXERR_DMA_ERROR;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan}
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now sync the memory buffer if one was used */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq->nonembed) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbox_nonembed = (MATCHMAP *)mbq->nonembed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan size = mbox_nonembed->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mbox_nonembed->dma_handle, 0, size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)((uint8_t *)mbox_nonembed->virt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)iptr, (uint8_t *)iptr, size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mbox_nonembed->dma_handle) != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_process_mbox_event: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mbox_nonembed->dma_handle);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mb->mbxStatus = MBXERR_DMA_ERROR;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "EXT AREA", (uint32_t *)iptr, 24, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Mailbox has been completely received at this point */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand == MBX_HEARTBEAT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->heartbeat_active = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->mbox_queue_flag == MBX_SLEEP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_DOWN_LOAD
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Received. %s: status=%x Sleep.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxCommand != MBX_DOWN_LOAD
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Completed. %s: status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Filter out passthru mailbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq->flag & MBQ_PASSTHRU) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->mbxStatus) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: status=0x%x", emlxs_mb_cmd_xlate(mb->mbxCommand),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (uint32_t)mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq->mbox_cmpl) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = (mbq->mbox_cmpl)(hba, mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If mbox was retried, return immediately */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (rc) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathandone:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, (MAILBOX *)mb, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Attempt to send pending mailboxes */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *)emlxs_mb_get(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Attempt to send pending mailboxes */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_NOWAIT, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_mbox_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_CQE_to_IOCB(emlxs_hba_t *hba, CQE_CmplWQ_t *cqe, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCB *iocb;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint32_t *iptr;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore fc_packet_t *pkt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_wqe_t *wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = &sbp->iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe = &iocbq->wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQE to IOCB: cmd:%x tag:%x xri:%d", wqe->Command,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->RequestTag, wqe->XRITag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPSTATUS = cqe->Status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.ulpWord[4] = cqe->Parameter;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPIOTAG = cqe->RequestTag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCONTEXT = wqe->XRITag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (wqe->Command) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CMD_FCP_ICMND64_CR:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_FCP_ICMND64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CMD_FCP_IREAD64_CR:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_FCP_IREAD64_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPPU = PARM_XFER_CHECK;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocb->ULPSTATUS == IOSTAT_FCP_RSP_ERROR) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.fcpi64.fcpi_parm =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.TotalTransferCount -
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe->CmdSpecific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CMD_FCP_IWRITE64_CR:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_FCP_IWRITE64_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (iocb->ULPSTATUS == IOSTAT_FCP_RSP_ERROR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (wqe->un.FcpCmd.TotalTransferCount >
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->CmdSpecific) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->un.fcpi64.fcpi_parm =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.TotalTransferCount -
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->CmdSpecific;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->un.fcpi64.fcpi_parm = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CMD_ELS_REQUEST64_CR:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_ELS_REQUEST64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.elsreq64.bdl.bdeSize = cqe->CmdSpecific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocb->ULPSTATUS == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_iocb.rsplen = cqe->CmdSpecific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (iocb->ULPSTATUS == IOSTAT_LS_RJT) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* For LS_RJT, the driver populates the rsp buffer */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore pkt = PRIV2PKT(sbp);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iptr = (uint32_t *)pkt->pkt_resp;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore *iptr++ = ELS_CMD_LS_RJT;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore *iptr = cqe->Parameter;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CMD_GEN_REQUEST64_CR:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_GEN_REQUEST64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_iocb.rsplen = cqe->CmdSpecific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CMD_XMIT_SEQUENCE64_CR:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_XMIT_SEQUENCE64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case CMD_ABORT_XRI_CX:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCONTEXT = wqe->AbortTag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case CMD_FCP_TRECEIVE64_CX:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* free memory for XRDY */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (iocbq->bp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mem_buf_free(hba, iocbq->bp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->bp = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*FALLTHROUGH*/
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case CMD_FCP_TSEND64_CX:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case CMD_FCP_TRSP64_CX:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = wqe->Command;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_CQE_to_IOCB() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_hba_flush_chipq(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t trigger = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CQE_CmplWQ_t cqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < hba->max_iotag; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp = hba->fc_table[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp == NULL || sbp == STALE_PACKET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan continue;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->fc_table[i] = STALE_PACKET;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count--;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sbp->iotag = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = sbp->channel;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&cqe, sizeof (CQE_CmplWQ_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe.RequestTag = i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe.Status = IOSTAT_LOCAL_REJECT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe.Parameter = IOERR_SEQUENCE_TIMEOUT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hbaCmplCmd_sbp++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SFCT_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FCT_IO_TRACE
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->fct_cmd) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fct_io_trace(port, sbp->fct_cmd,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_FCT_IOCB_COMPLETE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FCT_IO_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->pkt_flags & PACKET_IN_CHIPQ) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld atomic_dec_32(&hba->io_active);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef NODE_THROTTLE_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->node) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld atomic_dec_32(&sbp->node->io_active);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy entry to sbp's iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = &sbp->iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_CQE_to_IOCB(hba, &cqe, sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->next = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Exchange is no longer busy on-chip, free it */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, sbp->xrip, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(sbp->pkt_flags &
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (PACKET_POLLED | PACKET_ALLOCATED))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add the IOCB to the channel list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&cp->rsp_lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cp->rsp_head == NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_head = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_tail = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_tail->next = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_tail = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cp->rsp_lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan trigger = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_proc_channel_event(hba, cp, iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (trigger) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < hba->chan_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cp->rsp_head != NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_thread_trigger2(&cp->intr_thread,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_proc_channel, cp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_flush_chipq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_oor_wqe_cmpl(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CQ_DESC_t *cq, CQE_CmplWQ_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t request_tag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan request_tag = cqe->RequestTag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* 1 to 1 mapping between CQ and channel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = cq->channelp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hbaCmplCmd++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: OOR Cmpl: iotag=%d", request_tag);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CQE", (uint32_t *)cqe, 4, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_oor_wqe_cmpl() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_wqe_cmpl(emlxs_hba_t *hba, CQ_DESC_t *cq, CQE_CmplWQ_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCBQ *iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t request_tag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_IO_TRACE
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fct_cmd_t *fct_cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_buf_t *cmd_sbp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_IO_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan request_tag = cqe->RequestTag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* 1 to 1 mapping between CQ and channel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = cq->channelp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp = hba->fc_table[request_tag];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!sbp) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp->hbaCmplCmd++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_FCTAB_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: NULL sbp. iotag=%d. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld request_tag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp == STALE_PACKET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hbaCmplCmd_sbp++;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: Stale sbp. iotag=%d. Dropping...", request_tag);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->pkt_flags & PACKET_IN_CHIPQ) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld atomic_add_32(&hba->io_active, -1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef NODE_THROTTLE_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->node) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld atomic_add_32(&sbp->node->io_active, -1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(sbp->xrip)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hbaCmplCmd++;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: NULL sbp xrip %p. iotag=%d. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp, request_tag);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: process wqe compl");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->hbaCmplCmd_sbp++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy entry to sbp's iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = &sbp->iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_CQE_to_IOCB(hba, cqe, sbp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->next = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cqe->XB) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Mark exchange as ABORT in progress */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sbp->xrip->flag &= ~EMLXS_XRI_PENDING_IO;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->xrip->flag |= EMLXS_XRI_BUSY;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: XRI BUSY: iotag=%d xri=%d", request_tag,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sbp->xrip->XRI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, 0, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Exchange is no longer busy on-chip, free it */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, sbp->xrip, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FCT_IO_TRACE
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore fct_cmd = sbp->fct_cmd;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (fct_cmd) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&cmd_sbp->fct_mtx);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, EMLXS_FCT_IOCB_COMPLETE);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&cmd_sbp->fct_mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_IO_TRACE */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is NOT a polled command completion
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * or a driver allocated pkt, then defer pkt
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * completion.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(sbp->pkt_flags &
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (PACKET_POLLED | PACKET_ALLOCATED))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add the IOCB to the channel list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&cp->rsp_lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cp->rsp_head == NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_head = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_tail = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_tail->next = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->rsp_tail = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&cp->rsp_lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Delay triggering thread till end of ISR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->chan_flag |= EMLXS_NEEDS_TRIGGER;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_proc_channel_event(hba, cp, iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_wqe_cmpl() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_release_wqe(emlxs_hba_t *hba, CQ_DESC_t *cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CQE_RelWQ_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan WQ_DESC_t *wq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t wqi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqi = emlxs_sli4_wqid_to_index(hba, (uint16_t)cqe->WQid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Verify WQ index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (wqi == 0xffff) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: Invalid WQid:%d. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->WQid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wq = &hba->sli.sli4.wq[wqi];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: process release wqe: old %d new %d", wq->port_index,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe->WQindex);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wq->port_index = cqe->WQindex;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Cmd ring may be available. Try sending more iocbs */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < hba->chan_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (wq == (WQ_DESC_t *)cp->iopath) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_issue_iocb_cmd(hba, cp, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_release_wqe() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_iocbq_t *
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_rxq_get(emlxs_hba_t *hba, fc_frame_hdr_t *fchdr)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_queue_t *q;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_iocbq_t *iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_iocbq_t *prev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_frame_hdr_t *fchdr2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan RXQ_DESC_t *rxq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (fchdr->type) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 1: /* ELS */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rxq = &hba->sli.sli4.rxq[EMLXS_RXQ_ELS];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0x20: /* CT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rxq = &hba->sli.sli4.rxq[EMLXS_RXQ_CT];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&rxq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q = &rxq->active;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = (emlxs_iocbq_t *)q->q_first;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan prev = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr2 = (fc_frame_hdr_t *)iocbq->iocb.un.ulpWord;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((fchdr2->s_id == fchdr->s_id) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (fchdr2->ox_id == fchdr->ox_id) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (fchdr2->seq_id == fchdr->seq_id)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Remove iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (prev) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan prev->next = iocbq->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (q->q_first == (uint8_t *)iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q->q_first = (uint8_t *)iocbq->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (q->q_last == (uint8_t *)iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q->q_last = (uint8_t *)prev;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q->q_cnt--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan prev = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = iocbq->next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&rxq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_rxq_get() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanvoid
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_rxq_put(emlxs_hba_t *hba, emlxs_iocbq_t *iocbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_queue_t *q;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_frame_hdr_t *fchdr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan RXQ_DESC_t *rxq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr = (fc_frame_hdr_t *)iocbq->iocb.RXFCHDR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (fchdr->type) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 1: /* ELS */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rxq = &hba->sli.sli4.rxq[EMLXS_RXQ_ELS];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0x20: /* CT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rxq = &hba->sli.sli4.rxq[EMLXS_RXQ_CT];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&rxq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q = &rxq->active;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (q->q_last) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((emlxs_iocbq_t *)q->q_last)->next = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q->q_cnt++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q->q_first = (uint8_t *)iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q->q_cnt = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan q->q_last = (uint8_t *)iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->next = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&rxq->lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_rxq_put() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_rq_post(emlxs_port_t *port, uint16_t rqid)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_rqdbu_t rqdb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ POST: rqid=%d count=1", rqid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Ring the RQ doorbell once to repost the RQ buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqdb.word = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqdb.db.Qid = rqid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqdb.db.NumPosted = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_rqdb(hba, rqdb.word);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_rq_post() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_unsol_rcv(emlxs_hba_t *hba, CQ_DESC_t *cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CQE_UnsolRcv_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *vport;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan RQ_DESC_t *hdr_rq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan RQ_DESC_t *data_rq;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MBUF_INFO *hdr_mp;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MBUF_INFO *data_mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *seq_mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *data;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fc_frame_hdr_t fchdr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t hdr_rqi;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_iocbq_t *iocbq = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_iocb_t *iocb;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_node_t *node = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t seq_len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t seq_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t buf_type;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan char label[32];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_wqe_t *wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore RPIobj_t *rpip = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t cmd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t posted = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t abort = 1;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t status;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t data_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t rqid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t hdr_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fc_packet_t *pkt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_buf_t *sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cqe->Code == CQE_TYPE_UNSOL_RCV_V1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CQE_UnsolRcvV1_t *cqeV1 = (CQE_UnsolRcvV1_t *)cqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = cqeV1->Status;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld data_size = cqeV1->data_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rqid = cqeV1->RQid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_size = cqeV1->hdr_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = cqe->Status;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld data_size = cqe->data_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rqid = cqe->RQid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_size = cqe->hdr_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Validate the CQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check status */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (status) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case RQ_STATUS_SUCCESS: /* 0x10 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case RQ_STATUS_BUFLEN_EXCEEDED: /* 0x11 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: Payload truncated.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case RQ_STATUS_NEED_BUFFER: /* 0x12 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: Payload buffer needed.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case RQ_STATUS_FRAME_DISCARDED: /* 0x13 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: Payload buffer discarded.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: Unknown status=%x.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Make sure there is a frame header */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hdr_size < sizeof (fc_frame_hdr_t)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: FC header too small. Dropping...");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_rqi = emlxs_sli4_rqid_to_index(hba, rqid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Verify RQ index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hdr_rqi == 0xffff) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: Unsol Rcv: Invalid RQID:%d. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rqid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_rq = &hba->sli.sli4.rq[hdr_rqi];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld data_rq = &hba->sli.sli4.rq[hdr_rqi + 1];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: Unsol Rcv:%x rqid=%d,%d index=%d status=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "hdr_size=%d data_size=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->Code, rqid, hdr_rqi, hdr_rq->host_index, status, hdr_size,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld data_size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_rq->num_proc++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Update host index */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&hba->sli.sli4.rq[hdr_rqi].lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan host_index = hdr_rq->host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_rq->host_index++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hdr_rq->host_index >= hdr_rq->max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_rq->host_index = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data_rq->host_index = hdr_rq->host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&hba->sli.sli4.rq[hdr_rqi].lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the next header rqb */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hdr_mp = &hdr_rq->rqb[host_index];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)hdr_mp->virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(hdr_mp->dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (fc_frame_hdr_t), DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan LE_SWAP32_BCOPY(hdr_mp->virt, (uint8_t *)&fchdr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (fc_frame_hdr_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ HDR[%d]: rctl:%x type:%x "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "sid:%x did:%x oxid:%x rxid:%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan host_index, fchdr.r_ctl, fchdr.type,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr.s_id, fchdr.d_id, fchdr.ox_id, fchdr.rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ HDR[%d]: fctl:%x seq_id:%x seq_cnt:%x df_ctl:%x ro:%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan host_index, fchdr.f_ctl, fchdr.seq_id, fchdr.seq_cnt,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr.df_ctl, fchdr.ro);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Verify fc header type */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (fchdr.type) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0: /* BLS */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fchdr.r_ctl != 0x81) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: Unexpected FC rctl (0x%x) "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "received. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr.r_ctl);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Make sure there is no payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (data_size != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ ENTRY: ABTS payload provided. Dropping...");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_type = 0xFFFFFFFF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(label, "ABTS", sizeof (label));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[hba->channel_els];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0x01: /* ELS */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Make sure there is a payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (data_size == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: Unsol Rcv: No ELS payload provided. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dropping...");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_type = MEM_ELSBUF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(label, "Unsol ELS", sizeof (label));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[hba->channel_els];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0x20: /* CT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Make sure there is a payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (data_size == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: Unsol Rcv: No CT payload provided. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dropping...");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_type = MEM_CTBUF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(label, "Unsol CT", sizeof (label));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[hba->channel_ct];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 0x08: /* FCT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make sure there is a payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (data_size == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: Unsol Rcv: No FCP payload provided. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Dropping...");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_type = MEM_FCTBUF;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(label, "Unsol FCT", sizeof (label));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cp = &hba->chan[hba->CHANNEL_FCT];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ ENTRY: Unexpected FC type (0x%x) received. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr.type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Fc Header is valid */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if this is an active sequence */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = emlxs_sli4_rxq_get(hba, &fchdr);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fchdr.type != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(fchdr.f_ctl & F_CTL_FIRST_SEQ)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: First of sequence not"
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan " set. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((fchdr.type != 0) && (fchdr.seq_cnt != 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Sequence count not zero (%d). "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label, fchdr.seq_cnt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find vport */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < MAX_VPORTS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport = &VPORT(i);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vport->did == fchdr.d_id) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan port = vport;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (i == MAX_VPORTS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allow unsol FLOGI & PLOGI for P2P */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((fchdr.type != 1 /* ELS*/) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((fchdr.d_id != FABRIC_DID) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(hba->flag & FC_PT_TO_PT))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Invalid did=%x. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label, fchdr.d_id);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Allocate an IOCBQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = (emlxs_iocbq_t *)emlxs_mem_get(hba, MEM_IOCB);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Out of IOCB "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "resources. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan seq_mp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fchdr.type != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Allocate a buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seq_mp = (MATCHMAP *)emlxs_mem_get(hba, buf_type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!seq_mp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Out of buffer "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "resources. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->bp = (uint8_t *)seq_mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld node = (void *)emlxs_node_find_did(port, fchdr.s_id, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (node == NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ ENTRY: %s: Node not found. sid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label, fchdr.s_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize the iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->port = port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->channel = cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq->node = node;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->RXSEQCNT = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->RXSEQLEN = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan seq_len = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan seq_cnt = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb = &iocbq->iocb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan port = iocbq->port;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan node = (emlxs_node_t *)iocbq->node;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan seq_mp = (MATCHMAP *)iocbq->bp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan seq_len = iocb->RXSEQLEN;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan seq_cnt = iocb->RXSEQCNT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check sequence order */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fchdr.seq_cnt != seq_cnt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Out of order frame received "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "(%d != %d). Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label, fchdr.seq_cnt, seq_cnt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* We now have an iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!port->vpip->vfip) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: No fabric connection. "
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Dropping...",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore label);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore goto done;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save the frame data to our seq buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (data_size && seq_mp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the next data rqb */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan data_mp = &data_rq->rqb[host_index];
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan data_mp->virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(data_mp->dma_handle, offset,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld data_size, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data = (uint32_t *)data_mp->virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ DAT[%d]: %08x %08x %08x %08x %08x %08x ...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan host_index, data[0], data[1], data[2], data[3],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data[4], data[5]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check sequence length */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((seq_len + data_size) > seq_mp->size) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Sequence buffer overflow. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "(%d > %d). Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label, (seq_len + data_size), seq_mp->size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy data to local receive buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)data, ((uint8_t *)seq_mp->virt +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seq_len), data_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seq_len += data_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If this is not the last frame of sequence, queue it. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(fchdr.f_ctl & F_CTL_END_SEQ)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save sequence header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (seq_cnt == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)&fchdr, (uint8_t *)iocb->RXFCHDR,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (fc_frame_hdr_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Update sequence info in iocb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->RXSEQCNT = seq_cnt + 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->RXSEQLEN = seq_len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue iocbq for next frame */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_rxq_put(hba, iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Don't free resources */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* No need to abort */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan abort = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_sli4_rq_post(port, hdr_rq->qid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan posted = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* End of sequence found. Process request now. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (seq_cnt > 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Retrieve first frame of sequence */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)iocb->RXFCHDR, (uint8_t *)&fchdr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (fc_frame_hdr_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((uint8_t *)iocb, sizeof (emlxs_iocb_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Build rcv iocb and process it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (fchdr.type) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0: /* BLS */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: oxid:%x rxid %x sid:%x. Sending BLS ACC...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label, fchdr.ox_id, fchdr.rx_id, fchdr.s_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Try to send abort response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(pkt = emlxs_pkt_alloc(port, 0, 0, 0, KM_NOSLEEP))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Unable to alloc pkt. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Setup sbp / iocb for driver initiated cmd */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp = PKT2PRIV(pkt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Free the temporary iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mem_put(hba, MEM_IOCB, (void *)iocbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = (emlxs_iocbq_t *)&sbp->iocbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->port = port;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->channel = cp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->node = node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->pkt_flags &= ~PACKET_ULP_OWNED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (node) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->node = node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->did = node->nlp_DID;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->flag |= (IOCB_PRIORITY | IOCB_SPECIAL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* BLS ACC Response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe = &iocbq->wqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)wqe, sizeof (emlxs_wqe_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->iocb.ULPCOMMAND = CMD_XMIT_BLS_RSP64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->Command = CMD_XMIT_BLS_RSP64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->CmdType = WQE_TYPE_GEN;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.BlsRsp.Payload0 = 0x80;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.BlsRsp.Payload1 = fchdr.seq_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.BlsRsp.OXId = fchdr.ox_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.BlsRsp.RXId = fchdr.rx_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.BlsRsp.SeqCntLow = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.BlsRsp.SeqCntHigh = 0xFFFF;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.BlsRsp.XO = ((fchdr.f_ctl & F_CTL_XCHG_CONTEXT)? 1:0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.BlsRsp.AR = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = EMLXS_NODE_TO_RPI(port, node);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_RPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = rpip->RPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextType = WQE_VPI_CONTEXT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->ContextTag = port->vpip->VPI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = emlxs_rpi_reserve_notify(port, fchdr.s_id, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Unable to alloc "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "reserved RPI. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Store the reserved rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdSpecific = rpip->RPI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.BlsRsp.RemoteId = fchdr.s_id;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.BlsRsp.LocalId = fchdr.d_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (fchdr.f_ctl & F_CTL_CHAINED_SEQ) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CCPE = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CCP = fchdr.rsvd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate an exchange for this command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_alloc_xri(port, sbp, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_SOL_BLS_TYPE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Unable to alloc XRI. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->XRITag = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Class = CLASS3;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->RequestTag = xrip->iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->ticks = hba->timer_tics + 30;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_issue_iocb_cmd(hba, iocbq->channel, iocbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* The temporary iocbq has been freed already */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 1: /* ELS */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd = *((uint32_t *)seq_mp->virt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd &= ELS_CMD_MASK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->vpip->flag & EMLXS_VPI_PORT_ENABLED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t dropit = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allow for P2P handshaking */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (cmd) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ELS_CMD_FLOGI:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld dropit = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ELS_CMD_PLOGI:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case ELS_CMD_PRLI:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->flag & FC_PT_TO_PT) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld dropit = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (dropit) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Port not yet enabled. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cmd != ELS_CMD_LOGO) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = EMLXS_NODE_TO_RPI(port, node);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use the fabric rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = port->vpip->fabric_rpip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_reserve_xri(port, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_UNSOL_ELS_TYPE, fchdr.ox_id);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Out of exchange "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "resources. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Build CMD_RCV_ELS64_CX */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvels64.elsReq.tus.f.bdeFlags = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvels64.elsReq.tus.f.bdeSize = seq_len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvels64.elsReq.addrLow = PADDR_LO(seq_mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvels64.elsReq.addrHigh = PADDR_HI(seq_mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPBDECOUNT = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvels64.remoteID = fchdr.s_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvels64.parmRo = fchdr.d_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPPU = 0x3;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iocb->ULPCONTEXT = xrip->XRI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPIOTAG = ((node)? node->nlp_Rpi:0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCLASS = CLASS3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_RCV_ELS64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.seq_len = seq_len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.vpi = port->vpip->VPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.oxid = fchdr.ox_id;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (fchdr.f_ctl & F_CTL_CHAINED_SEQ) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.ccpe = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.ccp = fchdr.rsvd;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (port->mode == MODE_INITIATOR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_els_handle_unsol_req(port, iocbq->channel,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq, seq_mp, seq_len);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld else if (port->mode == MODE_TARGET) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_fct_handle_unsol_els(port, iocbq->channel,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq, seq_mp, seq_len);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef SFCT_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 8: /* FCT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->VPIobj.flag & EMLXS_VPI_PORT_ENABLED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Port not yet enabled. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = EMLXS_NODE_TO_RPI(port, node);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Port not logged in. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_reserve_xri(port, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_UNSOL_FCP_TYPE, fchdr.ox_id);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Out of exchange "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "resources. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld label);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld goto done;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Build CMD_RCV_SEQUENCE64_CX */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->un.rcvseq64.rcvBde.tus.f.bdeFlags = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->un.rcvseq64.rcvBde.tus.f.bdeSize = seq_len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->un.rcvseq64.rcvBde.addrLow = PADDR_LO(seq_mp->phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->un.rcvseq64.rcvBde.addrHigh = PADDR_HI(seq_mp->phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPBDECOUNT = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPPU = 0x3;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCONTEXT = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPIOTAG = ((node)? node->nlp_Rpi:0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCLASS = CLASS3;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->ULPCOMMAND = CMD_RCV_ELS64_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_rcv.seq_len = seq_len;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iocb->unsli3.ext_rcv.vpi = port->VPIobj.VPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.oxid = fchdr.ox_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fchdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_rcv.ccpe = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_rcv.ccp = fchdr.rsvd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* pass xrip to FCT in the iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->sbp = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#define EMLXS_FIX_CISCO_BUG1
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef EMLXS_FIX_CISCO_BUG1
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfelduint8_t *ptr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldptr = ((uint8_t *)seq_mp->virt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldif (((*ptr+12) != 0xa0) && (*(ptr+20) == 0x8) && (*(ptr+21) == 0x8)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: Bad CDB fixed");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *ptr++ = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld *ptr = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld}
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld}
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_fct_handle_unsol_req(port, cp, iocbq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seq_mp, seq_len);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0x20: /* CT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->vpip->flag & EMLXS_VPI_PORT_ENABLED) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(hba->flag & FC_LOOPBACK_MODE)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Port not yet enabled. "
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Dropping...",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore label);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore goto done;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!node) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Node not found (did=%x). "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label, fchdr.d_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rpip = EMLXS_NODE_TO_RPI(port, node);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!rpip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: RPI not found (did=%x rpi=%d). "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label, fchdr.d_id, node->nlp_Rpi);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_reserve_xri(port, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_XRI_UNSOL_CT_TYPE, fchdr.ox_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Out of exchange "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "resources. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan label);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto done;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Build CMD_RCV_SEQ64_CX */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.rcvBde.tus.f.bdeFlags = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.rcvBde.tus.f.bdeSize = seq_len;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.rcvBde.addrLow = PADDR_LO(seq_mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.rcvBde.addrHigh = PADDR_HI(seq_mp->phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPBDECOUNT = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.xrsqRo = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.w5.hcsw.Rctl = fchdr.r_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.w5.hcsw.Type = fchdr.type;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.w5.hcsw.Dfctl = fchdr.df_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.rcvseq64.w5.hcsw.Fctl = fchdr.f_ctl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPPU = 0x3;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iocb->ULPCONTEXT = xrip->XRI;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iocb->ULPIOTAG = rpip->RPI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCLASS = CLASS3;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_RCV_SEQ64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_rcv.seq_len = seq_len;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocb->unsli3.ext_rcv.vpi = port->vpip->VPI;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (fchdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_rcv.ccpe = 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_rcv.ccp = fchdr.rsvd;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_ct_handle_unsol_req(port, iocbq->channel,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq, seq_mp, seq_len);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Sequence handled, no need to abort */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan abort = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathandone:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!posted) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_sli4_rq_post(port, hdr_rq->qid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (abort) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Send ABTS for this exchange */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! Currently, we have no implementation for this !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan abort = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Return memory resources to pools */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocbq->bp) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, buf_type, (void *)iocbq->bp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->bp = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_IOCB, (void *)iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_process_unsol_rcv: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.dma_handle);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan emlxs_thread_spawn(hba, emlxs_restart_thread,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore 0, 0);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_unsol_rcv() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_xri_aborted(emlxs_hba_t *hba, CQ_DESC_t *cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CQE_XRI_Abort_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_find_xri(port, cqe->XRI);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip == NULL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg, */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* "CQ ENTRY: process xri aborted ignored"); */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: XRI Aborted: xri=%d IA=%d EO=%d BR=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe->XRI, cqe->IA, cqe->EO, cqe->BR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(xrip->flag & EMLXS_XRI_BUSY)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: XRI Aborted: xri=%d flag=%x. Bad state.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->flag);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Exchange is no longer busy on-chip, free it */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, 0, xrip, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_xri_aborted () */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_cq(emlxs_hba_t *hba, CQ_DESC_t *cq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CQE_u *cqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CQE_u cq_entry;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t cqdb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int num_entries = 0;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* EMLXS_PORT_LOCK must be held when entering this routine */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe = (CQE_u *)cq->addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe += cq->host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan cq->addr.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(cq->addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4096, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (;;) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.word[3] = BE_SWAP32(cqe->word[3]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(cq_entry.word[3] & CQE_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.word[2] = BE_SWAP32(cqe->word[2]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.word[1] = BE_SWAP32(cqe->word[1]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.word[0] = BE_SWAP32(cqe->word[0]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_CQE
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CQE", (uint32_t *)cqe, 6, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_CQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan num_entries++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe->word[3] = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq->host_index++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cq->host_index >= cq->max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq->host_index = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe = (CQE_u *)cq->addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqe++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now handle specific cq type */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cq->type == EMLXS_CQ_TYPE_GROUP1) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cq_entry.cqAsyncEntry.async_evt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_async_event(hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (CQE_ASYNC_t *)&cq_entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_mbox_event(hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (CQE_MBOX_t *)&cq_entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else { /* EMLXS_CQ_TYPE_GROUP2 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (cq_entry.cqCmplEntry.Code) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CQE_TYPE_WQ_COMPLETION:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cq_entry.cqCmplEntry.RequestTag <
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->max_iotag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_wqe_cmpl(hba, cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (CQE_CmplWQ_t *)&cq_entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_oor_wqe_cmpl(hba, cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (CQE_CmplWQ_t *)&cq_entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CQE_TYPE_RELEASE_WQE:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_release_wqe(hba, cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (CQE_RelWQ_t *)&cq_entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CQE_TYPE_UNSOL_RCV:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case CQE_TYPE_UNSOL_RCV_V1:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_unsol_rcv(hba, cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (CQE_UnsolRcv_t *)&cq_entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case CQE_TYPE_XRI_ABORTED:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_xri_aborted(hba, cq,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (CQE_XRI_Abort_t *)&cq_entry);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid CQ entry %d: %08x %08x %08x %08x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.cqCmplEntry.Code, cq_entry.word[0],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.word[1], cq_entry.word[2],
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.word[3]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Number of times this routine gets called for this CQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cq->isr_count++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* num_entries is the number of CQEs we process in this specific CQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cq->num_proc += num_entries;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cq->max_proc < num_entries)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cq->max_proc = num_entries;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqdb = cq->qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqdb |= CQ_DB_REARM;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (num_entries != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqdb |= ((num_entries << CQ_DB_POP_SHIFT) & CQ_DB_POP_MASK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQE: CLEAR cqdb=%08x: pops=%d", cqdb, num_entries);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_cqdb(hba, cqdb);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* EMLXS_PORT_LOCK must be held when exiting this routine */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_cq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_eq(emlxs_hba_t *hba, EQ_DESC_t *eq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t eqdb;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t *ptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan CHANNEL *cp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EQE_u eqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t cqi;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int num_entries = 0;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* EMLXS_PORT_LOCK must be held when entering this routine */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->intr_busy_cnt ++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr = eq->addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr += eq->host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan eq->addr.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(eq->addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 4096, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (;;) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eqe.word = *ptr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eqe.word = BE_SWAP32(eqe.word);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(eqe.word & EQE_VALID)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "EQE00: %08x", eqe.word);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *ptr = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan num_entries++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eq->host_index++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (eq->host_index >= eq->max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eq->host_index = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr = eq->addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ptr++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqi = emlxs_sli4_cqid_to_index(hba, eqe.entry.CQId);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Verify CQ index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cqi == 0xffff) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "EQE: Invalid CQid: %d. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld eqe.entry.CQId);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "EQE: CQIndex:%x cqid:%x", cqi, eqe.entry.CQId);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_process_cq(hba, &hba->sli.sli4.cq[cqi]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Number of times the ISR for this EQ gets called */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld eq->isr_count++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* num_entries is the number of EQEs we process in this specific ISR */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld eq->num_proc += num_entries;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (eq->max_proc < num_entries) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld eq->max_proc = num_entries;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eqdb = eq->qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eqdb |= (EQ_DB_CLEAR | EQ_DB_EVENT | EQ_DB_REARM);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "EQE: CLEAR eqdb=%08x pops=%d", eqdb, num_entries);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (num_entries != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eqdb |= ((num_entries << EQ_DB_POP_SHIFT) & EQ_DB_POP_MASK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < hba->chan_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp = &hba->chan[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cp->chan_flag & EMLXS_NEEDS_TRIGGER) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->chan_flag &= ~EMLXS_NEEDS_TRIGGER;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_thread_trigger2(&cp->intr_thread,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_proc_channel, cp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_cqdb(hba, eqdb);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* EMLXS_PORT_LOCK must be held when exiting this routine */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->intr_busy_cnt --;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_eq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef MSI_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_msi_intr(char *arg1, char *arg2)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = (emlxs_hba_t *)arg1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t msgid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int rc;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "msiINTR arg1:%p arg2:%p", arg1, arg2);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check for legacy interrupt handling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->intr_type == DDI_INTR_TYPE_FIXED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = emlxs_sli4_intx_intr(arg1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (rc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get MSI message id */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan msgid = (uint16_t)((unsigned long)arg2);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Validate the message id */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (msgid >= hba->intr_count) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan msgid = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan if ((hba->state == FC_KILLED) || (hba->flag & FC_OFFLINE_MODE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (DDI_INTR_UNCLAIMED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The eq[] index == the MSI vector number */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_eq(hba, &hba->sli.sli4.eq[msgid]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (DDI_INTR_CLAIMED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_msi_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* MSI_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/*ARGSUSED*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_intx_intr(char *arg)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = (emlxs_hba_t *)arg;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_FASTPATH
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "intxINTR arg:%p", arg);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan if ((hba->state == FC_KILLED) || (hba->flag & FC_OFFLINE_MODE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (DDI_INTR_UNCLAIMED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_eq(hba, &hba->sli.sli4.eq[0]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (DDI_INTR_CLAIMED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_intx_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_hba_kill(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t j;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->flag & FC_INTERLOCKED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE_LOCKED(hba, FC_KILLED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan j = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (j++ < 10000) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->mbox_queue_flag == 0) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->intr_busy_cnt == 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld BUSYWAIT_US(100);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->mbox_queue_flag != 0) || (hba->intr_busy_cnt > 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Board kill failed. Adapter busy, %d, %d.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->mbox_queue_flag, hba->intr_busy_cnt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag |= FC_INTERLOCKED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE_LOCKED(hba, FC_KILLED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_kill() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_hba_reset_all(emlxs_hba_t *hba, uint32_t flag)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t value;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->sli_intf & SLI_INTF_IF_TYPE_MASK) != SLI_INTF_IF_TYPE_2) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Reset All failed. Invalid Operation.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Issue a Firmware Reset All Request */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (flag) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld value = SLI_PHYDEV_FRST | SLI_PHYDEV_FRL_ALL | SLI_PHYDEV_DD;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld value = SLI_PHYDEV_FRST | SLI_PHYDEV_FRL_ALL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_put32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.PHYSDEV_reg_addr, value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_hba_reset_all() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_enable_intr(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int num_cq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t data;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.flag |= EMLXS_SLI4_INTR_ENABLED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan num_cq = (hba->intr_count * cfg[CFG_NUM_WQ].current) +
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_CQ_OFFSET_WQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* ARM EQ / CQs */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < num_cq; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data = hba->sli.sli4.cq[i].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data |= CQ_DB_REARM;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_cqdb(hba, data);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < hba->intr_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data = hba->sli.sli4.eq[i].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data |= (EQ_DB_REARM | EQ_DB_EVENT);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_cqdb(hba, data);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_enable_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_disable_intr(emlxs_hba_t *hba, uint32_t att)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (att) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.flag &= ~EMLXS_SLI4_INTR_ENABLED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Short of reset, we cannot disable interrupts */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_disable_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_resource_free(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBUF_INFO *buf_info;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info = &hba->sli.sli4.slim2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (buf_info->virt == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Already free */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_fcf_fini(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info = &hba->sli.sli4.HeaderTmplate;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (buf_info->virt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(buf_info, sizeof (MBUF_INFO));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.XRIp) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((hba->sli.sli4.XRIinuse_f !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (XRIobj_t *)&hba->sli.sli4.XRIinuse_f) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (hba->sli.sli4.XRIinuse_b !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (XRIobj_t *)&hba->sli.sli4.XRIinuse_f)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "XRIs in use during free!: %p %p != %p\n",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.XRIinuse_f,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.XRIinuse_b,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &hba->sli.sli4.XRIinuse_f);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan kmem_free(hba->sli.sli4.XRIp,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (sizeof (XRIobj_t) * hba->sli.sli4.XRICount));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.XRIp = NULL;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.XRIfree_f =
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.XRIfree_b =
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xrif_count = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->intr_count; i++) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mutex_destroy(&hba->sli.sli4.eq[i].lastwq_lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.eq[i], sizeof (EQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.eq[i].qid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_CQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.cq[i], sizeof (CQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.cq[i].qid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_WQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.wq[i], sizeof (WQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.wq[i].qid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RXQS; i++) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mutex_destroy(&hba->sli.sli4.rxq[i].lock);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan bzero(&hba->sli.sli4.rxq[i], sizeof (RXQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_destroy(&hba->sli.sli4.rq[i].lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.rq[i], sizeof (RQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.rq[i].qid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free the MQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan bzero(&hba->sli.sli4.mq, sizeof (MQ_DESC_t));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info = &hba->sli.sli4.slim2;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (buf_info->virt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->flags = FC_MBUF_DMA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mem_free(hba, buf_info);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan bzero(buf_info, sizeof (MBUF_INFO));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_resource_free() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_resource_alloc(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBUF_INFO *buf_info;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int num_eq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int num_wq;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t j;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t k;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t cq_depth;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t cq_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t word;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan RQE_t *rqe;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan MBUF_INFO *rqb;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan uint64_t phys;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan uint64_t tmp_phys;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan char *virt;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan char *tmp_virt;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan void *data_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan void *dma_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan int32_t size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan off_t offset;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan uint32_t count = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t hddr_size = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t align;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t iotag;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info = &hba->sli.sli4.slim2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (buf_info->virt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Already allocated */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_fcf_init(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli.sli4.param.CQV) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cq_depth = CQ_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cq_depth = CQ_DEPTH_V2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cq_size = (cq_depth * CQE_SIZE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* EQs - 1 per Interrupt vector */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan num_eq = hba->intr_count;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* CQs - number of WQs + 1 for RQs + 1 for mbox/async events */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan num_wq = cfg[CFG_NUM_WQ].current * num_eq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* Calculate total dmable memory we need */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* WARNING: make sure each section is aligned on 4K boundary */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* EQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count += num_eq * 4096;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* CQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += (num_wq + EMLXS_CQ_OFFSET_WQ) * cq_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* WQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count += num_wq * (4096 * EMLXS_NUM_WQ_PAGES);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* MQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count += EMLXS_MAX_MQS * 4096;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* RQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count += EMLXS_MAX_RQS * 4096;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* RQB/E */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count += RQB_COUNT * (RQB_DATA_SIZE + RQB_HEADER_SIZE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += (4096 - (count%4096)); /* Ensure 4K alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += hba->sli.sli4.XRIExtSize * hba->sli.sli4.mem_sgl_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += (4096 - (count%4096)); /* Ensure 4K alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RPI Header Templates */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.param.HDRR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Bytes per extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = hba->sli.sli4.RPIExtSize * sizeof (RPIHdrTmplate_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Pages required per extent (page == 4096 bytes) */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld k = (j/4096) + ((j%4096)? 1:0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Total size */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hddr_size = (k * hba->sli.sli4.RPIExtCount * 4096);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += hddr_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* Allocate slim2 for SLI4 */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info = &hba->sli.sli4.slim2;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->size = count;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->flags = FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->align = ddi_ptob(hba->dip, 1L);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (void) emlxs_mem_alloc(hba, buf_info);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (buf_info->virt == NULL) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_init_failed_msg,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan "Unable to allocate internal memory for SLI4: %d",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan goto failed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan bzero(buf_info->virt, buf_info->size);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(buf_info->dma_handle, 0,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->size, DDI_DMA_SYNC_FORDEV);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* Assign memory to SGL, Head Template, EQ, CQ, WQ, RQ and MQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan data_handle = buf_info->data_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan dma_handle = buf_info->dma_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan phys = buf_info->phys;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan virt = (char *)buf_info->virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Allocate space for queues */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* EQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan size = 4096;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < num_eq; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(&hba->sli.sli4.eq[i], sizeof (EQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info = &hba->sli.sli4.eq[i].addr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->size = size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->flags =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->align = ddi_ptob(hba->dip, 1L);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->phys = phys;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->virt = (void *)virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->data_handle = data_handle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->dma_handle = dma_handle;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld phys += size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld virt += size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.eq[i].max_index = EQ_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.eq[i].qid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&hba->sli.sli4.eq[i].lastwq_lock, NULL,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MUTEX_DRIVER, NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* CQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < (num_wq + EMLXS_CQ_OFFSET_WQ); i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(&hba->sli.sli4.cq[i], sizeof (CQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info = &hba->sli.sli4.cq[i].addr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->size = cq_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->flags =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->align = ddi_ptob(hba->dip, 1L);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->phys = phys;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->virt = (void *)virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->data_handle = data_handle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->dma_handle = dma_handle;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld phys += cq_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld virt += cq_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.cq[i].max_index = cq_depth;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.cq[i].qid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* WQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan size = 4096 * EMLXS_NUM_WQ_PAGES;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < num_wq; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(&hba->sli.sli4.wq[i], sizeof (WQ_DESC_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info = &hba->sli.sli4.wq[i].addr;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->size = size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->flags =
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->align = ddi_ptob(hba->dip, 1L);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->phys = phys;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore buf_info->virt = (void *)virt;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->data_handle = data_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->dma_handle = dma_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan phys += size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan virt += size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.wq[i].max_index = WQ_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.wq[i].release_depth = WQE_RELEASE_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.wq[i].qid = 0xFFFF;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* MQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld size = 4096;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(&hba->sli.sli4.mq, sizeof (MQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info = &hba->sli.sli4.mq.addr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->size = size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->flags =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->align = ddi_ptob(hba->dip, 1L);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->phys = phys;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->virt = (void *)virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->data_handle = data_handle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->dma_handle = dma_handle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld phys += size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld virt += size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.mq.max_index = MQ_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RXQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_RXQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.rxq[i], sizeof (RXQ_DESC_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&hba->sli.sli4.rxq[i].lock, NULL, MUTEX_DRIVER,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan size = 4096;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_RQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.rq[i], sizeof (RQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info = &hba->sli.sli4.rq[i].addr;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->size = size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->flags =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->align = ddi_ptob(hba->dip, 1L);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->phys = phys;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore buf_info->virt = (void *)virt;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->data_handle = data_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->dma_handle = dma_handle;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan phys += size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan virt += size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].max_index = RQ_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.rq[i].qid = 0xFFFF;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&hba->sli.sli4.rq[i].lock, NULL, MUTEX_DRIVER, NULL);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RQB/E */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RQS; i++) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan size = (i & 0x1) ? RQB_DATA_SIZE : RQB_HEADER_SIZE;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan tmp_phys = phys;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan tmp_virt = virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize the RQEs */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqe = (RQE_t *)hba->sli.sli4.rq[i].addr.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (j = 0; j < (RQ_DEPTH/RQB_COUNT); j++) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan phys = tmp_phys;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan virt = tmp_virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (k = 0; k < RQB_COUNT; k++) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan word = PADDR_HI(phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqe->AddrHi = BE_SWAP32(word);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan word = PADDR_LO(phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqe->AddrLo = BE_SWAP32(word);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb = &hba->sli.sli4.rq[i].
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb[k + (j * RQB_COUNT)];
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb->size = size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb->flags = FC_MBUF_DMA |
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan FC_MBUF_SNGLSG | FC_MBUF_DMA32;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb->align = ddi_ptob(hba->dip, 1L);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb->phys = phys;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rqb->virt = (void *)virt;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb->data_handle = data_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan rqb->dma_handle = dma_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan phys += size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan virt += size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef DEBUG_RQE
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ_ALLOC: rq[%d] rqb[%d,%d]=%p iotag=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i, j, k, mp, mp->tag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_RQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqe++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.rq[i].addr.virt) -
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.virt));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Sync the RQ buffer list */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.rq[i].addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].addr.size, DDI_DMA_SYNC_FORDEV);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* 4K Alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld align = (4096 - (phys%4096));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld phys += align;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld virt += align;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initialize double linked lists */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIinuse_f =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (XRIobj_t *)&hba->sli.sli4.XRIinuse_f;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIinuse_b =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (XRIobj_t *)&hba->sli.sli4.XRIinuse_f;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.xria_count = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIfree_f =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIfree_b =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.xria_count = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIp = (XRIobj_t *)kmem_zalloc(
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (XRIobj_t) * hba->sli.sli4.XRICount), KM_SLEEP);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = hba->sli.sli4.XRIp;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld size = hba->sli.sli4.mem_sgl_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iotag = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->sli.sli4.XRICount; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI = emlxs_sli4_index_to_xri(hba, i);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* We don't use XRI==0, since it also represents an */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* uninitialized exchange */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->XRI == 0) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->iotag = iotag++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->sge_count =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.mem_sgl_size / sizeof (ULP_SGE64));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Add xrip to end of free list */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->_b = hba->sli.sli4.XRIfree_b;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIfree_b->_f = xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIfree_b = xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.xrif_count++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate SGL for this xrip */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info = &xrip->SGList;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->size = size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->flags =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->align = size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->phys = phys;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->virt = (void *)virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->data_handle = data_handle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->dma_handle = dma_handle;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld phys += size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld virt += size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* 4K Alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld align = (4096 - (phys%4096));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld phys += align;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld virt += align;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RPI Header Templates */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.param.HDRR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info = &hba->sli.sli4.HeaderTmplate;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan bzero(buf_info, sizeof (MBUF_INFO));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld buf_info->size = hddr_size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->flags = FC_MBUF_DMA | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->align = ddi_ptob(hba->dip, 1L);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->phys = phys;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore buf_info->virt = (void *)virt;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->data_handle = data_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->dma_handle = dma_handle;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#ifdef FMA_SUPPORT
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (hba->sli.sli4.slim2.dma_handle) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.dma_handle)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan != DDI_FM_OK) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan &emlxs_invalid_dma_handle_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_resource_alloc: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan hba->sli.sli4.slim2.dma_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan goto failed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanfailed:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_sli4_resource_free(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (ENOMEM);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_resource_alloc */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_zero_queue_stat(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t num_wq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_config_t *cfg = &CFG;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld clock_t time;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* EQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->intr_count; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.eq[i].num_proc = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.eq[i].max_proc = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.eq[i].isr_count = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld num_wq = cfg[CFG_NUM_WQ].current * hba->intr_count;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* CQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < (num_wq + EMLXS_CQ_OFFSET_WQ); i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.cq[i].num_proc = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.cq[i].max_proc = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.cq[i].isr_count = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* WQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < num_wq; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.wq[i].num_proc = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.wq[i].num_busy = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.rq[i].num_proc = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) drv_getparm(LBOLT, &time);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.que_stat_timer = (uint32_t)time;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_zero_queue_stat */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern XRIobj_t *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_reserve_xri(emlxs_port_t *port, RPIobj_t *rpip, uint32_t type,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t rx_id)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t iotag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip = hba->sli.sli4.XRIfree_f;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip == (XRIobj_t *)&hba->sli.sli4.XRIfree_f) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to reserve XRI. type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (NULL);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iotag = xrip->iotag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((!iotag) ||
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore ((hba->fc_table[iotag] != NULL) &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[iotag] != STALE_PACKET))) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /*
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore * No more command slots available, retry later
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to reserve iotag. type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->state = XRI_STATE_ALLOCATED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->type = type;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->flag = EMLXS_XRI_RESERVED;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->sbp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->rpip = rpip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->rx_id = rx_id;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip->xri_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Take it off free list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_b)->_f = xrip->_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_f)->_b = xrip->_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.xrif_count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of inuse list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = hba->sli.sli4.XRIinuse_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIinuse_b->_f = xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIinuse_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIinuse_b = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xria_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (xrip);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_reserve_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_unreserve_xri(emlxs_port_t *port, uint16_t xri, uint32_t lock)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_find_xri(port, xri);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip || xrip->state == XRI_STATE_FREE) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_unreserve_xri:%d already freed.", xri);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Flush this unsolicited ct command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->type == EMLXS_XRI_UNSOL_CT_TYPE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_flush_ct_event(port, xrip->rx_id);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!(xrip->flag & EMLXS_XRI_RESERVED)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_unreserve_xri:%d in use. type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip->iotag &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[xrip->iotag] != NULL) &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[xrip->iotag] != STALE_PACKET)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_unreserve_xri:%d sbp dropped:%p type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, hba->fc_table[xrip->iotag], xrip->type);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->fc_table[xrip->iotag] = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_unreserve_xri:%d unreserved. type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->type);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->state = XRI_STATE_FREE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->type = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip->rpip) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->rpip->xri_count--;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->rpip = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->reserved_rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->reserved_rpip->xri_count--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->reserved_rpip = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Take it off inuse list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_b)->_f = xrip->_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_f)->_b = xrip->_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xria_count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of free list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = hba->sli.sli4.XRIfree_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIfree_b->_f = xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIfree_b = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xrif_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_unreserve_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans RosenfeldXRIobj_t *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_register_xri(emlxs_port_t *port, emlxs_buf_t *sbp, uint16_t xri,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t did)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t iotag;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_node_t *node;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld RPIobj_t *rpip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = sbp->xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_find_xri(port, xri);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_register_xri:%d XRI not found.", xri);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_FCTAB_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (NULL);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((xrip->state == XRI_STATE_FREE) ||
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore !(xrip->flag & EMLXS_XRI_RESERVED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_register_xri:%d Invalid XRI. xrip=%p "
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "state=%x flag=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip, xrip->state, xrip->flag);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iotag = xrip->iotag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((!iotag) ||
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore ((hba->fc_table[iotag] != NULL) &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[iotag] != STALE_PACKET))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_register_xri:%d Invalid fc_table entry. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "iotag=%d entry=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, iotag, hba->fc_table[iotag]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_table[iotag] = sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->iotag = iotag;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sbp->xrip = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->flag &= ~EMLXS_XRI_RESERVED;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->sbp = sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* If we did not have a registered RPI when we reserved */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* this exchange, check again now. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->rpip && (xrip->rpip->RPI == FABRIC_RPI)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld node = emlxs_node_find_did(port, did, 1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = EMLXS_NODE_TO_RPI(port, node);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rpip && (rpip->RPI != FABRIC_RPI)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Move the XRI to the new RPI */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->rpip->xri_count--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->rpip = rpip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip->xri_count++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (xrip);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_register_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Performs both reserve and register functions for XRI */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic XRIobj_t *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_alloc_xri(emlxs_port_t *port, emlxs_buf_t *sbp, RPIobj_t *rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t type)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint16_t iotag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip = hba->sli.sli4.XRIfree_f;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip == (XRIobj_t *)&hba->sli.sli4.XRIfree_f) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the iotag by registering the packet */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iotag = xrip->iotag;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((!iotag) ||
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore ((hba->fc_table[iotag] != NULL) &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[iotag] != STALE_PACKET))) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * No more command slots available, retry later
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to alloc iotag:(0x%x)(%p) type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iotag, hba->fc_table[iotag], type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_table[iotag] = sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->iotag = iotag;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sbp->xrip = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->state = XRI_STATE_ALLOCATED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->type = type;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->flag = 0;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->sbp = sbp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->rpip = rpip;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip->xri_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Take it off free list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_b)->_f = xrip->_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_f)->_b = xrip->_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xrif_count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of inuse list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = hba->sli.sli4.XRIinuse_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIinuse_b->_f = xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIinuse_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIinuse_b = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xria_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (xrip);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_alloc_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore/* EMLXS_FCTAB_LOCK must be held to enter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern XRIobj_t *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_find_xri(emlxs_port_t *port, uint16_t xri)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip = (XRIobj_t *)hba->sli.sli4.XRIinuse_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore while (xrip != (XRIobj_t *)&hba->sli.sli4.XRIinuse_f) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((xrip->state >= XRI_STATE_ALLOCATED) &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->XRI == xri)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (xrip);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip = xrip->_f;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Unable to find XRI x%x", xri);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_find_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_free_xri(emlxs_port_t *port, emlxs_buf_t *sbp, XRIobj_t *xrip,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint8_t lock)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_hba_t *hba = HBA;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_enter(&EMLXS_FCTAB_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip->state == XRI_STATE_FREE) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Free XRI:%x, Already freed. type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->XRI, xrip->type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->type == EMLXS_XRI_UNSOL_CT_TYPE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_flush_ct_event(port, xrip->rx_id);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip->iotag &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[xrip->iotag] != NULL) &&
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[xrip->iotag] != STALE_PACKET)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->fc_table[xrip->iotag] = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->state = XRI_STATE_FREE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->type = 0;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->flag = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip->rpip) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->rpip->xri_count--;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->rpip = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->reserved_rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->reserved_rpip->xri_count--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->reserved_rpip = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Take it off inuse list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_b)->_f = xrip->_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (xrip->_f)->_b = xrip->_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = NULL;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xria_count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of free list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_b = hba->sli.sli4.XRIfree_b;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIfree_b->_f = xrip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.XRIfree_b = xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.xrif_count++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!(sbp->pkt_flags & PACKET_VALID) ||
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (sbp->pkt_flags &
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (PACKET_ULP_OWNED|PACKET_COMPLETED|PACKET_IN_COMPLETION))) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Free XRI: sbp invalid. sbp=%p flags=%x xri=%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sbp, sbp->pkt_flags, ((xrip)? xrip->XRI:0));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip && (xrip->iotag != sbp->iotag)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sbp/iotag mismatch %p iotag:%d %d", sbp,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore sbp->iotag, xrip->iotag);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->iotag) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (sbp == hba->fc_table[sbp->iotag]) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->fc_table[sbp->iotag] = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_count--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp->xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Exchange is still reserved */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->xrip->flag |= EMLXS_XRI_RESERVED;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->iotag = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sbp->xrip = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the sbp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->pkt_flags & PACKET_IN_TXQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->pkt_flags &= ~PACKET_IN_TXQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_tx_count--;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->pkt_flags & PACKET_IN_CHIPQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sbp->pkt_flags &= ~PACKET_IN_CHIPQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&sbp->mtx);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (lock) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mutex_exit(&EMLXS_FCTAB_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_free_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_post_sgl_pages(emlxs_hba_t *hba, MAILBOXQ *mbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb = (MAILBOX4 *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore XRIobj_t *xrip;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MATCHMAP *mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbox_req_hdr_t *hdr_req;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t cnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t xri_cnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t j;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_FCOE_CFG_POST_SGL_PAGES *post_sgl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq->bp = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq->mbox_cmpl = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mp = emlxs_mem_buf_alloc(hba, EMLXS_MAX_NONEMBED_SIZE)) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to POST_SGL. Mailbox cmd=%x ",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxCommand);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (EIO);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mbq->nonembed = (void *)mp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Signifies a non embedded command
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varSLIConfig.be.embedded = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxCommand = MBX_SLI_CONFIG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->mbxOwner = OWN_HOST;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_req = (mbox_req_hdr_t *)mp->virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan post_sgl =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (IOCTL_FCOE_CFG_POST_SGL_PAGES *)(hdr_req + 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip = hba->sli.sli4.XRIp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* For each extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (j = 0; j < hba->sli.sli4.XRIExtCount; j++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt = hba->sli.sli4.XRIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld while (cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (xrip->XRI == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld continue;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *) hdr_req, mp->size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld size = mp->size - IOCTL_HEADER_SZ;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.payload_length =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp->size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCTL_SUBSYSTEM_FCOE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FCOE_OPCODE_CFG_POST_SGL_PAGES;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.req_length = size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_req->subsystem = IOCTL_SUBSYSTEM_FCOE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_req->opcode = FCOE_OPCODE_CFG_POST_SGL_PAGES;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_req->timeout = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_req->req_length = size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.xri_count = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.xri_start = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xri_cnt = (size -
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (IOCTL_FCOE_CFG_POST_SGL_PAGES)) /
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (FCOE_SGL_PAGES);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; (i < xri_cnt) && cnt; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.xri_count++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.pages[i].\
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sgl_page0.addrLow =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld PADDR_LO(xrip->SGList.phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.pages[i].\
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sgl_page0.addrHigh =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld PADDR_HI(xrip->SGList.phys);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cnt--;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip++;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to POST_SGL. Mailbox cmd=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "status=%x XRI cnt:%d start:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxCommand, mb->mbxStatus,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.xri_count,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.xri_start);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mem_buf_free(hba, mp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mbq->nonembed = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_buf_free(hba, mp);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mbq->nonembed = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_post_sgl_pages() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_post_hdr_tmplates(emlxs_hba_t *hba, MAILBOXQ *mbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb = (MAILBOX4 *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t k;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint64_t addr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_FCOE_POST_HDR_TEMPLATES *post_hdr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t num_pages;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.HDRR)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Bytes per extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = hba->sli.sli4.RPIExtSize * sizeof (RPIHdrTmplate_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Pages required per extent (page == 4096 bytes) */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld num_pages = (j/4096) + ((j%4096)? 1:0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan addr = hba->sli.sli4.HeaderTmplate.phys;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* For each extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (j = 0; j < hba->sli.sli4.RPIExtCount; j++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mbq->bp = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mbq->mbox_cmpl = NULL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Signifies an embedded command
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.embedded = 1;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxCommand = MBX_SLI_CONFIG;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxOwner = OWN_HOST;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.payload_length =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (IOCTL_FCOE_POST_HDR_TEMPLATES) + IOCTL_HEADER_SZ;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCTL_SUBSYSTEM_FCOE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FCOE_OPCODE_POST_HDR_TEMPLATES;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (IOCTL_FCOE_POST_HDR_TEMPLATES);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_hdr =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (IOCTL_FCOE_POST_HDR_TEMPLATES *)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &mb->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_hdr->params.request.num_pages = num_pages;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_hdr->params.request.rpi_offset = hba->sli.sli4.RPIBase[j];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (k = 0; k < num_pages; k++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_hdr->params.request.pages[k].addrLow =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld PADDR_LO(addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_hdr->params.request.pages[k].addrHigh =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld PADDR_HI(addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld addr += 4096;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to POST_HDR_TEMPLATES. Mailbox cmd=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "status=%x ",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->mbxCommand, mb->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "POST_HDR", (uint32_t *)mb, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_post_hdr_tmplates() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_create_queues(emlxs_hba_t *hba, MAILBOXQ *mbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX4 *mb = (MAILBOX4 *)mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_COMMON_EQ_CREATE *eq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_COMMON_CQ_CREATE *cq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_FCOE_WQ_CREATE *wq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_FCOE_RQ_CREATE *rq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_COMMON_MQ_CREATE *mq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCTL_COMMON_MQ_CREATE_EXT *mq_ext;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_rqdbu_t rqdb;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t i, j;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t num_cq, total_cq;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint16_t num_wq, total_wq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /*
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * The first CQ is reserved for ASYNC events,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * the second is reserved for unsol rcv, the rest
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * correspond to WQs. (WQ0 -> CQ2, WQ1 -> CQ3, ...)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan total_cq = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan total_wq = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Create EQ's */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < hba->intr_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_eq_create(hba, mbq, i);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to Create EQ %d: Mailbox cmd=%x status=%x ",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i, mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (EIO);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eq = (IOCTL_COMMON_EQ_CREATE *)&mb->un.varSLIConfig.payload;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.eq[i].qid = eq->params.response.EQId;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.eq[i].lastwq = total_wq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.eq[i].msix_vector = i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "EQ0_CREATE", (uint32_t *)mb, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan num_wq = cfg[CFG_NUM_WQ].current;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan num_cq = num_wq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (i == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* One for RQ handling, one for mbox/event handling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan num_cq += EMLXS_CQ_OFFSET_WQ;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create CQ's */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (j = 0; j < num_cq; j++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_cq].eqid =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.eq[i].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cq_create(hba, mbq, total_cq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_init_failed_msg, "Unable to Create "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ %d: Mailbox cmd=%x status=%x ",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan total_cq, mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (EIO);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq = (IOCTL_COMMON_CQ_CREATE *)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &mb->un.varSLIConfig.payload;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_cq].qid =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq->params.response.CQId;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (total_cq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_CQ_MBOX:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* First CQ is for async event handling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_cq].type =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_CQ_TYPE_GROUP1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_CQ_RCV:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Second CQ is for unsol receive handling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_cq].type =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_CQ_TYPE_GROUP2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Setup CQ to channel mapping */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_cq].type =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_CQ_TYPE_GROUP2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_cq].channelp =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &hba->chan[total_cq - EMLXS_CQ_OFFSET_WQ];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CQX_CREATE", (uint32_t *)mb,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan total_cq++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create WQ's */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (j = 0; j < num_wq; j++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.wq[total_wq].cqid =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_wq + EMLXS_CQ_OFFSET_WQ].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_wq_create(hba, mbq, total_wq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &emlxs_init_failed_msg, "Unable to Create "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "WQ %d: Mailbox cmd=%x status=%x ",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan total_wq, mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (EIO);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wq = (IOCTL_FCOE_WQ_CREATE *)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &mb->un.varSLIConfig.payload;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.wq[total_wq].qid =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wq->params.response.WQId;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.wq[total_wq].cqid =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_wq+EMLXS_CQ_OFFSET_WQ].qid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "WQ_CREATE", (uint32_t *)mb,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan total_wq++;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->last_msiid = i;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* We assume 1 RQ pair will handle ALL incoming data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Create RQs */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_RQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Personalize the RQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (i) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].cqid =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[EMLXS_CQ_RCV].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 1:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].cqid =
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[EMLXS_CQ_RCV].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].cqid = 0xffff;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_rq_create(hba, mbq, i);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to Create RQ %d: Mailbox cmd=%x status=%x ",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i, mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (EIO);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rq = (IOCTL_FCOE_RQ_CREATE *)&mb->un.varSLIConfig.payload;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].qid = rq->params.response.RQId;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "RQ CREATE", (uint32_t *)mb, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ CREATE: rq[%d].qid=%d cqid=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i, hba->sli.sli4.rq[i].qid, hba->sli.sli4.rq[i].cqid);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize the host_index */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].host_index = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If Data queue was just created, */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* then post buffers using the header qid */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((i & 0x1)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Ring the RQ doorbell to post buffers */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqdb.word = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqdb.db.Qid = hba->sli.sli4.rq[i-1].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rqdb.db.NumPosted = RQB_COUNT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_write_rqdb(hba, rqdb.word);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ CREATE: Doorbell rang: qid=%d count=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i-1].qid, RQB_COUNT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Create MQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Personalize the MQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.mq.cqid = hba->sli.sli4.cq[EMLXS_CQ_MBOX].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_mq_create_ext(hba, mbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MBX_SUCCESS) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to Create MQ_EXT %d: Mailbox cmd=%x status=%x ",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan i, mb->mbxCommand, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Reuse mbq from previous mbox */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore bzero(mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mb_mq_create(hba, mbq);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore MBX_SUCCESS) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Unable to Create MQ %d: Mailbox cmd=%x status=%x ",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore i, mb->mbxCommand, mb->mbxStatus);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (EIO);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore mq = (IOCTL_COMMON_MQ_CREATE *)&mb->un.varSLIConfig.payload;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.mq.qid = mq->params.response.MQId;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mq_ext = (IOCTL_COMMON_MQ_CREATE_EXT *)&mb->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.mq.qid = mq_ext->params.response.MQId;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_create_queues() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_timer(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Perform SLI4 level timer checks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_fcf_timer_notify(hba);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_timer_check_mbox(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_timer() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_timer_check_mbox(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_config_t *cfg = &CFG;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX *mb = NULL;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!cfg[CFG_TIMEOUT_ENABLE].current) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Return if timer hasn't expired */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!hba->mbox_timer || (hba->timer_tics < hba->mbox_timer)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* The first to service the mbox queue will clear the timer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->mbox_timer = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->mbox_queue_flag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->mbox_mbq) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb = (MAILBOX *)hba->mbox_mbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (hba->mbox_queue_flag) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_NOWAIT:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Nowait.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_SLEEP:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: mb=%p Sleep.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case MBX_POLL:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: mb=%p Polled.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan default:
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: mb=%p (%d).",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_cmd_xlate(mb->mbxCommand),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb, hba->mbox_queue_flag);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan break;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg, NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->flag |= FC_MBOX_TIMEOUT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE_LOCKED(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Perform mailbox cleanup */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* This will wake any sleeping or polling threads */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, NULL, MBX_TIMEOUT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Trigger adapter shutdown */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_thread_spawn(hba, emlxs_shutdown_thread, 0, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_timer_check_mbox() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_data_dump(emlxs_port_t *port, char *str, uint32_t *iptr, int cnt, int err)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan void *msg;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!port || !str || !iptr || !cnt) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (err) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan msg = &emlxs_sli_err_msg;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan msg = &emlxs_sli_detail_msg;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s00: %08x %08x %08x %08x %08x %08x", str, *iptr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+1), *(iptr+2), *(iptr+3), *(iptr+4), *(iptr+5));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt > 6) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s06: %08x %08x %08x %08x %08x %08x", str, *(iptr+6),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+7), *(iptr+8), *(iptr+9), *(iptr+10), *(iptr+11));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt > 12) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s12: %08x %08x %08x %08x %08x %08x", str, *(iptr+12),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+13), *(iptr+14), *(iptr+15), *(iptr+16), *(iptr+17));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt > 18) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s18: %08x %08x %08x %08x %08x %08x", str, *(iptr+18),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+19), *(iptr+20), *(iptr+21), *(iptr+22), *(iptr+23));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt > 24) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s24: %08x %08x %08x %08x %08x %08x", str, *(iptr+24),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+25), *(iptr+26), *(iptr+27), *(iptr+28), *(iptr+29));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt > 30) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s30: %08x %08x %08x %08x %08x %08x", str, *(iptr+30),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+31), *(iptr+32), *(iptr+33), *(iptr+34), *(iptr+35));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cnt > 36) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s36: %08x %08x %08x %08x %08x %08x", str, *(iptr+36),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+37), *(iptr+38), *(iptr+39), *(iptr+40), *(iptr+41));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_data_dump() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanextern void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_ue_dump(emlxs_hba_t *hba, char *str)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t ue_h;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t ue_l;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t on1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t on2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_h = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld on1 = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_ONLINE1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld on2 = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_ONLINE2));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: ueLow:%08x ueHigh:%08x on1:%08x on2:%08x", str,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l, ue_h, on1, on2);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.STATUS_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_h = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: status:%08x err1:%08x err2:%08x", str,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, ue_l, ue_h);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#ifdef FMA_SUPPORT
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Access handle validation */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_CHK_ACC_HANDLE(hba, hba->pci_acc_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_ue_dump() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amorestatic void
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_poll_erratt(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t status;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t ue_h;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan uint32_t ue_l;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t error = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->flag & FC_HARDWARE_ERROR) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_0:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_h = ddi_get32(hba->pci_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((~hba->sli.sli4.ue_mask_lo & ue_l) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (~hba->sli.sli4.ue_mask_hi & ue_h) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.flag & EMLXS_SLI4_HW_ERROR)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_hardware_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Host Error: ueLow:%08x ueHigh:%08x maskLow:%08x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "maskHigh:%08x flag:%08x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l, ue_h, hba->sli.sli4.ue_mask_lo,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ue_mask_hi, hba->sli.sli4.flag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld error = 2;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case SLI_INTF_IF_TYPE_2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.STATUS_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((status & SLI_STATUS_ERROR) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.flag & EMLXS_SLI4_HW_ERROR)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR1_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_h = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.ERR2_reg_addr);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld error = (status & SLI_STATUS_RESET_NEEDED)? 1:2;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (error == 1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Host Error: status:%08x err1:%08x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "err2:%08x flag:%08x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, ue_l, ue_h, hba->sli.sli4.flag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld &emlxs_hardware_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Host Error: status:%08x err1:%08x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "err2:%08x flag:%08x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status, ue_l, ue_h, hba->sli.sli4.flag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (error == 2) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_hba_flush_chipq(hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_thread_spawn(hba, emlxs_shutdown_thread, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (error == 1) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_ERROR);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_hba_flush_chipq(hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_thread_spawn(hba, emlxs_restart_thread, 0, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#ifdef FMA_SUPPORT
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_CHK_ACC_HANDLE(hba, hba->pci_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_poll_erratt() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_reg_did(emlxs_port_t *port, uint32_t did, SERV_PARM *param,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_buf_t *sbp, fc_unsol_buf_t *ubp, IOCBQ *iocbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_hba_t *hba = HBA;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore NODELIST *node;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore RPIobj_t *rpip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint32_t rval;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Check for invalid node ids to register */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((did == 0) && (!(hba->flag & FC_LOOPBACK_MODE))) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (did & 0xff000000) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* We don't register our own did */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((did == port->did) && (!(hba->flag & FC_LOOPBACK_MODE))) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (did != FABRIC_DID) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rval = emlxs_mb_check_sparm(hba, param))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_node_create_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Invalid service parameters. did=%06x rval=%d", did,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rval);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Check if the node limit has been reached */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (port->node_count >= hba->max_nodes) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_node_create_failed_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Limit reached. did=%06x count=%d", did,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore port->node_count);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld node = emlxs_node_find_did(port, did, 1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rpip = EMLXS_NODE_TO_RPI(port, node);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rval = emlxs_rpi_online_notify(port, rpip, did, param, (void *)sbp,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void *)ubp, (void *)iocbq);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (rval);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_reg_did() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_unreg_node(emlxs_port_t *port, emlxs_node_t *node,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_buf_t *sbp, fc_unsol_buf_t *ubp, IOCBQ *iocbq)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore{
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore RPIobj_t *rpip;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint32_t rval;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!node) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Unreg all nodes */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_sli4_unreg_all_nodes(port);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Check for base node */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (node == &port->node_base) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Just flush base node */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_tx_node_flush(port, &port->node_base,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore 0, 0, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_chipq_node_flush(port, 0,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore &port->node_base, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore port->did = 0;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Return now */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "unreg_node:%p did=%x rpi=%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore node, node->nlp_DID, node->nlp_Rpi);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rpip = EMLXS_NODE_TO_RPI(port, node);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!rpip) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "unreg_node:%p did=%x rpi=%d. RPI not found.",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore node, node->nlp_DID, node->nlp_Rpi);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_node_rm(port, node);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (1);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rval = emlxs_rpi_offline_notify(port, rpip, (void *)sbp, (void *)ubp,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void *)iocbq);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (rval);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_unreg_node() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreextern uint32_t
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_unreg_all_nodes(emlxs_port_t *port)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore{
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan NODELIST *nlp;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan int i;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore uint32_t found;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Set the node tags */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* We will process all nodes with this tag */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rw_enter(&port->node_rwlock, RW_READER);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore found = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_NUM_HASH_QUES; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan nlp = port->node_table[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (nlp != NULL) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore found = 1;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore nlp->nlp_tag = 1;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore nlp = nlp->nlp_list_next;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan }
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rw_exit(&port->node_rwlock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!found) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore return (0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore for (;;) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rw_enter(&port->node_rwlock, RW_READER);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore found = 0;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore for (i = 0; i < EMLXS_NUM_HASH_QUES; i++) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore nlp = port->node_table[i];
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore while (nlp != NULL) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!nlp->nlp_tag) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore nlp = nlp->nlp_list_next;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore continue;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore nlp->nlp_tag = 0;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore found = 1;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore break;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (found) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore break;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rw_exit(&port->node_rwlock);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!found) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore break;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_sli4_unreg_node(port, nlp, 0, 0, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore }
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_unreg_all_nodes() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_handle_fcoe_link_event(emlxs_hba_t *hba, CQE_ASYNC_t *cqe)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Handle link down */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((cqe->un.link.link_status == ASYNC_EVENT_LOGICAL_LINK_DOWN) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (cqe->un.link.link_status == ASYNC_EVENT_PHYS_LINK_DOWN)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_fcf_linkdown_notify(port);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag &= ~EMLXS_SLI4_DOWN_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Link is up */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (cqe->un.link.port_speed) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case PHY_1GHZ_LINK:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_1GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case PHY_10GHZ_LINK:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_10GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_handle_fcoe_link_event: Unknown link speed=%x.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->un.link.port_speed);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set qos_linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->qos_linkspeed = cqe->un.link.qos_link_speed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set topology */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->topology = TOPOLOGY_PT_PT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag &= ~EMLXS_SLI4_DOWN_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_fcf_linkup_notify(port);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_handle_fcoe_link_event() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_handle_fc_link_att(emlxs_hba_t *hba, CQE_ASYNC_t *cqe)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Handle link down */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cqe->un.fc.att_type == ATT_TYPE_LINK_DOWN) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_fcf_linkdown_notify(port);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag &= ~EMLXS_SLI4_DOWN_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Link is up */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (cqe->un.fc.port_speed) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 1:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_1GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 2:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_2GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 4:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_4GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 8:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_8GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 10:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_10GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld case 16:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = LA_16GHZ_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld default:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_handle_fc_link_att: Unknown link speed=%x.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->un.fc.port_speed);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->linkspeed = 0;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set qos_linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->qos_linkspeed = cqe->un.fc.link_speed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set topology */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->topology = cqe->un.fc.topology;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_enter(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.flag &= ~EMLXS_SLI4_DOWN_LINK;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_exit(&EMLXS_PORT_LOCK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_fcf_linkup_notify(port);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_handle_fc_link_att() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic int
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_init_extents(emlxs_hba_t *hba, MAILBOXQ *mbq)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_port_t *port = &PPORT;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld MAILBOX4 *mb4;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld IOCTL_COMMON_EXTENTS *ep;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->sli.sli4.param.EXT)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4 = (MAILBOX4 *) mbq;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Discover XRI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_XRI);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to discover XRI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ExtentCnt = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate XRI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_XRI, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to allocate XRI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((uint8_t *)ep->params.response.RscId,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)hba->sli.sli4.XRIBase,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRICount = hba->sli.sli4.XRIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "XRI Ext: size=%d cnt=%d/%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtSize,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtCount, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < ep->params.response.ExtentCnt; i += 4) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "XRI Ext%d: %d, %d, %d, %d", i,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIBase[i],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIBase[i+1],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIBase[i+2],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIBase[i+3]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Discover RPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_RPI);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to discover RPI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ExtentCnt = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate RPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_RPI, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to allocate RPI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((uint8_t *)ep->params.response.RscId,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)hba->sli.sli4.RPIBase,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPICount = hba->sli.sli4.RPIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RPI Ext: size=%d cnt=%d/%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtSize,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtCount, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < ep->params.response.ExtentCnt; i += 4) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RPI Ext%d: %d, %d, %d, %d", i,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIBase[i],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIBase[i+1],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIBase[i+2],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIBase[i+3]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Discover VPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_VPI);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to discover VPI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ExtentCnt = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate VPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_VPI, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to allocate VPI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((uint8_t *)ep->params.response.RscId,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)hba->sli.sli4.VPIBase,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPICount = hba->sli.sli4.VPIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VPI Ext: size=%d cnt=%d/%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtSize,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtCount, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < ep->params.response.ExtentCnt; i += 4) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VPI Ext%d: %d, %d, %d, %d", i,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIBase[i],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIBase[i+1],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIBase[i+2],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIBase[i+3]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Discover VFI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_VFI);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to discover VFI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ExtentCnt = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate VFI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(mbq, sizeof (MAILBOXQ));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_VFI, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to allocate VFI extents. Mailbox cmd=%x status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb4->mbxCommand, mb4->mbxStatus);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (EIO);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy((uint8_t *)ep->params.response.RscId,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint8_t *)hba->sli.sli4.VFIBase,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFICount = hba->sli.sli4.VFIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VFI Ext: size=%d cnt=%d/%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtSize,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtCount, ExtentCnt);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < ep->params.response.ExtentCnt; i += 4) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VFI Ext%d: %d, %d, %d, %d", i,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIBase[i],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIBase[i+1],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIBase[i+2],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIBase[i+3]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_init_extents() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_rpi(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t rpi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i = index / hba->sli.sli4.RPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = index % hba->sli.sli4.RPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpi = hba->sli.sli4.RPIBase[i] + j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (rpi);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_rpi_to_index(emlxs_hba_t *hba, uint32_t rpi)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t lo;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t hi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t index = hba->sli.sli4.RPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->sli.sli4.RPIExtCount; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld lo = hba->sli.sli4.RPIBase[i];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hi = lo + hba->sli.sli4.RPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((rpi < hi) && (rpi >= lo)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld index = (i * hba->sli.sli4.RPIExtSize) + (rpi - lo);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (index);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_rpi_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_xri(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t xri;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i = index / hba->sli.sli4.XRIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = index % hba->sli.sli4.XRIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xri = hba->sli.sli4.XRIBase[i] + j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (xri);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_xri */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_vpi(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t vpi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i = index / hba->sli.sli4.VPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = index % hba->sli.sli4.VPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vpi = hba->sli.sli4.VPIBase[i] + j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (vpi);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_vpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_vpi_to_index(emlxs_hba_t *hba, uint32_t vpi)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t lo;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t hi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t index = hba->sli.sli4.VPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->sli.sli4.VPIExtCount; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld lo = hba->sli.sli4.VPIBase[i];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hi = lo + hba->sli.sli4.VPIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((vpi < hi) && (vpi >= lo)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld index = (i * hba->sli.sli4.VPIExtSize) + (vpi - lo);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld break;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (index);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_vpi_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern uint32_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_vfi(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint32_t vfi;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld i = index / hba->sli.sli4.VFIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = index % hba->sli.sli4.VFIExtSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld vfi = hba->sli.sli4.VFIBase[i] + j;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (vfi);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_vfi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_rqid_to_index(emlxs_hba_t *hba, uint16_t rqid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (rqid < 0xffff) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.rq[i].qid == rqid) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (i);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xffff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_rqid_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_wqid_to_index(emlxs_hba_t *hba, uint16_t wqid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (wqid < 0xffff) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_WQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.wq[i].qid == wqid) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (i);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xffff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_wqid_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_cqid_to_index(emlxs_hba_t *hba, uint16_t cqid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld{
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld uint16_t i;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cqid < 0xffff) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_CQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->sli.sli4.cq[i].qid == cqid) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (i);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld }
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xffff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_cqid_to_index */