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); 455