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