825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * CDDL HEADER START
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.
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 * 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 * CDDL HEADER END
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Use is subject to license terms.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic int emlxs_sli4_init_extents(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_read_status(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic int emlxs_init_bootstrap_mb(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_read_sema(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_read_mbdb(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_mbdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_wqdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_mqdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_rqdb(emlxs_hba_t *hba, uint32_t value);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_write_cqdb(emlxs_hba_t *hba, uint32_t value);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_create_queues(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_post_hdr_tmplates(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_post_sgl_pages(emlxs_hba_t *hba,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amorestatic int emlxs_sli4_read_eq(emlxs_hba_t *hba, EQ_DESC_t *eq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_map_hdw(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_unmap_hdw(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int32_t emlxs_sli4_online(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_offline(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_hba_reset(emlxs_hba_t *hba, uint32_t restart,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_hba_kill(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_hba_init(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_bde_setup(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_issue_iocb_cmd(emlxs_hba_t *hba,
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 Swaminathanstatic uint32_t emlxs_sli4_prep_fct_iocb(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_fct_bde_setup(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_fcp_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_ip_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_els_iocb(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_prep_ct_iocb(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_poll_intr(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int32_t emlxs_sli4_intx_intr(char *arg);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic uint32_t emlxs_sli4_msi_intr(char *arg1, char *arg2);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* MSI_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_resource_free(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic int emlxs_sli4_resource_alloc(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldextern void emlxs_sli4_zero_queue_stat(emlxs_hba_t *hba);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic XRIobj_t *emlxs_sli4_alloc_xri(emlxs_port_t *port,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_enable_intr(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_disable_intr(emlxs_hba_t *hba, uint32_t att);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_timer(emlxs_hba_t *hba);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanstatic void emlxs_sli4_timer_check_mbox(emlxs_hba_t *hba);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amorestatic void emlxs_sli4_poll_erratt(emlxs_hba_t *hba);
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 *);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_reg_did(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint32_t emlxs_sli4_unreg_node(emlxs_port_t *port,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_handle_fc_link_att(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic void emlxs_sli4_handle_fcoe_link_event(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t emlxs_sli4_rqid_to_index(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t emlxs_sli4_wqid_to_index(emlxs_hba_t *hba,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldstatic uint16_t emlxs_sli4_cqid_to_index(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Define SLI4 API functions */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* ************************************************************************** */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_set_default_params(emlxs_hba_t *hba)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero((char *)&hba->sli.sli4.param, sizeof (sli_params_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.ProtocolType = 0x3; /* FC/FCoE */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.Revision = 0x4; /* SLI4 */
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.EqeCntMask = 0x1F; /* 256-4096 elements */
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.CqeSize = 0x3; /* 16 byte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.CqeCntMask = 0x70; /* 256-1024 elements */
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.MqeCntMask = 0x0F; /* 16-128 elements */
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.WqeSize = 0x5; /* 64 byte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.WqeCntMask = 0x10; /* 256 elements */
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.RqeSize = 0x2; /* 8 byte */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.RqeCntMask = 0x100; /* 4096 elements */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.Loopback = 0xf; /* unsupported */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SglAlign = 0x7 /* 4096 */;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.param.SglPageSize = 0x1; /* 4096 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Default SLI4 parameters set.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_set_default_params() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * emlxs_sli4_online()
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * This routine will start initialization of the SLI4 HBA.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the fw_check flag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Networking not supported */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Networking is not supported in SLI4, turning it off");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->chan_count = hba->intr_count * cfg[CFG_NUM_WQ].current;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Max channels exceeded, dropping num-wq from %d to 1",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->chan_count = hba->intr_count * cfg[CFG_NUM_WQ].current;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->channel_fcp = 0; /* First channel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Default channel for everything else is the last channel */
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 hba->sli.sli4.dump_region.align = ddi_ptob(hba->dip, 1L);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_alloc(hba, &hba->sli.sli4.dump_region);
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 * Get a buffer which will be used repeatedly for mailbox commands
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *) kmem_zalloc((sizeof (MAILBOXQ)), KM_SLEEP);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reset & Initialize the adapter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to init hba.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.bar0_acc_handle) != DDI_FM_OK)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.bar1_acc_handle) != DDI_FM_OK) ||
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.bar2_acc_handle) != DDI_FM_OK)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Setup and issue mailbox READ REV command
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 /* Set param defaults */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Save parameters */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (char *)&hba->sli.sli4.param, sizeof (sli_params_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reuse mbq from previous mbox */
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 /* Save port names */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reuse mbq from previous mbox */
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",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "RD_REV", (uint32_t *)mb, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid read rev Version for SLI4: 0x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_DCBX_MODE_CIN: /* Mapped to nonFIP mode */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case EMLXS_DCBX_MODE_CEE: /* Mapped to FIP mode */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid read rev dcbx mode for SLI4: 0x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set FC/FCoE mode */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save information as VPD data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->sli4FwRev = (mb->un.varRdRev4.ULPFwId);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((char *)mb->un.varRdRev4.ULPFwName, vpd->sli4FwName, 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->opFwRev = (mb->un.varRdRev4.ULPFwId);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((char *)mb->un.varRdRev4.ULPFwName, vpd->opFwName, 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd->postKernRev = (mb->un.varRdRev4.ARMFwId);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((char *)mb->un.varRdRev4.ARMFwName, vpd->postKernName, 16);
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 /* Decode FW labels */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.chip == EMLXS_LANCER_CHIP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bcopy(vpd->postKernName, vpd->sli4FwName, 16);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_decode_label(vpd->sli4FwName, vpd->sli4FwName, 0,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_decode_label(vpd->opFwName, vpd->opFwName, 0,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_decode_label(vpd->postKernName, vpd->postKernName, 0,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (hba->model_info.chip == EMLXS_BE2_CHIP) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore } else if (hba->model_info.chip == EMLXS_BE3_CHIP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (hba->model_info.chip == EMLXS_LANCER_CHIP) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(vpd->sli4FwLabel, "xe201.grp",
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 /* No key information is needed for SLI4 products */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get adapter VPD information */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vpd_data = hba->sli.sli4.dump_region.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "No VPD found. status=%x", mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "VPD dumped. rsp_cnt=%d status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.dump_region.dma_handle,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan 0, mb->un.varDmp4.rsp_cnt, DDI_DMA_SYNC_FORKERNEL);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (hba->sli.sli4.dump_region.dma_handle) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_online: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_parse_vpd(hba, (uint8_t *)vpd_data,
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 * 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 (strcmp(&vpd->model[0], hba->model_info.model) != 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* First scan for a V2 match */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 1; i < emlxs_pci_model_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (strcmp(&vpd->part_num[0], hba->model_info.model) != 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Next scan for a PN match */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 1; i < emlxs_pci_model_count; i++) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* HP CNA port indices start at 1 instead of 0 */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (uint16_t *)(hba->pci_addr + PCI_SSVID_REGISTER));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((ssvid == PCI_SSVID_HP) && (vpd->port_index > 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Now lets update hba->model_info with the real
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * VPD data, if any.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Replace the default model description with vpd data
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Replace the default model with vpd data */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(hba->model_info.model, vpd->model,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Replace the default program types with vpd data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_parse_prog_types(hba, vpd->prog_types);
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 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);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->boot_version, vpd->sli4FwName,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get fcode version property */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware: kern=%08x stub=%08x sli1=%08x", vpd->postKernRev,
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "BIOS: boot=%s fcode=%s", vpd->boot_version, vpd->fcode_version);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If firmware checking is enabled and the adapter model indicates
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * a firmware image, then perform firmware version check
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->model_info.flags & EMLXS_ORACLE_BRANDED) &&
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((fw_check & 0x2) && hba->model_info.fwid)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Find firmware image indicated by adapter model */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < emlxs_fw_count; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_fw_table[i].id == hba->model_info.fwid) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If the image was found, then verify current firmware
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * versions of adapter
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Obtain current firmware version info */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_be_read_fw_version(hba, &hba_fw);
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan ((fw->kern && (hba_fw.kern != fw->kern)) ||
6a573d82e26abdedeb701fcdd5b5461b2fa0da40Sukumar Swaminathan (fw->stub && (hba_fw.stub != fw->stub)))) {
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 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 * 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#endif /* MODFW_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware update failed.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Unload the firmware image from
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * kernel memory
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* MODFW_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware image unavailable.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Firmware update not needed.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * This means either the adapter database is not
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * correct or a firmware image is missing from the
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 /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "No FCOE info found. status=%x", mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "FCOE info dumped. rsp_cnt=%d status=%x",
fe199829b492e6b3aa36dd76af597360bb4af121Sukumar Swaminathan (uint8_t *)hba->sli.sli4.dump_region.virt,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
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",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "REQ_FEATURE", (uint32_t *)mb, 6, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check to see if we get the features we requested */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status != mb->un.varReqFeatures.featuresEnabled) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Just report descrepencies, don't abort the attach */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld outptr = (uint8_t *)emlxs_request_feature_xlate(
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf, (char *)outptr, sizeof (buf));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "REQUEST_FEATURES: wanted:%s got:%s",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Initiator mode not supported by adapter.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check if we can fall back to just target mode */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Disabling dynamic target mode. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Enabling target mode only.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This will trigger the driver to reattach */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Target mode not supported by adapter.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check if we can fall back to just initiator mode */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Disabling dynamic target mode. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Enabling initiator mode only.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This will trigger the driver to reattach */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (mb->un.varReqFeatures.featuresEnabled & SLI4_FEATURE_NPIV) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (mb->un.varReqFeatures.featuresEnabled & SLI4_FEATURE_PERF_HINT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
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",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "READ_CONFIG4", (uint32_t *)mb, 18, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set default extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRICount = mb->un.varRdConfig4.XRICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtSize = hba->sli.sli4.XRICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIBase[0] = mb->un.varRdConfig4.XRIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPICount = mb->un.varRdConfig4.RPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtSize = hba->sli.sli4.RPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIBase[0] = mb->un.varRdConfig4.RPIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPICount = mb->un.varRdConfig4.VPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtSize = hba->sli.sli4.VPICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIBase[0] = mb->un.varRdConfig4.VPIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFICount = mb->un.varRdConfig4.VFICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtSize = hba->sli.sli4.VFICount;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIBase[0] = mb->un.varRdConfig4.VFIBase;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.FCFICount = mb->un.varRdConfig4.FCFICount;
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 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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to initialize extents.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: port_name:%c %c %c %c",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: ldv:%d link_type:%d link_number:%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.link_number = mb->un.varRdConfig4.link_number;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->vpi_max = min(hba->sli.sli4.VPICount, MAX_VPORTS) - 1;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the max node count */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->max_nodes = hba->sli.sli4.RPICount;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the io throttle */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->io_throttle = hba->sli.sli4.XRICount - IO_THROTTLE_RESERVE;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set max_iotag */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* We add 1 in case all XRI's are non-zero */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set out-of-range iotag base */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save the link speed capabilities */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore vpd->link_speed = (uint16_t)mb->un.varRdConfig4.lmt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Allocate some memory for buffers
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to allocate memory buffers.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to allocate resources.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "XRIp", (uint32_t *)hba->sli.sli4.XRIp, 18, 0);
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#endif /* >= EMLXS_MODREV5 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
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 /* Reuse mbq from previous mbox */
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 * 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 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 /* Reuse mbq from previous mbox */
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 EMLXS_STATE_CHANGE(hba, FC_INIT_CFGPORT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get and save the current firmware version (based on sli_mode) */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE(hba, FC_INIT_INITLINK);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reuse mbq from previous mbox */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to configure link. Mailbox cmd=%x "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * We need to get login parameters for NID
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 /* Free the buffer since we were polling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If no serial number in VPD data, then use the WWPN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < 12; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (char)((uint8_t)'A' + (uint8_t)(j - 10));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (char)((uint8_t)'A' + (uint8_t)(j - 10));
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()
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: WWPN: port_index=0");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make final attempt to set a port index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (strcmp(ddi_get_name(c_dip), "ethernet") == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CONFIG: Device tree: port_index=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.channels == EMLXS_MULTI_CHANNEL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(vpd->id, (sizeof (vpd->id)-1),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.model_desc, vpd->port_index);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->manufacturer, hba->model_info.manufacturer,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->part_num, hba->model_info.model,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(vpd->model_desc, (sizeof (vpd->model_desc)-1),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->model_info.model_desc, vpd->port_index);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strncpy(vpd->model, hba->model_info.model,
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,
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]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check persist-linkdown */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_STATE_CHANGE(hba, FC_LINK_DOWN_PERSIST);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld !(port->fct_flags & FCT_STATE_PORT_ONLINE)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Setup and issue mailbox INITIALIZE LINK command
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * At this point, the interrupt will be generated by the HW
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cfg[CFG_TOPOLOGY].current, cfg[CFG_LINK_SPEED].current);
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 /* Wait for link to come up */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for hardware error */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * The leadville driver will now handle the FLOGI at the driver level
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan (void) kmem_free((uint8_t *)mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->intr_flags & EMLXS_MSI_ADDED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) kmem_free((uint8_t *)mbq, sizeof (MAILBOXQ));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_free(hba, &hba->sli.sli4.dump_region);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_online() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_offline(emlxs_hba_t *hba, uint32_t reset_requested)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reverse emlxs_sli4_online */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Shutdown the adapter interface */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free SLI shared memory */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free driver shared memory */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free the host dump region buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_mem_free(hba, &hba->sli.sli4.dump_region);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_offline() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Map in Hardware BAR pages that will be used for */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* communication with HBA. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_regs_map_setup(dip, PCI_BAR1_RINDEX,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 0, 0, &dev_attr, &hba->sli.sli4.bar1_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "(PCI) ddi_regs_map_setup BAR1 failed. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "stat=%d mem=%p attr=%p hdl=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_regs_map_setup(dip, PCI_BAR2_RINDEX,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 0, 0, &dev_attr, &hba->sli.sli4.bar2_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ddi_regs_map_setup BAR2 failed. status=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* offset from beginning of register space */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_MB_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_CQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_MQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_WQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar2_addr + PD_RQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_LO_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_HI_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Map in Hardware BAR pages that will be used for */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* communication with HBA. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_regs_map_setup(dip, PCI_BAR0_RINDEX,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld 0, 0, &dev_attr, &hba->sli.sli4.bar0_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "(PCI) ddi_regs_map_setup BAR0 failed. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "stat=%d mem=%p attr=%p hdl=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* offset from beginning of register space */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_MB_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_CQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_MQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_WQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->sli.sli4.bar0_addr + PD_RQ_DB_OFFSET);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Map hdw: Unsupported if_type %08x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.bootstrapmb.virt == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->size = EMLXS_BOOTSTRAP_MB_SIZE + MBOX_EXTENSION_SIZE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
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 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_sli4_map_hdw() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ddi_regs_map_free(&hba->sli.sli4.bar0_acc_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_regs_map_free(&hba->sli.sli4.bar1_acc_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ddi_regs_map_free(&hba->sli.sli4.bar2_acc_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->phys = hba->sli.sli4.bootstrapmb.phys;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore buf_info->virt = hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->size = hba->sli.sli4.bootstrapmb.size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_unmap_hdw() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Wait for reset completion */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (i < 30) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check to see if any errors occurred during init */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((status & ARM_POST_MASK) == ARM_POST_READY) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* ARM Ready !! */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* ARM Ready !! */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ARM Ready (Reset Needed): "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "status=%x err1=%x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unrecoverable Error: status=%x err1=%x "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Timeout occurred */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Ready Timeout: Port Error: status=%x err1=%x err2=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_reset_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Ready Timeout: status=%x err1=%x err2=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_check_hdw_ready() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
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} /* emlxs_sli4_read_status() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar1_acc_handle,
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 status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
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} /* emlxs_sli4_read_sema() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar2_acc_handle,
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 status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
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} /* emlxs_sli4_read_mbdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_mbdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_mbdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_cqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_cqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_rqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_rqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_mqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_mqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_write_wqdb(emlxs_hba_t *hba, uint32_t value)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_write_wqdb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_check_bootstrap_ready(emlxs_hba_t *hba, uint32_t tmo)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Wait for reset completion, tmo is in 10ms ticks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check to see if any errors occurred during init */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
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",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_check_bootstrap_ready() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_issue_bootstrap_mb(emlxs_hba_t *hba, uint32_t tmo)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * This routine assumes the bootstrap mbox is loaded
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * with the mailbox command to be executed.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * First, load the high 30 bits of bootstrap mailbox
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan addr30 = (uint32_t)((hba->sli.sli4.bootstrapmb.phys>>32) & 0xfffffffc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = emlxs_check_bootstrap_ready(hba, tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Load the low 30 bits of bootstrap mailbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan addr30 = (uint32_t)((hba->sli.sli4.bootstrapmb.phys>>2) & 0xfffffffc);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = emlxs_check_bootstrap_ready(hba, tmo);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "BootstrapMB: %p Completed %08x %08x %08x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_issue_bootstrap_mb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_init_bootstrap_mb(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0); /* Already initialized */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* NOTE: tmo is in 10ms ticks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tmo = emlxs_check_bootstrap_ready(hba, 3000);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Issue FW_INITIALIZE command */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Special words to initialize bootstrap mbox MUST be little endian */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_BSIZE, DDI_DMA_SYNC_FORDEV);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "FW_INIT", (uint32_t *)iptr, 6, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!emlxs_issue_bootstrap_mb(hba, tmo)) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, hba->sli.sli4.bootstrapmb.dma_handle)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "init_bootstrap_mb: hdl=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_init_bootstrap_mb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Restart the adapter */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_hba_reset(hba, 1, 0, 0)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cp->iopath = (void *)&hba->sli.sli4.wq[i];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize all the port objects */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < MAX_VPORTS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set the max node count */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->max_nodes = cfg[CFG_NUM_NODES].current;
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;
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));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_init() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_hba_reset(emlxs_hba_t *hba, uint32_t restart, uint32_t skip_post,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_reset_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Adapter reset disabled.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Initalize Hardware that will be used to bring
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * SLI4 online.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Timeout occurred */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Timeout: RESET");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Log a dump event - not supported */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd4quiesce(hba, &mboxq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Log a dump event - not supported */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "resetPort", (uint32_t *)&mboxq, 12, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter not ready for reset.");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err1 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld err2 = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Don't generate an event if dump was forced */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Reset the port now */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reset the hba structure */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (channelno = 0; channelno < hba->chan_count; channelno++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reset the port objects */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < MAX_VPORTS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&vport->fabric_sparam, sizeof (SERV_PARM));
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore bzero(&vport->prev_fabric_sparam, sizeof (SERV_PARM));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((caddr_t)&vport->node_base, sizeof (NODELIST));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (vport->ub_count < EMLXS_UB_TOKEN_OFFSET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan vport->ub_count = EMLXS_UB_TOKEN_OFFSET;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (status & SLI_STATUS_DUMP_IMAGE_PRESENT) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_reset */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_pkt_to_sgl(emlxs_port_t *port, fc_packet_t *pkt, ULP_SGE64 *sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_SGE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* >= EMLXS_MODREV3 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < cookie_cnt && size > 0; i++, cp++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy staged SGE before we build next one */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan len = MIN(EMLXS_MAX_SGE_SIZE, sge_size);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "SGE", (uint32_t *)&stage_sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_SGE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_pkt_to_sgl */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_bde_setup(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* >= EMLXS_MODREV3 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sge = emlxs_pkt_to_sgl(port, pkt, sge, SGL_CMD, &cmd_cnt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* DATA payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Data payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.addrHigh = PADDR_HI(sge_addr);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.Payload.tus.f.bdeSize = cmd_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.PayloadLength = cmd_cnt + resp_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.GenReq.Payload.tus.f.bdeSize = cmd_cnt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_bde_setup */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_fct_bde_setup(emlxs_port_t *port, emlxs_buf_t *sbp)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * The hardware will automaticlly round up
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * to multiple of 4.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * if (size & 3) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * size = (size + 3) & 0xfffffffc;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld fct_mp = (MATCHMAP *)sbp->fct_buf->db_port_private;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bde_setup: Only 1 sglist entry supported: %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (iocb->ULPCOMMAND == CMD_FCP_TRECEIVE64_CX) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mp = emlxs_mem_buf_alloc(hba, EMLXS_XFER_RDY_SIZE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_error_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "fct_bde_setup: Cannot allocate XRDY memory");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Save the MATCHMAP info to free this memory later */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Point to XRDY payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Fill in burstsize in payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* First 2 SGEs are XRDY and SKIP */
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 } else { /* CMD_FCP_TSEND64_CX */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* First 2 SGEs are SKIP */
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 /* The BDE should match the contents of the first SGE payload */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* The PayloadLength should be set to 0 for TSEND64. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * TotalTransferCount equals to Relative Offset field (Word 4)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * in both TSEND64 and TRECEIVE64 WQE.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.FcpCmd.TotalTransferCount = dbuf->db_relative_offset;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Build SGEs */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE before we build next one */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.addrHigh = stage_sge.addrHigh;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->FirstData.tus.f.bdeSize = stage_sge.length;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_fct_bde_setup */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_issue_iocb_cmd(emlxs_hba_t *hba, CHANNEL *cp, IOCBQ *iocbq)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
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 /* 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 /* Attempt to acquire CMD_RING lock */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (mutex_tryenter(&EMLXS_QUE_LOCK(channelno)) == 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* EMLXS_QUE_LOCK acquired */
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 /* Hitting adapter throttle limit */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check to see if we have room for this WQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * We have a command ring slot available
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Make sure we have an iocb to send
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if the ring already has iocb's waiting */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Put the current iocbq on the tx queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Attempt to replace it with the next iocbq
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * in the tx queue
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Process each iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (sbp && sbp->node && sbp->node->io_throttle) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Node is busy */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Queue this iocb and get next iocb from */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* channel */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If exchange removed after wqe was prep'ed, drop it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Xmit WQE iotag:%x xri:%d aborted",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get next iocb from the tx queue */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp->pkt_flags & PACKET_DELAY_REQUIRED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Perform delay */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for ULP pkt request */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Set node to base node by default */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FCT_IO_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * At this point, we have a command ring slot available
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * and an iocb to send
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Send the iocb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)wqe, (uint8_t *)wqeslot,
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 (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(wq->addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Ring the WQ Doorbell */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqdb |= ((1 << 24) | (wq->host_index << 16));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * After this, the sbp / iocb / wqe should not be
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * accessed in the xmit path.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_IOCB, (void *)iocbq);
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 /* Check to see if we have room for another WQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue it for later */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the next iocb from the tx queue if there is one */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_iocb_cmd() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_issue_mq(emlxs_port_t *port, MAILBOX4 *mqe, MAILBOX *mb,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mb->mbxCommand != MBX_SLI_CONFIG) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is an embedded mbox, everything should fit
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * into the mailbox area.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)mqe,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.mq.addr.dma_handle, 0,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX CMD", (uint32_t *)mqe,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* SLI_CONFIG and non-embedded */
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 mb4->un.varSLIConfig.be.payload_length = mp->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)&mb4->un.varSLIConfig.be.un_hdr.hdr_req;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)mqe,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.mq.addr.dma_handle, offset,
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 /* Ring the MQ Doorbell */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mqdb |= ((1 << MQ_DB_POP_SHIFT) & MQ_DB_POP_MASK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_mq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_issue_bootstrap(emlxs_hba_t *hba, MAILBOX *mb, uint32_t tmo)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->mbox_mqe = hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mb->mbxCommand != MBX_SLI_CONFIG) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is an embedded mbox, everything should fit
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * into the bootstrap mailbox area.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)iptr,
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 * 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 mb4->un.varSLIConfig.be.payload_length = mp->size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)&mb4->un.varSLIConfig.be.un_hdr.hdr_req;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)mb, (uint8_t *)iptr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_BOOTSTRAP_MB_SIZE + MBOX_EXTENSION_SIZE,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX EXT", iptr, 12, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
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 /* NOTE: tmo is in 10ms ticks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!emlxs_issue_bootstrap_mb(hba, tmo)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mb->mbxCommand != MBX_SLI_CONFIG) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan MAILBOX_CMD_SLI4_BSIZE, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)iptr, (uint8_t *)mb,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_data_dump(port, "MBOX CMP", iptr, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(hba->sli.sli4.bootstrapmb.dma_handle, 0,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_BOOTSTRAP_MB_SIZE + MBOX_EXTENSION_SIZE,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)hba->sli.sli4.bootstrapmb.virt;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)iptr, (uint8_t *)mb,
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);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, mp->dma_handle)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_issue_bootstrap: mp_hdl=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_issue_bootstrap: hdl=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_bootstrap() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_issue_mbox_cmd(emlxs_hba_t *hba, MAILBOXQ *mbq, int32_t flag,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check for minimum timeouts */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Mailbox commands that erase/write flash */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hdr_req->subsystem == IOCTL_SUBSYSTEM_COMMON) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (hdr_req->subsystem == IOCTL_SUBSYSTEM_FCOE) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Also: VENDOR_MANAGE_FFV (0x13, 0x02) (not currently used)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Convert tmo seconds to 10 millisecond tics */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Adjust wait flag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.flag & EMLXS_SLI4_INTR_ENABLED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Must have interrupts enabled to perform MBX_NOWAIT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!(hba->sli.sli4.flag & EMLXS_SLI4_INTR_ENABLED)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Interrupts disabled. %s failed.",
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan /* Check for hardware error ; special case SLI_CONFIG */
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan ! ((mb4->mbxCommand == MBX_SLI_CONFIG) &&
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan (mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode ==
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 /* If we are not polling, then queue it for later */
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 "Timeout. %s: mb=%p tmo=%d Waiting.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Non-lethalStatus mailbox timeout */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Does not indicate a hardware error */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check for hardware error ; special case SLI_CONFIG */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode ==
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Hardware error reported. %s failed. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "status=%x mb=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Sending. %s: mb=%p NoWait. embedded %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr += (hba->sli.sli4.mq.host_index * MAILBOX_CMD_SLI4_WSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.mq.host_index >= hba->sli.sli4.mq.max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "BDE virt %p phys %p size x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (uint32_t *)(((MATCHMAP *)mbq->bp)->virt), 30, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rc = emlxs_sli4_issue_mq(port, (MAILBOX4 *)iptr, mb, tmo_local);
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 ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = emlxs_sli4_issue_bootstrap(hba, mb, tmo_local);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the mailbox area */
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 /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
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 /* Process the result */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, NULL, mb->mbxStatus);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "%s: MBX_NONEMBED_ERROR: 0x%x, 0x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Attempt to send pending mailboxes */
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)) {
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 ((mb->mbxCommand != MBX_SLI_CONFIG) ? 1 :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr += (hba->sli.sli4.mq.host_index * MAILBOX_CMD_SLI4_WSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli.sli4.mq.host_index >= hba->sli.sli4.mq.max_index) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rc = emlxs_sli4_issue_mq(port, (MAILBOX4 *)iptr, mb, tmo_local);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Wait for completion */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The driver clock is timing the mailbox. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cv_wait(&EMLXS_MBOX_CV, &EMLXS_MBOX_LOCK);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "%s: MBX_NONEMBED_ERROR: 0x%x, 0x%x",
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 /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
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} /* emlxs_sli4_issue_mbox_cmd() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_issue_mbox_cmd4quiesce(emlxs_hba_t *hba, MAILBOXQ *mbq, int32_t flag,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Convert tmo seconds to 10 millisecond tics */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check for hardware error */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rc = emlxs_sli4_issue_bootstrap(hba, mb, tmo_local);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Process the result */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, NULL, mb->mbxStatus);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "%s: MBX_NONEMBED_ERROR: 0x%x, 0x%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_issue_mbox_cmd4quiesce() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_prep_fct_iocb(emlxs_port_t *port, emlxs_buf_t *cmd_sbp, int channel)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use the fabric rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Next allocate an Exchange for this command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_alloc_xri(port, cmd_sbp, rpip,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to allocate exchange. "
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);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Don't give the abort priority, we want the IOCB
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * we are aborting to be processed first.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set the pkt timer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cmd_sbp->ticks = hba->timer_tics + pkt->pkt_timeout +
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (iocb->ULPCOMMAND == CMD_FCP_TRSP64_CX) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip = emlxs_sli4_register_xri(port, cmd_sbp,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to register xri %x. did=0x%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* >= EMLXS_MODREV3 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make size a multiple of 4 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Copy staged SGE into SGL */
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->Timer = ((timeout > 0xff) ? 0 : timeout);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 10 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 11 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set the pkt timer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MPDATA_SYNC(pkt->pkt_cmd_dma, 0, pkt->pkt_cmdlen,
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initalize iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(cmd_sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ((2 * hba->fc_ratov) < 60) ? 60 : (2 * hba->fc_ratov);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->timer_tics + timeout + ((timeout > 0xff) ? 0 : 10);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdType = WQE_TYPE_TRECEIVE; /* Word 11 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else { /* TF_READ_DATA */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* enable auto-rsp AP feature */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_sli4_fct_bde_setup(port, cmd_sbp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Timer = ((timeout > 0xff) ? 0 : timeout);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 10 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 11 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Word 12 */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_prep_fct_iocb() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_prep_fcp_iocb(emlxs_port_t *port, emlxs_buf_t *sbp, int channel)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find target node object */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Next allocate an Exchange for this command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to allocate exchange. did=0x%x", did);
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 /* Indicate this is a FCP cmd */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to setup SGE. did=0x%x", did);
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 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 (uint64_t)((unsigned long)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MPDATA_SYNC(xrip->SGList.dma_handle, offset,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* if device is FCP-2 device, set the following bit */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* that says to run the FC-TAPE protocol. */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (pkt->pkt_tran_type == FC_PKT_FCP_READ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan wqe->un.FcpCmd.TotalTransferCount = pkt->pkt_datalen;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((pkt->pkt_timeout > 0xff) ? 0 : pkt->pkt_timeout);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (FC_TRAN_CLASS(pkt->pkt_tran_flags)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_fcp_iocb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_prep_ip_iocb(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_ip_iocb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_prep_els_iocb(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)wqe, sizeof (emlxs_wqe_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initalize iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* >= EMLXS_MODREV3 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CMD payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrHigh = PADDR_HI(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrLow = PADDR_LO(cp_cmd->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initalize iocb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* ELS Response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to find XRI. rxid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
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 emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
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 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 /* Now sge is fully staged */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((cmd == ELS_CMD_ACC) && (sbp->ucmd == ELS_CMD_FLOGI)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* ELS Request */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use the fabric rpi */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Next allocate an Exchange for this command */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Adapter Busy. Unable to allocate exchange. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ELS: Prep xri=%d iotag=%d rpi=%d",
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;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Timer = ((pkt->pkt_timeout > 0xff) ? 0 : pkt->pkt_timeout);
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 BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan pkt->pkt_cmdlen; /* Byte offset of rsp data */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* RSP payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrHigh = PADDR_HI(cp_resp->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sge->addrLow = PADDR_LO(cp_resp->dmac_laddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now sge is fully staged */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)&stage_sge, (uint8_t *)sge,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ELS: SGLaddr virt %p phys %p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "ELS: PAYLOAD virt %p phys %p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "ELS: SGL", (uint32_t *)xrip->SGList.virt,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_ELS */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->sli_intf & SLI_INTF_IF_TYPE_MASK) ==
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This allows fct to abort the request */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld reserved_rpip = emlxs_rpi_reserve_notify(port, did, xrip);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to alloc reserved RPI. rxid=%x. Rejecting.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Store the reserved rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint64_t)((unsigned long)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MPDATA_SYNC(xrip->SGList.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (FC_TRAN_CLASS(pkt->pkt_tran_flags)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_els_iocb() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_prep_ct_iocb(emlxs_port_t *port, emlxs_buf_t *sbp)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)wqe, sizeof (emlxs_wqe_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initalize wqe */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_tran_type == FC_PKT_OUTBOUND) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CT Response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to find XRI. rxid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
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 emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Adapter Busy. Unable to setup SGE. did=0x%x", did);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(hba->model_info.chip & EMLXS_BE_CHIPS)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.XmitSeq.Rsvd0 = 0; /* Word3 now reserved */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (((SLI_CT_REQUEST *) pkt->pkt_cmd)->CommandResponse.bits.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_LAST_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_SEQ_INITIATIVE) {
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;
62379b581655b9c347d192fce07f06c575a54ea3Sukumar Swaminathan wqe->XC = 0; /* xri_tag is a new exchange */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CmdSpecific = wqe->un.GenReq.Payload.tus.f.bdeSize;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* CT Request */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to find rpi. did=0x%x rpi=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan return (0xff);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Next allocate an Exchange for this command */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Adapter Busy. Unable to allocate exchange. "
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Adapter Busy. Unable to setup SGE. did=0x%x", did);
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CT: SGLaddr virt %p phys %p", xrip->SGList.virt,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CT: SGL", (uint32_t *)xrip->SGList.virt,
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,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* DEBUG_CT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* This allows fct to abort the request */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
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 */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MPDATA_SYNC(xrip->SGList.dma_handle, offset,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->Timer = ((pkt->pkt_timeout > 0xff) ? 0 : pkt->pkt_timeout);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (pkt->pkt_cmd_fhdr.f_ctl & F_CTL_CHAINED_SEQ) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan switch (FC_TRAN_CLASS(pkt->pkt_tran_flags)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_prep_ct_iocb() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_read_eq(emlxs_hba_t *hba, EQ_DESC_t *eq)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(eq->addr.dma_handle, offset,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_read_eq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan char arg[] = {0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7};
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Check attention bits once and process if required */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rc = emlxs_sli4_read_eq(hba, &hba->sli.sli4.eq[i]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (char *)(unsigned long)arg[i]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_poll_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_async_event(emlxs_hba_t *hba, CQE_ASYNC_t *cqe)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Save the event tag */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->link_event_tag == cqe->un.link.event_tag) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld } else if (hba->link_event_tag + 1 < cqe->un.link.event_tag) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->link_event_tag = cqe->un.link.event_tag;
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);
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 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);
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 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 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 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);
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);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: CVL %d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: FCF_CHANGED %d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FIP Async Event: Unknown event type=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "DCBX Async Event: type=%d. Not supported.",
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;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FC Async Event: Link Attention. event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FC Async Event: Shared Link Attention. event=%x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "FC Async Event: Unknown event. type=%d event=%x",
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 BE_SWAP32(*((uint32_t *)cqe->un.port.link_status));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqe->un.port.link_status[hba->sli.sli4.link_number];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Physical media not "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Optics faulted/incorrectly "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "installed/not installed - Reseat optics, "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "if issue not resolved, replace.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Wrong physical "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "media detected");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Optics of two types installed - "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Remove one optic or install matching"
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "pair of optics.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Unsupported "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "physical media detected");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Incompatible optics - Replace "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "with compatible optics for card to "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "SLI Port Async Event: Physical media "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "^%s%d: Misconfigured port: status=0x%x - "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Check optics on card.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VF Async Event: type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "MR Async Event: type=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unknown Async Event: code=%d type=%d.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_async_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_mbox_event(emlxs_hba_t *hba, CQE_MBOX_t *cqe)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. Entry consumed but not completed");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_stray_mbox_intr_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. No mailbox active.");
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "CQ ENTRY: Mbox event. Completing Polled command.");
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Mailbox event. No service required.");
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 /* Set port context */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
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 BE_SWAP32_BCOPY((uint8_t *)hba->mbox_mqe, (uint8_t *)mb,
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 emlxs_data_dump(port, "MBOX CMP", (uint32_t *)hba->mbox_mqe,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Mbox sge_cnt: %d length: %d embed: %d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now sync the memory buffer if one was used */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mbox_bp->dma_handle, 0, mbox_bp->size,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, mbox_bp->dma_handle)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_process_mbox_event: hdl=%p",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now sync the memory buffer if one was used */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbox_nonembed = (MATCHMAP *)mbq->nonembed;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mbox_nonembed->dma_handle, 0, size,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iptr = (uint32_t *)((uint8_t *)mbox_nonembed->virt);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY((uint8_t *)iptr, (uint8_t *)iptr, size);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mbox_nonembed->dma_handle) != DDI_FM_OK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_process_mbox_event: hdl=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "EXT AREA", (uint32_t *)iptr, 24, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Mailbox has been completely received at this point */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->mbox_queue_flag == MBX_SLEEP) {
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 /* && mb->mbxCommand != MBX_DUMP_MEMORY */) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Completed. %s: status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Filter out passthru mailbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: status=0x%x", emlxs_mb_cmd_xlate(mb->mbxCommand),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If mbox was retried, return immediately */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the mailbox area */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_fini(hba, (MAILBOX *)mb, mb->mbxStatus);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Attempt to send pending mailboxes */
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)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_mbox_event() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_CQE_to_IOCB(emlxs_hba_t *hba, CQE_CmplWQ_t *cqe, emlxs_buf_t *sbp)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* 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,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (iocb->ULPSTATUS == IOSTAT_FCP_RSP_ERROR) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (iocb->ULPSTATUS == IOSTAT_FCP_RSP_ERROR) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_ELS_REQUEST64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->un.elsreq64.bdl.bdeSize = cqe->CmdSpecific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_iocb.rsplen = cqe->CmdSpecific;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* For LS_RJT, the driver populates the rsp buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_GEN_REQUEST64_CX;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->unsli3.ext_iocb.rsplen = cqe->CmdSpecific;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPCOMMAND = CMD_XMIT_SEQUENCE64_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* free memory for XRDY */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /*FALLTHROUGH*/
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_CQE_to_IOCB() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_hba_flush_chipq(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (sbp == NULL || sbp == STALE_PACKET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FCT_IO_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy entry to sbp's iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Exchange is no longer busy on-chip, free it */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_free_xri(port, sbp, sbp->xrip, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add the IOCB to the channel list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_proc_channel_event(hba, cp, iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_flush_chipq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_oor_wqe_cmpl(emlxs_hba_t *hba,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* 1 to 1 mapping between CQ and channel */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: OOR Cmpl: iotag=%d", request_tag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CQE", (uint32_t *)cqe, 4, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_oor_wqe_cmpl() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_wqe_cmpl(emlxs_hba_t *hba, CQ_DESC_t *cq, CQE_CmplWQ_t *cqe)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_IO_TRACE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* 1 to 1 mapping between CQ and channel */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: NULL sbp. iotag=%d. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: Stale sbp. iotag=%d. Dropping...", request_tag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* NODE_THROTTLE_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: NULL sbp xrip %p. iotag=%d. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: process wqe compl");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy entry to sbp's iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Mark exchange as ABORT in progress */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: XRI BUSY: iotag=%d xri=%d", request_tag,
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 cmd_sbp = (emlxs_buf_t *)fct_cmd->cmd_fca_private;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_FCT_STATE_CHG(fct_cmd, cmd_sbp, EMLXS_FCT_IOCB_COMPLETE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FCT_IO_TRACE */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore#endif /* SFCT_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * If this is NOT a polled command completion
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * or a driver allocated pkt, then defer pkt
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add the IOCB to the channel list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Delay triggering thread till end of ISR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_proc_channel_event(hba, cp, iocbq);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_wqe_cmpl() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_release_wqe(emlxs_hba_t *hba, CQ_DESC_t *cq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqi = emlxs_sli4_wqid_to_index(hba, (uint16_t)cqe->WQid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Verify WQ index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: Invalid WQid:%d. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: process release wqe: old %d new %d", wq->port_index,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Cmd ring may be available. Try sending more iocbs */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_release_wqe() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_rxq_get(emlxs_hba_t *hba, fc_frame_hdr_t *fchdr)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rxq = &hba->sli.sli4.rxq[EMLXS_RXQ_ELS];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr2 = (fc_frame_hdr_t *)iocbq->iocb.un.ulpWord;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Remove iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_rxq_get() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_rxq_put(emlxs_hba_t *hba, emlxs_iocbq_t *iocbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fchdr = (fc_frame_hdr_t *)iocbq->iocb.RXFCHDR;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rxq = &hba->sli.sli4.rxq[EMLXS_RXQ_ELS];
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ((emlxs_iocbq_t *)q->q_last)->next = iocbq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_rxq_put() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_rq_post(emlxs_port_t *port, uint16_t rqid)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Ring the RQ doorbell once to repost the RQ buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_rq_post() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_unsol_rcv(emlxs_hba_t *hba, CQ_DESC_t *cq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld CQE_UnsolRcvV1_t *cqeV1 = (CQE_UnsolRcvV1_t *)cqe;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Validate the CQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check status */
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: Payload buffer needed.");
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: Unknown status=%x.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Make sure there is a frame header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "CQ ENTRY: Unsol Rcv: FC header too small. Dropping...");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hdr_rqi = emlxs_sli4_rqid_to_index(hba, rqid);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Verify RQ index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: Unsol Rcv: Invalid RQID:%d. Dropping...",
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,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Update host index */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_enter(&hba->sli.sli4.rq[hdr_rqi].lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hdr_rq->host_index >= hdr_rq->max_index) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan data_rq->host_index = hdr_rq->host_index;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mutex_exit(&hba->sli.sli4.rq[hdr_rqi].lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the next header rqb */
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 EMLXS_MPDATA_SYNC(hdr_mp->dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (fc_frame_hdr_t), DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan LE_SWAP32_BCOPY(hdr_mp->virt, (uint8_t *)&fchdr,
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 fchdr.s_id, fchdr.d_id, fchdr.ox_id, fchdr.rx_id);
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 /* Verify fc header type */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0: /* BLS */
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 /* Make sure there is no payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ ENTRY: ABTS payload provided. Dropping...");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(label, "ABTS", sizeof (label));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Make sure there is a payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: Unsol Rcv: No ELS payload provided. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dropping...");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(label, "Unsol ELS", sizeof (label));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Make sure there is a payload */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: Unsol Rcv: No CT payload provided. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dropping...");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(label, "Unsol CT", sizeof (label));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Make sure there is a payload */
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 (void) strlcpy(label, "Unsol FCT", sizeof (label));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ ENTRY: Unexpected FC type (0x%x) received. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Fc Header is valid */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check if this is an active sequence */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocbq = emlxs_sli4_rxq_get(hba, &fchdr);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: First of sequence not"
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan " set. Dropping...",
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...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Find vport */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < MAX_VPORTS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allow unsol FLOGI & PLOGI for P2P */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Invalid did=%x. Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Allocate an IOCBQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq = (emlxs_iocbq_t *)emlxs_mem_get(hba, MEM_IOCB);
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 /* Allocate a buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld seq_mp = (MATCHMAP *)emlxs_mem_get(hba, buf_type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Out of buffer "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "resources. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld node = (void *)emlxs_node_find_did(port, fchdr.s_id, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ ENTRY: %s: Node not found. sid=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Initialize the iocbq */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check sequence order */
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 /* We now have an iocbq */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: No fabric connection. "
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save the frame data to our seq buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the next data rqb */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(data_mp->dma_handle, offset,
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 /* Check sequence length */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Sequence buffer overflow. "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "(%d > %d). Dropping...",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Copy data to local receive buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)data, ((uint8_t *)seq_mp->virt +
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* If this is not the last frame of sequence, queue it. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Save sequence header */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)&fchdr, (uint8_t *)iocb->RXFCHDR,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Update sequence info in iocb */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Queue iocbq for next frame */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Don't free resources */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* No need to abort */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* End of sequence found. Process request now. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Retrieve first frame of sequence */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)iocb->RXFCHDR, (uint8_t *)&fchdr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((uint8_t *)iocb, sizeof (emlxs_iocb_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Build rcv iocb and process it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan case 0: /* BLS */
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);
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 /* Setup sbp / iocb for driver initiated cmd */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Free the temporary iocbq */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->flag |= (IOCB_PRIORITY | IOCB_SPECIAL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* BLS ACC Response */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *)wqe, sizeof (emlxs_wqe_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld iocbq->iocb.ULPCOMMAND = CMD_XMIT_BLS_RSP64_CX;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->un.BlsRsp.XO = ((fchdr.f_ctl & F_CTL_XCHG_CONTEXT)? 1:0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld rpip = emlxs_rpi_reserve_notify(port, fchdr.s_id, 0);
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 /* Store the reserved rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate an exchange for this command */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Unable to alloc XRI. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld wqe->CQId = (uint16_t)0xffff; /* default CQ for response */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_sli4_issue_iocb_cmd(hba, iocbq->channel, iocbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* The temporary iocbq has been freed already */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->vpip->flag & EMLXS_VPI_PORT_ENABLED)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allow for P2P handshaking */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Port not yet enabled. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Use the fabric rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Out of exchange "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "resources. Dropping...",
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->un.rcvels64.remoteID = fchdr.s_id;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan iocb->ULPIOTAG = ((node)? node->nlp_Rpi:0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_els_handle_unsol_req(port, iocbq->channel,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_fct_handle_unsol_els(port, iocbq->channel,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Port not logged in. "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ ENTRY: %s: Out of exchange "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "resources. Dropping...",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Build CMD_RCV_SEQUENCE64_CX */
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);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore iocb->unsli3.ext_rcv.vpi = port->VPIobj.VPI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* pass xrip to FCT in the iocbq */
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 (void) emlxs_fct_handle_unsol_req(port, cp, iocbq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* SFCT_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (!(port->vpip->flag & EMLXS_VPI_PORT_ENABLED) &&
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...",
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 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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "RQ ENTRY: %s: Out of exchange "
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "resources. Dropping...",
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->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 (void) emlxs_ct_handle_unsol_req(port, iocbq->channel,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Sequence handled, no need to abort */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Send ABTS for this exchange */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* !!! Currently, we have no implementation for this !!! */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Return memory resources to pools */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, buf_type, (void *)iocbq->bp);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_mem_put(hba, MEM_IOCB, (void *)iocbq);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_process_unsol_rcv: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan emlxs_thread_spawn(hba, emlxs_restart_thread,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_unsol_rcv() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_xri_aborted(emlxs_hba_t *hba, CQ_DESC_t *cq,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg, */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* "CQ ENTRY: process xri aborted ignored"); */
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "CQ ENTRY: XRI Aborted: xri=%d flag=%x. Bad state.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Exchange is no longer busy on-chip, free it */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_xri_aborted () */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_cq(emlxs_hba_t *hba, CQ_DESC_t *cq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* EMLXS_PORT_LOCK must be held when entering this routine */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(cq->addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cq_entry.word[3] = BE_SWAP32(cqe->word[3]);
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]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CQE", (uint32_t *)cqe, 6, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_CQE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Now handle specific cq type */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan } else { /* EMLXS_CQ_TYPE_GROUP2 */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_oor_wqe_cmpl(hba, cq,
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],
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Number of times this routine gets called for this CQ */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* num_entries is the number of CQEs we process in this specific CQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cqdb |= ((num_entries << CQ_DB_POP_SHIFT) & CQ_DB_POP_MASK);
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 /* EMLXS_PORT_LOCK must be held when exiting this routine */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_cq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_process_eq(emlxs_hba_t *hba, EQ_DESC_t *eq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* EMLXS_PORT_LOCK must be held when entering this routine */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(eq->addr.dma_handle, offset,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld cqi = emlxs_sli4_cqid_to_index(hba, eqe.entry.CQId);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Verify CQ index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "EQE: Invalid CQid: %d. Dropping...",
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 emlxs_sli4_process_cq(hba, &hba->sli.sli4.cq[cqi]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Number of times the ISR for this EQ gets called */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* num_entries is the number of EQEs we process in this specific ISR */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eqdb |= (EQ_DB_CLEAR | EQ_DB_EVENT | EQ_DB_REARM);
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 eqdb |= ((num_entries << EQ_DB_POP_SHIFT) & EQ_DB_POP_MASK);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (cp->chan_flag & EMLXS_NEEDS_TRIGGER) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* EMLXS_PORT_LOCK must be held when exiting this routine */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_process_eq() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_msi_intr(char *arg1, char *arg2)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Check for legacy interrupt handling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->intr_type == DDI_INTR_TYPE_FIXED) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get MSI message id */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan msgid = (uint16_t)((unsigned long)arg2);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Validate the message id */
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan if ((hba->state == FC_KILLED) || (hba->flag & FC_OFFLINE_MODE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The eq[] index == the MSI vector number */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_eq(hba, &hba->sli.sli4.eq[msgid]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_msi_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* MSI_SUPPORT */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_FASTPATH */
bce54adf407df0723facaef4e2147ed69b922786Sukumar Swaminathan if ((hba->state == FC_KILLED) || (hba->flag & FC_OFFLINE_MODE)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_sli4_process_eq(hba, &hba->sli.sli4.eq[0]);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_intx_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE_LOCKED(hba, FC_KILLED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan while (j++ < 10000) {
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.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE_LOCKED(hba, FC_KILLED);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_hba_kill() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_hba_reset_all(emlxs_hba_t *hba, uint32_t flag)
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 /* Issue a Firmware Reset All Request */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld value = SLI_PHYDEV_FRST | SLI_PHYDEV_FRL_ALL | SLI_PHYDEV_DD;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld value = SLI_PHYDEV_FRST | SLI_PHYDEV_FRL_ALL;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_hba_reset_all() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.flag |= EMLXS_SLI4_INTR_ENABLED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan num_cq = (hba->intr_count * cfg[CFG_NUM_WQ].current) +
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* ARM EQ / CQs */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < num_cq; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_enable_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_disable_intr(emlxs_hba_t *hba, uint32_t att)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.flag &= ~EMLXS_SLI4_INTR_ENABLED;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Short of reset, we cannot disable interrupts */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_disable_intr() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_resource_free(emlxs_hba_t *hba)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Already free */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info = &hba->sli.sli4.HeaderTmplate;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (XRIobj_t *)&hba->sli.sli4.XRIinuse_f) ||
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 (sizeof (XRIobj_t) * hba->sli.sli4.XRICount));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan mutex_destroy(&hba->sli.sli4.eq[i].lastwq_lock);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.eq[i], sizeof (EQ_DESC_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_CQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.cq[i], sizeof (CQ_DESC_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_WQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.wq[i], sizeof (WQ_DESC_t));
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 for (i = 0; i < EMLXS_MAX_RQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.rq[i], sizeof (RQ_DESC_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Free the MQ */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan bzero(&hba->sli.sli4.mq, sizeof (MQ_DESC_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_resource_free() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_resource_alloc(emlxs_hba_t *hba)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Already allocated */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* EQs - 1 per Interrupt vector */
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;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* Calculate total dmable memory we need */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* WARNING: make sure each section is aligned on 4K boundary */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += (num_wq + EMLXS_CQ_OFFSET_WQ) * cq_size;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count += num_wq * (4096 * EMLXS_NUM_WQ_PAGES);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan count += RQB_COUNT * (RQB_DATA_SIZE + RQB_HEADER_SIZE);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += (4096 - (count%4096)); /* Ensure 4K alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += hba->sli.sli4.XRIExtSize * hba->sli.sli4.mem_sgl_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld count += (4096 - (count%4096)); /* Ensure 4K alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RPI Header Templates */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Bytes per extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = hba->sli.sli4.RPIExtSize * sizeof (RPIHdrTmplate_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Pages required per extent (page == 4096 bytes) */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Total size */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hddr_size = (k * hba->sli.sli4.RPIExtCount * 4096);
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* Allocate slim2 for SLI4 */
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 "Unable to allocate internal memory for SLI4: %d",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan EMLXS_MPDATA_SYNC(buf_info->dma_handle, 0,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan /* Assign memory to SGL, Head Template, EQ, CQ, WQ, RQ and MQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Allocate space for queues */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < num_eq; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(&hba->sli.sli4.eq[i], sizeof (EQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&hba->sli.sli4.eq[i].lastwq_lock, NULL,
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 FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < num_wq; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(&hba->sli.sli4.wq[i], sizeof (WQ_DESC_t));
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->align = ddi_ptob(hba->dip, 1L);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.wq[i].release_depth = WQE_RELEASE_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld bzero(&hba->sli.sli4.mq, sizeof (MQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_RXQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.rxq[i], sizeof (RXQ_DESC_t));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&hba->sli.sli4.rxq[i].lock, NULL, MUTEX_DRIVER,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_MAX_RQS; i++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero(&hba->sli.sli4.rq[i], sizeof (RQ_DESC_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->align = ddi_ptob(hba->dip, 1L);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.rq[i].max_index = RQ_DEPTH;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mutex_init(&hba->sli.sli4.rq[i].lock, NULL, MUTEX_DRIVER, NULL);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RQS; i++) {
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan size = (i & 0x1) ? RQB_DATA_SIZE : RQB_HEADER_SIZE;
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++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (k = 0; k < RQB_COUNT; k++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RQ_ALLOC: rq[%d] rqb[%d,%d]=%p iotag=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* DEBUG_RQE */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan offset = (off_t)((uint64_t)((unsigned long)
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan (uint64_t)((unsigned long)
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);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* 4K Alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Initialize double linked lists */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIp = (XRIobj_t *)kmem_zalloc(
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (sizeof (XRIobj_t) * hba->sli.sli4.XRICount), KM_SLEEP);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->sli.sli4.XRICount; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* We don't use XRI==0, since it also represents an */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* uninitialized exchange */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.mem_sgl_size / sizeof (ULP_SGE64));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Add xrip to end of free list */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate SGL for this xrip */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld FC_MBUF_DMA | FC_MBUF_SNGLSG | FC_MBUF_DMA32;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* 4K Alignment */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* RPI Header Templates */
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan buf_info->flags = FC_MBUF_DMA | FC_MBUF_DMA32;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buf_info->align = ddi_ptob(hba->dip, 1L);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_resource_alloc: hdl=%p",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_resource_alloc */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld num_wq = cfg[CFG_NUM_WQ].current * hba->intr_count;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < (num_wq + EMLXS_CQ_OFFSET_WQ); i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < num_wq; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.que_stat_timer = (uint32_t)time;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_zero_queue_stat */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_reserve_xri(emlxs_port_t *port, RPIobj_t *rpip, uint32_t type,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip == (XRIobj_t *)&hba->sli.sli4.XRIfree_f) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_err_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to reserve XRI. type=%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore * No more command slots available, retry later
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to reserve iotag. type=%d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Take it off free list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of inuse list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIinuse_f;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_reserve_xri() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_unreserve_xri(emlxs_port_t *port, uint16_t xri, uint32_t lock)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (!xrip || xrip->state == XRI_STATE_FREE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_unreserve_xri:%d already freed.", xri);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Flush this unsolicited ct command */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_flush_ct_event(port, xrip->rx_id);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_unreserve_xri:%d in use. type=%d",
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);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_unreserve_xri:%d unreserved. type=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Take it off inuse list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of free list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_unreserve_xri() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_register_xri(emlxs_port_t *port, emlxs_buf_t *sbp, uint16_t xri,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
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",
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 /* 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 /* Move the XRI to the new RPI */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_register_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan/* Performs both reserve and register functions for XRI */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_alloc_xri(emlxs_port_t *port, emlxs_buf_t *sbp, RPIobj_t *rpip,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (xrip == (XRIobj_t *)&hba->sli.sli4.XRIfree_f) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Get the iotag by registering the packet */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * No more command slots available, retry later
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_pkt_trans_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Adapter Busy. Unable to alloc iotag:(0x%x)(%p) type=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Take it off free list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of inuse list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIinuse_f;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_alloc_xri() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore/* EMLXS_FCTAB_LOCK must be held to enter */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_find_xri(emlxs_port_t *port, uint16_t xri)
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_find_xri() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_free_xri(emlxs_port_t *port, emlxs_buf_t *sbp, XRIobj_t *xrip,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Free XRI:%x, Already freed. type=%d",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) emlxs_flush_ct_event(port, xrip->rx_id);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (hba->fc_table[xrip->iotag] != STALE_PACKET)) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Take it off inuse list */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Add it to end of free list */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore xrip->_f = (XRIobj_t *)&hba->sli.sli4.XRIfree_f;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (PACKET_ULP_OWNED|PACKET_COMPLETED|PACKET_IN_COMPLETION))) {
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 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Exchange is still reserved */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clean up the sbp */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_free_xri() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_post_sgl_pages(emlxs_hba_t *hba, MAILBOXQ *mbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_FCOE_CFG_POST_SGL_PAGES *post_sgl;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
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 * Signifies a non embedded command
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (IOCTL_FCOE_CFG_POST_SGL_PAGES *)(hdr_req + 1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* For each extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (j = 0; j < hba->sli.sli4.XRIExtCount; j++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
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 hdr_req->opcode = FCOE_OPCODE_CFG_POST_SGL_PAGES;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_sgl->params.request.xri_start = xrip->XRI;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
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",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_post_sgl_pages() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_post_hdr_tmplates(emlxs_hba_t *hba, MAILBOXQ *mbq)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan IOCTL_FCOE_POST_HDR_TEMPLATES *post_hdr;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Bytes per extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld j = hba->sli.sli4.RPIExtSize * sizeof (RPIHdrTmplate_t);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Pages required per extent (page == 4096 bytes) */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan addr = hba->sli.sli4.HeaderTmplate.phys;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* For each extent */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (j = 0; j < hba->sli.sli4.RPIExtCount; j++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Signifies an embedded command
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld sizeof (IOCTL_FCOE_POST_HDR_TEMPLATES) + IOCTL_HEADER_SZ;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld mb->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
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 post_hdr->params.request.num_pages = num_pages;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld post_hdr->params.request.rpi_offset = hba->sli.sli4.RPIBase[j];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (k = 0; k < num_pages; k++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
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 emlxs_data_dump(port, "POST_HDR", (uint32_t *)mb, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_post_hdr_tmplates() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_create_queues(emlxs_hba_t *hba, MAILBOXQ *mbq)
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 /* Create EQ's */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to Create EQ %d: Mailbox cmd=%x status=%x ",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan eq = (IOCTL_COMMON_EQ_CREATE *)&mb->un.varSLIConfig.payload;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.eq[i].qid = eq->params.response.EQId;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "EQ0_CREATE", (uint32_t *)mb, 18, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* One for RQ handling, one for mbox/event handling */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create CQ's */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (j = 0; j < num_cq; j++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
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 /* First CQ is for async event handling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Second CQ is for unsol receive handling */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Setup CQ to channel mapping */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan &hba->chan[total_cq - EMLXS_CQ_OFFSET_WQ];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "CQX_CREATE", (uint32_t *)mb,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Create WQ's */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (j = 0; j < num_wq; j++) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.cq[total_wq + EMLXS_CQ_OFFSET_WQ].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
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 hba->sli.sli4.cq[total_wq+EMLXS_CQ_OFFSET_WQ].qid;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_data_dump(port, "WQ_CREATE", (uint32_t *)mb,
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 /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to Create RQ %d: Mailbox cmd=%x status=%x ",
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 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 /* Initialize the host_index */
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.db.Qid = hba->sli.sli4.rq[i-1].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "RQ CREATE: Doorbell rang: qid=%d count=%d",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Create MQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Personalize the MQ */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hba->sli.sli4.mq.cqid = hba->sli.sli4.cq[EMLXS_CQ_MBOX].qid;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Reuse mbq from previous mbox */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_failed_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Unable to Create MQ_EXT %d: Mailbox cmd=%x status=%x ",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Reuse mbq from previous mbox */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if (emlxs_sli4_issue_mbox_cmd(hba, mbq, MBX_WAIT, 0) !=
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 mq = (IOCTL_COMMON_MQ_CREATE *)&mb->un.varSLIConfig.payload;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore hba->sli.sli4.mq.qid = mq->params.response.MQId;
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;
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_create_queues() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Perform SLI4 level timer checks */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_timer() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_sli4_timer_check_mbox(emlxs_hba_t *hba)
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Return if timer hasn't expired */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (!hba->mbox_timer || (hba->timer_tics < hba->mbox_timer)) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* The first to service the mbox queue will clear the timer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: Nowait.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: mb=%p Sleep.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: mb=%p Polled.",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "%s: mb=%p (%d).",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_mbox_timeout_msg, NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_STATE_CHANGE_LOCKED(hba, FC_ERROR);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Perform mailbox cleanup */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* This will wake any sleeping or polling threads */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Trigger adapter shutdown */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_thread_spawn(hba, emlxs_shutdown_thread, 0, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_timer_check_mbox() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_data_dump(emlxs_port_t *port, char *str, uint32_t *iptr, int cnt, int err)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s00: %08x %08x %08x %08x %08x %08x", str, *iptr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+1), *(iptr+2), *(iptr+3), *(iptr+4), *(iptr+5));
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 "%s12: %08x %08x %08x %08x %08x %08x", str, *(iptr+12),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+13), *(iptr+14), *(iptr+15), *(iptr+16), *(iptr+17));
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 "%s24: %08x %08x %08x %08x %08x %08x", str, *(iptr+24),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+25), *(iptr+26), *(iptr+27), *(iptr+28), *(iptr+29));
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 "%s36: %08x %08x %08x %08x %08x %08x", str, *(iptr+36),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan *(iptr+37), *(iptr+38), *(iptr+39), *(iptr+40), *(iptr+41));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_data_dump() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathanemlxs_ue_dump(emlxs_hba_t *hba, char *str)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_ONLINE1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (uint32_t *)(hba->pci_addr + PCICFG_UE_STATUS_ONLINE2));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%s: ueLow:%08x ueHigh:%08x on1:%08x on2:%08x", str,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_h = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Access handle validation */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_CHK_ACC_HANDLE(hba, hba->pci_acc_handle);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_ue_dump() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld switch (hba->sli_intf & SLI_INTF_IF_TYPE_MASK) {
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 hba->sli.sli4.ue_mask_hi, hba->sli.sli4.flag);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld status = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (hba->sli.sli4.flag & EMLXS_SLI4_HW_ERROR)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_l = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld ue_h = ddi_get32(hba->sli.sli4.bar0_acc_handle,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld error = (status & SLI_STATUS_RESET_NEEDED)? 1:2;
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 "Host Error: status:%08x err1:%08x "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "err2:%08x flag:%08x",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore emlxs_thread_spawn(hba, emlxs_shutdown_thread, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_thread_spawn(hba, emlxs_restart_thread, 0, 0);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Access handle validation */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_CHK_ACC_HANDLE(hba, hba->pci_acc_handle);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_sli4_poll_erratt() */
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)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Check for invalid node ids to register */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((did == 0) && (!(hba->flag & FC_LOOPBACK_MODE))) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* We don't register our own did */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((did == port->did) && (!(hba->flag & FC_LOOPBACK_MODE))) {
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,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Check if the node limit has been reached */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_node_create_failed_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore rval = emlxs_rpi_online_notify(port, rpip, did, param, (void *)sbp,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_reg_did() */
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 /* Unreg all nodes */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Check for base node */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Just flush base node */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_tx_node_flush(port, &port->node_base,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Return now */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "unreg_node:%p did=%x rpi=%d",
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 rval = emlxs_rpi_offline_notify(port, rpip, (void *)sbp, (void *)ubp,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_unreg_node() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amoreemlxs_sli4_unreg_all_nodes(emlxs_port_t *port)
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* Set the node tags */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore /* We will process all nodes with this tag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan for (i = 0; i < EMLXS_NUM_HASH_QUES; i++) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore for (i = 0; i < EMLXS_NUM_HASH_QUES; i++) {
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore (void) emlxs_sli4_unreg_node(port, nlp, 0, 0, 0);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore} /* emlxs_sli4_unreg_all_nodes() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_handle_fcoe_link_event(emlxs_hba_t *hba, CQE_ASYNC_t *cqe)
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 /* Link is up */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_handle_fcoe_link_event: Unknown link speed=%x.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set qos_linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->qos_linkspeed = cqe->un.link.qos_link_speed;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set topology */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_handle_fcoe_link_event() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_handle_fc_link_att(emlxs_hba_t *hba, CQE_ASYNC_t *cqe)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Handle link down */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (cqe->un.fc.att_type == ATT_TYPE_LINK_DOWN) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Link is up */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "sli4_handle_fc_link_att: Unknown link speed=%x.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set qos_linkspeed */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Set topology */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_handle_fc_link_att() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_init_extents(emlxs_hba_t *hba, MAILBOXQ *mbq)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Discover XRI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_XRI);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate XRI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_XRI, ExtentCnt);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.XRICount = hba->sli.sli4.XRIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "XRI Ext: size=%d cnt=%d/%d",
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 /* Discover RPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_RPI);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate RPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_RPI, ExtentCnt);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.RPICount = hba->sli.sli4.RPIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "RPI Ext: size=%d cnt=%d/%d",
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 /* Discover VPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_VPI);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate VPI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_VPI, ExtentCnt);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VPICount = hba->sli.sli4.VPIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VPI Ext: size=%d cnt=%d/%d",
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 /* Discover VFI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_get_extents_info(hba, mbq, RSC_TYPE_FCOE_VFI);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtSize = ep->params.response.ExtentSize;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* Allocate VFI Extents */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld emlxs_mb_alloc_extents(hba, mbq, RSC_TYPE_FCOE_VFI, ExtentCnt);
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 ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (ep->params.response.ExtentCnt * sizeof (uint16_t)));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFIExtCount = ep->params.response.ExtentCnt;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld hba->sli.sli4.VFICount = hba->sli.sli4.VFIExtCount *
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "VFI Ext: size=%d cnt=%d/%d",
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} /* emlxs_sli4_init_extents() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_rpi(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_rpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_rpi_to_index(emlxs_hba_t *hba, uint32_t rpi)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->sli.sli4.RPIExtCount; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld index = (i * hba->sli.sli4.RPIExtSize) + (rpi - lo);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_rpi_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_xri(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_xri */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_vpi(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_vpi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_vpi_to_index(emlxs_hba_t *hba, uint32_t vpi)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < hba->sli.sli4.VPIExtCount; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld index = (i * hba->sli.sli4.VPIExtSize) + (vpi - lo);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_vpi_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_index_to_vfi(emlxs_hba_t *hba, uint32_t index)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_index_to_vfi */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_rqid_to_index(emlxs_hba_t *hba, uint16_t rqid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_RQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xffff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_rqid_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_wqid_to_index(emlxs_hba_t *hba, uint16_t wqid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_WQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xffff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_wqid_to_index */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeldemlxs_sli4_cqid_to_index(emlxs_hba_t *hba, uint16_t cqid)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld for (i = 0; i < EMLXS_MAX_CQS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld return (0xffff);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld} /* emlxs_sli4_cqid_to_index */