1fcf3ce44SJohn Forte /*
2fcf3ce44SJohn Forte  * CDDL HEADER START
3fcf3ce44SJohn Forte  *
4fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7fcf3ce44SJohn Forte  *
88f23e9faSHans Rosenfeld  * You can obtain a copy of the license at
98f23e9faSHans Rosenfeld  * http://www.opensource.org/licenses/cddl1.txt.
10fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11fcf3ce44SJohn Forte  * and limitations under the License.
12fcf3ce44SJohn Forte  *
13fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18fcf3ce44SJohn Forte  *
19fcf3ce44SJohn Forte  * CDDL HEADER END
20fcf3ce44SJohn Forte  */
21fcf3ce44SJohn Forte 
22fcf3ce44SJohn Forte /*
238f23e9faSHans Rosenfeld  * Copyright (c) 2004-2012 Emulex. All rights reserved.
2482527734SSukumar Swaminathan  * Use is subject to license terms.
25*a3170057SPaul Winder  * Copyright 2020 RackTop Systems, Inc.
26fcf3ce44SJohn Forte  */
27fcf3ce44SJohn Forte 
28291a2b48SSukumar Swaminathan #include <emlxs.h>
29fcf3ce44SJohn Forte 
3082527734SSukumar Swaminathan /* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
3182527734SSukumar Swaminathan EMLXS_MSG_DEF(EMLXS_MBOX_C);
3282527734SSukumar Swaminathan 
3382527734SSukumar Swaminathan 
348f23e9faSHans Rosenfeld emlxs_table_t emlxs_mb_status_table[] = {
358f23e9faSHans Rosenfeld 	{MBX_SUCCESS, "SUCCESS"},
368f23e9faSHans Rosenfeld 	{MBX_FAILURE, "FAILURE"},
378f23e9faSHans Rosenfeld 	{MBXERR_NUM_IOCBS, "NUM_IOCBS"},
388f23e9faSHans Rosenfeld 	{MBXERR_IOCBS_EXCEEDED, "IOCBS_EXCEEDED"},
398f23e9faSHans Rosenfeld 	{MBXERR_BAD_RING_NUMBER, "BAD_RING_NUMBER"},
408f23e9faSHans Rosenfeld 	{MBXERR_MASK_ENTRIES_RANGE, "MASK_ENTRIES_RANGE"},
418f23e9faSHans Rosenfeld 	{MBXERR_MASKS_EXCEEDED, "MASKS_EXCEEDED"},
428f23e9faSHans Rosenfeld 	{MBXERR_BAD_PROFILE, "BAD_PROFILE"},
438f23e9faSHans Rosenfeld 	{MBXERR_BAD_DEF_CLASS, "BAD_DEF_CLASS"},
448f23e9faSHans Rosenfeld 	{MBXERR_BAD_MAX_RESPONDER, "BAD_MAX_RESPONDER"},
458f23e9faSHans Rosenfeld 	{MBXERR_BAD_MAX_ORIGINATOR, "BAD_MAX_ORIGINATOR"},
468f23e9faSHans Rosenfeld 	{MBXERR_RPI_REGISTERED, "RPI_REGISTERED"},
478f23e9faSHans Rosenfeld 	{MBXERR_RPI_FULL, "RPI_FULL"},
488f23e9faSHans Rosenfeld 	{MBXERR_NO_RESOURCES, "NO_RESOURCES"},
498f23e9faSHans Rosenfeld 	{MBXERR_BAD_RCV_LENGTH, "BAD_RCV_LENGTH"},
508f23e9faSHans Rosenfeld 	{MBXERR_DMA_ERROR, "DMA_ERROR"},
518f23e9faSHans Rosenfeld 	{MBXERR_NOT_SUPPORTED, "NOT_SUPPORTED"},
528f23e9faSHans Rosenfeld 	{MBXERR_UNSUPPORTED_FEATURE, "UNSUPPORTED_FEATURE"},
538f23e9faSHans Rosenfeld 	{MBXERR_UNKNOWN_COMMAND, "UNKNOWN_COMMAND"},
548f23e9faSHans Rosenfeld 	{MBXERR_BAD_IP_BIT, "BAD_IP_BIT"},
558f23e9faSHans Rosenfeld 	{MBXERR_BAD_PCB_ALIGN, "BAD_PCB_ALIGN"},
568f23e9faSHans Rosenfeld 	{MBXERR_BAD_HBQ_ID, "BAD_HBQ_ID"},
578f23e9faSHans Rosenfeld 	{MBXERR_BAD_HBQ_STATE, "BAD_HBQ_STATE"},
588f23e9faSHans Rosenfeld 	{MBXERR_BAD_HBQ_MASK_NUM, "BAD_HBQ_MASK_NUM"},
598f23e9faSHans Rosenfeld 	{MBXERR_BAD_HBQ_MASK_SUBSET, "BAD_HBQ_MASK_SUBSET"},
608f23e9faSHans Rosenfeld 	{MBXERR_HBQ_CREATE_FAIL, "HBQ_CREATE_FAIL"},
618f23e9faSHans Rosenfeld 	{MBXERR_HBQ_EXISTING, "HBQ_EXISTING"},
628f23e9faSHans Rosenfeld 	{MBXERR_HBQ_RSPRING_FULL, "HBQ_RSPRING_FULL"},
638f23e9faSHans Rosenfeld 	{MBXERR_HBQ_DUP_MASK, "HBQ_DUP_MASK"},
648f23e9faSHans Rosenfeld 	{MBXERR_HBQ_INVAL_GET_PTR, "HBQ_INVAL_GET_PTR"},
658f23e9faSHans Rosenfeld 	{MBXERR_BAD_HBQ_SIZE, "BAD_HBQ_SIZE"},
668f23e9faSHans Rosenfeld 	{MBXERR_BAD_HBQ_ORDER, "BAD_HBQ_ORDER"},
678f23e9faSHans Rosenfeld 	{MBXERR_INVALID_ID, "INVALID_ID"},
688f23e9faSHans Rosenfeld 	{MBXERR_INVALID_VFI, "INVALID_VFI"},
698f23e9faSHans Rosenfeld 	{MBXERR_FLASH_WRITE_FAILED, "FLASH_WRITE_FAILED"},
708f23e9faSHans Rosenfeld 	{MBXERR_INVALID_LINKSPEED, "INVALID_LINKSPEED"},
718f23e9faSHans Rosenfeld 	{MBXERR_BAD_REDIRECT, "BAD_REDIRECT"},
728f23e9faSHans Rosenfeld 	{MBXERR_RING_ALREADY_CONFIG, "RING_ALREADY_CONFIG"},
738f23e9faSHans Rosenfeld 	{MBXERR_RING_INACTIVE, "RING_INACTIVE"},
748f23e9faSHans Rosenfeld 	{MBXERR_RPI_INACTIVE, "RPI_INACTIVE"},
758f23e9faSHans Rosenfeld 	{MBXERR_NO_ACTIVE_XRI, "NO_ACTIVE_XRI"},
768f23e9faSHans Rosenfeld 	{MBXERR_XRI_NOT_ACTIVE, "XRI_NOT_ACTIVE"},
778f23e9faSHans Rosenfeld 	{MBXERR_RPI_INUSE, "RPI_INUSE"},
788f23e9faSHans Rosenfeld 	{MBXERR_NO_LINK_ATTENTION, "NO_LINK_ATTENTION"},
798f23e9faSHans Rosenfeld 	{MBXERR_INVALID_SLI_MODE, "INVALID_SLI_MODE"},
808f23e9faSHans Rosenfeld 	{MBXERR_INVALID_HOST_PTR, "INVALID_HOST_PTR"},
818f23e9faSHans Rosenfeld 	{MBXERR_CANT_CFG_SLI_MODE, "CANT_CFG_SLI_MODE"},
828f23e9faSHans Rosenfeld 	{MBXERR_BAD_OVERLAY, "BAD_OVERLAY"},
838f23e9faSHans Rosenfeld 	{MBXERR_INVALID_FEAT_REQ, "INVALID_FEAT_REQ"},
848f23e9faSHans Rosenfeld 	{MBXERR_CONFIG_CANT_COMPLETE, "CONFIG_CANT_COMPLETE"},
858f23e9faSHans Rosenfeld 	{MBXERR_DID_ALREADY_REGISTERED, "DID_ALREADY_REGISTERED"},
868f23e9faSHans Rosenfeld 	{MBXERR_DID_INCONSISTENT, "DID_INCONSISTENT"},
878f23e9faSHans Rosenfeld 	{MBXERR_VPI_TOO_LARGE, "VPI_TOO_LARGE"},
888f23e9faSHans Rosenfeld 	{MBXERR_STILL_ASSOCIATED, "STILL_ASSOCIATED"},
898f23e9faSHans Rosenfeld 	{MBXERR_INVALID_VF_STATE, "INVALID_VF_STATE"},
908f23e9faSHans Rosenfeld 	{MBXERR_VFI_ALREADY_REGISTERED, "VFI_ALREADY_REGISTERED"},
918f23e9faSHans Rosenfeld 	{MBXERR_VFI_TOO_LARGE, "VFI_TOO_LARGE"},
928f23e9faSHans Rosenfeld 	{MBXERR_LOAD_FW_FAILED, "LOAD_FW_FAILED"},
938f23e9faSHans Rosenfeld 	{MBXERR_FIND_FW_FAILED, "FIND_FW_FAILED"},
948f23e9faSHans Rosenfeld };
9582527734SSukumar Swaminathan 
9682527734SSukumar Swaminathan emlxs_table_t emlxs_mb_cmd_table[] = {
9782527734SSukumar Swaminathan 	{MBX_SHUTDOWN, "SHUTDOWN"},
9882527734SSukumar Swaminathan 	{MBX_LOAD_SM, "LOAD_SM"},
9982527734SSukumar Swaminathan 	{MBX_READ_NV, "READ_NV"},
10082527734SSukumar Swaminathan 	{MBX_WRITE_NV, "WRITE_NV"},
10182527734SSukumar Swaminathan 	{MBX_RUN_BIU_DIAG, "RUN_BIU_DIAG"},
10282527734SSukumar Swaminathan 	{MBX_INIT_LINK, "INIT_LINK"},
10382527734SSukumar Swaminathan 	{MBX_DOWN_LINK, "DOWN_LINK"},
10482527734SSukumar Swaminathan 	{MBX_CONFIG_LINK, "CONFIG_LINK"},
10582527734SSukumar Swaminathan 	{MBX_PART_SLIM, "PART_SLIM"},
10682527734SSukumar Swaminathan 	{MBX_CONFIG_RING, "CONFIG_RING"},
10782527734SSukumar Swaminathan 	{MBX_RESET_RING, "RESET_RING"},
10882527734SSukumar Swaminathan 	{MBX_READ_CONFIG, "READ_CONFIG"},
10982527734SSukumar Swaminathan 	{MBX_READ_RCONFIG, "READ_RCONFIG"},
11082527734SSukumar Swaminathan 	{MBX_READ_SPARM, "READ_SPARM"},
11182527734SSukumar Swaminathan 	{MBX_READ_STATUS, "READ_STATUS"},
11282527734SSukumar Swaminathan 	{MBX_READ_RPI, "READ_RPI"},
11382527734SSukumar Swaminathan 	{MBX_READ_XRI, "READ_XRI"},
11482527734SSukumar Swaminathan 	{MBX_READ_REV, "READ_REV"},
11582527734SSukumar Swaminathan 	{MBX_READ_LNK_STAT, "READ_LNK_STAT"},
11682527734SSukumar Swaminathan 	{MBX_REG_LOGIN, "REG_LOGIN"},
117a9800bebSGarrett D'Amore 	{MBX_UNREG_LOGIN, "UNREG_RPI"},
11882527734SSukumar Swaminathan 	{MBX_READ_LA, "READ_LA"},
11982527734SSukumar Swaminathan 	{MBX_CLEAR_LA, "CLEAR_LA"},
12082527734SSukumar Swaminathan 	{MBX_DUMP_MEMORY, "DUMP_MEMORY"},
12182527734SSukumar Swaminathan 	{MBX_DUMP_CONTEXT, "DUMP_CONTEXT"},
12282527734SSukumar Swaminathan 	{MBX_RUN_DIAGS, "RUN_DIAGS"},
12382527734SSukumar Swaminathan 	{MBX_RESTART, "RESTART"},
12482527734SSukumar Swaminathan 	{MBX_UPDATE_CFG, "UPDATE_CFG"},
12582527734SSukumar Swaminathan 	{MBX_DOWN_LOAD, "DOWN_LOAD"},
12682527734SSukumar Swaminathan 	{MBX_DEL_LD_ENTRY, "DEL_LD_ENTRY"},
12782527734SSukumar Swaminathan 	{MBX_RUN_PROGRAM, "RUN_PROGRAM"},
12882527734SSukumar Swaminathan 	{MBX_SET_MASK, "SET_MASK"},
12982527734SSukumar Swaminathan 	{MBX_SET_VARIABLE, "SET_VARIABLE"},
13082527734SSukumar Swaminathan 	{MBX_UNREG_D_ID, "UNREG_D_ID"},
13182527734SSukumar Swaminathan 	{MBX_KILL_BOARD, "KILL_BOARD"},
13282527734SSukumar Swaminathan 	{MBX_CONFIG_FARP, "CONFIG_FARP"},
13382527734SSukumar Swaminathan 	{MBX_LOAD_AREA, "LOAD_AREA"},
13482527734SSukumar Swaminathan 	{MBX_RUN_BIU_DIAG64, "RUN_BIU_DIAG64"},
13582527734SSukumar Swaminathan 	{MBX_CONFIG_PORT, "CONFIG_PORT"},
13682527734SSukumar Swaminathan 	{MBX_READ_SPARM64, "READ_SPARM64"},
13782527734SSukumar Swaminathan 	{MBX_READ_RPI64, "READ_RPI64"},
13882527734SSukumar Swaminathan 	{MBX_CONFIG_MSI, "CONFIG_MSI"},
13982527734SSukumar Swaminathan 	{MBX_CONFIG_MSIX, "CONFIG_MSIX"},
140a9800bebSGarrett D'Amore 	{MBX_REG_LOGIN64, "REG_RPI"},
14182527734SSukumar Swaminathan 	{MBX_READ_LA64, "READ_LA64"},
14282527734SSukumar Swaminathan 	{MBX_FLASH_WR_ULA, "FLASH_WR_ULA"},
14382527734SSukumar Swaminathan 	{MBX_SET_DEBUG, "SET_DEBUG"},
14482527734SSukumar Swaminathan 	{MBX_GET_DEBUG, "GET_DEBUG"},
14582527734SSukumar Swaminathan 	{MBX_LOAD_EXP_ROM, "LOAD_EXP_ROM"},
14682527734SSukumar Swaminathan 	{MBX_BEACON, "BEACON"},
14782527734SSukumar Swaminathan 	{MBX_CONFIG_HBQ, "CONFIG_HBQ"},	/* SLI3 */
14882527734SSukumar Swaminathan 	{MBX_REG_VPI, "REG_VPI"},	/* NPIV */
14982527734SSukumar Swaminathan 	{MBX_UNREG_VPI, "UNREG_VPI"},	/* NPIV */
15082527734SSukumar Swaminathan 	{MBX_ASYNC_EVENT, "ASYNC_EVENT"},
15182527734SSukumar Swaminathan 	{MBX_HEARTBEAT, "HEARTBEAT"},
15282527734SSukumar Swaminathan 	{MBX_READ_EVENT_LOG_STATUS, "READ_EVENT_LOG_STATUS"},
15382527734SSukumar Swaminathan 	{MBX_READ_EVENT_LOG, "READ_EVENT_LOG"},
15482527734SSukumar Swaminathan 	{MBX_WRITE_EVENT_LOG, "WRITE_EVENT_LOG"},
15582527734SSukumar Swaminathan 	{MBX_NV_LOG, "NV_LOG"},
15682527734SSukumar Swaminathan 	{MBX_PORT_CAPABILITIES, "PORT_CAPABILITIES"},
15782527734SSukumar Swaminathan 	{MBX_IOV_CONTROL, "IOV_CONTROL"},
15882527734SSukumar Swaminathan 	{MBX_IOV_MBX, "IOV_MBX"},
15982527734SSukumar Swaminathan 	{MBX_SLI_CONFIG, "SLI_CONFIG"},
16082527734SSukumar Swaminathan 	{MBX_REQUEST_FEATURES, "REQUEST_FEATURES"},
16182527734SSukumar Swaminathan 	{MBX_RESUME_RPI, "RESUME_RPI"},
16282527734SSukumar Swaminathan 	{MBX_REG_VFI, "REG_VFI"},
16382527734SSukumar Swaminathan 	{MBX_REG_FCFI, "REG_FCFI"},
16482527734SSukumar Swaminathan 	{MBX_UNREG_VFI, "UNREG_VFI"},
16582527734SSukumar Swaminathan 	{MBX_UNREG_FCFI, "UNREG_FCFI"},
16682527734SSukumar Swaminathan 	{MBX_INIT_VFI, "INIT_VFI"},
1678f23e9faSHans Rosenfeld 	{MBX_INIT_VPI, "INIT_VPI"},
1688f23e9faSHans Rosenfeld 	{MBX_WRITE_VPARMS, "WRITE_VPARMS"},
1698f23e9faSHans Rosenfeld 	{MBX_ACCESS_VDATA, "ACCESS_VDATA"}
17082527734SSukumar Swaminathan };	/* emlxs_mb_cmd_table */
17182527734SSukumar Swaminathan 
17282527734SSukumar Swaminathan 
1738f23e9faSHans Rosenfeld emlxs_table_t emlxs_request_feature_table[] = {
1748f23e9faSHans Rosenfeld 	{SLI4_FEATURE_INHIBIT_AUTO_ABTS, "IAA "},	/* Bit 0 */
1758f23e9faSHans Rosenfeld 	{SLI4_FEATURE_NPIV, "NPIV "},			/* Bit 1 */
1768f23e9faSHans Rosenfeld 	{SLI4_FEATURE_DIF, "DIF "},			/* Bit 2 */
1778f23e9faSHans Rosenfeld 	{SLI4_FEATURE_VIRTUAL_FABRICS, "VF "},		/* Bit 3 */
1788f23e9faSHans Rosenfeld 	{SLI4_FEATURE_FCP_INITIATOR, "FCPI "},		/* Bit 4 */
1798f23e9faSHans Rosenfeld 	{SLI4_FEATURE_FCP_TARGET, "FCPT "},		/* Bit 5 */
1808f23e9faSHans Rosenfeld 	{SLI4_FEATURE_FCP_COMBO, "FCPC "},		/* Bit 6 */
1818f23e9faSHans Rosenfeld 	{SLI4_FEATURE_RSVD1, "RSVD1 "},			/* Bit 7 */
1828f23e9faSHans Rosenfeld 	{SLI4_FEATURE_RQD, "RQD "},			/* Bit 8 */
1838f23e9faSHans Rosenfeld 	{SLI4_FEATURE_INHIBIT_AUTO_ABTS_R, "IAAR "},	/* Bit 9 */
1848f23e9faSHans Rosenfeld 	{SLI4_FEATURE_HIGH_LOGIN_MODE, "HLM "},		/* Bit 10 */
1858f23e9faSHans Rosenfeld 	{SLI4_FEATURE_PERF_HINT, "PERFH "}		/* Bit 11 */
1868f23e9faSHans Rosenfeld };	/* emlxs_request_feature_table */
1878f23e9faSHans Rosenfeld 
1888f23e9faSHans Rosenfeld 
1898f23e9faSHans Rosenfeld extern char *
1908f23e9faSHans Rosenfeld emlxs_mb_xlate_status(uint32_t status)
1918f23e9faSHans Rosenfeld {
1928f23e9faSHans Rosenfeld 	static char	buffer[32];
1938f23e9faSHans Rosenfeld 	uint32_t	i;
1948f23e9faSHans Rosenfeld 	uint32_t	count;
1958f23e9faSHans Rosenfeld 
1968f23e9faSHans Rosenfeld 	count = sizeof (emlxs_mb_status_table) / sizeof (emlxs_table_t);
1978f23e9faSHans Rosenfeld 	for (i = 0; i < count; i++) {
1988f23e9faSHans Rosenfeld 		if (status == emlxs_mb_status_table[i].code) {
1998f23e9faSHans Rosenfeld 			return (emlxs_mb_status_table[i].string);
2008f23e9faSHans Rosenfeld 		}
2018f23e9faSHans Rosenfeld 	}
2028f23e9faSHans Rosenfeld 
2038f23e9faSHans Rosenfeld 	(void) snprintf(buffer, sizeof (buffer), "status=%x", status);
2048f23e9faSHans Rosenfeld 	return (buffer);
2058f23e9faSHans Rosenfeld 
2068f23e9faSHans Rosenfeld } /* emlxs_mb_xlate_status() */
2078f23e9faSHans Rosenfeld 
2088f23e9faSHans Rosenfeld 
209a9800bebSGarrett D'Amore /* SLI4 */
21082527734SSukumar Swaminathan /*ARGSUSED*/
21182527734SSukumar Swaminathan extern void
21282527734SSukumar Swaminathan emlxs_mb_resetport(emlxs_hba_t *hba, MAILBOXQ *mbq)
21382527734SSukumar Swaminathan {
214a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
21582527734SSukumar Swaminathan 
216a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
21782527734SSukumar Swaminathan 	mbq->nonembed = NULL;
21882527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
219a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
22082527734SSukumar Swaminathan 
22182527734SSukumar Swaminathan 	/*
22282527734SSukumar Swaminathan 	 * Signifies an embedded command
22382527734SSukumar Swaminathan 	 */
224a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
22582527734SSukumar Swaminathan 
226a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
227a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
228a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.payload_length = IOCTL_HEADER_SZ;
229a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
23082527734SSukumar Swaminathan 	    IOCTL_SUBSYSTEM_COMMON;
231a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode = COMMON_OPCODE_RESET;
232a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
233a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length = 0;
23482527734SSukumar Swaminathan 
23582527734SSukumar Swaminathan 	return;
23682527734SSukumar Swaminathan 
23782527734SSukumar Swaminathan } /* emlxs_mb_resetport() */
23882527734SSukumar Swaminathan 
23982527734SSukumar Swaminathan 
240a9800bebSGarrett D'Amore /* SLI4 */
24182527734SSukumar Swaminathan /*ARGSUSED*/
24282527734SSukumar Swaminathan extern void
2438f23e9faSHans Rosenfeld emlxs_mb_request_features(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t mask)
24482527734SSukumar Swaminathan {
245a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
24682527734SSukumar Swaminathan 
24782527734SSukumar Swaminathan 	hba->flag &= ~FC_NPIV_ENABLED;
2488f23e9faSHans Rosenfeld 	hba->sli.sli4.flag &= ~(EMLXS_SLI4_PHON | EMLXS_SLI4_PHWQ);
24982527734SSukumar Swaminathan 
250a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
25182527734SSukumar Swaminathan 	mbq->nonembed = NULL;
25282527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
253a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
25482527734SSukumar Swaminathan 
255a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_REQUEST_FEATURES;
256a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
25782527734SSukumar Swaminathan 
2588f23e9faSHans Rosenfeld 	mb4->un.varReqFeatures.featuresRequested = mask;
2598f23e9faSHans Rosenfeld 	return;
26082527734SSukumar Swaminathan 
26182527734SSukumar Swaminathan } /* emlxs_mb_request_features() */
26282527734SSukumar Swaminathan 
26382527734SSukumar Swaminathan 
264a9800bebSGarrett D'Amore /* SLI4 */
26582527734SSukumar Swaminathan /*ARGSUSED*/
26682527734SSukumar Swaminathan extern void
26782527734SSukumar Swaminathan emlxs_mb_noop(emlxs_hba_t *hba, MAILBOXQ *mbq)
26882527734SSukumar Swaminathan {
269a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
27082527734SSukumar Swaminathan 	IOCTL_COMMON_NOP *nop;
27182527734SSukumar Swaminathan 
272a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
27382527734SSukumar Swaminathan 	mbq->nonembed = NULL;
27482527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
275a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
27682527734SSukumar Swaminathan 
27782527734SSukumar Swaminathan 	/*
27882527734SSukumar Swaminathan 	 * Signifies an embedded command
27982527734SSukumar Swaminathan 	 */
280a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
28182527734SSukumar Swaminathan 
282a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
283a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
284a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.payload_length = sizeof (IOCTL_COMMON_NOP) +
28582527734SSukumar Swaminathan 	    IOCTL_HEADER_SZ;
286a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
28782527734SSukumar Swaminathan 	    IOCTL_SUBSYSTEM_COMMON;
288a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode = COMMON_OPCODE_NOP;
289a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
290a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
29182527734SSukumar Swaminathan 	    sizeof (IOCTL_COMMON_NOP);
292a9800bebSGarrett D'Amore 	nop = (IOCTL_COMMON_NOP *)&mb4->un.varSLIConfig.payload;
29382527734SSukumar Swaminathan 	nop->params.request.context = -1;
29482527734SSukumar Swaminathan 
29582527734SSukumar Swaminathan 	return;
29682527734SSukumar Swaminathan 
29782527734SSukumar Swaminathan } /* emlxs_mb_noop() */
29882527734SSukumar Swaminathan 
29982527734SSukumar Swaminathan 
300a9800bebSGarrett D'Amore /* SLI4 */
30182527734SSukumar Swaminathan /*ARGSUSED*/
30282527734SSukumar Swaminathan extern int
30382527734SSukumar Swaminathan emlxs_mbext_noop(emlxs_hba_t *hba, MAILBOXQ *mbq)
30482527734SSukumar Swaminathan {
305a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
30682527734SSukumar Swaminathan 	IOCTL_COMMON_NOP *nop;
30782527734SSukumar Swaminathan 	MATCHMAP *mp;
30882527734SSukumar Swaminathan 	mbox_req_hdr_t	*hdr_req;
30982527734SSukumar Swaminathan 
310a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
31182527734SSukumar Swaminathan 
3128f23e9faSHans Rosenfeld 	if ((mp = (MATCHMAP *)emlxs_mem_get(hba, MEM_BUF)) == 0) {
31382527734SSukumar Swaminathan 		return (1);
31482527734SSukumar Swaminathan 	}
31582527734SSukumar Swaminathan 	/*
31682527734SSukumar Swaminathan 	 * Save address for completion
31782527734SSukumar Swaminathan 	 * Signifies a non-embedded command
31882527734SSukumar Swaminathan 	 */
319a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 0;
320a9800bebSGarrett D'Amore 	mbq->nonembed = (void *)mp;
32182527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
322a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
32382527734SSukumar Swaminathan 
324a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
325a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
32682527734SSukumar Swaminathan 
32782527734SSukumar Swaminathan 	hdr_req = (mbox_req_hdr_t *)mp->virt;
32882527734SSukumar Swaminathan 	hdr_req->subsystem = IOCTL_SUBSYSTEM_COMMON;
32982527734SSukumar Swaminathan 	hdr_req->opcode = COMMON_OPCODE_NOP;
33082527734SSukumar Swaminathan 	hdr_req->timeout = 0;
33182527734SSukumar Swaminathan 	hdr_req->req_length = sizeof (IOCTL_COMMON_NOP);
33282527734SSukumar Swaminathan 	nop = (IOCTL_COMMON_NOP *)(hdr_req + 1);
33382527734SSukumar Swaminathan 	nop->params.request.context = -1;
33482527734SSukumar Swaminathan 
33582527734SSukumar Swaminathan 	return (0);
33682527734SSukumar Swaminathan 
33782527734SSukumar Swaminathan } /* emlxs_mbext_noop() */
33882527734SSukumar Swaminathan 
33982527734SSukumar Swaminathan 
340a9800bebSGarrett D'Amore /* SLI4 */
34182527734SSukumar Swaminathan /*ARGSUSED*/
34282527734SSukumar Swaminathan extern void
34382527734SSukumar Swaminathan emlxs_mb_eq_create(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t num)
34482527734SSukumar Swaminathan {
345a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
34682527734SSukumar Swaminathan 	IOCTL_COMMON_EQ_CREATE *qp;
34782527734SSukumar Swaminathan 	uint64_t	addr;
34882527734SSukumar Swaminathan 
349a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
35082527734SSukumar Swaminathan 	mbq->nonembed = NULL;
35182527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
352a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
35382527734SSukumar Swaminathan 
35482527734SSukumar Swaminathan 	/*
35582527734SSukumar Swaminathan 	 * Signifies an embedded command
35682527734SSukumar Swaminathan 	 */
357a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
35882527734SSukumar Swaminathan 
359a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
360a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
361a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.payload_length =
36282527734SSukumar Swaminathan 	    sizeof (IOCTL_COMMON_EQ_CREATE) + IOCTL_HEADER_SZ;
363a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
36482527734SSukumar Swaminathan 	    IOCTL_SUBSYSTEM_COMMON;
365a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode = COMMON_OPCODE_EQ_CREATE;
366a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
367a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
36882527734SSukumar Swaminathan 	    sizeof (IOCTL_COMMON_EQ_CREATE);
3698f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 0;
3708f23e9faSHans Rosenfeld 
371a9800bebSGarrett D'Amore 	qp = (IOCTL_COMMON_EQ_CREATE *)&mb4->un.varSLIConfig.payload;
37282527734SSukumar Swaminathan 
37382527734SSukumar Swaminathan 	/* 1024 * 4 bytes = 4K */
37482527734SSukumar Swaminathan 	qp->params.request.EQContext.Count = EQ_ELEMENT_COUNT_1024;
37582527734SSukumar Swaminathan 	qp->params.request.EQContext.Valid = 1;
37682527734SSukumar Swaminathan 	qp->params.request.EQContext.DelayMult = EQ_DELAY_MULT;
37782527734SSukumar Swaminathan 
37882527734SSukumar Swaminathan 	addr = hba->sli.sli4.eq[num].addr.phys;
37982527734SSukumar Swaminathan 	qp->params.request.NumPages = 1;
38082527734SSukumar Swaminathan 	qp->params.request.Pages[0].addrLow = PADDR_LO(addr);
38182527734SSukumar Swaminathan 	qp->params.request.Pages[0].addrHigh = PADDR_HI(addr);
38282527734SSukumar Swaminathan 
38382527734SSukumar Swaminathan 	return;
38482527734SSukumar Swaminathan 
38582527734SSukumar Swaminathan } /* emlxs_mb_eq_create() */
38682527734SSukumar Swaminathan 
38782527734SSukumar Swaminathan 
388a9800bebSGarrett D'Amore /* SLI4 */
38982527734SSukumar Swaminathan /*ARGSUSED*/
39082527734SSukumar Swaminathan extern void
39182527734SSukumar Swaminathan emlxs_mb_cq_create(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t num)
39282527734SSukumar Swaminathan {
393a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
39482527734SSukumar Swaminathan 	IOCTL_COMMON_CQ_CREATE *qp;
3958f23e9faSHans Rosenfeld 	IOCTL_COMMON_CQ_CREATE_V2 *qp2;
39682527734SSukumar Swaminathan 	uint64_t	addr;
3978f23e9faSHans Rosenfeld 	uint32_t	i;
39882527734SSukumar Swaminathan 
399a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
40082527734SSukumar Swaminathan 	mbq->nonembed = NULL;
40182527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
402a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
40382527734SSukumar Swaminathan 
40482527734SSukumar Swaminathan 	/*
40582527734SSukumar Swaminathan 	 * Signifies an embedded command
40682527734SSukumar Swaminathan 	 */
407a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
40882527734SSukumar Swaminathan 
409a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
410a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
4118f23e9faSHans Rosenfeld 
4128f23e9faSHans Rosenfeld 	switch (hba->sli.sli4.param.CQV) {
4138f23e9faSHans Rosenfeld 	case 0:
4148f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
4158f23e9faSHans Rosenfeld 		    sizeof (IOCTL_COMMON_CQ_CREATE) + IOCTL_HEADER_SZ;
4168f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
4178f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_COMMON;
4188f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
4198f23e9faSHans Rosenfeld 		    COMMON_OPCODE_CQ_CREATE;
4208f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
4218f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
4228f23e9faSHans Rosenfeld 		    sizeof (IOCTL_COMMON_CQ_CREATE);
4238f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 0;
4248f23e9faSHans Rosenfeld 
4258f23e9faSHans Rosenfeld 		qp = (IOCTL_COMMON_CQ_CREATE *)
4268f23e9faSHans Rosenfeld 		    &mb4->un.varSLIConfig.payload;
4278f23e9faSHans Rosenfeld 
4288f23e9faSHans Rosenfeld 		/* 256 * 16 bytes = 4K */
4298f23e9faSHans Rosenfeld 		qp->params.request.CQContext.Count = CQ_ELEMENT_COUNT_256;
4308f23e9faSHans Rosenfeld 		qp->params.request.CQContext.EQId =
4318f23e9faSHans Rosenfeld 		    (uint8_t)hba->sli.sli4.cq[num].eqid;
4328f23e9faSHans Rosenfeld 		qp->params.request.CQContext.Valid = 1;
4338f23e9faSHans Rosenfeld 		qp->params.request.CQContext.Eventable = 1;
4348f23e9faSHans Rosenfeld 		qp->params.request.CQContext.NoDelay = 0;
4358f23e9faSHans Rosenfeld 		qp->params.request.CQContext.CoalesceWM = 0;
4368f23e9faSHans Rosenfeld 
4378f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.cq[num].addr.phys;
4388f23e9faSHans Rosenfeld 		qp->params.request.NumPages = 1;
4398f23e9faSHans Rosenfeld 		qp->params.request.Pages[0].addrLow = PADDR_LO(addr);
4408f23e9faSHans Rosenfeld 		qp->params.request.Pages[0].addrHigh = PADDR_HI(addr);
4418f23e9faSHans Rosenfeld 
4428f23e9faSHans Rosenfeld 		break;
4438f23e9faSHans Rosenfeld 
4448f23e9faSHans Rosenfeld 	case 2:
4458f23e9faSHans Rosenfeld 	default:
4468f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
4478f23e9faSHans Rosenfeld 		    sizeof (IOCTL_COMMON_CQ_CREATE_V2) + IOCTL_HEADER_SZ;
4488f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
4498f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_COMMON;
4508f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
4518f23e9faSHans Rosenfeld 		    COMMON_OPCODE_CQ_CREATE;
4528f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
4538f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
4548f23e9faSHans Rosenfeld 		    sizeof (IOCTL_COMMON_CQ_CREATE_V2);
4558f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 2;
4568f23e9faSHans Rosenfeld 
4578f23e9faSHans Rosenfeld 		qp2 = (IOCTL_COMMON_CQ_CREATE_V2 *)
4588f23e9faSHans Rosenfeld 		    &mb4->un.varSLIConfig.payload;
4598f23e9faSHans Rosenfeld 
4608f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.CqeCnt = CQ_ELEMENT_COUNT_1024;
4618f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.CqeSize = CQE_SIZE_16_BYTES;
4628f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.EQId = hba->sli.sli4.cq[num].eqid;
4638f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.Valid = 1;
4648f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.AutoValid = 0;
4658f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.Eventable = 1;
4668f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.NoDelay = 0;
4678f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.Count1 = 0;
4688f23e9faSHans Rosenfeld 		qp2->params.request.CQContext.CoalesceWM = 0;
4698f23e9faSHans Rosenfeld 
4708f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.cq[num].addr.phys;
4718f23e9faSHans Rosenfeld 		qp2->params.request.PageSize = CQ_PAGE_SIZE_4K;
4728f23e9faSHans Rosenfeld 		qp2->params.request.NumPages = EMLXS_NUM_CQ_PAGES_V2;
4738f23e9faSHans Rosenfeld 
4748f23e9faSHans Rosenfeld 		for (i = 0; i < EMLXS_NUM_CQ_PAGES_V2; i++) {
4758f23e9faSHans Rosenfeld 			qp2->params.request.Pages[i].addrLow = PADDR_LO(addr);
4768f23e9faSHans Rosenfeld 			qp2->params.request.Pages[i].addrHigh = PADDR_HI(addr);
4778f23e9faSHans Rosenfeld 			addr += 4096;
4788f23e9faSHans Rosenfeld 		}
4798f23e9faSHans Rosenfeld 
4808f23e9faSHans Rosenfeld 		break;
4818f23e9faSHans Rosenfeld 	}
4828f23e9faSHans Rosenfeld 	return;
4838f23e9faSHans Rosenfeld 
4848f23e9faSHans Rosenfeld } /* emlxs_mb_cq_create() */
4858f23e9faSHans Rosenfeld 
4868f23e9faSHans Rosenfeld 
4878f23e9faSHans Rosenfeld /* SLI4 */
4888f23e9faSHans Rosenfeld /*ARGSUSED*/
4898f23e9faSHans Rosenfeld extern void
4908f23e9faSHans Rosenfeld emlxs_mb_get_port_name(emlxs_hba_t *hba, MAILBOXQ *mbq)
4918f23e9faSHans Rosenfeld {
4928f23e9faSHans Rosenfeld 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
4938f23e9faSHans Rosenfeld 
4948f23e9faSHans Rosenfeld 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
4958f23e9faSHans Rosenfeld 	mbq->nonembed = NULL;
4968f23e9faSHans Rosenfeld 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
4978f23e9faSHans Rosenfeld 	mbq->port = (void *)&PPORT;
4988f23e9faSHans Rosenfeld 
4998f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.embedded = 1;
5008f23e9faSHans Rosenfeld 	mb4->mbxCommand = MBX_SLI_CONFIG;
5018f23e9faSHans Rosenfeld 	mb4->mbxOwner = OWN_HOST;
5028f23e9faSHans Rosenfeld 
5038f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.payload_length = IOCTL_HEADER_SZ;
504a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
50582527734SSukumar Swaminathan 	    IOCTL_SUBSYSTEM_COMMON;
5068f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
5078f23e9faSHans Rosenfeld 	    COMMON_OPCODE_GET_PORT_NAME;
508a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
5098f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length = 0;
51082527734SSukumar Swaminathan 
5118f23e9faSHans Rosenfeld 	if (hba->model_info.chip & EMLXS_BE_CHIPS) {
5128f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 0; /* V0 */
5138f23e9faSHans Rosenfeld 	} else {
5148f23e9faSHans Rosenfeld 		IOCTL_COMMON_GET_PORT_NAME_V1 *pn;
51582527734SSukumar Swaminathan 
5168f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 1; /* V1 */
5178f23e9faSHans Rosenfeld 
5188f23e9faSHans Rosenfeld 		pn = (IOCTL_COMMON_GET_PORT_NAME_V1 *)
5198f23e9faSHans Rosenfeld 		    &mb4->un.varSLIConfig.payload;
5208f23e9faSHans Rosenfeld 		pn->params.request.pt = PORT_TYPE_FC;
5218f23e9faSHans Rosenfeld 	}
52282527734SSukumar Swaminathan 
52382527734SSukumar Swaminathan 	return;
52482527734SSukumar Swaminathan 
5258f23e9faSHans Rosenfeld } /* emlxs_mb_get_port_name() */
5268f23e9faSHans Rosenfeld 
5278f23e9faSHans Rosenfeld 
5288f23e9faSHans Rosenfeld /* SLI4 */
5298f23e9faSHans Rosenfeld /*ARGSUSED*/
5308f23e9faSHans Rosenfeld extern void
5318f23e9faSHans Rosenfeld emlxs_mb_get_sli4_params(emlxs_hba_t *hba, MAILBOXQ *mbq)
5328f23e9faSHans Rosenfeld {
5338f23e9faSHans Rosenfeld 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
5348f23e9faSHans Rosenfeld 
5358f23e9faSHans Rosenfeld 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
5368f23e9faSHans Rosenfeld 	mbq->nonembed = NULL;
5378f23e9faSHans Rosenfeld 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
5388f23e9faSHans Rosenfeld 	mbq->port = (void *)&PPORT;
5398f23e9faSHans Rosenfeld 
5408f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.embedded = 1;
5418f23e9faSHans Rosenfeld 	mb4->mbxCommand = MBX_SLI_CONFIG;
5428f23e9faSHans Rosenfeld 	mb4->mbxOwner = OWN_HOST;
5438f23e9faSHans Rosenfeld 
5448f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.payload_length = IOCTL_HEADER_SZ;
5458f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
5468f23e9faSHans Rosenfeld 	    IOCTL_SUBSYSTEM_COMMON;
5478f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
5488f23e9faSHans Rosenfeld 	    COMMON_OPCODE_GET_SLI4_PARAMS;
5498f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
5508f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length = 0;
5518f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 0; /* V0 */
5528f23e9faSHans Rosenfeld 
5538f23e9faSHans Rosenfeld 	return;
5548f23e9faSHans Rosenfeld 
5558f23e9faSHans Rosenfeld } /* emlxs_mb_get_sli4_params() */
5568f23e9faSHans Rosenfeld 
5578f23e9faSHans Rosenfeld 
5588f23e9faSHans Rosenfeld /* SLI4 */
5598f23e9faSHans Rosenfeld /*ARGSUSED*/
5608f23e9faSHans Rosenfeld extern void
5618f23e9faSHans Rosenfeld emlxs_mb_get_extents_info(emlxs_hba_t *hba, MAILBOXQ *mbq, uint16_t type)
5628f23e9faSHans Rosenfeld {
5638f23e9faSHans Rosenfeld 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
5648f23e9faSHans Rosenfeld 	IOCTL_COMMON_EXTENTS *ep;
5658f23e9faSHans Rosenfeld 
5668f23e9faSHans Rosenfeld 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
5678f23e9faSHans Rosenfeld 	mbq->nonembed = NULL;
5688f23e9faSHans Rosenfeld 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
5698f23e9faSHans Rosenfeld 	mbq->port = (void *)&PPORT;
5708f23e9faSHans Rosenfeld 
5718f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.embedded = 1;
5728f23e9faSHans Rosenfeld 	mb4->mbxCommand = MBX_SLI_CONFIG;
5738f23e9faSHans Rosenfeld 	mb4->mbxOwner = OWN_HOST;
5748f23e9faSHans Rosenfeld 
5758f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.payload_length = IOCTL_HEADER_SZ;
5768f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.subsystem =
5778f23e9faSHans Rosenfeld 	    IOCTL_SUBSYSTEM_COMMON;
5788f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.opcode =
5798f23e9faSHans Rosenfeld 	    COMMON_OPCODE_GET_EXTENTS_INFO;
5808f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.timeout = 0;
5818f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.req_length =
5828f23e9faSHans Rosenfeld 	    sizeof (IOCTL_COMMON_EXTENTS);
5838f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vf_number = 0;
5848f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vh_number = 0;
5858f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.pf_number = 0;
5868f23e9faSHans Rosenfeld 
5878f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.version = 0; /* V0 */
5888f23e9faSHans Rosenfeld 
5898f23e9faSHans Rosenfeld 	ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
5908f23e9faSHans Rosenfeld 	ep->params.request.RscType = type;
5918f23e9faSHans Rosenfeld 
5928f23e9faSHans Rosenfeld 	return;
5938f23e9faSHans Rosenfeld 
5948f23e9faSHans Rosenfeld } /* emlxs_mb_get_extents_info() */
5958f23e9faSHans Rosenfeld 
5968f23e9faSHans Rosenfeld 
5978f23e9faSHans Rosenfeld /* SLI4 */
5988f23e9faSHans Rosenfeld /*ARGSUSED*/
5998f23e9faSHans Rosenfeld extern void
6008f23e9faSHans Rosenfeld emlxs_mb_get_extents(emlxs_hba_t *hba, MAILBOXQ *mbq, uint16_t type)
6018f23e9faSHans Rosenfeld {
6028f23e9faSHans Rosenfeld 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
6038f23e9faSHans Rosenfeld 	IOCTL_COMMON_EXTENTS *ep;
6048f23e9faSHans Rosenfeld 
6058f23e9faSHans Rosenfeld 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
6068f23e9faSHans Rosenfeld 	mbq->nonembed = NULL;
6078f23e9faSHans Rosenfeld 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
6088f23e9faSHans Rosenfeld 	mbq->port = (void *)&PPORT;
6098f23e9faSHans Rosenfeld 
6108f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.embedded = 1;
6118f23e9faSHans Rosenfeld 	mb4->mbxCommand = MBX_SLI_CONFIG;
6128f23e9faSHans Rosenfeld 	mb4->mbxOwner = OWN_HOST;
6138f23e9faSHans Rosenfeld 
6148f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.payload_length = IOCTL_HEADER_SZ;
6158f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.subsystem =
6168f23e9faSHans Rosenfeld 	    IOCTL_SUBSYSTEM_COMMON;
6178f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.opcode =
6188f23e9faSHans Rosenfeld 	    COMMON_OPCODE_GET_EXTENTS;
6198f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.timeout = 0;
6208f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.req_length =
6218f23e9faSHans Rosenfeld 	    sizeof (IOCTL_COMMON_EXTENTS);
6228f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vf_number = 0;
6238f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vh_number = 0;
6248f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.pf_number = 0;
6258f23e9faSHans Rosenfeld 
6268f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.version = 0; /* V0 */
6278f23e9faSHans Rosenfeld 
6288f23e9faSHans Rosenfeld 	ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
6298f23e9faSHans Rosenfeld 	ep->params.request.RscType = type;
6308f23e9faSHans Rosenfeld 
6318f23e9faSHans Rosenfeld 	return;
6328f23e9faSHans Rosenfeld 
6338f23e9faSHans Rosenfeld } /* emlxs_mb_get_extents() */
6348f23e9faSHans Rosenfeld 
6358f23e9faSHans Rosenfeld 
6368f23e9faSHans Rosenfeld /* SLI4 */
6378f23e9faSHans Rosenfeld /*ARGSUSED*/
6388f23e9faSHans Rosenfeld extern void
6398f23e9faSHans Rosenfeld emlxs_mb_alloc_extents(emlxs_hba_t *hba, MAILBOXQ *mbq, uint16_t type,
6408f23e9faSHans Rosenfeld     uint16_t count)
6418f23e9faSHans Rosenfeld {
6428f23e9faSHans Rosenfeld 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
6438f23e9faSHans Rosenfeld 	IOCTL_COMMON_EXTENTS *ep;
6448f23e9faSHans Rosenfeld 
6458f23e9faSHans Rosenfeld 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
6468f23e9faSHans Rosenfeld 	mbq->nonembed = NULL;
6478f23e9faSHans Rosenfeld 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
6488f23e9faSHans Rosenfeld 	mbq->port = (void *)&PPORT;
6498f23e9faSHans Rosenfeld 
6508f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.embedded = 1;
6518f23e9faSHans Rosenfeld 	mb4->mbxCommand = MBX_SLI_CONFIG;
6528f23e9faSHans Rosenfeld 	mb4->mbxOwner = OWN_HOST;
6538f23e9faSHans Rosenfeld 
6548f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.payload_length = IOCTL_HEADER_SZ;
6558f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.subsystem =
6568f23e9faSHans Rosenfeld 	    IOCTL_SUBSYSTEM_COMMON;
6578f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.opcode =
6588f23e9faSHans Rosenfeld 	    COMMON_OPCODE_ALLOC_EXTENTS;
6598f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.timeout = 0;
6608f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.req_length =
6618f23e9faSHans Rosenfeld 	    sizeof (IOCTL_COMMON_EXTENTS);
6628f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vf_number = 0;
6638f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vh_number = 0;
6648f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.pf_number = 0;
6658f23e9faSHans Rosenfeld 
6668f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.version = 0; /* V0 */
6678f23e9faSHans Rosenfeld 
6688f23e9faSHans Rosenfeld 	ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
6698f23e9faSHans Rosenfeld 	ep->params.request.RscType = type;
6708f23e9faSHans Rosenfeld 
6718f23e9faSHans Rosenfeld 	count = min(count, MAX_EXTENTS);
6728f23e9faSHans Rosenfeld 	ep->params.request.RscCnt = count;
6738f23e9faSHans Rosenfeld 
6748f23e9faSHans Rosenfeld 	return;
6758f23e9faSHans Rosenfeld 
6768f23e9faSHans Rosenfeld } /* emlxs_mb_alloc_extents() */
6778f23e9faSHans Rosenfeld 
6788f23e9faSHans Rosenfeld 
6798f23e9faSHans Rosenfeld /* SLI4 */
6808f23e9faSHans Rosenfeld /*ARGSUSED*/
6818f23e9faSHans Rosenfeld extern void
6828f23e9faSHans Rosenfeld emlxs_mb_dealloc_extents(emlxs_hba_t *hba, MAILBOXQ *mbq, uint16_t type)
6838f23e9faSHans Rosenfeld {
6848f23e9faSHans Rosenfeld 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
6858f23e9faSHans Rosenfeld 	IOCTL_COMMON_EXTENTS *ep;
6868f23e9faSHans Rosenfeld 
6878f23e9faSHans Rosenfeld 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
6888f23e9faSHans Rosenfeld 	mbq->nonembed = NULL;
6898f23e9faSHans Rosenfeld 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
6908f23e9faSHans Rosenfeld 	mbq->port = (void *)&PPORT;
6918f23e9faSHans Rosenfeld 
6928f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.embedded = 1;
6938f23e9faSHans Rosenfeld 	mb4->mbxCommand = MBX_SLI_CONFIG;
6948f23e9faSHans Rosenfeld 	mb4->mbxOwner = OWN_HOST;
6958f23e9faSHans Rosenfeld 
6968f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.payload_length = IOCTL_HEADER_SZ;
6978f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.subsystem =
6988f23e9faSHans Rosenfeld 	    IOCTL_SUBSYSTEM_COMMON;
6998f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.opcode =
7008f23e9faSHans Rosenfeld 	    COMMON_OPCODE_DEALLOC_EXTENTS;
7018f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.timeout = 0;
7028f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.req_length =
7038f23e9faSHans Rosenfeld 	    sizeof (IOCTL_COMMON_EXTENTS);
7048f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vf_number = 0;
7058f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.vh_number = 0;
7068f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.pf_number = 0;
7078f23e9faSHans Rosenfeld 
7088f23e9faSHans Rosenfeld 	mb4->un.varSLIConfig.be.un_hdr.hdr_req2.version = 0; /* V0 */
7098f23e9faSHans Rosenfeld 
7108f23e9faSHans Rosenfeld 	ep = (IOCTL_COMMON_EXTENTS *)&mb4->un.varSLIConfig.payload;
7118f23e9faSHans Rosenfeld 	ep->params.request.RscType = type;
7128f23e9faSHans Rosenfeld 
7138f23e9faSHans Rosenfeld 	return;
7148f23e9faSHans Rosenfeld 
7158f23e9faSHans Rosenfeld } /* emlxs_mb_dealloc_extents() */
71682527734SSukumar Swaminathan 
71782527734SSukumar Swaminathan 
718a9800bebSGarrett D'Amore /* SLI4 */
71982527734SSukumar Swaminathan /*ARGSUSED*/
72082527734SSukumar Swaminathan extern void
72182527734SSukumar Swaminathan emlxs_mb_wq_create(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t num)
72282527734SSukumar Swaminathan {
723a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
72482527734SSukumar Swaminathan 	IOCTL_FCOE_WQ_CREATE *qp;
7258f23e9faSHans Rosenfeld 	IOCTL_FCOE_WQ_CREATE_V1 *qp1;
72682527734SSukumar Swaminathan 	uint64_t addr;
72782527734SSukumar Swaminathan 	int i;
72882527734SSukumar Swaminathan 
729a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
73082527734SSukumar Swaminathan 	mbq->nonembed = NULL;
73182527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
732a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
73382527734SSukumar Swaminathan 
73482527734SSukumar Swaminathan 	/*
73582527734SSukumar Swaminathan 	 * Signifies an embedded command
73682527734SSukumar Swaminathan 	 */
737a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
73882527734SSukumar Swaminathan 
739a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
740a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
74182527734SSukumar Swaminathan 
7428f23e9faSHans Rosenfeld 	switch (hba->sli.sli4.param.WQV) {
7438f23e9faSHans Rosenfeld 	case 0:
7448f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
7458f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_WQ_CREATE) + IOCTL_HEADER_SZ;
7468f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
7478f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_FCOE;
7488f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
7498f23e9faSHans Rosenfeld 		    FCOE_OPCODE_WQ_CREATE;
7508f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
7518f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
7528f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_WQ_CREATE);
7538f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 0;
7548f23e9faSHans Rosenfeld 
7558f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.wq[num].addr.phys;
7568f23e9faSHans Rosenfeld 		qp = (IOCTL_FCOE_WQ_CREATE *)&mb4->un.varSLIConfig.payload;
7578f23e9faSHans Rosenfeld 
7588f23e9faSHans Rosenfeld 		qp->params.request.CQId = hba->sli.sli4.wq[num].cqid;
7598f23e9faSHans Rosenfeld 
7608f23e9faSHans Rosenfeld 		qp->params.request.NumPages = EMLXS_NUM_WQ_PAGES;
7618f23e9faSHans Rosenfeld 		for (i = 0; i < EMLXS_NUM_WQ_PAGES; i++) {
7628f23e9faSHans Rosenfeld 			qp->params.request.Pages[i].addrLow = PADDR_LO(addr);
7638f23e9faSHans Rosenfeld 			qp->params.request.Pages[i].addrHigh = PADDR_HI(addr);
7648f23e9faSHans Rosenfeld 			addr += 4096;
7658f23e9faSHans Rosenfeld 		}
7668f23e9faSHans Rosenfeld 
7678f23e9faSHans Rosenfeld 		break;
7688f23e9faSHans Rosenfeld 
7698f23e9faSHans Rosenfeld 	case 1:
7708f23e9faSHans Rosenfeld 	default:
7718f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
7728f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_WQ_CREATE_V1) + IOCTL_HEADER_SZ;
7738f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
7748f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_FCOE;
7758f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
7768f23e9faSHans Rosenfeld 		    FCOE_OPCODE_WQ_CREATE;
7778f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
7788f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
7798f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_WQ_CREATE_V1);
7808f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 1;
7818f23e9faSHans Rosenfeld 
7828f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.wq[num].addr.phys;
7838f23e9faSHans Rosenfeld 		qp1 = (IOCTL_FCOE_WQ_CREATE_V1 *)&mb4->un.varSLIConfig.payload;
7848f23e9faSHans Rosenfeld 
7858f23e9faSHans Rosenfeld 		qp1->params.request.CQId = hba->sli.sli4.wq[num].cqid;
7868f23e9faSHans Rosenfeld 		qp1->params.request.NumPages = EMLXS_NUM_WQ_PAGES;
78782527734SSukumar Swaminathan 
7888f23e9faSHans Rosenfeld 		qp1->params.request.WqeCnt = WQ_DEPTH;
7898f23e9faSHans Rosenfeld 		qp1->params.request.WqeSize = WQE_SIZE_64_BYTES;
7908f23e9faSHans Rosenfeld 		qp1->params.request.PageSize = WQ_PAGE_SIZE_4K;
79182527734SSukumar Swaminathan 
7928f23e9faSHans Rosenfeld 		for (i = 0; i < EMLXS_NUM_WQ_PAGES; i++) {
7938f23e9faSHans Rosenfeld 			qp1->params.request.Pages[i].addrLow = PADDR_LO(addr);
7948f23e9faSHans Rosenfeld 			qp1->params.request.Pages[i].addrHigh = PADDR_HI(addr);
7958f23e9faSHans Rosenfeld 			addr += 4096;
7968f23e9faSHans Rosenfeld 		}
7978f23e9faSHans Rosenfeld 
7988f23e9faSHans Rosenfeld 		break;
79982527734SSukumar Swaminathan 	}
80082527734SSukumar Swaminathan 
80182527734SSukumar Swaminathan 	return;
80282527734SSukumar Swaminathan 
80382527734SSukumar Swaminathan } /* emlxs_mb_wq_create() */
80482527734SSukumar Swaminathan 
80582527734SSukumar Swaminathan 
806a9800bebSGarrett D'Amore /* SLI4 */
80782527734SSukumar Swaminathan /*ARGSUSED*/
80882527734SSukumar Swaminathan extern void
80982527734SSukumar Swaminathan emlxs_mb_rq_create(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t num)
810a9800bebSGarrett D'Amore {
811a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
812a9800bebSGarrett D'Amore 	IOCTL_FCOE_RQ_CREATE *qp;
8138f23e9faSHans Rosenfeld 	IOCTL_FCOE_RQ_CREATE_V1 *qp1;
814a9800bebSGarrett D'Amore 	uint64_t	addr;
81582527734SSukumar Swaminathan 
816a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
817a9800bebSGarrett D'Amore 	mbq->nonembed = NULL;
818a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
819a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
82082527734SSukumar Swaminathan 
82182527734SSukumar Swaminathan 	/*
822a9800bebSGarrett D'Amore 	 * Signifies an embedded command
82382527734SSukumar Swaminathan 	 */
824a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
82582527734SSukumar Swaminathan 
826a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
827a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
82882527734SSukumar Swaminathan 
8298f23e9faSHans Rosenfeld 	switch (hba->sli.sli4.param.RQV) {
8308f23e9faSHans Rosenfeld 	case 0:
8318f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
8328f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_RQ_CREATE) + IOCTL_HEADER_SZ;
8338f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
8348f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_FCOE;
8358f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
8368f23e9faSHans Rosenfeld 		    FCOE_OPCODE_RQ_CREATE;
8378f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
8388f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
8398f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_RQ_CREATE);
8408f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 0;
8418f23e9faSHans Rosenfeld 
8428f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.rq[num].addr.phys;
8438f23e9faSHans Rosenfeld 
8448f23e9faSHans Rosenfeld 		qp = (IOCTL_FCOE_RQ_CREATE *)&mb4->un.varSLIConfig.payload;
8458f23e9faSHans Rosenfeld 
8468f23e9faSHans Rosenfeld 		qp->params.request.RQContext.RqeCnt	= RQ_DEPTH_EXPONENT;
8478f23e9faSHans Rosenfeld 		qp->params.request.RQContext.BufferSize	= RQB_DATA_SIZE;
8488f23e9faSHans Rosenfeld 		qp->params.request.RQContext.CQId	=
8498f23e9faSHans Rosenfeld 		    hba->sli.sli4.rq[num].cqid;
8508f23e9faSHans Rosenfeld 
8518f23e9faSHans Rosenfeld 		qp->params.request.NumPages = 1;
8528f23e9faSHans Rosenfeld 		qp->params.request.Pages[0].addrLow = PADDR_LO(addr);
8538f23e9faSHans Rosenfeld 		qp->params.request.Pages[0].addrHigh = PADDR_HI(addr);
85482527734SSukumar Swaminathan 
8558f23e9faSHans Rosenfeld 		break;
856fcf3ce44SJohn Forte 
8578f23e9faSHans Rosenfeld 	case 1:
8588f23e9faSHans Rosenfeld 	default:
8598f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
8608f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_RQ_CREATE_V1) + IOCTL_HEADER_SZ;
8618f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
8628f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_FCOE;
8638f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
8648f23e9faSHans Rosenfeld 		    FCOE_OPCODE_RQ_CREATE;
8658f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
8668f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
8678f23e9faSHans Rosenfeld 		    sizeof (IOCTL_FCOE_RQ_CREATE_V1);
8688f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 1;
8698f23e9faSHans Rosenfeld 
8708f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.rq[num].addr.phys;
8718f23e9faSHans Rosenfeld 
8728f23e9faSHans Rosenfeld 		qp1 = (IOCTL_FCOE_RQ_CREATE_V1 *)&mb4->un.varSLIConfig.payload;
8738f23e9faSHans Rosenfeld 
8748f23e9faSHans Rosenfeld 		qp1->params.request.RQContext.RqeCnt	 = RQ_DEPTH;
8758f23e9faSHans Rosenfeld 		qp1->params.request.RQContext.RqeSize	 = RQE_SIZE_8_BYTES;
8768f23e9faSHans Rosenfeld 		qp1->params.request.RQContext.PageSize	 = RQ_PAGE_SIZE_4K;
8778f23e9faSHans Rosenfeld 
8788f23e9faSHans Rosenfeld 		qp1->params.request.RQContext.BufferSize = RQB_DATA_SIZE;
8798f23e9faSHans Rosenfeld 		qp1->params.request.RQContext.CQId	 =
8808f23e9faSHans Rosenfeld 		    hba->sli.sli4.rq[num].cqid;
8818f23e9faSHans Rosenfeld 
8828f23e9faSHans Rosenfeld 		qp1->params.request.NumPages = 1;
8838f23e9faSHans Rosenfeld 		qp1->params.request.Pages[0].addrLow = PADDR_LO(addr);
8848f23e9faSHans Rosenfeld 		qp1->params.request.Pages[0].addrHigh = PADDR_HI(addr);
8858f23e9faSHans Rosenfeld 
8868f23e9faSHans Rosenfeld 		break;
8878f23e9faSHans Rosenfeld 	}
888fcf3ce44SJohn Forte 
889a9800bebSGarrett D'Amore 	return;
890fcf3ce44SJohn Forte 
891a9800bebSGarrett D'Amore } /* emlxs_mb_rq_create() */
89282527734SSukumar Swaminathan 
89382527734SSukumar Swaminathan 
894a9800bebSGarrett D'Amore /* SLI4 */
89582527734SSukumar Swaminathan /*ARGSUSED*/
896a9800bebSGarrett D'Amore extern void
897a9800bebSGarrett D'Amore emlxs_mb_mq_create(emlxs_hba_t *hba, MAILBOXQ *mbq)
89882527734SSukumar Swaminathan {
899a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
900a9800bebSGarrett D'Amore 	IOCTL_COMMON_MQ_CREATE *qp;
901a9800bebSGarrett D'Amore 	uint64_t	addr;
90282527734SSukumar Swaminathan 
903a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
904a9800bebSGarrett D'Amore 	mbq->nonembed = NULL;
905a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
906a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
90782527734SSukumar Swaminathan 
908a9800bebSGarrett D'Amore 	/*
909a9800bebSGarrett D'Amore 	 * Signifies an embedded command
910a9800bebSGarrett D'Amore 	 */
911a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
91282527734SSukumar Swaminathan 
913a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
914a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
915a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.payload_length =
916a9800bebSGarrett D'Amore 	    sizeof (IOCTL_COMMON_MQ_CREATE) + IOCTL_HEADER_SZ;
917a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
918a9800bebSGarrett D'Amore 	    IOCTL_SUBSYSTEM_COMMON;
919a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode = COMMON_OPCODE_MQ_CREATE;
920a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
921a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
922a9800bebSGarrett D'Amore 	    sizeof (IOCTL_COMMON_MQ_CREATE);
92382527734SSukumar Swaminathan 
924a9800bebSGarrett D'Amore 	addr = hba->sli.sli4.mq.addr.phys;
925a9800bebSGarrett D'Amore 	qp = (IOCTL_COMMON_MQ_CREATE *)&mb4->un.varSLIConfig.payload;
92682527734SSukumar Swaminathan 
927a9800bebSGarrett D'Amore 	qp->params.request.MQContext.Size = MQ_ELEMENT_COUNT_16;
928a9800bebSGarrett D'Amore 	qp->params.request.MQContext.Valid = 1;
929a9800bebSGarrett D'Amore 	qp->params.request.MQContext.CQId = hba->sli.sli4.mq.cqid;
93082527734SSukumar Swaminathan 
931a9800bebSGarrett D'Amore 	qp->params.request.NumPages = 1;
932a9800bebSGarrett D'Amore 	qp->params.request.Pages[0].addrLow = PADDR_LO(addr);
933a9800bebSGarrett D'Amore 	qp->params.request.Pages[0].addrHigh = PADDR_HI(addr);
93482527734SSukumar Swaminathan 
935a9800bebSGarrett D'Amore 	return;
93682527734SSukumar Swaminathan 
937a9800bebSGarrett D'Amore } /* emlxs_mb_mq_create() */
93882527734SSukumar Swaminathan 
93982527734SSukumar Swaminathan 
940a9800bebSGarrett D'Amore /* SLI4 */
94182527734SSukumar Swaminathan /*ARGSUSED*/
942a9800bebSGarrett D'Amore extern void
9438f23e9faSHans Rosenfeld emlxs_mb_mq_create_ext(emlxs_hba_t *hba, MAILBOXQ *mbq)
94482527734SSukumar Swaminathan {
945a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
9468f23e9faSHans Rosenfeld 	IOCTL_COMMON_MQ_CREATE_EXT *qp;
9478f23e9faSHans Rosenfeld 	IOCTL_COMMON_MQ_CREATE_EXT_V1 *qp1;
948a9800bebSGarrett D'Amore 	uint64_t	addr;
94982527734SSukumar Swaminathan 
950a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
951a9800bebSGarrett D'Amore 	mbq->nonembed = NULL;
952a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
953a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
95482527734SSukumar Swaminathan 
955a9800bebSGarrett D'Amore 	/*
956a9800bebSGarrett D'Amore 	 * Signifies an embedded command
957a9800bebSGarrett D'Amore 	 */
958a9800bebSGarrett D'Amore 	mb4->un.varSLIConfig.be.embedded = 1;
95982527734SSukumar Swaminathan 
960a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_SLI_CONFIG;
961a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
96282527734SSukumar Swaminathan 
9638f23e9faSHans Rosenfeld 	switch (hba->sli.sli4.param.MQV) {
9648f23e9faSHans Rosenfeld 	case 0:
9658f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
9668f23e9faSHans Rosenfeld 		    sizeof (IOCTL_COMMON_MQ_CREATE_EXT) + IOCTL_HEADER_SZ;
9678f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
9688f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_COMMON;
9698f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
9708f23e9faSHans Rosenfeld 		    COMMON_OPCODE_MQ_CREATE_EXT;
9718f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
9728f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
9738f23e9faSHans Rosenfeld 		    sizeof (IOCTL_COMMON_MQ_CREATE_EXT);
9748f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 0;
9758f23e9faSHans Rosenfeld 
9768f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.mq.addr.phys;
9778f23e9faSHans Rosenfeld 		qp = (IOCTL_COMMON_MQ_CREATE_EXT *)
9788f23e9faSHans Rosenfeld 		    &mb4->un.varSLIConfig.payload;
9798f23e9faSHans Rosenfeld 
9808f23e9faSHans Rosenfeld 		qp->params.request.num_pages = 1;
9818f23e9faSHans Rosenfeld 		qp->params.request.async_event_bitmap =
9828f23e9faSHans Rosenfeld 		    ASYNC_LINK_EVENT | ASYNC_FCF_EVENT | ASYNC_GROUP5_EVENT;
9838f23e9faSHans Rosenfeld 		qp->params.request.context.Size = MQ_ELEMENT_COUNT_16;
9848f23e9faSHans Rosenfeld 		qp->params.request.context.Valid = 1;
9858f23e9faSHans Rosenfeld 		qp->params.request.context.CQId = hba->sli.sli4.mq.cqid;
9868f23e9faSHans Rosenfeld 
9878f23e9faSHans Rosenfeld 		qp->params.request.pages[0].addrLow = PADDR_LO(addr);
9888f23e9faSHans Rosenfeld 		qp->params.request.pages[0].addrHigh = PADDR_HI(addr);
9898f23e9faSHans Rosenfeld 
9908f23e9faSHans Rosenfeld 		break;
99182527734SSukumar Swaminathan 
9928f23e9faSHans Rosenfeld 	case 1:
9938f23e9faSHans Rosenfeld 	default:
9948f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.payload_length =
995*a3170057SPaul Winder 		    sizeof (IOCTL_COMMON_MQ_CREATE_EXT_V1) + IOCTL_HEADER_SZ;
9968f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.subsystem =
9978f23e9faSHans Rosenfeld 		    IOCTL_SUBSYSTEM_COMMON;
9988f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.opcode =
9998f23e9faSHans Rosenfeld 		    COMMON_OPCODE_MQ_CREATE_EXT;
10008f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.timeout = 0;
10018f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.req_length =
10028f23e9faSHans Rosenfeld 		    sizeof (IOCTL_COMMON_MQ_CREATE_EXT_V1);
10038f23e9faSHans Rosenfeld 		mb4->un.varSLIConfig.be.un_hdr.hdr_req.version = 1;
10048f23e9faSHans Rosenfeld 
10058f23e9faSHans Rosenfeld 		addr = hba->sli.sli4.mq.addr.phys;
10068f23e9faSHans Rosenfeld 		qp1 = (IOCTL_COMMON_MQ_CREATE_EXT_V1 *)
10078f23e9faSHans Rosenfeld 		    &mb4->un.varSLIConfig.payload;
10088f23e9faSHans Rosenfeld 
10098f23e9faSHans Rosenfeld 		qp1->params.request.num_pages = 1;
10108f23e9faSHans Rosenfeld 		qp1->params.request.async_event_bitmap =
10118f23e9faSHans Rosenfeld 		    ASYNC_LINK_EVENT | ASYNC_FCF_EVENT | ASYNC_GROUP5_EVENT |
10128f23e9faSHans Rosenfeld 		    ASYNC_FC_EVENT | ASYNC_PORT_EVENT;
10138f23e9faSHans Rosenfeld 		qp1->params.request.context.Size = MQ_ELEMENT_COUNT_16;
10148f23e9faSHans Rosenfeld 		qp1->params.request.context.Valid = 1;
10158f23e9faSHans Rosenfeld 		qp1->params.request.CQId = hba->sli.sli4.mq.cqid;
10168f23e9faSHans Rosenfeld 
10178f23e9faSHans Rosenfeld 		qp1->params.request.pages[0].addrLow = PADDR_LO(addr);
10188f23e9faSHans Rosenfeld 		qp1->params.request.pages[0].addrHigh = PADDR_HI(addr);
101982527734SSukumar Swaminathan 
10208f23e9faSHans Rosenfeld 		break;
10218f23e9faSHans Rosenfeld 	}
102282527734SSukumar Swaminathan 
1023a9800bebSGarrett D'Amore 	return;
102482527734SSukumar Swaminathan 
10258f23e9faSHans Rosenfeld } /* emlxs_mb_mq_create_ext() */
1026fcf3ce44SJohn Forte 
1027fcf3ce44SJohn Forte 
1028291a2b48SSukumar Swaminathan /*ARGSUSED*/
1029fcf3ce44SJohn Forte extern void
103082527734SSukumar Swaminathan emlxs_mb_async_event(emlxs_hba_t *hba, MAILBOXQ *mbq)
1031fcf3ce44SJohn Forte {
103282527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
103382527734SSukumar Swaminathan 
1034fcf3ce44SJohn Forte 	bzero((void *) mb, MAILBOX_CMD_BSIZE);
1035fcf3ce44SJohn Forte 
1036fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_ASYNC_EVENT;
1037fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
103882527734SSukumar Swaminathan 	mb->un.varWords[0] = hba->channel_els;
103982527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1040a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1041fcf3ce44SJohn Forte 
1042fcf3ce44SJohn Forte 	return;
1043fcf3ce44SJohn Forte 
1044fcf3ce44SJohn Forte } /* emlxs_mb_async_event() */
1045fcf3ce44SJohn Forte 
1046fcf3ce44SJohn Forte 
1047291a2b48SSukumar Swaminathan /*ARGSUSED*/
1048fcf3ce44SJohn Forte extern void
104982527734SSukumar Swaminathan emlxs_mb_heartbeat(emlxs_hba_t *hba, MAILBOXQ *mbq)
1050fcf3ce44SJohn Forte {
105182527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
105282527734SSukumar Swaminathan 
1053fcf3ce44SJohn Forte 	bzero((void *) mb, MAILBOX_CMD_BSIZE);
1054fcf3ce44SJohn Forte 
1055fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_HEARTBEAT;
1056fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
105782527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed for hbeat */
1058a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1059fcf3ce44SJohn Forte 
1060fcf3ce44SJohn Forte 	return;
1061fcf3ce44SJohn Forte 
1062fcf3ce44SJohn Forte } /* emlxs_mb_heartbeat() */
1063fcf3ce44SJohn Forte 
1064fcf3ce44SJohn Forte 
1065fcf3ce44SJohn Forte #ifdef MSI_SUPPORT
1066fcf3ce44SJohn Forte 
1067291a2b48SSukumar Swaminathan /*ARGSUSED*/
1068fcf3ce44SJohn Forte extern void
106982527734SSukumar Swaminathan emlxs_mb_config_msi(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t *intr_map,
1070fcf3ce44SJohn Forte     uint32_t intr_count)
1071fcf3ce44SJohn Forte {
107282527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
1073a9800bebSGarrett D'Amore 	uint16_t i;
1074fcf3ce44SJohn Forte 	uint32_t mask;
1075fcf3ce44SJohn Forte 
1076291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1077fcf3ce44SJohn Forte 
1078fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_CONFIG_MSI;
1079fcf3ce44SJohn Forte 
1080fcf3ce44SJohn Forte 	/* Set the default message id to zero */
1081fcf3ce44SJohn Forte 	mb->un.varCfgMSI.defaultPresent = 1;
1082fcf3ce44SJohn Forte 	mb->un.varCfgMSI.defaultMessageNumber = 0;
1083fcf3ce44SJohn Forte 
1084fcf3ce44SJohn Forte 	for (i = 1; i < intr_count; i++) {
1085fcf3ce44SJohn Forte 		mask = intr_map[i];
1086fcf3ce44SJohn Forte 
1087fcf3ce44SJohn Forte 		mb->un.varCfgMSI.attConditions |= mask;
1088fcf3ce44SJohn Forte 
1089fcf3ce44SJohn Forte #ifdef EMLXS_BIG_ENDIAN
1090fcf3ce44SJohn Forte 		if (mask & HA_R0ATT) {
1091fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[3] = i;
1092fcf3ce44SJohn Forte 		}
1093fcf3ce44SJohn Forte 		if (mask & HA_R1ATT) {
1094fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[7] = i;
1095fcf3ce44SJohn Forte 		}
1096fcf3ce44SJohn Forte 		if (mask & HA_R2ATT) {
1097fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[11] = i;
1098fcf3ce44SJohn Forte 		}
1099fcf3ce44SJohn Forte 		if (mask & HA_R3ATT) {
1100fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[15] = i;
1101fcf3ce44SJohn Forte 		}
1102fcf3ce44SJohn Forte 		if (mask & HA_LATT) {
1103fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[29] = i;
1104fcf3ce44SJohn Forte 		}
1105fcf3ce44SJohn Forte 		if (mask & HA_MBATT) {
1106fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[30] = i;
1107fcf3ce44SJohn Forte 		}
1108fcf3ce44SJohn Forte 		if (mask & HA_ERATT) {
1109fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[31] = i;
1110fcf3ce44SJohn Forte 		}
1111fcf3ce44SJohn Forte #endif	/* EMLXS_BIG_ENDIAN */
1112fcf3ce44SJohn Forte 
1113fcf3ce44SJohn Forte #ifdef EMLXS_LITTLE_ENDIAN
1114fcf3ce44SJohn Forte 		/* Accounts for half word swap of LE architecture */
1115fcf3ce44SJohn Forte 		if (mask & HA_R0ATT) {
1116fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[2] = i;
1117fcf3ce44SJohn Forte 		}
1118fcf3ce44SJohn Forte 		if (mask & HA_R1ATT) {
1119fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[6] = i;
1120fcf3ce44SJohn Forte 		}
1121fcf3ce44SJohn Forte 		if (mask & HA_R2ATT) {
1122fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[10] = i;
1123fcf3ce44SJohn Forte 		}
1124fcf3ce44SJohn Forte 		if (mask & HA_R3ATT) {
1125fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[14] = i;
1126fcf3ce44SJohn Forte 		}
1127fcf3ce44SJohn Forte 		if (mask & HA_LATT) {
1128fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[28] = i;
1129fcf3ce44SJohn Forte 		}
1130fcf3ce44SJohn Forte 		if (mask & HA_MBATT) {
1131fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[31] = i;
1132fcf3ce44SJohn Forte 		}
1133fcf3ce44SJohn Forte 		if (mask & HA_ERATT) {
1134fcf3ce44SJohn Forte 			mb->un.varCfgMSI.messageNumberByHA[30] = i;
1135fcf3ce44SJohn Forte 		}
1136fcf3ce44SJohn Forte #endif	/* EMLXS_LITTLE_ENDIAN */
1137fcf3ce44SJohn Forte 	}
1138fcf3ce44SJohn Forte 
1139fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
114082527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1141a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1142fcf3ce44SJohn Forte 
1143fcf3ce44SJohn Forte 	return;
1144fcf3ce44SJohn Forte 
1145fcf3ce44SJohn Forte } /* emlxs_mb_config_msi() */
1146fcf3ce44SJohn Forte 
1147fcf3ce44SJohn Forte 
1148291a2b48SSukumar Swaminathan /*ARGSUSED*/
1149fcf3ce44SJohn Forte extern void
115082527734SSukumar Swaminathan emlxs_mb_config_msix(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t *intr_map,
1151fcf3ce44SJohn Forte     uint32_t intr_count)
1152fcf3ce44SJohn Forte {
115382527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
1154a9800bebSGarrett D'Amore 	uint8_t i;
1155fcf3ce44SJohn Forte 	uint32_t mask;
1156fcf3ce44SJohn Forte 
1157291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1158fcf3ce44SJohn Forte 
1159fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_CONFIG_MSIX;
1160fcf3ce44SJohn Forte 
1161fcf3ce44SJohn Forte 	/* Set the default message id to zero */
1162fcf3ce44SJohn Forte 	mb->un.varCfgMSIX.defaultPresent = 1;
1163fcf3ce44SJohn Forte 	mb->un.varCfgMSIX.defaultMessageNumber = 0;
1164fcf3ce44SJohn Forte 
1165fcf3ce44SJohn Forte 	for (i = 1; i < intr_count; i++) {
1166fcf3ce44SJohn Forte 		mask = intr_map[i];
1167fcf3ce44SJohn Forte 
1168fcf3ce44SJohn Forte 		mb->un.varCfgMSIX.attConditions1 |= mask;
1169fcf3ce44SJohn Forte 
1170fcf3ce44SJohn Forte #ifdef EMLXS_BIG_ENDIAN
1171fcf3ce44SJohn Forte 		if (mask & HA_R0ATT) {
1172fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[3] = i;
1173fcf3ce44SJohn Forte 		}
1174fcf3ce44SJohn Forte 		if (mask & HA_R1ATT) {
1175fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[7] = i;
1176fcf3ce44SJohn Forte 		}
1177fcf3ce44SJohn Forte 		if (mask & HA_R2ATT) {
1178fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[11] = i;
1179fcf3ce44SJohn Forte 		}
1180fcf3ce44SJohn Forte 		if (mask & HA_R3ATT) {
1181fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[15] = i;
1182fcf3ce44SJohn Forte 		}
1183fcf3ce44SJohn Forte 		if (mask & HA_LATT) {
1184fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[29] = i;
1185fcf3ce44SJohn Forte 		}
1186fcf3ce44SJohn Forte 		if (mask & HA_MBATT) {
1187fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[30] = i;
1188fcf3ce44SJohn Forte 		}
1189fcf3ce44SJohn Forte 		if (mask & HA_ERATT) {
1190fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[31] = i;
1191fcf3ce44SJohn Forte 		}
1192fcf3ce44SJohn Forte #endif	/* EMLXS_BIG_ENDIAN */
1193fcf3ce44SJohn Forte 
1194fcf3ce44SJohn Forte #ifdef EMLXS_LITTLE_ENDIAN
1195fcf3ce44SJohn Forte 		/* Accounts for word swap of LE architecture */
1196fcf3ce44SJohn Forte 		if (mask & HA_R0ATT) {
1197fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[0] = i;
1198fcf3ce44SJohn Forte 		}
1199fcf3ce44SJohn Forte 		if (mask & HA_R1ATT) {
1200fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[4] = i;
1201fcf3ce44SJohn Forte 		}
1202fcf3ce44SJohn Forte 		if (mask & HA_R2ATT) {
1203fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[8] = i;
1204fcf3ce44SJohn Forte 		}
1205fcf3ce44SJohn Forte 		if (mask & HA_R3ATT) {
1206fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[12] = i;
1207fcf3ce44SJohn Forte 		}
1208fcf3ce44SJohn Forte 		if (mask & HA_LATT) {
1209fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[30] = i;
1210fcf3ce44SJohn Forte 		}
1211fcf3ce44SJohn Forte 		if (mask & HA_MBATT) {
1212fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[29] = i;
1213fcf3ce44SJohn Forte 		}
1214fcf3ce44SJohn Forte 		if (mask & HA_ERATT) {
1215fcf3ce44SJohn Forte 			mb->un.varCfgMSIX.messageNumberByHA[28] = i;
1216fcf3ce44SJohn Forte 		}
1217fcf3ce44SJohn Forte #endif	/* EMLXS_LITTLE_ENDIAN */
1218fcf3ce44SJohn Forte 	}
1219fcf3ce44SJohn Forte 
1220fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
122182527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1222a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1223fcf3ce44SJohn Forte 
1224fcf3ce44SJohn Forte 	return;
1225fcf3ce44SJohn Forte 
1226fcf3ce44SJohn Forte } /* emlxs_mb_config_msix() */
1227fcf3ce44SJohn Forte 
1228fcf3ce44SJohn Forte 
1229fcf3ce44SJohn Forte #endif	/* MSI_SUPPORT */
1230fcf3ce44SJohn Forte 
1231291a2b48SSukumar Swaminathan 
1232291a2b48SSukumar Swaminathan /*ARGSUSED*/
1233fcf3ce44SJohn Forte extern void
123482527734SSukumar Swaminathan emlxs_mb_reset_ring(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t ringno)
1235fcf3ce44SJohn Forte {
123682527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
123782527734SSukumar Swaminathan 
1238291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1239fcf3ce44SJohn Forte 
1240fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_RESET_RING;
1241fcf3ce44SJohn Forte 	mb->un.varRstRing.ring_no = ringno;
1242fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
124382527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1244a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1245fcf3ce44SJohn Forte 
1246fcf3ce44SJohn Forte 	return;
1247fcf3ce44SJohn Forte 
1248fcf3ce44SJohn Forte } /* emlxs_mb_reset_ring() */
1249fcf3ce44SJohn Forte 
1250fcf3ce44SJohn Forte 
125182527734SSukumar Swaminathan /*ARGSUSED*/
125282527734SSukumar Swaminathan extern void
125382527734SSukumar Swaminathan emlxs_mb_dump_vpd(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t offset)
125482527734SSukumar Swaminathan {
125582527734SSukumar Swaminathan 
125682527734SSukumar Swaminathan 	if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
1257a9800bebSGarrett D'Amore 		MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
125882527734SSukumar Swaminathan 
125982527734SSukumar Swaminathan 		/* Clear the local dump_region */
126082527734SSukumar Swaminathan 		bzero(hba->sli.sli4.dump_region.virt,
126182527734SSukumar Swaminathan 		    hba->sli.sli4.dump_region.size);
126282527734SSukumar Swaminathan 
1263a9800bebSGarrett D'Amore 		bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
126482527734SSukumar Swaminathan 
1265a9800bebSGarrett D'Amore 		mb4->mbxCommand = MBX_DUMP_MEMORY;
1266a9800bebSGarrett D'Amore 		mb4->un.varDmp4.type = DMP_NV_PARAMS;
1267a9800bebSGarrett D'Amore 		mb4->un.varDmp4.entry_index = offset;
1268a9800bebSGarrett D'Amore 		mb4->un.varDmp4.region_id = DMP_VPD_REGION;
126982527734SSukumar Swaminathan 
1270a9800bebSGarrett D'Amore 		mb4->un.varDmp4.available_cnt = hba->sli.sli4.dump_region.size;
1271a9800bebSGarrett D'Amore 		mb4->un.varDmp4.addrHigh =
127282527734SSukumar Swaminathan 		    PADDR_HI(hba->sli.sli4.dump_region.phys);
1273a9800bebSGarrett D'Amore 		mb4->un.varDmp4.addrLow =
127482527734SSukumar Swaminathan 		    PADDR_LO(hba->sli.sli4.dump_region.phys);
1275a9800bebSGarrett D'Amore 		mb4->un.varDmp4.rsp_cnt = 0;
127682527734SSukumar Swaminathan 
1277a9800bebSGarrett D'Amore 		mb4->mbxOwner = OWN_HOST;
127882527734SSukumar Swaminathan 
127982527734SSukumar Swaminathan 	} else {
128082527734SSukumar Swaminathan 		MAILBOX *mb = (MAILBOX *)mbq;
128182527734SSukumar Swaminathan 
128282527734SSukumar Swaminathan 		bzero((void *)mb, MAILBOX_CMD_BSIZE);
128382527734SSukumar Swaminathan 
128482527734SSukumar Swaminathan 		mb->mbxCommand = MBX_DUMP_MEMORY;
128582527734SSukumar Swaminathan 		mb->un.varDmp.cv = 1;
128682527734SSukumar Swaminathan 		mb->un.varDmp.type = DMP_NV_PARAMS;
128782527734SSukumar Swaminathan 		mb->un.varDmp.entry_index = offset;
128882527734SSukumar Swaminathan 		mb->un.varDmp.region_id = DMP_VPD_REGION;
128982527734SSukumar Swaminathan 
129082527734SSukumar Swaminathan 		/* limited by mailbox size */
129182527734SSukumar Swaminathan 		mb->un.varDmp.word_cnt = DMP_VPD_DUMP_WCOUNT;
129282527734SSukumar Swaminathan 
129382527734SSukumar Swaminathan 		mb->un.varDmp.co = 0;
129482527734SSukumar Swaminathan 		mb->un.varDmp.resp_offset = 0;
129582527734SSukumar Swaminathan 		mb->mbxOwner = OWN_HOST;
129682527734SSukumar Swaminathan 	}
129782527734SSukumar Swaminathan 
129882527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1299a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
130082527734SSukumar Swaminathan 
130182527734SSukumar Swaminathan } /* emlxs_mb_dump_vpd() */
130282527734SSukumar Swaminathan 
130382527734SSukumar Swaminathan 
1304a9800bebSGarrett D'Amore /* SLI4 */
130582527734SSukumar Swaminathan /*ARGSUSED*/
130682527734SSukumar Swaminathan extern void
130782527734SSukumar Swaminathan emlxs_mb_dump_fcoe(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t offset)
130882527734SSukumar Swaminathan {
1309a9800bebSGarrett D'Amore 	MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
131082527734SSukumar Swaminathan 
1311a9800bebSGarrett D'Amore 	if (hba->sli_mode < EMLXS_HBA_SLI4_MODE) {
131282527734SSukumar Swaminathan 		return;
131382527734SSukumar Swaminathan 	}
1314a9800bebSGarrett D'Amore 
131582527734SSukumar Swaminathan 	/* Clear the local dump_region */
131682527734SSukumar Swaminathan 	bzero(hba->sli.sli4.dump_region.virt,
131782527734SSukumar Swaminathan 	    hba->sli.sli4.dump_region.size);
131882527734SSukumar Swaminathan 
1319a9800bebSGarrett D'Amore 	bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
132082527734SSukumar Swaminathan 
1321a9800bebSGarrett D'Amore 	mb4->mbxCommand = MBX_DUMP_MEMORY;
1322a9800bebSGarrett D'Amore 	mb4->un.varDmp4.type = DMP_NV_PARAMS;
1323a9800bebSGarrett D'Amore 	mb4->un.varDmp4.entry_index = offset;
1324a9800bebSGarrett D'Amore 	mb4->un.varDmp4.region_id = DMP_FCOE_REGION;
132582527734SSukumar Swaminathan 
1326a9800bebSGarrett D'Amore 	mb4->un.varDmp4.available_cnt = hba->sli.sli4.dump_region.size;
1327a9800bebSGarrett D'Amore 	mb4->un.varDmp4.addrHigh =
132882527734SSukumar Swaminathan 	    PADDR_HI(hba->sli.sli4.dump_region.phys);
1329a9800bebSGarrett D'Amore 	mb4->un.varDmp4.addrLow =
133082527734SSukumar Swaminathan 	    PADDR_LO(hba->sli.sli4.dump_region.phys);
1331a9800bebSGarrett D'Amore 	mb4->un.varDmp4.rsp_cnt = 0;
133282527734SSukumar Swaminathan 
1333a9800bebSGarrett D'Amore 	mb4->mbxOwner = OWN_HOST;
133482527734SSukumar Swaminathan 
133582527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1336a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
133782527734SSukumar Swaminathan 
133882527734SSukumar Swaminathan } /* emlxs_mb_dump_fcoe() */
133982527734SSukumar Swaminathan 
134082527734SSukumar Swaminathan 
134182527734SSukumar Swaminathan /*ARGSUSED*/
134282527734SSukumar Swaminathan extern void
134382527734SSukumar Swaminathan emlxs_mb_dump(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t offset, uint32_t words)
134482527734SSukumar Swaminathan {
134582527734SSukumar Swaminathan 
134682527734SSukumar Swaminathan 	if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
1347a9800bebSGarrett D'Amore 		MAILBOX4 *mb4 = (MAILBOX4 *)mbq;
134882527734SSukumar Swaminathan 
134982527734SSukumar Swaminathan 		/* Clear the local dump_region */
135082527734SSukumar Swaminathan 		bzero(hba->sli.sli4.dump_region.virt,
135182527734SSukumar Swaminathan 		    hba->sli.sli4.dump_region.size);
135282527734SSukumar Swaminathan 
1353a9800bebSGarrett D'Amore 		bzero((void *) mb4, MAILBOX_CMD_SLI4_BSIZE);
135482527734SSukumar Swaminathan 
1355a9800bebSGarrett D'Amore 		mb4->mbxCommand = MBX_DUMP_MEMORY;
1356a9800bebSGarrett D'Amore 		mb4->un.varDmp4.type = DMP_MEM_REG;
1357a9800bebSGarrett D'Amore 		mb4->un.varDmp4.entry_index = offset;
1358a9800bebSGarrett D'Amore 		mb4->un.varDmp4.region_id = 0;
135982527734SSukumar Swaminathan 
1360a9800bebSGarrett D'Amore 		mb4->un.varDmp4.available_cnt = min((words*4),
136182527734SSukumar Swaminathan 		    hba->sli.sli4.dump_region.size);
1362a9800bebSGarrett D'Amore 		mb4->un.varDmp4.addrHigh =
136382527734SSukumar Swaminathan 		    PADDR_HI(hba->sli.sli4.dump_region.phys);
1364a9800bebSGarrett D'Amore 		mb4->un.varDmp4.addrLow =
136582527734SSukumar Swaminathan 		    PADDR_LO(hba->sli.sli4.dump_region.phys);
1366a9800bebSGarrett D'Amore 		mb4->un.varDmp4.rsp_cnt = 0;
136782527734SSukumar Swaminathan 
1368a9800bebSGarrett D'Amore 		mb4->mbxOwner = OWN_HOST;
136982527734SSukumar Swaminathan 
137082527734SSukumar Swaminathan 	} else {
137182527734SSukumar Swaminathan 
137282527734SSukumar Swaminathan 		MAILBOX *mb = (MAILBOX *)mbq;
137382527734SSukumar Swaminathan 
137482527734SSukumar Swaminathan 		bzero((void *)mb, MAILBOX_CMD_BSIZE);
137582527734SSukumar Swaminathan 
137682527734SSukumar Swaminathan 		mb->mbxCommand = MBX_DUMP_MEMORY;
137782527734SSukumar Swaminathan 		mb->un.varDmp.type = DMP_MEM_REG;
137882527734SSukumar Swaminathan 		mb->un.varDmp.word_cnt = words;
137982527734SSukumar Swaminathan 		mb->un.varDmp.base_adr = offset;
138082527734SSukumar Swaminathan 
138182527734SSukumar Swaminathan 		mb->un.varDmp.co = 0;
138282527734SSukumar Swaminathan 		mb->un.varDmp.resp_offset = 0;
138382527734SSukumar Swaminathan 		mb->mbxOwner = OWN_HOST;
138482527734SSukumar Swaminathan 	}
138582527734SSukumar Swaminathan 
138682527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1387a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
138882527734SSukumar Swaminathan 
138982527734SSukumar Swaminathan 	return;
139082527734SSukumar Swaminathan 
139182527734SSukumar Swaminathan } /* emlxs_mb_dump() */
139282527734SSukumar Swaminathan 
139382527734SSukumar Swaminathan 
139482527734SSukumar Swaminathan /*
139582527734SSukumar Swaminathan  *  emlxs_mb_read_nv  Issue a READ NVPARAM mailbox command
139682527734SSukumar Swaminathan  */
139782527734SSukumar Swaminathan /*ARGSUSED*/
139882527734SSukumar Swaminathan extern void
139982527734SSukumar Swaminathan emlxs_mb_read_nv(emlxs_hba_t *hba, MAILBOXQ *mbq)
140082527734SSukumar Swaminathan {
140182527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
140282527734SSukumar Swaminathan 
140382527734SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
140482527734SSukumar Swaminathan 
140582527734SSukumar Swaminathan 	mb->mbxCommand = MBX_READ_NV;
140682527734SSukumar Swaminathan 	mb->mbxOwner = OWN_HOST;
140782527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1408a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
140982527734SSukumar Swaminathan 
141082527734SSukumar Swaminathan } /* emlxs_mb_read_nv() */
141182527734SSukumar Swaminathan 
1412fcf3ce44SJohn Forte 
1413fcf3ce44SJohn Forte /*
141482527734SSukumar Swaminathan  * emlxs_mb_read_rev  Issue a READ REV mailbox command
1415fcf3ce44SJohn Forte  */
1416291a2b48SSukumar Swaminathan /*ARGSUSED*/
1417fcf3ce44SJohn Forte extern void
141882527734SSukumar Swaminathan emlxs_mb_read_rev(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t v3)
141982527734SSukumar Swaminathan {
142082527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
142182527734SSukumar Swaminathan 
142282527734SSukumar Swaminathan 	if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
142382527734SSukumar Swaminathan 		bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
142482527734SSukumar Swaminathan 		mbq->nonembed = NULL;
142582527734SSukumar Swaminathan 	} else {
142682527734SSukumar Swaminathan 		bzero((void *)mb, MAILBOX_CMD_BSIZE);
142782527734SSukumar Swaminathan 
142882527734SSukumar Swaminathan 		mb->un.varRdRev.cv = 1;
142982527734SSukumar Swaminathan 
143082527734SSukumar Swaminathan 		if (v3) {
143182527734SSukumar Swaminathan 			mb->un.varRdRev.cv3 = 1;
143282527734SSukumar Swaminathan 		}
143382527734SSukumar Swaminathan 	}
143482527734SSukumar Swaminathan 
143582527734SSukumar Swaminathan 	mb->mbxCommand = MBX_READ_REV;
143682527734SSukumar Swaminathan 	mb->mbxOwner = OWN_HOST;
143782527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL;
1438a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
143982527734SSukumar Swaminathan 
144082527734SSukumar Swaminathan } /* emlxs_mb_read_rev() */
144182527734SSukumar Swaminathan 
144282527734SSukumar Swaminathan 
144382527734SSukumar Swaminathan /*
144482527734SSukumar Swaminathan  * emlxs_mb_run_biu_diag  Issue a RUN_BIU_DIAG mailbox command
144582527734SSukumar Swaminathan  */
144682527734SSukumar Swaminathan /*ARGSUSED*/
144782527734SSukumar Swaminathan extern uint32_t
144882527734SSukumar Swaminathan emlxs_mb_run_biu_diag(emlxs_hba_t *hba, MAILBOXQ *mbq, uint64_t out,
144982527734SSukumar Swaminathan     uint64_t in)
145082527734SSukumar Swaminathan {
145182527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
145282527734SSukumar Swaminathan 
145382527734SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
145482527734SSukumar Swaminathan 
145582527734SSukumar Swaminathan 	mb->mbxCommand = MBX_RUN_BIU_DIAG64;
145682527734SSukumar Swaminathan 	mb->un.varBIUdiag.un.s2.xmit_bde64.tus.f.bdeSize = MEM_ELSBUF_SIZE;
145782527734SSukumar Swaminathan 	mb->un.varBIUdiag.un.s2.xmit_bde64.addrHigh = PADDR_HI(out);
145882527734SSukumar Swaminathan 	mb->un.varBIUdiag.un.s2.xmit_bde64.addrLow = PADDR_LO(out);
145982527734SSukumar Swaminathan 	mb->un.varBIUdiag.un.s2.rcv_bde64.tus.f.bdeSize = MEM_ELSBUF_SIZE;
146082527734SSukumar Swaminathan 	mb->un.varBIUdiag.un.s2.rcv_bde64.addrHigh = PADDR_HI(in);
146182527734SSukumar Swaminathan 	mb->un.varBIUdiag.un.s2.rcv_bde64.addrLow = PADDR_LO(in);
146282527734SSukumar Swaminathan 	mb->mbxOwner = OWN_HOST;
146382527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1464a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
146582527734SSukumar Swaminathan 
146682527734SSukumar Swaminathan 	return (0);
146782527734SSukumar Swaminathan } /* emlxs_mb_run_biu_diag() */
146882527734SSukumar Swaminathan 
146982527734SSukumar Swaminathan 
147082527734SSukumar Swaminathan /* This should only be called with active MBX_NOWAIT mailboxes */
147182527734SSukumar Swaminathan void
147282527734SSukumar Swaminathan emlxs_mb_retry(emlxs_hba_t *hba, MAILBOXQ *mbq)
147382527734SSukumar Swaminathan {
147482527734SSukumar Swaminathan 	MAILBOX	*mb;
147582527734SSukumar Swaminathan 	MAILBOX	*mbox;
147682527734SSukumar Swaminathan 	int rc;
147782527734SSukumar Swaminathan 
14788f23e9faSHans Rosenfeld 	mbox = (MAILBOX *)emlxs_mem_get(hba, MEM_MBOX);
147982527734SSukumar Swaminathan 	if (!mbox) {
148082527734SSukumar Swaminathan 		return;
148182527734SSukumar Swaminathan 	}
148282527734SSukumar Swaminathan 	mb = (MAILBOX *)mbq;
148382527734SSukumar Swaminathan 	bcopy((uint8_t *)mb, (uint8_t *)mbox, MAILBOX_CMD_BSIZE);
148482527734SSukumar Swaminathan 	mbox->mbxOwner = OWN_HOST;
148582527734SSukumar Swaminathan 	mbox->mbxStatus = 0;
148682527734SSukumar Swaminathan 
148782527734SSukumar Swaminathan 	mutex_enter(&EMLXS_PORT_LOCK);
148882527734SSukumar Swaminathan 
148982527734SSukumar Swaminathan 	HBASTATS.MboxCompleted++;
149082527734SSukumar Swaminathan 
149182527734SSukumar Swaminathan 	if (mb->mbxStatus != 0) {
149282527734SSukumar Swaminathan 		HBASTATS.MboxError++;
149382527734SSukumar Swaminathan 	} else {
149482527734SSukumar Swaminathan 		HBASTATS.MboxGood++;
149582527734SSukumar Swaminathan 	}
149682527734SSukumar Swaminathan 
1497a9800bebSGarrett D'Amore 	hba->mbox_mbq = NULL;
149882527734SSukumar Swaminathan 	hba->mbox_queue_flag = 0;
149982527734SSukumar Swaminathan 
150082527734SSukumar Swaminathan 	mutex_exit(&EMLXS_PORT_LOCK);
150182527734SSukumar Swaminathan 
150282527734SSukumar Swaminathan 	rc =  EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox, MBX_NOWAIT, 0);
150382527734SSukumar Swaminathan 	if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
1504a9800bebSGarrett D'Amore 		emlxs_mem_put(hba, MEM_MBOX, (void *)mbox);
150582527734SSukumar Swaminathan 	}
150682527734SSukumar Swaminathan 	return;
150782527734SSukumar Swaminathan 
150882527734SSukumar Swaminathan } /* emlxs_mb_retry() */
150982527734SSukumar Swaminathan 
151082527734SSukumar Swaminathan 
1511a9800bebSGarrett D'Amore /* SLI3 */
1512a9800bebSGarrett D'Amore static uint32_t
1513a9800bebSGarrett D'Amore emlxs_read_la_mbcmpl(emlxs_hba_t *hba, MAILBOXQ *mbq)
1514fcf3ce44SJohn Forte {
1515a9800bebSGarrett D'Amore 	emlxs_port_t *port = (emlxs_port_t *)mbq->port;
151682527734SSukumar Swaminathan 	MAILBOX *mb;
151782527734SSukumar Swaminathan 	MAILBOXQ *mbox;
151882527734SSukumar Swaminathan 	MATCHMAP *mp;
151982527734SSukumar Swaminathan 	READ_LA_VAR la;
152082527734SSukumar Swaminathan 	int i;
152182527734SSukumar Swaminathan 	uint32_t  control;
152282527734SSukumar Swaminathan 
152382527734SSukumar Swaminathan 	mb = (MAILBOX *)mbq;
152482527734SSukumar Swaminathan 	if (mb->mbxStatus) {
152582527734SSukumar Swaminathan 		if (mb->mbxStatus == MBXERR_NO_RESOURCES) {
152682527734SSukumar Swaminathan 			control = mb->un.varReadLA.un.lilpBde64.tus.f.bdeSize;
152782527734SSukumar Swaminathan 			if (control == 0) {
152882527734SSukumar Swaminathan 				(void) emlxs_mb_read_la(hba, mbq);
152982527734SSukumar Swaminathan 			}
153082527734SSukumar Swaminathan 			emlxs_mb_retry(hba, mbq);
153182527734SSukumar Swaminathan 			return (1);
153282527734SSukumar Swaminathan 		}
153382527734SSukumar Swaminathan 		/* Enable Link Attention interrupts */
153482527734SSukumar Swaminathan 		mutex_enter(&EMLXS_PORT_LOCK);
1535fcf3ce44SJohn Forte 
153682527734SSukumar Swaminathan 		if (!(hba->sli.sli3.hc_copy & HC_LAINT_ENA)) {
153782527734SSukumar Swaminathan 			hba->sli.sli3.hc_copy |= HC_LAINT_ENA;
153882527734SSukumar Swaminathan 			WRITE_CSR_REG(hba, FC_HC_REG(hba),
153982527734SSukumar Swaminathan 			    hba->sli.sli3.hc_copy);
154082527734SSukumar Swaminathan #ifdef FMA_SUPPORT
154182527734SSukumar Swaminathan 			/* Access handle validation */
154282527734SSukumar Swaminathan 			EMLXS_CHK_ACC_HANDLE(hba,
154382527734SSukumar Swaminathan 			    hba->sli.sli3.csr_acc_handle);
154482527734SSukumar Swaminathan #endif  /* FMA_SUPPORT */
154582527734SSukumar Swaminathan 		}
1546291a2b48SSukumar Swaminathan 
154782527734SSukumar Swaminathan 		mutex_exit(&EMLXS_PORT_LOCK);
154882527734SSukumar Swaminathan 		return (0);
154982527734SSukumar Swaminathan 	}
1550a9800bebSGarrett D'Amore 	bcopy((void *)&mb->un.varReadLA, (void *)&la, sizeof (READ_LA_VAR));
1551fcf3ce44SJohn Forte 
155282527734SSukumar Swaminathan 	mp = (MATCHMAP *)mbq->bp;
155382527734SSukumar Swaminathan 	if (mp) {
155482527734SSukumar Swaminathan 		bcopy((caddr_t)mp->virt, (caddr_t)port->alpa_map, 128);
155582527734SSukumar Swaminathan 	} else {
155682527734SSukumar Swaminathan 		bzero((caddr_t)port->alpa_map, 128);
155782527734SSukumar Swaminathan 	}
1558291a2b48SSukumar Swaminathan 
155982527734SSukumar Swaminathan 	if (la.attType == AT_LINK_UP) {
156082527734SSukumar Swaminathan 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_linkup_atten_msg,
156182527734SSukumar Swaminathan 		    "tag=%d -> %d  ALPA=%x",
156282527734SSukumar Swaminathan 		    (uint32_t)hba->link_event_tag,
156382527734SSukumar Swaminathan 		    (uint32_t)la.eventTag,
156482527734SSukumar Swaminathan 		    (uint32_t)la.granted_AL_PA);
156582527734SSukumar Swaminathan 	} else {
156682527734SSukumar Swaminathan 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_linkdown_atten_msg,
156782527734SSukumar Swaminathan 		    "tag=%d -> %d  ALPA=%x",
156882527734SSukumar Swaminathan 		    (uint32_t)hba->link_event_tag,
156982527734SSukumar Swaminathan 		    (uint32_t)la.eventTag,
157082527734SSukumar Swaminathan 		    (uint32_t)la.granted_AL_PA);
157182527734SSukumar Swaminathan 	}
1572fcf3ce44SJohn Forte 
157382527734SSukumar Swaminathan 	if (la.pb) {
157482527734SSukumar Swaminathan 		hba->flag |= FC_BYPASSED_MODE;
157582527734SSukumar Swaminathan 	} else {
157682527734SSukumar Swaminathan 		hba->flag &= ~FC_BYPASSED_MODE;
157782527734SSukumar Swaminathan 	}
1578fcf3ce44SJohn Forte 
157982527734SSukumar Swaminathan 	if (hba->link_event_tag == la.eventTag) {
158082527734SSukumar Swaminathan 		HBASTATS.LinkMultiEvent++;
158182527734SSukumar Swaminathan 	} else if (hba->link_event_tag + 1 < la.eventTag) {
158282527734SSukumar Swaminathan 		HBASTATS.LinkMultiEvent++;
1583291a2b48SSukumar Swaminathan 
158482527734SSukumar Swaminathan 		/* Make sure link is declared down */
158582527734SSukumar Swaminathan 		emlxs_linkdown(hba);
158682527734SSukumar Swaminathan 	}
1587291a2b48SSukumar Swaminathan 
158882527734SSukumar Swaminathan 	hba->link_event_tag = la.eventTag;
158982527734SSukumar Swaminathan 	port->lip_type = 0;
1590291a2b48SSukumar Swaminathan 
159182527734SSukumar Swaminathan 	/* If link not already up then declare it up now */
159282527734SSukumar Swaminathan 	if ((la.attType == AT_LINK_UP) && (hba->state < FC_LINK_UP)) {
1593291a2b48SSukumar Swaminathan 
159482527734SSukumar Swaminathan #ifdef MENLO_SUPPORT
1595*a3170057SPaul Winder 		if (hba->model_info.vendor_id == PCI_VENDOR_ID_EMULEX &&
1596*a3170057SPaul Winder 		    hba->model_info.device_id == PCI_DEVICE_ID_HORNET &&
159782527734SSukumar Swaminathan 		    (hba->flag & (FC_ILB_MODE | FC_ELB_MODE))) {
159882527734SSukumar Swaminathan 			la.topology = TOPOLOGY_LOOP;
159982527734SSukumar Swaminathan 			la.granted_AL_PA = 0;
160082527734SSukumar Swaminathan 			port->alpa_map[0] = 1;
160182527734SSukumar Swaminathan 			port->alpa_map[1] = 0;
160282527734SSukumar Swaminathan 			la.lipType = LT_PORT_INIT;
160382527734SSukumar Swaminathan 		}
160482527734SSukumar Swaminathan #endif /* MENLO_SUPPORT */
160582527734SSukumar Swaminathan 		/* Save the linkspeed */
160682527734SSukumar Swaminathan 		hba->linkspeed = la.UlnkSpeed;
160782527734SSukumar Swaminathan 
160882527734SSukumar Swaminathan 		/* Check for old model adapters that only */
160982527734SSukumar Swaminathan 		/* supported 1Gb */
161082527734SSukumar Swaminathan 		if ((hba->linkspeed == 0) &&
161182527734SSukumar Swaminathan 		    (hba->model_info.chip & EMLXS_DRAGONFLY_CHIP)) {
161282527734SSukumar Swaminathan 			hba->linkspeed = LA_1GHZ_LINK;
161382527734SSukumar Swaminathan 		}
1614291a2b48SSukumar Swaminathan 
161582527734SSukumar Swaminathan 		if ((hba->topology = la.topology) == TOPOLOGY_LOOP) {
16168f23e9faSHans Rosenfeld 			port->granted_alpa = la.granted_AL_PA;
16178f23e9faSHans Rosenfeld 			port->did = port->granted_alpa;
161882527734SSukumar Swaminathan 			port->lip_type = la.lipType;
161982527734SSukumar Swaminathan 			if (hba->flag & FC_SLIM2_MODE) {
162082527734SSukumar Swaminathan 				i = la.un.lilpBde64.tus.f.bdeSize;
162182527734SSukumar Swaminathan 			} else {
162282527734SSukumar Swaminathan 				i = la.un.lilpBde.bdeSize;
162382527734SSukumar Swaminathan 			}
1624291a2b48SSukumar Swaminathan 
162582527734SSukumar Swaminathan 			if (i == 0) {
162682527734SSukumar Swaminathan 				port->alpa_map[0] = 0;
162782527734SSukumar Swaminathan 			} else {
162882527734SSukumar Swaminathan 				uint8_t *alpa_map;
162982527734SSukumar Swaminathan 				uint32_t j;
163082527734SSukumar Swaminathan 
163182527734SSukumar Swaminathan 				/* Check number of devices in map */
163282527734SSukumar Swaminathan 				if (port->alpa_map[0] > 127) {
163382527734SSukumar Swaminathan 					port->alpa_map[0] = 127;
163482527734SSukumar Swaminathan 				}
163582527734SSukumar Swaminathan 
163682527734SSukumar Swaminathan 				alpa_map = (uint8_t *)port->alpa_map;
163782527734SSukumar Swaminathan 
163882527734SSukumar Swaminathan 				EMLXS_MSGF(EMLXS_CONTEXT,
163982527734SSukumar Swaminathan 				    &emlxs_link_atten_msg,
164082527734SSukumar Swaminathan 				    "alpa_map: %d device(s):      "
164182527734SSukumar Swaminathan 				    "%02x %02x %02x %02x %02x %02x "
164282527734SSukumar Swaminathan 				    "%02x", alpa_map[0], alpa_map[1],
164382527734SSukumar Swaminathan 				    alpa_map[2], alpa_map[3],
164482527734SSukumar Swaminathan 				    alpa_map[4], alpa_map[5],
164582527734SSukumar Swaminathan 				    alpa_map[6], alpa_map[7]);
164682527734SSukumar Swaminathan 
164782527734SSukumar Swaminathan 				for (j = 8; j <= alpa_map[0]; j += 8) {
164882527734SSukumar Swaminathan 					EMLXS_MSGF(EMLXS_CONTEXT,
164982527734SSukumar Swaminathan 					    &emlxs_link_atten_msg,
165082527734SSukumar Swaminathan 					    "alpa_map:             "
165182527734SSukumar Swaminathan 					    "%02x %02x %02x %02x %02x "
165282527734SSukumar Swaminathan 					    "%02x %02x %02x",
165382527734SSukumar Swaminathan 					    alpa_map[j],
165482527734SSukumar Swaminathan 					    alpa_map[j + 1],
165582527734SSukumar Swaminathan 					    alpa_map[j + 2],
165682527734SSukumar Swaminathan 					    alpa_map[j + 3],
165782527734SSukumar Swaminathan 					    alpa_map[j + 4],
165882527734SSukumar Swaminathan 					    alpa_map[j + 5],
165982527734SSukumar Swaminathan 					    alpa_map[j + 6],
166082527734SSukumar Swaminathan 					    alpa_map[j + 7]);
166182527734SSukumar Swaminathan 				}
166282527734SSukumar Swaminathan 			}
166382527734SSukumar Swaminathan 		}
166482527734SSukumar Swaminathan #ifdef MENLO_SUPPORT
166582527734SSukumar Swaminathan 		/* Check if Menlo maintenance mode is enabled */
1666*a3170057SPaul Winder 		if (hba->model_info.vendor_id == PCI_VENDOR_ID_EMULEX &&
1667*a3170057SPaul Winder 		    hba->model_info.device_id == PCI_DEVICE_ID_HORNET) {
166882527734SSukumar Swaminathan 			if (la.mm == 1) {
166982527734SSukumar Swaminathan 				EMLXS_MSGF(EMLXS_CONTEXT,
167082527734SSukumar Swaminathan 				    &emlxs_link_atten_msg,
167182527734SSukumar Swaminathan 				    "Maintenance Mode enabled.");
167282527734SSukumar Swaminathan 
167382527734SSukumar Swaminathan 				mutex_enter(&EMLXS_PORT_LOCK);
167482527734SSukumar Swaminathan 				hba->flag |= FC_MENLO_MODE;
167582527734SSukumar Swaminathan 				mutex_exit(&EMLXS_PORT_LOCK);
167682527734SSukumar Swaminathan 
167782527734SSukumar Swaminathan 				mutex_enter(&EMLXS_LINKUP_LOCK);
167882527734SSukumar Swaminathan 				cv_broadcast(&EMLXS_LINKUP_CV);
167982527734SSukumar Swaminathan 				mutex_exit(&EMLXS_LINKUP_LOCK);
168082527734SSukumar Swaminathan 			} else {
168182527734SSukumar Swaminathan 				EMLXS_MSGF(EMLXS_CONTEXT,
168282527734SSukumar Swaminathan 				    &emlxs_link_atten_msg,
168382527734SSukumar Swaminathan 				    "Maintenance Mode disabled.");
168482527734SSukumar Swaminathan 			}
1685291a2b48SSukumar Swaminathan 
168682527734SSukumar Swaminathan 			/* Check FCoE attention bit */
168782527734SSukumar Swaminathan 			if (la.fa == 1) {
168882527734SSukumar Swaminathan 				emlxs_thread_spawn(hba,
168982527734SSukumar Swaminathan 				    emlxs_fcoe_attention_thread,
1690a9800bebSGarrett D'Amore 				    0, 0);
169182527734SSukumar Swaminathan 			}
169282527734SSukumar Swaminathan 		}
169382527734SSukumar Swaminathan #endif /* MENLO_SUPPORT */
1694fcf3ce44SJohn Forte 
169582527734SSukumar Swaminathan 		if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba,
16968f23e9faSHans Rosenfeld 		    MEM_MBOX))) {
169782527734SSukumar Swaminathan 			/* This should turn on DELAYED ABTS for */
169882527734SSukumar Swaminathan 			/* ELS timeouts */
169982527734SSukumar Swaminathan 			emlxs_mb_set_var(hba, mbox, 0x00052198, 0x1);
1700fcf3ce44SJohn Forte 
170182527734SSukumar Swaminathan 			emlxs_mb_put(hba, mbox);
170282527734SSukumar Swaminathan 		}
1703fcf3ce44SJohn Forte 
170482527734SSukumar Swaminathan 		if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba,
17058f23e9faSHans Rosenfeld 		    MEM_MBOX))) {
170682527734SSukumar Swaminathan 			/* If link not already down then */
170782527734SSukumar Swaminathan 			/* declare it down now */
170882527734SSukumar Swaminathan 			if (emlxs_mb_read_sparam(hba, mbox) == 0) {
170982527734SSukumar Swaminathan 				emlxs_mb_put(hba, mbox);
171082527734SSukumar Swaminathan 			} else {
1711a9800bebSGarrett D'Amore 				emlxs_mem_put(hba, MEM_MBOX,
1712a9800bebSGarrett D'Amore 				    (void *)mbox);
171382527734SSukumar Swaminathan 			}
171482527734SSukumar Swaminathan 		}
171582527734SSukumar Swaminathan 
171682527734SSukumar Swaminathan 		if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba,
17178f23e9faSHans Rosenfeld 		    MEM_MBOX))) {
171882527734SSukumar Swaminathan 			emlxs_mb_config_link(hba, mbox);
1719fcf3ce44SJohn Forte 
172082527734SSukumar Swaminathan 			emlxs_mb_put(hba, mbox);
172182527734SSukumar Swaminathan 		}
1722fcf3ce44SJohn Forte 
172382527734SSukumar Swaminathan 		/* Declare the linkup here */
172482527734SSukumar Swaminathan 		emlxs_linkup(hba);
1725fcf3ce44SJohn Forte 	}
1726fcf3ce44SJohn Forte 
172782527734SSukumar Swaminathan 	/* If link not already down then declare it down now */
172882527734SSukumar Swaminathan 	else if (la.attType == AT_LINK_DOWN) {
172982527734SSukumar Swaminathan 		/* Make sure link is declared down */
173082527734SSukumar Swaminathan 		emlxs_linkdown(hba);
173182527734SSukumar Swaminathan 	}
1732fcf3ce44SJohn Forte 
173382527734SSukumar Swaminathan 	/* Enable Link attention interrupt */
173482527734SSukumar Swaminathan 	mutex_enter(&EMLXS_PORT_LOCK);
1735fcf3ce44SJohn Forte 
173682527734SSukumar Swaminathan 	if (!(hba->sli.sli3.hc_copy & HC_LAINT_ENA)) {
173782527734SSukumar Swaminathan 		hba->sli.sli3.hc_copy |= HC_LAINT_ENA;
173882527734SSukumar Swaminathan 		WRITE_CSR_REG(hba, FC_HC_REG(hba), hba->sli.sli3.hc_copy);
173982527734SSukumar Swaminathan #ifdef FMA_SUPPORT
174082527734SSukumar Swaminathan 		/* Access handle validation */
174182527734SSukumar Swaminathan 		EMLXS_CHK_ACC_HANDLE(hba, hba->sli.sli3.csr_acc_handle);
174282527734SSukumar Swaminathan #endif  /* FMA_SUPPORT */
174382527734SSukumar Swaminathan 	}
1744fcf3ce44SJohn Forte 
174582527734SSukumar Swaminathan 	mutex_exit(&EMLXS_PORT_LOCK);
1746fcf3ce44SJohn Forte 
1747fcf3ce44SJohn Forte 	return (0);
174882527734SSukumar Swaminathan 
1749a9800bebSGarrett D'Amore } /* emlxs_read_la_mbcmpl() */
1750fcf3ce44SJohn Forte 
1751fcf3ce44SJohn Forte 
1752fcf3ce44SJohn Forte extern uint32_t
175382527734SSukumar Swaminathan emlxs_mb_read_la(emlxs_hba_t *hba, MAILBOXQ *mbq)
1754fcf3ce44SJohn Forte {
175582527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
1756fcf3ce44SJohn Forte 	MATCHMAP *mp;
1757fcf3ce44SJohn Forte 
1758291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1759fcf3ce44SJohn Forte 
17608f23e9faSHans Rosenfeld 	if ((mp = (MATCHMAP *)emlxs_mem_get(hba, MEM_BUF)) == 0) {
1761fcf3ce44SJohn Forte 		mb->mbxCommand = MBX_READ_LA64;
1762fcf3ce44SJohn Forte 
1763fcf3ce44SJohn Forte 		return (1);
1764fcf3ce44SJohn Forte 	}
1765291a2b48SSukumar Swaminathan 
1766fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_READ_LA64;
1767fcf3ce44SJohn Forte 	mb->un.varReadLA.un.lilpBde64.tus.f.bdeSize = 128;
176882527734SSukumar Swaminathan 	mb->un.varReadLA.un.lilpBde64.addrHigh = PADDR_HI(mp->phys);
176982527734SSukumar Swaminathan 	mb->un.varReadLA.un.lilpBde64.addrLow = PADDR_LO(mp->phys);
1770fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
1771a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = emlxs_read_la_mbcmpl;
1772a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1773fcf3ce44SJohn Forte 
1774fcf3ce44SJohn Forte 	/*
1775fcf3ce44SJohn Forte 	 * save address for completion
1776fcf3ce44SJohn Forte 	 */
1777a9800bebSGarrett D'Amore 	mbq->bp = (void *)mp;
1778fcf3ce44SJohn Forte 
1779fcf3ce44SJohn Forte 	return (0);
1780fcf3ce44SJohn Forte 
1781fcf3ce44SJohn Forte } /* emlxs_mb_read_la() */
1782fcf3ce44SJohn Forte 
1783fcf3ce44SJohn Forte 
1784a9800bebSGarrett D'Amore /* SLI3 */
1785a9800bebSGarrett D'Amore static uint32_t
1786a9800bebSGarrett D'Amore emlxs_clear_la_mbcmpl(emlxs_hba_t *hba, MAILBOXQ *mbq)
178782527734SSukumar Swaminathan {
1788a9800bebSGarrett D'Amore 	emlxs_port_t *port = (emlxs_port_t *)mbq->port;
178982527734SSukumar Swaminathan 	MAILBOX *mb;
179082527734SSukumar Swaminathan 	MAILBOXQ *mbox;
179182527734SSukumar Swaminathan 	emlxs_port_t *vport;
179282527734SSukumar Swaminathan 	uint32_t la_enable;
179382527734SSukumar Swaminathan 	int i, rc;
179482527734SSukumar Swaminathan 
179582527734SSukumar Swaminathan 	mb = (MAILBOX *)mbq;
179682527734SSukumar Swaminathan 	if (mb->mbxStatus) {
179782527734SSukumar Swaminathan 		la_enable = 1;
179882527734SSukumar Swaminathan 
179982527734SSukumar Swaminathan 		if (mb->mbxStatus == 0x1601) {
180082527734SSukumar Swaminathan 			/* Get a buffer which will be used for */
180182527734SSukumar Swaminathan 			/* mailbox commands */
180282527734SSukumar Swaminathan 			if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba,
18038f23e9faSHans Rosenfeld 			    MEM_MBOX))) {
180482527734SSukumar Swaminathan 				/* Get link attention message */
180582527734SSukumar Swaminathan 				if (emlxs_mb_read_la(hba, mbox) == 0) {
180682527734SSukumar Swaminathan 					rc =  EMLXS_SLI_ISSUE_MBOX_CMD(hba,
180782527734SSukumar Swaminathan 					    (MAILBOX *)mbox, MBX_NOWAIT, 0);
180882527734SSukumar Swaminathan 					if ((rc != MBX_BUSY) &&
180982527734SSukumar Swaminathan 					    (rc != MBX_SUCCESS)) {
1810a9800bebSGarrett D'Amore 						emlxs_mem_put(hba,
1811a9800bebSGarrett D'Amore 						    MEM_MBOX, (void *)mbox);
181282527734SSukumar Swaminathan 					}
181382527734SSukumar Swaminathan 					la_enable = 0;
181482527734SSukumar Swaminathan 				} else {
1815a9800bebSGarrett D'Amore 					emlxs_mem_put(hba, MEM_MBOX,
1816a9800bebSGarrett D'Amore 					    (void *)mbox);
181782527734SSukumar Swaminathan 				}
181882527734SSukumar Swaminathan 			}
181982527734SSukumar Swaminathan 		}
182082527734SSukumar Swaminathan 
182182527734SSukumar Swaminathan 		mutex_enter(&EMLXS_PORT_LOCK);
182282527734SSukumar Swaminathan 		if (la_enable) {
182382527734SSukumar Swaminathan 			if (!(hba->sli.sli3.hc_copy & HC_LAINT_ENA)) {
182482527734SSukumar Swaminathan 				/* Enable Link Attention interrupts */
182582527734SSukumar Swaminathan 				hba->sli.sli3.hc_copy |= HC_LAINT_ENA;
182682527734SSukumar Swaminathan 				WRITE_CSR_REG(hba, FC_HC_REG(hba),
182782527734SSukumar Swaminathan 				    hba->sli.sli3.hc_copy);
182882527734SSukumar Swaminathan #ifdef FMA_SUPPORT
182982527734SSukumar Swaminathan 				/* Access handle validation */
183082527734SSukumar Swaminathan 				EMLXS_CHK_ACC_HANDLE(hba,
183182527734SSukumar Swaminathan 				    hba->sli.sli3.csr_acc_handle);
183282527734SSukumar Swaminathan #endif  /* FMA_SUPPORT */
183382527734SSukumar Swaminathan 			}
183482527734SSukumar Swaminathan 		} else {
183582527734SSukumar Swaminathan 			if (hba->sli.sli3.hc_copy & HC_LAINT_ENA) {
183682527734SSukumar Swaminathan 				/* Disable Link Attention interrupts */
183782527734SSukumar Swaminathan 				hba->sli.sli3.hc_copy &= ~HC_LAINT_ENA;
183882527734SSukumar Swaminathan 				WRITE_CSR_REG(hba, FC_HC_REG(hba),
183982527734SSukumar Swaminathan 				    hba->sli.sli3.hc_copy);
184082527734SSukumar Swaminathan #ifdef FMA_SUPPORT
184182527734SSukumar Swaminathan 				/* Access handle validation */
184282527734SSukumar Swaminathan 				EMLXS_CHK_ACC_HANDLE(hba,
184382527734SSukumar Swaminathan 				    hba->sli.sli3.csr_acc_handle);
184482527734SSukumar Swaminathan #endif  /* FMA_SUPPORT */
184582527734SSukumar Swaminathan 			}
184682527734SSukumar Swaminathan 		}
184782527734SSukumar Swaminathan 		mutex_exit(&EMLXS_PORT_LOCK);
184882527734SSukumar Swaminathan 
184982527734SSukumar Swaminathan 		return (0);
185082527734SSukumar Swaminathan 	}
185182527734SSukumar Swaminathan 	/* Enable on Link Attention interrupts */
185282527734SSukumar Swaminathan 	mutex_enter(&EMLXS_PORT_LOCK);
185382527734SSukumar Swaminathan 
185482527734SSukumar Swaminathan 	if (!(hba->sli.sli3.hc_copy & HC_LAINT_ENA)) {
185582527734SSukumar Swaminathan 		hba->sli.sli3.hc_copy |= HC_LAINT_ENA;
185682527734SSukumar Swaminathan 		WRITE_CSR_REG(hba, FC_HC_REG(hba), hba->sli.sli3.hc_copy);
185782527734SSukumar Swaminathan #ifdef FMA_SUPPORT
185882527734SSukumar Swaminathan 		/* Access handle validation */
185982527734SSukumar Swaminathan 		EMLXS_CHK_ACC_HANDLE(hba, hba->sli.sli3.csr_acc_handle);
186082527734SSukumar Swaminathan #endif  /* FMA_SUPPORT */
186182527734SSukumar Swaminathan 	}
186282527734SSukumar Swaminathan 
186382527734SSukumar Swaminathan 	if (hba->state >= FC_LINK_UP) {
186482527734SSukumar Swaminathan 		EMLXS_STATE_CHANGE_LOCKED(hba, FC_READY);
186582527734SSukumar Swaminathan 	}
186682527734SSukumar Swaminathan 
186782527734SSukumar Swaminathan 	mutex_exit(&EMLXS_PORT_LOCK);
186882527734SSukumar Swaminathan 
186982527734SSukumar Swaminathan 	/* Adapter is now ready for FCP traffic */
187082527734SSukumar Swaminathan 	if (hba->state == FC_READY) {
1871a9800bebSGarrett D'Amore 
187282527734SSukumar Swaminathan 		/* Register vpi's for all ports that have did's */
187382527734SSukumar Swaminathan 		for (i = 0; i < MAX_VPORTS; i++) {
187482527734SSukumar Swaminathan 			vport = &VPORT(i);
187582527734SSukumar Swaminathan 
187682527734SSukumar Swaminathan 			if (!(vport->flag & EMLXS_PORT_BOUND) ||
187782527734SSukumar Swaminathan 			    !(vport->did)) {
187882527734SSukumar Swaminathan 				continue;
187982527734SSukumar Swaminathan 			}
188082527734SSukumar Swaminathan 
188182527734SSukumar Swaminathan 			(void) emlxs_mb_reg_vpi(vport, NULL);
188282527734SSukumar Swaminathan 		}
188382527734SSukumar Swaminathan 
188482527734SSukumar Swaminathan 		/* Attempt to send any pending IO */
188582527734SSukumar Swaminathan 		EMLXS_SLI_ISSUE_IOCB_CMD(hba, &hba->chan[hba->channel_fcp], 0);
188682527734SSukumar Swaminathan 	}
188782527734SSukumar Swaminathan 	return (0);
188882527734SSukumar Swaminathan 
1889a9800bebSGarrett D'Amore } /* emlxs_clear_la_mbcmpl() */
189082527734SSukumar Swaminathan 
189182527734SSukumar Swaminathan 
1892a9800bebSGarrett D'Amore /* SLI3 */
1893fcf3ce44SJohn Forte extern void
189482527734SSukumar Swaminathan emlxs_mb_clear_la(emlxs_hba_t *hba, MAILBOXQ *mbq)
1895fcf3ce44SJohn Forte {
189682527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
189782527734SSukumar Swaminathan 
1898fcf3ce44SJohn Forte #ifdef FC_RPI_CHECK
1899fcf3ce44SJohn Forte 	emlxs_rpi_check(hba);
1900fcf3ce44SJohn Forte #endif	/* FC_RPI_CHECK */
1901fcf3ce44SJohn Forte 
1902291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1903fcf3ce44SJohn Forte 
1904fcf3ce44SJohn Forte 	mb->un.varClearLA.eventTag = hba->link_event_tag;
1905fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_CLEAR_LA;
1906fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
1907a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = emlxs_clear_la_mbcmpl;
1908a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1909fcf3ce44SJohn Forte 
1910fcf3ce44SJohn Forte 	return;
1911fcf3ce44SJohn Forte 
191282527734SSukumar Swaminathan } /* emlxs_mb_clear_la() */
1913fcf3ce44SJohn Forte 
1914fcf3ce44SJohn Forte 
1915fcf3ce44SJohn Forte /*
1916291a2b48SSukumar Swaminathan  * emlxs_mb_read_status  Issue a READ STATUS mailbox command
1917fcf3ce44SJohn Forte  */
1918291a2b48SSukumar Swaminathan /*ARGSUSED*/
1919fcf3ce44SJohn Forte extern void
192082527734SSukumar Swaminathan emlxs_mb_read_status(emlxs_hba_t *hba, MAILBOXQ *mbq)
1921fcf3ce44SJohn Forte {
192282527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
192382527734SSukumar Swaminathan 
1924291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1925fcf3ce44SJohn Forte 
1926fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_READ_STATUS;
1927fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
192882527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1929a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
193082527734SSukumar Swaminathan 
193182527734SSukumar Swaminathan } /* fc_read_status() */
193282527734SSukumar Swaminathan 
1933fcf3ce44SJohn Forte 
1934fcf3ce44SJohn Forte /*
1935291a2b48SSukumar Swaminathan  * emlxs_mb_read_lnk_stat  Issue a LINK STATUS mailbox command
1936fcf3ce44SJohn Forte  */
1937291a2b48SSukumar Swaminathan /*ARGSUSED*/
1938fcf3ce44SJohn Forte extern void
193982527734SSukumar Swaminathan emlxs_mb_read_lnk_stat(emlxs_hba_t *hba, MAILBOXQ *mbq)
1940fcf3ce44SJohn Forte {
194182527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
194282527734SSukumar Swaminathan 
1943291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1944fcf3ce44SJohn Forte 
1945fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_READ_LNK_STAT;
1946fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
194782527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1948a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
194982527734SSukumar Swaminathan 
195082527734SSukumar Swaminathan } /* emlxs_mb_read_lnk_stat() */
1951fcf3ce44SJohn Forte 
1952fcf3ce44SJohn Forte 
1953fcf3ce44SJohn Forte 
195482527734SSukumar Swaminathan 
1955fcf3ce44SJohn Forte 
1956fcf3ce44SJohn Forte 
1957fcf3ce44SJohn Forte /*
1958291a2b48SSukumar Swaminathan  * emlxs_mb_config_ring  Issue a CONFIG RING mailbox command
1959fcf3ce44SJohn Forte  */
1960fcf3ce44SJohn Forte extern void
196182527734SSukumar Swaminathan emlxs_mb_config_ring(emlxs_hba_t *hba, int32_t ring, MAILBOXQ *mbq)
1962fcf3ce44SJohn Forte {
196382527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
1964fcf3ce44SJohn Forte 	int32_t i;
1965fcf3ce44SJohn Forte 	int32_t j;
1966fcf3ce44SJohn Forte 
1967291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
1968fcf3ce44SJohn Forte 
1969fcf3ce44SJohn Forte 	j = 0;
1970fcf3ce44SJohn Forte 	for (i = 0; i < ring; i++) {
197182527734SSukumar Swaminathan 		j += hba->sli.sli3.ring_masks[i];
1972fcf3ce44SJohn Forte 	}
1973fcf3ce44SJohn Forte 
197482527734SSukumar Swaminathan 	for (i = 0; i < hba->sli.sli3.ring_masks[ring]; i++) {
1975fcf3ce44SJohn Forte 		if ((j + i) >= 6) {
1976fcf3ce44SJohn Forte 			break;
1977fcf3ce44SJohn Forte 		}
1978291a2b48SSukumar Swaminathan 
197982527734SSukumar Swaminathan 		mb->un.varCfgRing.rrRegs[i].rval  =
198082527734SSukumar Swaminathan 		    hba->sli.sli3.ring_rval[j + i];
198182527734SSukumar Swaminathan 		mb->un.varCfgRing.rrRegs[i].rmask =
198282527734SSukumar Swaminathan 		    hba->sli.sli3.ring_rmask[j + i];
198382527734SSukumar Swaminathan 		mb->un.varCfgRing.rrRegs[i].tval  =
198482527734SSukumar Swaminathan 		    hba->sli.sli3.ring_tval[j + i];
198582527734SSukumar Swaminathan 		mb->un.varCfgRing.rrRegs[i].tmask =
198682527734SSukumar Swaminathan 		    hba->sli.sli3.ring_tmask[j + i];
1987fcf3ce44SJohn Forte 	}
1988fcf3ce44SJohn Forte 
1989fcf3ce44SJohn Forte 	mb->un.varCfgRing.ring = ring;
1990fcf3ce44SJohn Forte 	mb->un.varCfgRing.profile = 0;
1991fcf3ce44SJohn Forte 	mb->un.varCfgRing.maxOrigXchg = 0;
1992fcf3ce44SJohn Forte 	mb->un.varCfgRing.maxRespXchg = 0;
1993fcf3ce44SJohn Forte 	mb->un.varCfgRing.recvNotify = 1;
199482527734SSukumar Swaminathan 	mb->un.varCfgRing.numMask = hba->sli.sli3.ring_masks[ring];
1995fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_CONFIG_RING;
1996fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
199782527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
1998a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
1999fcf3ce44SJohn Forte 
2000fcf3ce44SJohn Forte 	return;
2001fcf3ce44SJohn Forte 
200282527734SSukumar Swaminathan } /* emlxs_mb_config_ring() */
2003fcf3ce44SJohn Forte 
2004fcf3ce44SJohn Forte 
2005fcf3ce44SJohn Forte /*
2006291a2b48SSukumar Swaminathan  *  emlxs_mb_config_link  Issue a CONFIG LINK mailbox command
2007fcf3ce44SJohn Forte  */
2008fcf3ce44SJohn Forte extern void
200982527734SSukumar Swaminathan emlxs_mb_config_link(emlxs_hba_t *hba, MAILBOXQ *mbq)
2010fcf3ce44SJohn Forte {
201182527734SSukumar Swaminathan 	MAILBOX	*mb = (MAILBOX *)mbq;
2012291a2b48SSukumar Swaminathan 	emlxs_port_t   *port = &PPORT;
2013fcf3ce44SJohn Forte 	emlxs_config_t *cfg = &CFG;
2014fcf3ce44SJohn Forte 
2015291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2016fcf3ce44SJohn Forte 
2017fcf3ce44SJohn Forte 	/*
2018fcf3ce44SJohn Forte 	 * NEW_FEATURE SLI-2, Coalescing Response Feature.
2019fcf3ce44SJohn Forte 	 */
2020fcf3ce44SJohn Forte 	if (cfg[CFG_CR_DELAY].current) {
2021fcf3ce44SJohn Forte 		mb->un.varCfgLnk.cr = 1;
2022fcf3ce44SJohn Forte 		mb->un.varCfgLnk.ci = 1;
2023fcf3ce44SJohn Forte 		mb->un.varCfgLnk.cr_delay = cfg[CFG_CR_DELAY].current;
2024fcf3ce44SJohn Forte 		mb->un.varCfgLnk.cr_count = cfg[CFG_CR_COUNT].current;
2025fcf3ce44SJohn Forte 	}
2026291a2b48SSukumar Swaminathan 
20278f23e9faSHans Rosenfeld 	if (cfg[CFG_ACK0].current) {
2028fcf3ce44SJohn Forte 		mb->un.varCfgLnk.ack0_enable = 1;
20298f23e9faSHans Rosenfeld 	}
2030fcf3ce44SJohn Forte 
2031fcf3ce44SJohn Forte 	mb->un.varCfgLnk.myId = port->did;
2032fcf3ce44SJohn Forte 	mb->un.varCfgLnk.edtov = hba->fc_edtov;
2033fcf3ce44SJohn Forte 	mb->un.varCfgLnk.arbtov = hba->fc_arbtov;
2034fcf3ce44SJohn Forte 	mb->un.varCfgLnk.ratov = hba->fc_ratov;
2035fcf3ce44SJohn Forte 	mb->un.varCfgLnk.rttov = hba->fc_rttov;
2036fcf3ce44SJohn Forte 	mb->un.varCfgLnk.altov = hba->fc_altov;
2037fcf3ce44SJohn Forte 	mb->un.varCfgLnk.crtov = hba->fc_crtov;
2038fcf3ce44SJohn Forte 	mb->un.varCfgLnk.citov = hba->fc_citov;
2039fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_CONFIG_LINK;
2040fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
204182527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL;
2042a9800bebSGarrett D'Amore 	mbq->port = (void *)port;
2043fcf3ce44SJohn Forte 
2044fcf3ce44SJohn Forte 	return;
2045fcf3ce44SJohn Forte 
2046fcf3ce44SJohn Forte } /* emlxs_mb_config_link() */
2047fcf3ce44SJohn Forte 
2048fcf3ce44SJohn Forte 
2049a9800bebSGarrett D'Amore static uint32_t
2050a9800bebSGarrett D'Amore emlxs_init_link_mbcmpl(emlxs_hba_t *hba, MAILBOXQ *mbq)
205182527734SSukumar Swaminathan {
2052a9800bebSGarrett D'Amore 	emlxs_port_t *port = (emlxs_port_t *)mbq->port;
205382527734SSukumar Swaminathan 	emlxs_config_t	*cfg = &CFG;
205482527734SSukumar Swaminathan 	MAILBOX *mb;
205582527734SSukumar Swaminathan 
205682527734SSukumar Swaminathan 	mb = (MAILBOX *)mbq;
205782527734SSukumar Swaminathan 	if (mb->mbxStatus) {
205882527734SSukumar Swaminathan 		if ((hba->flag & FC_SLIM2_MODE) &&
205982527734SSukumar Swaminathan 		    (hba->mbox_queue_flag == MBX_NOWAIT)) {
206082527734SSukumar Swaminathan 			/* Retry only MBX_NOWAIT requests */
206182527734SSukumar Swaminathan 
206282527734SSukumar Swaminathan 			if ((cfg[CFG_LINK_SPEED].current > 0) &&
206382527734SSukumar Swaminathan 			    ((mb->mbxStatus == 0x0011) ||
206482527734SSukumar Swaminathan 			    (mb->mbxStatus == 0x0500))) {
206582527734SSukumar Swaminathan 
206682527734SSukumar Swaminathan 				EMLXS_MSGF(EMLXS_CONTEXT,
206782527734SSukumar Swaminathan 				    &emlxs_mbox_event_msg,
206882527734SSukumar Swaminathan 				    "Retrying.  %s: status=%x. Auto-speed set.",
206982527734SSukumar Swaminathan 				    emlxs_mb_cmd_xlate(mb->mbxCommand),
207082527734SSukumar Swaminathan 				    (uint32_t)mb->mbxStatus);
207182527734SSukumar Swaminathan 
207282527734SSukumar Swaminathan 				mb->un.varInitLnk.link_flags &=
207382527734SSukumar Swaminathan 				    ~FLAGS_LINK_SPEED;
207482527734SSukumar Swaminathan 				mb->un.varInitLnk.link_speed = 0;
207582527734SSukumar Swaminathan 
207682527734SSukumar Swaminathan 				emlxs_mb_retry(hba, mbq);
207782527734SSukumar Swaminathan 				return (1);
207882527734SSukumar Swaminathan 			}
207982527734SSukumar Swaminathan 		}
208082527734SSukumar Swaminathan 	}
208182527734SSukumar Swaminathan 	return (0);
208282527734SSukumar Swaminathan 
2083a9800bebSGarrett D'Amore } /* emlxs_init_link_mbcmpl() */
208482527734SSukumar Swaminathan 
208582527734SSukumar Swaminathan 
2086fcf3ce44SJohn Forte /*
2087291a2b48SSukumar Swaminathan  *  emlxs_mb_init_link  Issue an INIT LINK mailbox command
2088fcf3ce44SJohn Forte  */
2089fcf3ce44SJohn Forte extern void
209082527734SSukumar Swaminathan emlxs_mb_init_link(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t topology,
2091fcf3ce44SJohn Forte     uint32_t linkspeed)
2092fcf3ce44SJohn Forte {
209382527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
2094291a2b48SSukumar Swaminathan 	emlxs_vpd_t	*vpd = &VPD;
2095291a2b48SSukumar Swaminathan 	emlxs_config_t	*cfg = &CFG;
2096fcf3ce44SJohn Forte 
20978f23e9faSHans Rosenfeld 	if ((hba->sli_mode == EMLXS_HBA_SLI4_MODE) &&
20988f23e9faSHans Rosenfeld 	    (SLI4_FCOE_MODE)) {
209982527734SSukumar Swaminathan 		bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
210082527734SSukumar Swaminathan 		mbq->nonembed = NULL;
210182527734SSukumar Swaminathan 		mbq->mbox_cmpl = NULL; /* no cmpl needed */
2102a9800bebSGarrett D'Amore 		mbq->port = (void *)&PPORT;
210382527734SSukumar Swaminathan 
210482527734SSukumar Swaminathan 		mb->mbxCommand = (volatile uint8_t) MBX_INIT_LINK;
210582527734SSukumar Swaminathan 		mb->mbxOwner = OWN_HOST;
210682527734SSukumar Swaminathan 		return;
210782527734SSukumar Swaminathan 	}
210882527734SSukumar Swaminathan 
2109291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2110fcf3ce44SJohn Forte 
2111fcf3ce44SJohn Forte 	switch (topology) {
2112fcf3ce44SJohn Forte 	case FLAGS_LOCAL_LB:
2113fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_LOOP;
2114fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags |= FLAGS_LOCAL_LB;
2115fcf3ce44SJohn Forte 		break;
2116fcf3ce44SJohn Forte 	case FLAGS_TOPOLOGY_MODE_LOOP_PT:
2117fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_LOOP;
2118fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags |= FLAGS_TOPOLOGY_FAILOVER;
2119fcf3ce44SJohn Forte 		break;
2120fcf3ce44SJohn Forte 	case FLAGS_TOPOLOGY_MODE_PT_PT:
2121fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_PT_PT;
2122fcf3ce44SJohn Forte 		break;
2123fcf3ce44SJohn Forte 	case FLAGS_TOPOLOGY_MODE_LOOP:
2124fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_LOOP;
2125fcf3ce44SJohn Forte 		break;
2126fcf3ce44SJohn Forte 	case FLAGS_TOPOLOGY_MODE_PT_LOOP:
2127fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_PT_PT;
2128fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags |= FLAGS_TOPOLOGY_FAILOVER;
2129fcf3ce44SJohn Forte 		break;
2130fcf3ce44SJohn Forte 	}
2131fcf3ce44SJohn Forte 
2132fcf3ce44SJohn Forte 	if (cfg[CFG_LILP_ENABLE].current == 0) {
2133fcf3ce44SJohn Forte 		/* Disable LIRP/LILP support */
2134fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags |= FLAGS_LIRP_LILP;
2135fcf3ce44SJohn Forte 	}
2136291a2b48SSukumar Swaminathan 
2137fcf3ce44SJohn Forte 	/*
2138fcf3ce44SJohn Forte 	 * Setting up the link speed
2139fcf3ce44SJohn Forte 	 */
2140fcf3ce44SJohn Forte 	switch (linkspeed) {
2141fcf3ce44SJohn Forte 	case 0:
2142fcf3ce44SJohn Forte 		break;
2143fcf3ce44SJohn Forte 
2144fcf3ce44SJohn Forte 	case 1:
2145*a3170057SPaul Winder 		linkspeed = (vpd->link_speed & LMT_1GB_CAPABLE) == 0 ? 0 :
2146*a3170057SPaul Winder 		    LINK_SPEED_1G;
2147fcf3ce44SJohn Forte 		break;
2148fcf3ce44SJohn Forte 
2149fcf3ce44SJohn Forte 	case 2:
2150*a3170057SPaul Winder 		linkspeed = (vpd->link_speed & LMT_2GB_CAPABLE) == 0 ? 0 :
2151*a3170057SPaul Winder 		    LINK_SPEED_2G;
2152fcf3ce44SJohn Forte 		break;
2153fcf3ce44SJohn Forte 
2154fcf3ce44SJohn Forte 	case 4:
2155*a3170057SPaul Winder 		linkspeed = (vpd->link_speed & LMT_4GB_CAPABLE) == 0 ? 0 :
2156*a3170057SPaul Winder 		    LINK_SPEED_4G;
2157fcf3ce44SJohn Forte 		break;
2158fcf3ce44SJohn Forte 
2159fcf3ce44SJohn Forte 	case 8:
2160*a3170057SPaul Winder 		linkspeed = (vpd->link_speed & LMT_8GB_CAPABLE) == 0 ? 0 :
2161*a3170057SPaul Winder 		    LINK_SPEED_8G;
2162fcf3ce44SJohn Forte 		break;
2163fcf3ce44SJohn Forte 
2164fcf3ce44SJohn Forte 	case 10:
2165*a3170057SPaul Winder 		linkspeed = (vpd->link_speed & LMT_10GB_CAPABLE) == 0 ? 0 :
2166*a3170057SPaul Winder 		    LINK_SPEED_10G;
2167fcf3ce44SJohn Forte 		break;
2168fcf3ce44SJohn Forte 
21698f23e9faSHans Rosenfeld 	case 16:
2170*a3170057SPaul Winder 		linkspeed = (vpd->link_speed & LMT_16GB_CAPABLE) == 0 ? 0 :
2171*a3170057SPaul Winder 		    LINK_SPEED_16G;
2172*a3170057SPaul Winder 		break;
2173*a3170057SPaul Winder 
2174*a3170057SPaul Winder 	case 32:
2175*a3170057SPaul Winder 		linkspeed = (vpd->link_speed & LMT_32GB_CAPABLE) == 0 ? 0 :
2176*a3170057SPaul Winder 		    LINK_SPEED_32G;
21778f23e9faSHans Rosenfeld 		break;
21788f23e9faSHans Rosenfeld 
2179fcf3ce44SJohn Forte 	default:
2180fcf3ce44SJohn Forte 		linkspeed = 0;
2181fcf3ce44SJohn Forte 		break;
2182fcf3ce44SJohn Forte 
2183fcf3ce44SJohn Forte 	}
2184fcf3ce44SJohn Forte 
2185fcf3ce44SJohn Forte 	if ((linkspeed > 0) && (vpd->feaLevelHigh >= 0x02)) {
2186fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_flags |= FLAGS_LINK_SPEED;
2187fcf3ce44SJohn Forte 		mb->un.varInitLnk.link_speed = linkspeed;
2188fcf3ce44SJohn Forte 	}
2189291a2b48SSukumar Swaminathan 
2190fcf3ce44SJohn Forte 	mb->un.varInitLnk.link_flags |= FLAGS_PREABORT_RETURN;
2191fcf3ce44SJohn Forte 
2192291a2b48SSukumar Swaminathan 	mb->un.varInitLnk.fabric_AL_PA =
2193291a2b48SSukumar Swaminathan 	    (uint8_t)cfg[CFG_ASSIGN_ALPA].current;
2194fcf3ce44SJohn Forte 	mb->mbxCommand = (volatile uint8_t) MBX_INIT_LINK;
2195fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
2196a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = emlxs_init_link_mbcmpl;
2197a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2198fcf3ce44SJohn Forte 
2199fcf3ce44SJohn Forte 
2200fcf3ce44SJohn Forte 	return;
2201fcf3ce44SJohn Forte 
2202fcf3ce44SJohn Forte } /* emlxs_mb_init_link() */
2203fcf3ce44SJohn Forte 
2204fcf3ce44SJohn Forte 
2205fcf3ce44SJohn Forte /*
2206291a2b48SSukumar Swaminathan  *  emlxs_mb_down_link  Issue a DOWN LINK mailbox command
2207fcf3ce44SJohn Forte  */
2208291a2b48SSukumar Swaminathan /*ARGSUSED*/
2209fcf3ce44SJohn Forte extern void
221082527734SSukumar Swaminathan emlxs_mb_down_link(emlxs_hba_t *hba, MAILBOXQ *mbq)
2211fcf3ce44SJohn Forte {
221282527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
221382527734SSukumar Swaminathan 
2214291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2215fcf3ce44SJohn Forte 
2216fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_DOWN_LINK;
2217fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
221882527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL;
2219a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2220fcf3ce44SJohn Forte 
2221fcf3ce44SJohn Forte 	return;
2222fcf3ce44SJohn Forte 
2223fcf3ce44SJohn Forte } /* emlxs_mb_down_link() */
2224fcf3ce44SJohn Forte 
2225fcf3ce44SJohn Forte 
2226a9800bebSGarrett D'Amore static uint32_t
2227a9800bebSGarrett D'Amore emlxs_read_sparam_mbcmpl(emlxs_hba_t *hba, MAILBOXQ *mbq)
222882527734SSukumar Swaminathan {
22298f23e9faSHans Rosenfeld 	emlxs_port_t *port = &PPORT;
223082527734SSukumar Swaminathan 	MAILBOX *mb;
223182527734SSukumar Swaminathan 	MATCHMAP *mp;
223282527734SSukumar Swaminathan 	emlxs_port_t *vport;
223382527734SSukumar Swaminathan 	int32_t i;
223482527734SSukumar Swaminathan 	uint32_t  control;
223582527734SSukumar Swaminathan 	uint8_t null_wwn[8];
223682527734SSukumar Swaminathan 
223782527734SSukumar Swaminathan 	mb = (MAILBOX *)mbq;
223882527734SSukumar Swaminathan 	if (mb->mbxStatus) {
223982527734SSukumar Swaminathan 		if (mb->mbxStatus == MBXERR_NO_RESOURCES) {
224082527734SSukumar Swaminathan 			control = mb->un.varRdSparm.un.sp64.tus.f.bdeSize;
224182527734SSukumar Swaminathan 			if (control == 0) {
224282527734SSukumar Swaminathan 				(void) emlxs_mb_read_sparam(hba, mbq);
224382527734SSukumar Swaminathan 			}
224482527734SSukumar Swaminathan 			emlxs_mb_retry(hba, mbq);
224582527734SSukumar Swaminathan 			return (1);
224682527734SSukumar Swaminathan 		}
224782527734SSukumar Swaminathan 		return (0);
224882527734SSukumar Swaminathan 	}
224982527734SSukumar Swaminathan 	mp = (MATCHMAP *)mbq->bp;
225082527734SSukumar Swaminathan 	if (!mp) {
225182527734SSukumar Swaminathan 		return (0);
225282527734SSukumar Swaminathan 	}
225382527734SSukumar Swaminathan 
225482527734SSukumar Swaminathan 	bcopy((caddr_t)mp->virt, (caddr_t)&hba->sparam, sizeof (SERV_PARM));
225582527734SSukumar Swaminathan 
225682527734SSukumar Swaminathan 	/* Initialize the node name and port name only once */
225782527734SSukumar Swaminathan 	bzero(null_wwn, 8);
225882527734SSukumar Swaminathan 	if ((bcmp((caddr_t)&hba->wwnn, (caddr_t)null_wwn, 8) == 0) &&
225982527734SSukumar Swaminathan 	    (bcmp((caddr_t)&hba->wwpn, (caddr_t)null_wwn, 8) == 0)) {
226082527734SSukumar Swaminathan 		bcopy((caddr_t)&hba->sparam.nodeName,
226182527734SSukumar Swaminathan 		    (caddr_t)&hba->wwnn, sizeof (NAME_TYPE));
226282527734SSukumar Swaminathan 
226382527734SSukumar Swaminathan 		bcopy((caddr_t)&hba->sparam.portName,
226482527734SSukumar Swaminathan 		    (caddr_t)&hba->wwpn, sizeof (NAME_TYPE));
226582527734SSukumar Swaminathan 	} else {
226682527734SSukumar Swaminathan 		bcopy((caddr_t)&hba->wwnn,
226782527734SSukumar Swaminathan 		    (caddr_t)&hba->sparam.nodeName, sizeof (NAME_TYPE));
226882527734SSukumar Swaminathan 
226982527734SSukumar Swaminathan 		bcopy((caddr_t)&hba->wwpn,
227082527734SSukumar Swaminathan 		    (caddr_t)&hba->sparam.portName, sizeof (NAME_TYPE));
227182527734SSukumar Swaminathan 	}
227282527734SSukumar Swaminathan 
227382527734SSukumar Swaminathan 	EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2274a9800bebSGarrett D'Amore 	    "SPARAM: EDTOV hba=%x mbox_csp=%x BBC=%x",
227582527734SSukumar Swaminathan 	    hba->fc_edtov, hba->sparam.cmn.e_d_tov,
227682527734SSukumar Swaminathan 	    hba->sparam.cmn.bbCreditlsb);
227782527734SSukumar Swaminathan 
227882527734SSukumar Swaminathan 	/* Initialize the physical port */
22798f23e9faSHans Rosenfeld 	bcopy((caddr_t)&hba->sparam, (caddr_t)&port->sparam,
22808f23e9faSHans Rosenfeld 	    sizeof (SERV_PARM));
228182527734SSukumar Swaminathan 	bcopy((caddr_t)&hba->wwpn, (caddr_t)&port->wwpn,
228282527734SSukumar Swaminathan 	    sizeof (NAME_TYPE));
228382527734SSukumar Swaminathan 	bcopy((caddr_t)&hba->wwnn, (caddr_t)&port->wwnn,
228482527734SSukumar Swaminathan 	    sizeof (NAME_TYPE));
228582527734SSukumar Swaminathan 
228682527734SSukumar Swaminathan 	/* Initialize the virtual ports */
228782527734SSukumar Swaminathan 	for (i = 1; i < MAX_VPORTS; i++) {
228882527734SSukumar Swaminathan 		vport = &VPORT(i);
22898f23e9faSHans Rosenfeld 		if (! (vport->flag & EMLXS_PORT_BOUND)) {
229082527734SSukumar Swaminathan 			continue;
229182527734SSukumar Swaminathan 		}
229282527734SSukumar Swaminathan 
229382527734SSukumar Swaminathan 		bcopy((caddr_t)&hba->sparam,
229482527734SSukumar Swaminathan 		    (caddr_t)&vport->sparam,
229582527734SSukumar Swaminathan 		    sizeof (SERV_PARM));
229682527734SSukumar Swaminathan 
229782527734SSukumar Swaminathan 		bcopy((caddr_t)&vport->wwnn,
229882527734SSukumar Swaminathan 		    (caddr_t)&vport->sparam.nodeName,
229982527734SSukumar Swaminathan 		    sizeof (NAME_TYPE));
230082527734SSukumar Swaminathan 
230182527734SSukumar Swaminathan 		bcopy((caddr_t)&vport->wwpn,
230282527734SSukumar Swaminathan 		    (caddr_t)&vport->sparam.portName,
230382527734SSukumar Swaminathan 		    sizeof (NAME_TYPE));
230482527734SSukumar Swaminathan 	}
230582527734SSukumar Swaminathan 
230682527734SSukumar Swaminathan 	return (0);
230782527734SSukumar Swaminathan 
2308a9800bebSGarrett D'Amore } /* emlxs_read_sparam_mbcmpl() */
230982527734SSukumar Swaminathan 
231082527734SSukumar Swaminathan 
2311fcf3ce44SJohn Forte /*
2312291a2b48SSukumar Swaminathan  * emlxs_mb_read_sparam  Issue a READ SPARAM mailbox command
2313fcf3ce44SJohn Forte  */
2314fcf3ce44SJohn Forte extern uint32_t
231582527734SSukumar Swaminathan emlxs_mb_read_sparam(emlxs_hba_t *hba, MAILBOXQ *mbq)
2316fcf3ce44SJohn Forte {
231782527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
2318fcf3ce44SJohn Forte 	MATCHMAP *mp;
2319fcf3ce44SJohn Forte 
2320291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2321fcf3ce44SJohn Forte 
23228f23e9faSHans Rosenfeld 	if ((mp = (MATCHMAP *)emlxs_mem_get(hba, MEM_BUF)) == 0) {
2323fcf3ce44SJohn Forte 		mb->mbxCommand = MBX_READ_SPARM64;
2324fcf3ce44SJohn Forte 
2325fcf3ce44SJohn Forte 		return (1);
2326fcf3ce44SJohn Forte 	}
2327291a2b48SSukumar Swaminathan 
2328fcf3ce44SJohn Forte 	mb->un.varRdSparm.un.sp64.tus.f.bdeSize = sizeof (SERV_PARM);
232982527734SSukumar Swaminathan 	mb->un.varRdSparm.un.sp64.addrHigh = PADDR_HI(mp->phys);
233082527734SSukumar Swaminathan 	mb->un.varRdSparm.un.sp64.addrLow = PADDR_LO(mp->phys);
2331fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_READ_SPARM64;
2332fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
2333a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = emlxs_read_sparam_mbcmpl;
2334a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2335fcf3ce44SJohn Forte 
2336fcf3ce44SJohn Forte 	/*
2337fcf3ce44SJohn Forte 	 * save address for completion
2338fcf3ce44SJohn Forte 	 */
2339a9800bebSGarrett D'Amore 	mbq->bp = (void *)mp;
2340fcf3ce44SJohn Forte 
2341fcf3ce44SJohn Forte 	return (0);
2342fcf3ce44SJohn Forte 
2343fcf3ce44SJohn Forte } /* emlxs_mb_read_sparam() */
2344fcf3ce44SJohn Forte 
2345fcf3ce44SJohn Forte 
2346fcf3ce44SJohn Forte /*
2347291a2b48SSukumar Swaminathan  * emlxs_mb_read_rpi    Issue a READ RPI mailbox command
2348fcf3ce44SJohn Forte  */
2349291a2b48SSukumar Swaminathan /*ARGSUSED*/
2350fcf3ce44SJohn Forte extern uint32_t
235182527734SSukumar Swaminathan emlxs_mb_read_rpi(emlxs_hba_t *hba, uint32_t rpi, MAILBOXQ *mbq,
2352291a2b48SSukumar Swaminathan     uint32_t flag)
2353fcf3ce44SJohn Forte {
235482527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
235582527734SSukumar Swaminathan 
2356291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2357fcf3ce44SJohn Forte 
2358fcf3ce44SJohn Forte 	/*
2359fcf3ce44SJohn Forte 	 * Set flag to issue action on cmpl
2360fcf3ce44SJohn Forte 	 */
2361fcf3ce44SJohn Forte 	mb->un.varWords[30] = flag;
2362fcf3ce44SJohn Forte 	mb->un.varRdRPI.reqRpi = (volatile uint16_t) rpi;
2363fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_READ_RPI64;
2364fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
236582527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
2366a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2367fcf3ce44SJohn Forte 
2368fcf3ce44SJohn Forte 	return (0);
236982527734SSukumar Swaminathan } /* emlxs_mb_read_rpi() */
2370fcf3ce44SJohn Forte 
2371fcf3ce44SJohn Forte 
2372fcf3ce44SJohn Forte /*
2373291a2b48SSukumar Swaminathan  * emlxs_mb_read_xri    Issue a READ XRI mailbox command
2374fcf3ce44SJohn Forte  */
2375291a2b48SSukumar Swaminathan /*ARGSUSED*/
2376fcf3ce44SJohn Forte extern uint32_t
237782527734SSukumar Swaminathan emlxs_mb_read_xri(emlxs_hba_t *hba, uint32_t xri, MAILBOXQ *mbq,
2378291a2b48SSukumar Swaminathan     uint32_t flag)
2379fcf3ce44SJohn Forte {
238082527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
238182527734SSukumar Swaminathan 
2382291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2383fcf3ce44SJohn Forte 
2384fcf3ce44SJohn Forte 	/*
2385fcf3ce44SJohn Forte 	 * Set flag to issue action on cmpl
2386fcf3ce44SJohn Forte 	 */
2387fcf3ce44SJohn Forte 	mb->un.varWords[30] = flag;
2388291a2b48SSukumar Swaminathan 	mb->un.varRdXRI.reqXri = (volatile uint16_t)xri;
2389fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_READ_XRI;
2390fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
239182527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
2392a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
239382527734SSukumar Swaminathan 
239482527734SSukumar Swaminathan 	return (0);
239582527734SSukumar Swaminathan } /* emlxs_mb_read_xri() */
239682527734SSukumar Swaminathan 
239782527734SSukumar Swaminathan 
239882527734SSukumar Swaminathan /*ARGSUSED*/
239982527734SSukumar Swaminathan extern int32_t
240082527734SSukumar Swaminathan emlxs_mb_check_sparm(emlxs_hba_t *hba, SERV_PARM *nsp)
240182527734SSukumar Swaminathan {
240282527734SSukumar Swaminathan 	uint32_t nsp_value;
240382527734SSukumar Swaminathan 	uint32_t *iptr;
240482527734SSukumar Swaminathan 
240582527734SSukumar Swaminathan 	if (nsp->cmn.fPort) {
240682527734SSukumar Swaminathan 		return (0);
240782527734SSukumar Swaminathan 	}
240882527734SSukumar Swaminathan 
240982527734SSukumar Swaminathan 	/* Validate the service parameters */
241082527734SSukumar Swaminathan 	iptr = (uint32_t *)&nsp->portName;
241182527734SSukumar Swaminathan 	if (iptr[0] == 0 && iptr[1] == 0) {
241282527734SSukumar Swaminathan 		return (1);
241382527734SSukumar Swaminathan 	}
241482527734SSukumar Swaminathan 
241582527734SSukumar Swaminathan 	iptr = (uint32_t *)&nsp->nodeName;
241682527734SSukumar Swaminathan 	if (iptr[0] == 0 && iptr[1] == 0) {
241782527734SSukumar Swaminathan 		return (2);
241882527734SSukumar Swaminathan 	}
241982527734SSukumar Swaminathan 
242082527734SSukumar Swaminathan 	if (nsp->cls2.classValid) {
242182527734SSukumar Swaminathan 		nsp_value =
242282527734SSukumar Swaminathan 		    ((nsp->cls2.rcvDataSizeMsb & 0x0f) << 8) | nsp->cls2.
242382527734SSukumar Swaminathan 		    rcvDataSizeLsb;
242482527734SSukumar Swaminathan 
242582527734SSukumar Swaminathan 		/* If the receive data length is zero then set it to */
242682527734SSukumar Swaminathan 		/* the CSP value */
242782527734SSukumar Swaminathan 		if (!nsp_value) {
242882527734SSukumar Swaminathan 			nsp->cls2.rcvDataSizeMsb = nsp->cmn.bbRcvSizeMsb;
242982527734SSukumar Swaminathan 			nsp->cls2.rcvDataSizeLsb = nsp->cmn.bbRcvSizeLsb;
243082527734SSukumar Swaminathan 			return (0);
243182527734SSukumar Swaminathan 		}
243282527734SSukumar Swaminathan 	}
243382527734SSukumar Swaminathan 
243482527734SSukumar Swaminathan 	if (nsp->cls3.classValid) {
243582527734SSukumar Swaminathan 		nsp_value =
243682527734SSukumar Swaminathan 		    ((nsp->cls3.rcvDataSizeMsb & 0x0f) << 8) | nsp->cls3.
243782527734SSukumar Swaminathan 		    rcvDataSizeLsb;
243882527734SSukumar Swaminathan 
243982527734SSukumar Swaminathan 		/* If the receive data length is zero then set it to */
244082527734SSukumar Swaminathan 		/* the CSP value */
244182527734SSukumar Swaminathan 		if (!nsp_value) {
244282527734SSukumar Swaminathan 			nsp->cls3.rcvDataSizeMsb = nsp->cmn.bbRcvSizeMsb;
244382527734SSukumar Swaminathan 			nsp->cls3.rcvDataSizeLsb = nsp->cmn.bbRcvSizeLsb;
244482527734SSukumar Swaminathan 			return (0);
244582527734SSukumar Swaminathan 		}
244682527734SSukumar Swaminathan 	}
244782527734SSukumar Swaminathan 
244882527734SSukumar Swaminathan 	return (0);
244982527734SSukumar Swaminathan 
245082527734SSukumar Swaminathan } /* emlxs_mb_check_sparm() */
245182527734SSukumar Swaminathan 
245282527734SSukumar Swaminathan 
2453fcf3ce44SJohn Forte 
2454fcf3ce44SJohn Forte 
2455fcf3ce44SJohn Forte /*
2456291a2b48SSukumar Swaminathan  * emlxs_mb_set_var   Issue a special debug mbox command to write slim
2457fcf3ce44SJohn Forte  */
2458291a2b48SSukumar Swaminathan /*ARGSUSED*/
2459fcf3ce44SJohn Forte extern void
246082527734SSukumar Swaminathan emlxs_mb_set_var(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t addr,
2461291a2b48SSukumar Swaminathan     uint32_t value)
2462fcf3ce44SJohn Forte {
246382527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
246482527734SSukumar Swaminathan 
2465291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2466fcf3ce44SJohn Forte 
2467fcf3ce44SJohn Forte 	/* addr = 0x090597 is AUTO ABTS disable for ELS commands */
2468fcf3ce44SJohn Forte 	/* addr = 0x052198 is DELAYED ABTS enable for ELS commands */
2469fcf3ce44SJohn Forte 	/* addr = 0x100506 is for setting PCI MAX READ value */
2470fcf3ce44SJohn Forte 
2471fcf3ce44SJohn Forte 	/*
2472fcf3ce44SJohn Forte 	 * Always turn on DELAYED ABTS for ELS timeouts
2473fcf3ce44SJohn Forte 	 */
2474fcf3ce44SJohn Forte 	if ((addr == 0x052198) && (value == 0)) {
2475fcf3ce44SJohn Forte 		value = 1;
2476fcf3ce44SJohn Forte 	}
2477291a2b48SSukumar Swaminathan 
2478fcf3ce44SJohn Forte 	mb->un.varWords[0] = addr;
2479fcf3ce44SJohn Forte 	mb->un.varWords[1] = value;
2480fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_SET_VARIABLE;
2481fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
248282527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
2483a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
248482527734SSukumar Swaminathan 
248582527734SSukumar Swaminathan } /* emlxs_mb_set_var() */
2486fcf3ce44SJohn Forte 
2487fcf3ce44SJohn Forte 
2488fcf3ce44SJohn Forte /*
2489fcf3ce44SJohn Forte  * Disable Traffic Cop
2490fcf3ce44SJohn Forte  */
2491291a2b48SSukumar Swaminathan /*ARGSUSED*/
2492fcf3ce44SJohn Forte extern void
249382527734SSukumar Swaminathan emlxs_disable_tc(emlxs_hba_t *hba, MAILBOXQ *mbq)
2494fcf3ce44SJohn Forte {
249582527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
249682527734SSukumar Swaminathan 
2497291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2498fcf3ce44SJohn Forte 
2499fcf3ce44SJohn Forte 	mb->un.varWords[0] = 0x50797;
2500fcf3ce44SJohn Forte 	mb->un.varWords[1] = 0;
2501fcf3ce44SJohn Forte 	mb->un.varWords[2] = 0xfffffffe;
2502fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_SET_VARIABLE;
2503fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
250482527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
2505a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2506fcf3ce44SJohn Forte 
250782527734SSukumar Swaminathan } /* emlxs_disable_tc() */
2508fcf3ce44SJohn Forte 
2509fcf3ce44SJohn Forte 
2510fcf3ce44SJohn Forte extern void
251182527734SSukumar Swaminathan emlxs_mb_config_hbq(emlxs_hba_t *hba, MAILBOXQ *mbq, int hbq_id)
2512fcf3ce44SJohn Forte {
2513291a2b48SSukumar Swaminathan 	HBQ_INIT_t	*hbq;
251482527734SSukumar Swaminathan 	MAILBOX		*mb = (MAILBOX *)mbq;
2515291a2b48SSukumar Swaminathan 	int		i;
2516fcf3ce44SJohn Forte 
2517291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2518fcf3ce44SJohn Forte 
251982527734SSukumar Swaminathan 	hbq = &hba->sli.sli3.hbq_table[hbq_id];
2520fcf3ce44SJohn Forte 
2521fcf3ce44SJohn Forte 	mb->un.varCfgHbq.hbqId = hbq_id;
2522fcf3ce44SJohn Forte 	mb->un.varCfgHbq.numEntries = hbq->HBQ_numEntries;
2523fcf3ce44SJohn Forte 	mb->un.varCfgHbq.recvNotify = hbq->HBQ_recvNotify;
2524fcf3ce44SJohn Forte 	mb->un.varCfgHbq.numMask = hbq->HBQ_num_mask;
2525fcf3ce44SJohn Forte 	mb->un.varCfgHbq.profile = hbq->HBQ_profile;
2526fcf3ce44SJohn Forte 	mb->un.varCfgHbq.ringMask = hbq->HBQ_ringMask;
2527fcf3ce44SJohn Forte 	mb->un.varCfgHbq.headerLen = hbq->HBQ_headerLen;
2528fcf3ce44SJohn Forte 	mb->un.varCfgHbq.logEntry = hbq->HBQ_logEntry;
252982527734SSukumar Swaminathan 	mb->un.varCfgHbq.hbqaddrLow = PADDR_LO(hbq->HBQ_host_buf.phys);
253082527734SSukumar Swaminathan 	mb->un.varCfgHbq.hbqaddrHigh = PADDR_HI(hbq->HBQ_host_buf.phys);
2531fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_CONFIG_HBQ;
2532fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
253382527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL;
2534a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2535fcf3ce44SJohn Forte 
2536fcf3ce44SJohn Forte 	/* Copy info for profiles 2,3,5. Other profiles this area is reserved */
2537fcf3ce44SJohn Forte 	if ((hbq->HBQ_profile == 2) || (hbq->HBQ_profile == 3) ||
2538fcf3ce44SJohn Forte 	    (hbq->HBQ_profile == 5)) {
2539fcf3ce44SJohn Forte 		bcopy(&hbq->profiles.allprofiles,
25406b511167SToomas Soome 		    (void *)&mb->un.varCfgHbq.profiles.allprofiles,
2541fcf3ce44SJohn Forte 		    sizeof (hbq->profiles));
2542fcf3ce44SJohn Forte 	}
2543291a2b48SSukumar Swaminathan 
2544fcf3ce44SJohn Forte 	/* Return if no rctl / type masks for this HBQ */
2545fcf3ce44SJohn Forte 	if (!hbq->HBQ_num_mask) {
2546fcf3ce44SJohn Forte 		return;
2547fcf3ce44SJohn Forte 	}
2548291a2b48SSukumar Swaminathan 
2549fcf3ce44SJohn Forte 	/* Otherwise we setup specific rctl / type masks for this HBQ */
2550fcf3ce44SJohn Forte 	for (i = 0; i < hbq->HBQ_num_mask; i++) {
2551291a2b48SSukumar Swaminathan 		mb->un.varCfgHbq.hbqMasks[i].tmatch =
2552291a2b48SSukumar Swaminathan 		    hbq->HBQ_Masks[i].tmatch;
2553fcf3ce44SJohn Forte 		mb->un.varCfgHbq.hbqMasks[i].tmask = hbq->HBQ_Masks[i].tmask;
2554fcf3ce44SJohn Forte 		mb->un.varCfgHbq.hbqMasks[i].rctlmatch =
2555fcf3ce44SJohn Forte 		    hbq->HBQ_Masks[i].rctlmatch;
2556fcf3ce44SJohn Forte 		mb->un.varCfgHbq.hbqMasks[i].rctlmask =
2557fcf3ce44SJohn Forte 		    hbq->HBQ_Masks[i].rctlmask;
2558fcf3ce44SJohn Forte 	}
2559fcf3ce44SJohn Forte 
2560fcf3ce44SJohn Forte 	return;
2561fcf3ce44SJohn Forte 
2562fcf3ce44SJohn Forte } /* emlxs_mb_config_hbq() */
2563fcf3ce44SJohn Forte 
256482527734SSukumar Swaminathan 
2565a9800bebSGarrett D'Amore /* SLI3 */
2566a9800bebSGarrett D'Amore static uint32_t
2567a9800bebSGarrett D'Amore emlxs_reg_vpi_mbcmpl(emlxs_hba_t *hba, MAILBOXQ *mbq)
256882527734SSukumar Swaminathan {
2569a9800bebSGarrett D'Amore 	emlxs_port_t *port = (emlxs_port_t *)mbq->port;
257082527734SSukumar Swaminathan 	MAILBOX *mb;
257182527734SSukumar Swaminathan 
257282527734SSukumar Swaminathan 	mb = (MAILBOX *)mbq;
257382527734SSukumar Swaminathan 
2574a9800bebSGarrett D'Amore 	mutex_enter(&EMLXS_PORT_LOCK);
257582527734SSukumar Swaminathan 
257682527734SSukumar Swaminathan 	if (mb->mbxStatus != MBX_SUCCESS) {
2577a9800bebSGarrett D'Amore 		port->flag &= ~EMLXS_PORT_REG_VPI;
2578a9800bebSGarrett D'Amore 		mutex_exit(&EMLXS_PORT_LOCK);
257982527734SSukumar Swaminathan 
2580a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2581a9800bebSGarrett D'Amore 		    "cmpl_reg_vpi:%d failed. status=%x",
2582a9800bebSGarrett D'Amore 		    port->vpi, mb->mbxStatus);
258382527734SSukumar Swaminathan 		return (0);
258482527734SSukumar Swaminathan 	}
258582527734SSukumar Swaminathan 
2586a9800bebSGarrett D'Amore 	port->flag |= EMLXS_PORT_REG_VPI_CMPL;
258782527734SSukumar Swaminathan 
2588a9800bebSGarrett D'Amore 	mutex_exit(&EMLXS_PORT_LOCK);
258982527734SSukumar Swaminathan 
2590a9800bebSGarrett D'Amore 	EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2591a9800bebSGarrett D'Amore 	    "cmpl_reg_vpi:%d ",
2592a9800bebSGarrett D'Amore 	    port->vpi);
259382527734SSukumar Swaminathan 
259482527734SSukumar Swaminathan 	return (0);
2595a9800bebSGarrett D'Amore 
2596a9800bebSGarrett D'Amore } /* emlxs_reg_vpi_mbcmpl */
259782527734SSukumar Swaminathan 
259882527734SSukumar Swaminathan 
2599a9800bebSGarrett D'Amore /* SLI3 */
260082527734SSukumar Swaminathan extern uint32_t
260182527734SSukumar Swaminathan emlxs_mb_reg_vpi(emlxs_port_t *port, emlxs_buf_t *sbp)
260282527734SSukumar Swaminathan {
260382527734SSukumar Swaminathan 	emlxs_hba_t *hba = HBA;
260482527734SSukumar Swaminathan 	MAILBOXQ *mbq;
260582527734SSukumar Swaminathan 	MAILBOX	*mb;
260682527734SSukumar Swaminathan 	int rval;
2607fcf3ce44SJohn Forte 
2608a9800bebSGarrett D'Amore 	if (hba->sli_mode > EMLXS_HBA_SLI3_MODE) {
2609a9800bebSGarrett D'Amore 		return (1);
2610a9800bebSGarrett D'Amore 	}
2611a9800bebSGarrett D'Amore 
2612fcf3ce44SJohn Forte 	if (!(hba->flag & FC_NPIV_ENABLED)) {
2613a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2614a9800bebSGarrett D'Amore 		    "reg_vpi:%d failed. NPIV disabled.",
2615a9800bebSGarrett D'Amore 		    port->vpi);
2616a9800bebSGarrett D'Amore 		return (1);
2617a9800bebSGarrett D'Amore 	}
2618a9800bebSGarrett D'Amore 
2619a9800bebSGarrett D'Amore 	if (port->flag & EMLXS_PORT_REG_VPI) {
2620a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2621a9800bebSGarrett D'Amore 		    "reg_vpi:%d failed. Already registered.",
2622a9800bebSGarrett D'Amore 		    port->vpi);
2623fcf3ce44SJohn Forte 		return (0);
2624fcf3ce44SJohn Forte 	}
2625291a2b48SSukumar Swaminathan 
2626fcf3ce44SJohn Forte 	mutex_enter(&EMLXS_PORT_LOCK);
2627fcf3ce44SJohn Forte 
2628fcf3ce44SJohn Forte 	/* Can't reg vpi until ClearLA is sent */
2629fcf3ce44SJohn Forte 	if (hba->state != FC_READY) {
2630fcf3ce44SJohn Forte 		mutex_exit(&EMLXS_PORT_LOCK);
2631fcf3ce44SJohn Forte 
2632a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2633a9800bebSGarrett D'Amore 		    "reg_vpi:%d failed. HBA state not READY",
2634a9800bebSGarrett D'Amore 		    port->vpi);
2635fcf3ce44SJohn Forte 		return (1);
2636fcf3ce44SJohn Forte 	}
2637291a2b48SSukumar Swaminathan 
2638fcf3ce44SJohn Forte 	/* Must have port id */
2639fcf3ce44SJohn Forte 	if (!port->did) {
2640fcf3ce44SJohn Forte 		mutex_exit(&EMLXS_PORT_LOCK);
2641fcf3ce44SJohn Forte 
2642a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2643a9800bebSGarrett D'Amore 		    "reg_vpi:%d failed. Port did=0",
2644a9800bebSGarrett D'Amore 		    port->vpi);
2645fcf3ce44SJohn Forte 		return (1);
2646fcf3ce44SJohn Forte 	}
2647291a2b48SSukumar Swaminathan 
26488f23e9faSHans Rosenfeld 	if (!(mbq = (MAILBOXQ *)emlxs_mem_get(hba, MEM_MBOX))) {
2649fcf3ce44SJohn Forte 		mutex_exit(&EMLXS_PORT_LOCK);
2650fcf3ce44SJohn Forte 
2651a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2652a9800bebSGarrett D'Amore 		    "reg_vpi:%d failed. Unable to allocate mbox.",
2653a9800bebSGarrett D'Amore 		    port->vpi);
2654fcf3ce44SJohn Forte 		return (1);
2655fcf3ce44SJohn Forte 	}
2656291a2b48SSukumar Swaminathan 
2657a9800bebSGarrett D'Amore 	port->flag |= EMLXS_PORT_REG_VPI;
2658fcf3ce44SJohn Forte 
2659fcf3ce44SJohn Forte 	mutex_exit(&EMLXS_PORT_LOCK);
2660fcf3ce44SJohn Forte 
2661291a2b48SSukumar Swaminathan 	mb = (MAILBOX *)mbq->mbox;
2662a9800bebSGarrett D'Amore 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
266382527734SSukumar Swaminathan 
2664a9800bebSGarrett D'Amore 	EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2665a9800bebSGarrett D'Amore 	    "reg_vpi:%d", port->vpi);
266682527734SSukumar Swaminathan 
2667a9800bebSGarrett D'Amore 	mb->un.varRegVpi.vpi = port->vpi;
2668fcf3ce44SJohn Forte 	mb->un.varRegVpi.sid = port->did;
2669fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_REG_VPI;
2670fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
2671fcf3ce44SJohn Forte 
2672a9800bebSGarrett D'Amore 	mbq->sbp = (void *)sbp;
2673a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = emlxs_reg_vpi_mbcmpl;
2674a9800bebSGarrett D'Amore 	mbq->context = NULL;
2675a9800bebSGarrett D'Amore 	mbq->port = (void *)port;
2676a9800bebSGarrett D'Amore 
267782527734SSukumar Swaminathan 	rval = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_NOWAIT, 0);
267882527734SSukumar Swaminathan 	if ((rval != MBX_BUSY) && (rval != MBX_SUCCESS)) {
2679a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2680a9800bebSGarrett D'Amore 		    "reg_vpi:%d failed. Unable to send request.",
2681a9800bebSGarrett D'Amore 		    port->vpi);
2682a9800bebSGarrett D'Amore 
2683a9800bebSGarrett D'Amore 		emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
2684a9800bebSGarrett D'Amore 		return (1);
2685fcf3ce44SJohn Forte 	}
2686291a2b48SSukumar Swaminathan 
2687fcf3ce44SJohn Forte 	return (0);
2688fcf3ce44SJohn Forte 
2689fcf3ce44SJohn Forte } /* emlxs_mb_reg_vpi() */
2690fcf3ce44SJohn Forte 
2691fcf3ce44SJohn Forte 
2692a9800bebSGarrett D'Amore /* SLI3 */
2693a9800bebSGarrett D'Amore static uint32_t
2694a9800bebSGarrett D'Amore emlxs_unreg_vpi_mbcmpl(emlxs_hba_t *hba, MAILBOXQ *mbq)
269582527734SSukumar Swaminathan {
2696a9800bebSGarrett D'Amore 	emlxs_port_t *port = (emlxs_port_t *)mbq->port;
2697a9800bebSGarrett D'Amore 	MAILBOX *mb;
269882527734SSukumar Swaminathan 
2699a9800bebSGarrett D'Amore 	mb  = (MAILBOX *)mbq->mbox;
2700a9800bebSGarrett D'Amore 
2701a9800bebSGarrett D'Amore 	if (mb->mbxStatus != MBX_SUCCESS) {
2702a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2703a9800bebSGarrett D'Amore 		    "unreg_vpi_mbcmpl:%d failed. status=%x",
2704a9800bebSGarrett D'Amore 		    port->vpi, mb->mbxStatus);
2705a9800bebSGarrett D'Amore 		return (0);
270682527734SSukumar Swaminathan 	}
2707a9800bebSGarrett D'Amore 
2708a9800bebSGarrett D'Amore 	EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2709a9800bebSGarrett D'Amore 	    "unreg_vpi_mbcmpl:%d", port->vpi);
2710a9800bebSGarrett D'Amore 
2711a9800bebSGarrett D'Amore 	mutex_enter(&EMLXS_PORT_LOCK);
2712a9800bebSGarrett D'Amore 	port->flag &= ~EMLXS_PORT_REG_VPI_CMPL;
2713a9800bebSGarrett D'Amore 	mutex_exit(&EMLXS_PORT_LOCK);
2714a9800bebSGarrett D'Amore 
271582527734SSukumar Swaminathan 	return (0);
271682527734SSukumar Swaminathan 
2717a9800bebSGarrett D'Amore } /* emlxs_unreg_vpi_mbcmpl() */
271882527734SSukumar Swaminathan 
271982527734SSukumar Swaminathan 
2720a9800bebSGarrett D'Amore /* SLI3 */
2721fcf3ce44SJohn Forte extern uint32_t
2722fcf3ce44SJohn Forte emlxs_mb_unreg_vpi(emlxs_port_t *port)
2723fcf3ce44SJohn Forte {
2724291a2b48SSukumar Swaminathan 	emlxs_hba_t	*hba = HBA;
2725291a2b48SSukumar Swaminathan 	MAILBOXQ	*mbq;
2726291a2b48SSukumar Swaminathan 	MAILBOX		*mb;
272782527734SSukumar Swaminathan 	int		rval;
2728fcf3ce44SJohn Forte 
2729a9800bebSGarrett D'Amore 	if (hba->sli_mode > EMLXS_HBA_SLI3_MODE) {
2730a9800bebSGarrett D'Amore 		return (1);
2731a9800bebSGarrett D'Amore 	}
2732a9800bebSGarrett D'Amore 
2733fcf3ce44SJohn Forte 	mutex_enter(&EMLXS_PORT_LOCK);
2734fcf3ce44SJohn Forte 
2735a9800bebSGarrett D'Amore 	if (!(port->flag & EMLXS_PORT_REG_VPI) ||
2736a9800bebSGarrett D'Amore 	    !(port->flag & EMLXS_PORT_REG_VPI_CMPL)) {
2737a9800bebSGarrett D'Amore 
2738a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2739a9800bebSGarrett D'Amore 		    "unreg_vpi:%d failed. Not registered. flag=%x",
2740a9800bebSGarrett D'Amore 		    port->vpi, port->flag);
2741a9800bebSGarrett D'Amore 
2742fcf3ce44SJohn Forte 		mutex_exit(&EMLXS_PORT_LOCK);
2743fcf3ce44SJohn Forte 		return (0);
2744fcf3ce44SJohn Forte 	}
2745291a2b48SSukumar Swaminathan 
27468f23e9faSHans Rosenfeld 	if (!(mbq = (MAILBOXQ *)emlxs_mem_get(hba, MEM_MBOX))) {
2747a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2748a9800bebSGarrett D'Amore 		    "unreg_vpi:%d failed. Unable to allocate mbox.",
2749a9800bebSGarrett D'Amore 		    port->vpi);
2750a9800bebSGarrett D'Amore 
2751fcf3ce44SJohn Forte 		mutex_exit(&EMLXS_PORT_LOCK);
2752fcf3ce44SJohn Forte 		return (1);
2753fcf3ce44SJohn Forte 	}
2754291a2b48SSukumar Swaminathan 
2755a9800bebSGarrett D'Amore 	port->flag &= ~EMLXS_PORT_REG_VPI;
2756fcf3ce44SJohn Forte 
2757fcf3ce44SJohn Forte 	mutex_exit(&EMLXS_PORT_LOCK);
2758fcf3ce44SJohn Forte 
2759a9800bebSGarrett D'Amore 	EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2760a9800bebSGarrett D'Amore 	    "unreg_vpi:%d", port->vpi);
2761291a2b48SSukumar Swaminathan 
2762a9800bebSGarrett D'Amore 	mb = (MAILBOX *)mbq->mbox;
2763a9800bebSGarrett D'Amore 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2764a9800bebSGarrett D'Amore 	mb->un.varUnregVpi.vpi = port->vpi;
2765a9800bebSGarrett D'Amore 	mb->mbxCommand = MBX_UNREG_VPI;
2766a9800bebSGarrett D'Amore 	mb->mbxOwner = OWN_HOST;
276782527734SSukumar Swaminathan 
2768a9800bebSGarrett D'Amore 	mbq->mbox_cmpl = emlxs_unreg_vpi_mbcmpl;
2769a9800bebSGarrett D'Amore 	mbq->context = NULL;
2770a9800bebSGarrett D'Amore 	mbq->port = (void *)port;
277182527734SSukumar Swaminathan 
2772a9800bebSGarrett D'Amore 	rval = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_NOWAIT, 0);
2773a9800bebSGarrett D'Amore 	if ((rval != MBX_BUSY) && (rval != MBX_SUCCESS)) {
2774a9800bebSGarrett D'Amore 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
2775a9800bebSGarrett D'Amore 		    "unreg_vpi:%d failed. Unable to send request.",
2776a9800bebSGarrett D'Amore 		    port->vpi);
277782527734SSukumar Swaminathan 
2778a9800bebSGarrett D'Amore 		emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
2779a9800bebSGarrett D'Amore 		return (1);
278082527734SSukumar Swaminathan 	}
2781a9800bebSGarrett D'Amore 
2782fcf3ce44SJohn Forte 	return (0);
2783fcf3ce44SJohn Forte 
2784fcf3ce44SJohn Forte } /* emlxs_mb_unreg_vpi() */
2785fcf3ce44SJohn Forte 
2786fcf3ce44SJohn Forte 
2787fcf3ce44SJohn Forte /*
2788291a2b48SSukumar Swaminathan  * emlxs_mb_config_farp  Issue a CONFIG FARP mailbox command
2789fcf3ce44SJohn Forte  */
2790fcf3ce44SJohn Forte extern void
279182527734SSukumar Swaminathan emlxs_mb_config_farp(emlxs_hba_t *hba, MAILBOXQ *mbq)
2792fcf3ce44SJohn Forte {
279382527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
279482527734SSukumar Swaminathan 
2795291a2b48SSukumar Swaminathan 	bzero((void *)mb, MAILBOX_CMD_BSIZE);
2796fcf3ce44SJohn Forte 
2797291a2b48SSukumar Swaminathan 	bcopy((uint8_t *)&hba->wwpn,
2798291a2b48SSukumar Swaminathan 	    (uint8_t *)&mb->un.varCfgFarp.portname, sizeof (NAME_TYPE));
2799fcf3ce44SJohn Forte 
2800291a2b48SSukumar Swaminathan 	bcopy((uint8_t *)&hba->wwpn,
2801291a2b48SSukumar Swaminathan 	    (uint8_t *)&mb->un.varCfgFarp.nodename, sizeof (NAME_TYPE));
2802fcf3ce44SJohn Forte 
2803fcf3ce44SJohn Forte 	mb->un.varCfgFarp.filterEnable = 1;
2804fcf3ce44SJohn Forte 	mb->un.varCfgFarp.portName = 1;
2805fcf3ce44SJohn Forte 	mb->un.varCfgFarp.nodeName = 1;
2806fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_CONFIG_FARP;
2807fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
280882527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
2809a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2810a9800bebSGarrett D'Amore 
2811fcf3ce44SJohn Forte } /* emlxs_mb_config_farp() */
2812fcf3ce44SJohn Forte 
2813fcf3ce44SJohn Forte 
2814fcf3ce44SJohn Forte /*
2815291a2b48SSukumar Swaminathan  * emlxs_mb_read_nv  Issue a READ CONFIG mailbox command
2816fcf3ce44SJohn Forte  */
2817291a2b48SSukumar Swaminathan /*ARGSUSED*/
2818fcf3ce44SJohn Forte extern void
281982527734SSukumar Swaminathan emlxs_mb_read_config(emlxs_hba_t *hba, MAILBOXQ *mbq)
2820fcf3ce44SJohn Forte {
282182527734SSukumar Swaminathan 	MAILBOX *mb = (MAILBOX *)mbq;
282282527734SSukumar Swaminathan 
282382527734SSukumar Swaminathan 	if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
282482527734SSukumar Swaminathan 		bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
282582527734SSukumar Swaminathan 		mbq->nonembed = NULL;
282682527734SSukumar Swaminathan 	} else {
282782527734SSukumar Swaminathan 		bzero((void *)mb, MAILBOX_CMD_BSIZE);
282882527734SSukumar Swaminathan 	}
2829fcf3ce44SJohn Forte 
2830fcf3ce44SJohn Forte 	mb->mbxCommand = MBX_READ_CONFIG;
2831fcf3ce44SJohn Forte 	mb->mbxOwner = OWN_HOST;
283282527734SSukumar Swaminathan 	mbq->mbox_cmpl = NULL; /* no cmpl needed */
2833a9800bebSGarrett D'Amore 	mbq->port = (void *)&PPORT;
2834a9800bebSGarrett D'Amore 
2835fcf3ce44SJohn Forte } /* emlxs_mb_read_config() */
2836fcf3ce44SJohn Forte 
2837fcf3ce44SJohn Forte 
2838fcf3ce44SJohn Forte /*
2839fcf3ce44SJohn Forte  * NAME:     emlxs_mb_put
2840fcf3ce44SJohn Forte  *
2841fcf3ce44SJohn Forte  * FUNCTION: put mailbox cmd onto the mailbox queue.
2842fcf3ce44SJohn Forte  *
2843fcf3ce44SJohn Forte  * EXECUTION ENVIRONMENT: process and interrupt level.
2844fcf3ce44SJohn Forte  *
2845fcf3ce44SJohn Forte  * NOTES:
2846fcf3ce44SJohn Forte  *
284782527734SSukumar Swaminathan  * CALLED FROM: EMLXS_SLI_ISSUE_MBOX_CMD
2848fcf3ce44SJohn Forte  *
2849291a2b48SSukumar Swaminathan  * INPUT: hba           - pointer to the device info area
2850291a2b48SSukumar Swaminathan  *      mbp             - pointer to mailbox queue entry of mailbox cmd
2851fcf3ce44SJohn Forte  *
2852fcf3ce44SJohn Forte  * RETURNS: NULL - command queued
2853fcf3ce44SJohn Forte  */
2854fcf3ce44SJohn Forte extern void
2855fcf3ce44SJohn Forte emlxs_mb_put(emlxs_hba_t *hba, MAILBOXQ *mbq)
2856fcf3ce44SJohn Forte {
2857fcf3ce44SJohn Forte 
2858fcf3ce44SJohn Forte 	mutex_enter(&EMLXS_MBOX_LOCK);
2859fcf3ce44SJohn Forte 
2860fcf3ce44SJohn Forte 	if (hba->mbox_queue.q_first) {
2861fcf3ce44SJohn Forte 
2862fcf3ce44SJohn Forte 		/*
2863fcf3ce44SJohn Forte 		 * queue command to end of list
2864fcf3ce44SJohn Forte 		 */
2865291a2b48SSukumar Swaminathan 		((MAILBOXQ *)hba->mbox_queue.q_last)->next = mbq;
2866fcf3ce44SJohn Forte 		hba->mbox_queue.q_last = (uint8_t *)mbq;
2867fcf3ce44SJohn Forte 		hba->mbox_queue.q_cnt++;
2868fcf3ce44SJohn Forte 	} else {
2869fcf3ce44SJohn Forte 
2870fcf3ce44SJohn Forte 		/*
2871fcf3ce44SJohn Forte 		 * add command to empty list
2872fcf3ce44SJohn Forte 		 */
2873fcf3ce44SJohn Forte 		hba->mbox_queue.q_first = (uint8_t *)mbq;
2874fcf3ce44SJohn Forte 		hba->mbox_queue.q_last = (uint8_t *)mbq;
2875fcf3ce44SJohn Forte 		hba->mbox_queue.q_cnt = 1;
2876fcf3ce44SJohn Forte 	}
2877fcf3ce44SJohn Forte 
2878fcf3ce44SJohn Forte 	mbq->next = NULL;
2879fcf3ce44SJohn Forte 
2880fcf3ce44SJohn Forte 	mutex_exit(&EMLXS_MBOX_LOCK);
2881fcf3ce44SJohn Forte } /* emlxs_mb_put() */
2882fcf3ce44SJohn Forte 
2883fcf3ce44SJohn Forte 
2884fcf3ce44SJohn Forte /*
2885fcf3ce44SJohn Forte  * NAME:     emlxs_mb_get
2886fcf3ce44SJohn Forte  *
2887fcf3ce44SJohn Forte  * FUNCTION: get a mailbox command from mailbox command queue
2888fcf3ce44SJohn Forte  *
2889fcf3ce44SJohn Forte  * EXECUTION ENVIRONMENT: interrupt level.
2890fcf3ce44SJohn Forte  *
2891fcf3ce44SJohn Forte  * NOTES:
2892fcf3ce44SJohn Forte  *
2893fcf3ce44SJohn Forte  * CALLED FROM: emlxs_handle_mb_event
2894fcf3ce44SJohn Forte  *
2895fcf3ce44SJohn Forte  * INPUT: hba       - pointer to the device info area
2896fcf3ce44SJohn Forte  *
2897fcf3ce44SJohn Forte  * RETURNS: NULL - no match found mb pointer - pointer to a mailbox command
2898fcf3ce44SJohn Forte  */
2899fcf3ce44SJohn Forte extern MAILBOXQ *
2900fcf3ce44SJohn Forte emlxs_mb_get(emlxs_hba_t *hba)
2901fcf3ce44SJohn Forte {
2902291a2b48SSukumar Swaminathan 	MAILBOXQ	*p_first = NULL;
2903fcf3ce44SJohn Forte 
2904fcf3ce44SJohn Forte 	mutex_enter(&EMLXS_MBOX_LOCK);
2905fcf3ce44SJohn Forte 
2906fcf3ce44SJohn Forte 	if (hba->mbox_queue.q_first) {
2907291a2b48SSukumar Swaminathan 		p_first = (MAILBOXQ *)hba->mbox_queue.q_first;
2908fcf3ce44SJohn Forte 		hba->mbox_queue.q_first = (uint8_t *)p_first->next;
2909fcf3ce44SJohn Forte 
2910fcf3ce44SJohn Forte 		if (hba->mbox_queue.q_first == NULL) {
2911fcf3ce44SJohn Forte 			hba->mbox_queue.q_last = NULL;
2912fcf3ce44SJohn Forte 			hba->mbox_queue.q_cnt = 0;
2913fcf3ce44SJohn Forte 		} else {
2914fcf3ce44SJohn Forte 			hba->mbox_queue.q_cnt--;
2915fcf3ce44SJohn Forte 		}
2916fcf3ce44SJohn Forte 
2917fcf3ce44SJohn Forte 		p_first->next = NULL;
2918fcf3ce44SJohn Forte 	}
2919291a2b48SSukumar Swaminathan 
2920fcf3ce44SJohn Forte 	mutex_exit(&EMLXS_MBOX_LOCK);
2921fcf3ce44SJohn Forte 
2922fcf3ce44SJohn Forte 	return (p_first);
2923fcf3ce44SJohn Forte 
2924fcf3ce44SJohn Forte } /* emlxs_mb_get() */
2925fcf3ce44SJohn Forte 
2926fcf3ce44SJohn Forte 
2927fcf3ce44SJohn Forte /* EMLXS_PORT_LOCK must be held when calling this */
2928291a2b48SSukumar Swaminathan void
2929fcf3ce44SJohn Forte emlxs_mb_init(emlxs_hba_t *hba, MAILBOXQ *mbq, uint32_t flag, uint32_t tmo)
2930fcf3ce44SJohn Forte {
2931291a2b48SSukumar Swaminathan 	MATCHMAP	*mp;
2932fcf3ce44SJohn Forte 
2933fcf3ce44SJohn Forte 	HBASTATS.MboxIssued++;
2934fcf3ce44SJohn Forte 	hba->mbox_queue_flag = flag;
2935fcf3ce44SJohn Forte 
2936fcf3ce44SJohn Forte 	/* Set the Mailbox timer */
29378f23e9faSHans Rosenfeld 	if (hba->timer_tics) {
29388f23e9faSHans Rosenfeld 		hba->mbox_timer = hba->timer_tics + tmo;
29398f23e9faSHans Rosenfeld 	} else {
29408f23e9faSHans Rosenfeld 		hba->mbox_timer = DRV_TIME + tmo;
29418f23e9faSHans Rosenfeld 	}
2942fcf3ce44SJohn Forte 
2943fcf3ce44SJohn Forte 	/* Initialize mailbox */
2944fcf3ce44SJohn Forte 	mbq->flag &= MBQ_INIT_MASK;
2945fcf3ce44SJohn Forte 	mbq->next = 0;
2946fcf3ce44SJohn Forte 
2947fcf3ce44SJohn Forte 	mutex_enter(&EMLXS_MBOX_LOCK);
2948a9800bebSGarrett D'Amore 	hba->mbox_mbq = (void *)mbq;
2949fcf3ce44SJohn Forte 	mutex_exit(&EMLXS_MBOX_LOCK);
2950fcf3ce44SJohn Forte 
295182527734SSukumar Swaminathan 	if (mbq->nonembed) {
295282527734SSukumar Swaminathan 		mp = (MATCHMAP *) mbq->nonembed;
295382527734SSukumar Swaminathan 		EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
2954fcf3ce44SJohn Forte 		    DDI_DMA_SYNC_FORDEV);
2955fcf3ce44SJohn Forte 	}
2956291a2b48SSukumar Swaminathan 
295782527734SSukumar Swaminathan 	if (mbq->bp) {
295882527734SSukumar Swaminathan 		mp = (MATCHMAP *) mbq->bp;
295982527734SSukumar Swaminathan 		EMLXS_MPDATA_SYNC(mp->dma_handle, 0, mp->size,
296082527734SSukumar Swaminathan 		    DDI_DMA_SYNC_FORDEV);
2961fcf3ce44SJohn Forte 	}
2962fcf3ce44SJohn Forte 	return;
2963fcf3ce44SJohn Forte 
2964fcf3ce44SJohn Forte } /* emlxs_mb_init() */
2965fcf3ce44SJohn Forte 
2966fcf3ce44SJohn Forte 
2967fcf3ce44SJohn Forte extern void
2968fcf3ce44SJohn Forte emlxs_mb_fini(emlxs_hba_t *hba, MAILBOX *mb, uint32_t mbxStatus)
2969fcf3ce44SJohn Forte {
2970291a2b48SSukumar Swaminathan 	emlxs_port_t	*port = &PPORT;
297182527734SSukumar Swaminathan 	MATCHMAP	*mbox_nonembed;
2972291a2b48SSukumar Swaminathan 	MATCHMAP	*mbox_bp;
2973291a2b48SSukumar Swaminathan 	emlxs_buf_t	*mbox_sbp;
2974291a2b48SSukumar Swaminathan 	fc_unsol_buf_t	*mbox_ubp;
2975291a2b48SSukumar Swaminathan 	IOCBQ		*mbox_iocbq;
2976291a2b48SSukumar Swaminathan 	MAILBOXQ	*mbox_mbq;
2977291a2b48SSukumar Swaminathan 	MAILBOX		*mbox;
2978291a2b48SSukumar Swaminathan 	uint32_t	mbox_queue_flag;
2979fcf3ce44SJohn Forte 
2980fcf3ce44SJohn Forte 	mutex_enter(&EMLXS_PORT_LOCK);
2981fcf3ce44SJohn Forte 
2982fcf3ce44SJohn Forte 	if (hba->mbox_queue_flag) {
2983fcf3ce44SJohn Forte 		HBASTATS.MboxCompleted++;
2984fcf3ce44SJohn Forte 
2985fcf3ce44SJohn Forte 		if (mbxStatus != MBX_SUCCESS) {
2986fcf3ce44SJohn Forte 			HBASTATS.MboxError++;
2987fcf3ce44SJohn Forte 		} else {
2988fcf3ce44SJohn Forte 			HBASTATS.MboxGood++;
2989fcf3ce44SJohn Forte 		}
2990fcf3ce44SJohn Forte 	}
2991291a2b48SSukumar Swaminathan 
299282527734SSukumar Swaminathan 	mutex_enter(&EMLXS_MBOX_LOCK);
2993fcf3ce44SJohn Forte 	mbox_queue_flag = hba->mbox_queue_flag;
299482527734SSukumar Swaminathan 	mbox_mbq = (MAILBOXQ *)hba->mbox_mbq;
2995fcf3ce44SJohn Forte 
299682527734SSukumar Swaminathan 	if (mbox_mbq) {
299782527734SSukumar Swaminathan 		mbox_nonembed = (MATCHMAP *)mbox_mbq->nonembed;
299882527734SSukumar Swaminathan 		mbox_bp = (MATCHMAP *)mbox_mbq->bp;
299982527734SSukumar Swaminathan 		mbox_sbp = (emlxs_buf_t *)mbox_mbq->sbp;
300082527734SSukumar Swaminathan 		mbox_ubp = (fc_unsol_buf_t *)mbox_mbq->ubp;
300182527734SSukumar Swaminathan 		mbox_iocbq = (IOCBQ *)mbox_mbq->iocbq;
300282527734SSukumar Swaminathan 	} else {
300382527734SSukumar Swaminathan 		mbox_nonembed = NULL;
300482527734SSukumar Swaminathan 		mbox_bp = NULL;
300582527734SSukumar Swaminathan 		mbox_sbp = NULL;
300682527734SSukumar Swaminathan 		mbox_ubp = NULL;
300782527734SSukumar Swaminathan 		mbox_iocbq = NULL;
300882527734SSukumar Swaminathan 	}
3009fcf3ce44SJohn Forte 
3010a9800bebSGarrett D'Amore 	hba->mbox_mbq = NULL;
3011fcf3ce44SJohn Forte 	hba->mbox_queue_flag = 0;
301282527734SSukumar Swaminathan 	hba->mbox_timer = 0;
301382527734SSukumar Swaminathan 	mutex_exit(&EMLXS_MBOX_LOCK);
3014fcf3ce44SJohn Forte 
3015fcf3ce44SJohn Forte 	mutex_exit(&EMLXS_PORT_LOCK);
3016fcf3ce44SJohn Forte 
30178f23e9faSHans Rosenfeld #ifdef SFCT_SUPPORT
30188f23e9faSHans Rosenfeld 	if (mb && mbox_sbp && mbox_sbp->fct_cmd) {
30198f23e9faSHans Rosenfeld 		EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fct_detail_msg,
30208f23e9faSHans Rosenfeld 		    "FCT mailbox: %s: status=%x",
30218f23e9faSHans Rosenfeld 		    emlxs_mb_cmd_xlate(mb->mbxCommand),
30228f23e9faSHans Rosenfeld 		    mb->mbxStatus);
30238f23e9faSHans Rosenfeld 	}
30248f23e9faSHans Rosenfeld #endif /* SFCT_SUPPORT */
30258f23e9faSHans Rosenfeld 
302682527734SSukumar Swaminathan 	if (mbox_queue_flag == MBX_NOWAIT) {
302782527734SSukumar Swaminathan 		/* Check for deferred MBUF cleanup */
302882527734SSukumar Swaminathan 		if (mbox_bp) {
3029a9800bebSGarrett D'Amore 			emlxs_mem_put(hba, MEM_BUF, (void *)mbox_bp);
303082527734SSukumar Swaminathan 		}
303182527734SSukumar Swaminathan 		if (mbox_nonembed) {
3032a9800bebSGarrett D'Amore 			emlxs_mem_put(hba, MEM_BUF,
3033a9800bebSGarrett D'Amore 			    (void *)mbox_nonembed);
3034fcf3ce44SJohn Forte 		}
303582527734SSukumar Swaminathan 		if (mbox_mbq) {
3036a9800bebSGarrett D'Amore 			emlxs_mem_put(hba, MEM_MBOX,
3037a9800bebSGarrett D'Amore 			    (void *)mbox_mbq);
303882527734SSukumar Swaminathan 		}
303982527734SSukumar Swaminathan 	} else {  /* MBX_WAIT */
304082527734SSukumar Swaminathan 		if (mbox_mbq) {
304182527734SSukumar Swaminathan 			if (mb) {
304282527734SSukumar Swaminathan 				/* Copy the local mailbox provided back into */
304382527734SSukumar Swaminathan 				/* the original mailbox */
304482527734SSukumar Swaminathan 				if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
304582527734SSukumar Swaminathan 					bcopy((uint32_t *)mb,
304682527734SSukumar Swaminathan 					    (uint32_t *)mbox_mbq,
304782527734SSukumar Swaminathan 					    MAILBOX_CMD_SLI4_BSIZE);
304882527734SSukumar Swaminathan 				} else {
304982527734SSukumar Swaminathan 					bcopy((uint32_t *)mb,
305082527734SSukumar Swaminathan 					    (uint32_t *)mbox_mbq,
305182527734SSukumar Swaminathan 					    MAILBOX_CMD_BSIZE);
305282527734SSukumar Swaminathan 				}
305382527734SSukumar Swaminathan 			}
3054291a2b48SSukumar Swaminathan 
305582527734SSukumar Swaminathan 			mbox = (MAILBOX *)mbox_mbq;
3056a9800bebSGarrett D'Amore 			mbox->mbxStatus = (uint16_t)mbxStatus;
3057fcf3ce44SJohn Forte 
305882527734SSukumar Swaminathan 			/* Mark mailbox complete */
305982527734SSukumar Swaminathan 			mbox_mbq->flag |= MBQ_COMPLETED;
306082527734SSukumar Swaminathan 		}
3061fcf3ce44SJohn Forte 
3062fcf3ce44SJohn Forte 		/* Wake up the sleeping thread */
3063fcf3ce44SJohn Forte 		if (mbox_queue_flag == MBX_SLEEP) {
3064fcf3ce44SJohn Forte 			mutex_enter(&EMLXS_MBOX_LOCK);
3065fcf3ce44SJohn Forte 			cv_broadcast(&EMLXS_MBOX_CV);
3066fcf3ce44SJohn Forte 			mutex_exit(&EMLXS_MBOX_LOCK);
3067fcf3ce44SJohn Forte 		}
3068fcf3ce44SJohn Forte 	}
3069291a2b48SSukumar Swaminathan 
3070a9800bebSGarrett D'Amore 	emlxs_mb_deferred_cmpl(port, mbxStatus, mbox_sbp, mbox_ubp, mbox_iocbq);
3071a9800bebSGarrett D'Amore 
3072a9800bebSGarrett D'Amore 	return;
3073a9800bebSGarrett D'Amore 
3074a9800bebSGarrett D'Amore } /* emlxs_mb_fini() */
3075a9800bebSGarrett D'Amore 
3076a9800bebSGarrett D'Amore 
3077a9800bebSGarrett D'Amore extern void
3078a9800bebSGarrett D'Amore emlxs_mb_deferred_cmpl(emlxs_port_t *port, uint32_t mbxStatus, emlxs_buf_t *sbp,
3079a9800bebSGarrett D'Amore     fc_unsol_buf_t *ubp, IOCBQ *iocbq)
3080a9800bebSGarrett D'Amore {
3081a9800bebSGarrett D'Amore 	emlxs_hba_t *hba = HBA;
3082a9800bebSGarrett D'Amore 	emlxs_ub_priv_t	*ub_priv;
3083a9800bebSGarrett D'Amore 
3084a9800bebSGarrett D'Amore #ifdef SFCT_SUPPORT
30858f23e9faSHans Rosenfeld 	if (sbp && sbp->fct_cmd && (sbp->fct_state == EMLXS_FCT_REG_PENDING)) {
30868f23e9faSHans Rosenfeld 		mutex_enter(&EMLXS_PKT_LOCK);
30878f23e9faSHans Rosenfeld 		sbp->fct_flags |= EMLXS_FCT_REGISTERED;
30888f23e9faSHans Rosenfeld 		cv_broadcast(&EMLXS_PKT_CV);
30898f23e9faSHans Rosenfeld 		mutex_exit(&EMLXS_PKT_LOCK);
3090a9800bebSGarrett D'Amore 
30918f23e9faSHans Rosenfeld 		sbp = NULL;
3092a9800bebSGarrett D'Amore 	}
3093a9800bebSGarrett D'Amore #endif /* SFCT_SUPPORT */
3094a9800bebSGarrett D'Amore 
3095fcf3ce44SJohn Forte 	/* Check for deferred pkt completion */
3096a9800bebSGarrett D'Amore 	if (sbp) {
3097fcf3ce44SJohn Forte 		if (mbxStatus != MBX_SUCCESS) {
3098fcf3ce44SJohn Forte 			/* Set error status */
3099a9800bebSGarrett D'Amore 			sbp->pkt_flags &= ~PACKET_STATE_VALID;
3100a9800bebSGarrett D'Amore 			emlxs_set_pkt_state(sbp, IOSTAT_LOCAL_REJECT,
3101fcf3ce44SJohn Forte 			    IOERR_NO_RESOURCES, 1);
3102fcf3ce44SJohn Forte 		}
3103291a2b48SSukumar Swaminathan 
3104a9800bebSGarrett D'Amore 		emlxs_pkt_complete(sbp, -1, 0, 1);
3105fcf3ce44SJohn Forte 	}
3106291a2b48SSukumar Swaminathan 
3107fcf3ce44SJohn Forte 	/* Check for deferred ub completion */
3108a9800bebSGarrett D'Amore 	if (ubp) {
3109a9800bebSGarrett D'Amore 		ub_priv = ubp->ub_fca_private;
3110fcf3ce44SJohn Forte 
3111a9800bebSGarrett D'Amore 		if (mbxStatus == MBX_SUCCESS) {
3112a9800bebSGarrett D'Amore 			emlxs_ub_callback(ub_priv->port, ubp);
3113a9800bebSGarrett D'Amore 		} else {
3114a9800bebSGarrett D'Amore 			(void) emlxs_fca_ub_release(ub_priv->port, 1,
3115a9800bebSGarrett D'Amore 			    &ubp->ub_token);
3116a9800bebSGarrett D'Amore 		}
3117fcf3ce44SJohn Forte 	}
3118291a2b48SSukumar Swaminathan 
3119a9800bebSGarrett D'Amore 	/* Special handling for restricted login */
3120a9800bebSGarrett D'Amore 	if (iocbq == (IOCBQ *)1) {
3121a9800bebSGarrett D'Amore 		iocbq = NULL;
312282527734SSukumar Swaminathan 	}
312382527734SSukumar Swaminathan 
3124fcf3ce44SJohn Forte 	/* Check for deferred iocb tx */
3125a9800bebSGarrett D'Amore 	if (iocbq) {
312682527734SSukumar Swaminathan 		/* Check for driver special codes */
312782527734SSukumar Swaminathan 		/* These indicate the mailbox is being flushed */
312882527734SSukumar Swaminathan 		if (mbxStatus >= MBX_DRIVER_RESERVED) {
312982527734SSukumar Swaminathan 			/* Set the error status and return it */
3130a9800bebSGarrett D'Amore 			iocbq->iocb.ULPSTATUS = IOSTAT_LOCAL_REJECT;
3131a9800bebSGarrett D'Amore 			iocbq->iocb.un.grsp.perr.statLocalError =
313282527734SSukumar Swaminathan 			    IOERR_ABORT_REQUESTED;
313382527734SSukumar Swaminathan 
3134a9800bebSGarrett D'Amore 			emlxs_proc_channel_event(hba, iocbq->channel,
3135a9800bebSGarrett D'Amore 			    iocbq);
313682527734SSukumar Swaminathan 		} else {
3137a9800bebSGarrett D'Amore 			EMLXS_SLI_ISSUE_IOCB_CMD(hba, iocbq->channel,
3138a9800bebSGarrett D'Amore 			    iocbq);
313982527734SSukumar Swaminathan 		}
3140fcf3ce44SJohn Forte 	}
3141a9800bebSGarrett D'Amore 
3142fcf3ce44SJohn Forte 	return;
3143fcf3ce44SJohn Forte 
3144a9800bebSGarrett D'Amore } /* emlxs_mb_deferred_cmpl() */
3145fcf3ce44SJohn Forte 
3146fcf3ce44SJohn Forte 
314782527734SSukumar Swaminathan extern void
314882527734SSukumar Swaminathan emlxs_mb_flush(emlxs_hba_t *hba)
3149fcf3ce44SJohn Forte {
3150291a2b48SSukumar Swaminathan 	MAILBOXQ	*mbq;
315182527734SSukumar Swaminathan 	uint32_t	mbxStatus;
3152fcf3ce44SJohn Forte 
315382527734SSukumar Swaminathan 	mbxStatus = (hba->flag & FC_HARDWARE_ERROR) ?
315482527734SSukumar Swaminathan 	    MBX_HARDWARE_ERROR : MBX_NOT_FINISHED;
3155fcf3ce44SJohn Forte 
315682527734SSukumar Swaminathan 	/* Flush out the active mbox command */
315782527734SSukumar Swaminathan 	emlxs_mb_fini(hba, NULL, mbxStatus);
3158fcf3ce44SJohn Forte 
315982527734SSukumar Swaminathan 	/* Flush out the queued mbox commands */
316082527734SSukumar Swaminathan 	while (mbq = (MAILBOXQ *)emlxs_mb_get(hba)) {
316182527734SSukumar Swaminathan 		mutex_enter(&EMLXS_MBOX_LOCK);
316282527734SSukumar Swaminathan 		hba->mbox_queue_flag = MBX_NOWAIT;
3163a9800bebSGarrett D'Amore 		hba->mbox_mbq = (void *)mbq;
316482527734SSukumar Swaminathan 		mutex_exit(&EMLXS_MBOX_LOCK);
3165fcf3ce44SJohn Forte 
316682527734SSukumar Swaminathan 		emlxs_mb_fini(hba, NULL, mbxStatus);
316782527734SSukumar Swaminathan 	}
3168fcf3ce44SJohn Forte 
3169fcf3ce44SJohn Forte 	return;
3170fcf3ce44SJohn Forte 
317182527734SSukumar Swaminathan } /* emlxs_mb_flush */
3172fcf3ce44SJohn Forte 
3173fcf3ce44SJohn Forte 
3174291a2b48SSukumar Swaminathan extern char *
3175291a2b48SSukumar Swaminathan emlxs_mb_cmd_xlate(uint8_t cmd)
3176fcf3ce44SJohn Forte {
3177291a2b48SSukumar Swaminathan 	static char	buffer[32];
3178291a2b48SSukumar Swaminathan 	uint32_t	i;
3179291a2b48SSukumar Swaminathan 	uint32_t	count;
3180fcf3ce44SJohn Forte 
3181fcf3ce44SJohn Forte 	count = sizeof (emlxs_mb_cmd_table) / sizeof (emlxs_table_t);
3182fcf3ce44SJohn Forte 	for (i = 0; i < count; i++) {
3183fcf3ce44SJohn Forte 		if (cmd == emlxs_mb_cmd_table[i].code) {
3184fcf3ce44SJohn Forte 			return (emlxs_mb_cmd_table[i].string);
3185fcf3ce44SJohn Forte 		}
3186fcf3ce44SJohn Forte 	}
3187fcf3ce44SJohn Forte 
31888f23e9faSHans Rosenfeld 	(void) snprintf(buffer, sizeof (buffer), "Cmd=0x%x", cmd);
3189fcf3ce44SJohn Forte 	return (buffer);
3190fcf3ce44SJohn Forte 
3191fcf3ce44SJohn Forte } /* emlxs_mb_cmd_xlate() */
31928f23e9faSHans Rosenfeld 
31938f23e9faSHans Rosenfeld extern char *
31948f23e9faSHans Rosenfeld emlxs_request_feature_xlate(uint32_t mask)
31958f23e9faSHans Rosenfeld {
31968f23e9faSHans Rosenfeld 	static char	buffer[64];
31978f23e9faSHans Rosenfeld 	uint32_t	i;
31988f23e9faSHans Rosenfeld 
31998f23e9faSHans Rosenfeld 	bzero((char *)&buffer[0], 64);
32008f23e9faSHans Rosenfeld 	for (i = 0; i < 12; i++) {
32018f23e9faSHans Rosenfeld 		if (mask & (1<<i)) {
32028f23e9faSHans Rosenfeld 			(void) strlcat(buffer,
32038f23e9faSHans Rosenfeld 			    emlxs_request_feature_table[i].string,
32048f23e9faSHans Rosenfeld 			    sizeof (buffer));
32058f23e9faSHans Rosenfeld 		}
32068f23e9faSHans Rosenfeld 	}
32078f23e9faSHans Rosenfeld 	return (buffer);
32088f23e9faSHans Rosenfeld }
3209